Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
CMPSS
Влияние команды на флаги и форматы команды:
* |
* |
|
|
|
|
F3 0F C2 /r ib |
CMPSS xmm1, xmm2/m128, imm8 |
Сравнить (по условию imm8) младшие короткие вещественные значения из xmm1и из xmm2/m128, по результатам сравнения установить младший элемент xmm1 |
Pentium III |
cmpss xmm3, xmm5, 6 |
Описание:
Команда CMPSS сравнивает младшее (из четырех упакованных) короткое вещественное значение из операнда-источника с младшим короткими вещественным из операнда-назначения. По результатам сравнения младший 32-разрядный операнд операнда-назначения заполняется либо единицами, либо нулями.
Третий операнд команды (непосредственное значение imm8) задает условие операции сравнения (0 — равно, 1 — меньше, 2 — меньше либо равно, 3 — несравнимо, 4 — не равно, 5 — не меньше, 6 — не меньше и не равно, 7 — сравнимо). Условие сравненя считается выполненным (True), если выполняется: DEST условие SRC. Например, для входного значения imm8 = 1, условие DEST < SRC выполняется (True), если DEST =2, SRC =8, и не выполняется, если DEST =1, SRC =-5.
Если заданное условие сравнения для соответствующей пары коротких вещественных операндов исполняется, то в 32-разрядное поле операнда-назначения помещаются все 1 (True), в противном случае — все 0 (False).
Операнды считаются несравнимыми, если любой из них NaN, и сравнимыми в противном случае. Для условий сравнения 1, 2, 5, 6, если один из операндов NaN, генерируется SIMD-исключение Недействительная операция (#I).
Значения imm8 большие 7 зарезервированы и не должны использоваться во избежание несовместимости с будущими версиями процессоров.
Операция:
IF (imm8 = 0)
THEN
OP = "EQ";
ELSE
IF (imm8 = 1)
THEN
OP = "LT";
ELSE
IF (imm8 = 2)
THEN
OP = "LE";
ELSE
IF (imm8 = 3)
THEN
OP = "UNORD";
ELSE
IF (imm8 = 4)
THEN
OP = "NE";
ELSE
IF (imm8 = 5)
THEN
OP = "NLT";
ELSE
IF (imm8 = 6)
THEN
OP = "NLE";
ELSE
IF (imm8 = 7) THEN OP = "ORD";FI;
FI;
FI;
FI;
FI;
FI;
FI;
FI;
CMP0 = DEST[31-0] OP SRC/m128[31-0];
IF (CMP0 = TRUE) THEN
DEST[31-0] = FFFFFFFFh;
DEST[63-32] = DEST[63-32];
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
ELSE
DEST[31-0] = 00000000h;
DEST[63-32] = DEST[63-32];
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
FI
Особые ситуации защищенного режима:
#GP(0) при некорретном эффективном адресе операнда в памяти в сегментах CS, DS, ES, FS или GS.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#NM, если CR0.TS = 1.
#AC при невыровненных обращениях к памяти (когда CR0.AM = 1, EFLAGS.AC = 1 и CPL = 3).
#UD, если CR0.EM = 1 или CR4.OSFXSR = 0, а также при встрече незамаскированных SIMD-исключений, когда CR4.OSXMMEXCPT = 0.
#XM при встрече незамаскированных SIMD-исключений, когда CR4.OSXMMEXCPT = 1.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов от 0 до 0FFFFh.
#NM, если CR0.TS = 1.
#UD, если CR0.EM = 1 или CR4.OSFXSR = 0, а также при встрече незамаскированных SIMD-исключений, когда CR4.OSXMMEXCPT = 0.
#XM при встрече незамаскированных SIMD-исключений, когда CR4.OSXMMEXCPT = 1.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC при невыровненных обращениях к памяти (когда CR0.AM = 1 и EFLAGS.AC = 1).
Замечание:
Некоторые ассемблеры могут использовать следующие мнемоники для конкретных видов сравнения:
CMPEQSS xmm1,xmm2 — для CMPSS xmm1,xmm2,0
CMPLTSS xmm1,xmm2 — для CMPSS xmm1,xmm2,1
CMPLESS xmm1,xmm2 — для CMPSS xmm1,xmm2,2
CMPUNORDSS xmm1,xmm2 — для CMPSS xmm1,xmm2,3
CMPNEQSS xmm1,xmm2 — для CMPSS xmm1,xmm2,4
CMPNLTSS xmm1,xmm2 — для CMPSS xmm1,xmm2,5
CMPNLESS xmm1,xmm2 — для CMPSS xmm1,xmm2,6
CMPORDSS xmm1,xmm2 — для CMPSS xmm1,xmm2,7
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru