Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.6.3. Команды арифметических операций

Команды этой группы (табл. 2.47) имеют две формы: пакетную (суффикс PS) и скаляр­ную (суффикс SS). Пакетная форма команды обрабатывает пакеты одинарной точности: четыре элемента F3-FO одинарной точности, упакованные в 128 разрядов. Скалярная форма команды работает только с одним элементом одинарной точности FO (младшие 32 разря­да SSE-регистра), остальные 96 разрядов (старшие элементы F3F1) содержимого этого регистра не изменяются. Для всех команд данной группы результат операции размещается в SSE-регистре xmm, а исходные операнды - в SSE-регистре xmm или ячейке памяти с адресом m128 (пакетная форма), либо т32 (скалярная форма).

Таблица 2.47

Команды ADD[PS,SS], SUB[PS,SS], DIV[PS,SS], MUL[PS,SS] производят соответствен­но операции сложения, вычитания, деления и умножения. Если при выполнении операций с какими-либо элементами происходит переполнение, то устанавливаются значения при­знаков ошибки ОЕ = РЕ = 1 и реализуется исключение типа #ХМ (при значении бита маски ОМ=0). Если соответствующее исключение замаскировано (установлено значение ОМ = 1), то результатом операции является число, округленное в соответствии с полем RC в регистре MXCSR (см. табл. 2.1). В случае антипереполнения устанавливаются значения признаков UE = РЕ = 1. При значении бита маски UM=0 реализуется исключение #ХМ, а при значении UM = 1 результатом становится округленное число. Команда DIV[PS,SS] вызыва­ет установку признака ошибки ZE = 1, если операнд-делитель равен нулю. В этом случае реализуется исключение #ХМ, если соответствующий бит маски ZM = 0. Если данная ошиб­ка маскирована (значение бита ZM = 1), то результатом операции будет код бесконечности соответствующего знака (7F800000h или FF800000h, см. табл. 2.16).

При выполнении данных команд элементами исходных операндов могут быть не-числа QNaN или SNaN. Результаты операций в этих случаях приведены в табл. 2.48. В случаях, когда установлено значение бита маски IM = 1 (исключение типа #1 маскировано), элементом результата будет не-число QNaN, являющееся элементом одного из операндов, или полу­ченное из не-числа SNaN, являющегося элементом операнда, путем изменения значения бита Ь22 (первого разряда мантиссы) с «О» на «1»(SNaN -> QNaN)*. В случаях, когда значение бита маски IM = 0 (исключение #1 не маскировано), реализуется переход к подпрограмме обслуживания данного исключения, если элементами операндов являются не-числа SNaN. Если же элементами являются не-числа QNaN, то они представляются в качестве результа­та операции, а исключение не реализуется.

В табл. 2.48 указан также результат выполнения ряда арифметических операций, когда элементами операндов являются «О» или «бесконечность», В этих случаях элементом результата становится код FFCOOOOOh («неопределенность», см. табл.2.16), если установ­лено значение бита маски IM = 1 (исключение #1 маскировано). Если же значение IM = 0, то реализуется исключение Таблица 2.48

Команда SQRT[PS,SS] вычисляет значение квадратного корня из элементов исходного операнда (у = ^). Результаты этой операции в случаях, если элементом операнда явля­ется He-число или отрицательное число, указаны в табл. 2.49. Отметим, что данные ре­зультаты аналогичны приведенным в табл. 2.48 для исключительных случаев, возникаю­щих при выполнении других арифметических операций.

Таблица 2.49 -

Все рассмотренные выше команды данной группы устанавливают значение признака DE = 1 и реализуют исключение #ХМ, если один из элементов исходных операндов пред­ставлен в денормализованном виде.

Команда RCP[PS,SS] вычисляет обратную величину операнда, а команда RSQRT[PS,SS] - обратную величину квадратного корня из операнда (/ = i/VJ). Правила округления, определяемые значением поля RC в регистре MXCSR, не оказывают влияния на выполнение этих команд. Денормализованные операнды воспринимаются как нули со­ ответствующего знака. Результат антипереполнения всегда округляется до нуля. Макси­- мальная величина ошибки при выполнении этих команд составляет 1,5х2>12. Команды RSQRT[PS,SS] и RCP[PS,SS] не реализуют какие-либо исключения, поэтому контроль оши­бок при их выполнении должен выполняться программными средствами.

ние бита маски IM = 0 (исключение #1 не маскировано), реализуется переход к подпрограмме обслуживания данного исключения, если элементами операндов являются не-числа SNaN. Если же элементами являются не-числа QNaN, то они представляются в качестве результа­та операции, а исключение не реализуется.

В табл. 2.48 указан также результат выполнения ряда арифметических операций, когда элементами операндов являются «О» или «бесконечность», В этих случаях элементом результата становится код FFCOOOOOh («неопределенность», см. табл.2.16), если установ­лено значение бита маски IM = 1 (исключение #1 маскировано). Если же значение IM = 0, то реализуется исключение #l. ;

Таблица 2.48

Команда SQRT[PS,SS] вычисляет значение квадратного корня из элементов исходного операнда (у = ^). Результаты этой операции в случаях, если элементом операнда явля­ется He-число или отрицательное число, указаны в табл. 2.49. Отметим, что данные ре­зультаты аналогичны приведенным в табл. 2.48 для исключительных случаев, возникаю­щих при выполнении других арифметических операций.

Таблица 2.49 -

Все рассмотренные выше команды данной группы устанавливают значение признака DE = 1 и реализуют исключение #ХМ, если один из элементов исходных операндов пред­ставлен в денормализованном виде.

Команда RCP[PS,SS] вычисляет обратную величину операнда (/ = '/•»), а команда RSQRT[PS,SS] - обратную величину квадратного корня из операнда (/ = i/VJ). Правила округления, определяемые значением поля RC в регистре MXCSR, не оказывают влияния на выполнение этих команд. Денормализованные операнды воспринимаются как нули со­ ответствующего знака. Результат антипереполнения всегда округляется до нуля. Макси­ мальная величина ошибки при выполнении этих команд составляет 1,5х2>12. Команды RSQRT[PS,SS] и RCP[PS,SS] не реализуют какие-либо исключения, поэтому контроль ошибок при их выполнении должен выполняться программными средствами. Команды сравнения по-разному реагируют на поступление операндов - не-чисел. Если элементом сравниваемых операндов является NaN, то для одних команд результатом срав­нения может быть число FFFFFFFFh, а для других OOOOOOOOh (табл. 2.53). Команды CMPUNORD[PS, SS] и CMPORD[PS, SS] специально предназначены для сравнения не­чисел. Результатом выполнения команды CMPUNORD[PS, SS] будет FFFFFFFFh, если хотя бы один из элементов является He-числом (NaN), и OOOOOOOOh, если оба операнда являют­ся достоверными числами. Результатом выполнения команды CMPORDfPS, SS] будет, на­оборот, FFFFFFFFh - при сравнении достоверных чисел и OOOOOOOOh - при сравнении не­-чисел. Различные команды сравнения могут вызывать или не вызывать исключение типа #1 при NAN операндах (табл. 2.53).

' Таблица 2.53

Команды COMISS и UCOMISS производят сравнение двух чисел одинарной точности с установкой признаков в регистре EFLAGS. При этом признаки OF.SF.AF принимают зна­чение «О», а признаки ZF.PF.CF устанавливаются в зависимости от результатов сравне­ния (табл. 2.54). Команда COMISS реализует исключение типа #1, если элемент хотя бы одного из операндов является не-числом (SNaN или QNaN), а команда UCOMISS — если элемент одного из операндов является SNaN. Состояние регистра EFLAGS при реализа­ции данного исключения не изменяется. В случае, если соответствующий бит маски име­ет значение IM = 1 (исключение маскировано), то исключение не реализуется, а признаки ZF, PF, CF устанавливаются в «1».

Таблица 2.54

Команды MAX[PS,SS] и MIN[PS,SS] выделяют из исходных операндов элементы с наи­большими или наименьшими значениями. Элементы операндов попарно сравниваются меж­ду собой, и в качестве соответствующего элемента результата в регистр xmm заносится элемент с наибольшим (команда МАХ) или наименьшим (команда MIN) значением. Если хотя бы один из сравниваемых элементов является не-числом, и значение бита маски IM = 1, то соответствующим элементом результата становится элемент из операнда-источника xmm/m128 или xmm/m32 независимо от того, является ли он достоверным числом или NaN.