Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
CMPPS
Влияние команды на флаги и форматы команды:
* |
* |
|
|
|
|
0F C2 /r ib |
CMPPS xmm1, xmm2/m128, imm8 |
Сравнить (по условию imm8) упакованные короткие вещественные значения из xmm1 с соответствующими значениями из xmm2/m128, по результатам сравнения установить элементы xmm1 |
Pentium III |
cmpps xmm3, xmm5, 2 |
Описание:
Команда CMPPS сравнивает упакованные короткие вещественные значения из операнда-источника с соответствующими короткими вещественными, упакованными в операнде-назначении. По результатам сравнения соответствующие 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];
CMP1 = DEST[63-32] OP SRC/m128[63-32];
CMP2 = DEST [95-64] OP SRC/m128[95-64];
CMP3 = DEST[127-96] OP SRC/m128[127-96];
IF (CMP0 = TRUE) THEN
DEST[31-0] = FFFFFFFFh;
DEST[63-32] = FFFFFFFFh;
DEST[95-64] = FFFFFFFFh;
DEST[127-96] = FFFFFFFFh;
ELSE
DEST[31-0] = 00000000h;
DEST[63-32] = 00000000h;
DEST[95-64] = 00000000h;
DEST[127-96] = 00000000h;
FI;
Особые ситуации защищенного режима:
#GP(0) при некорретном эффективном адресе операнда в памяти в сегментах CS, DS, ES, FS или GS, и для всех сегментов если операнд в памяти не выровнен по 16-байтным границам.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#NM, если CR0.TS = 1.
#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(Код ошибки) при страничной ошибке.
Замечание:
Некоторые ассемблеры могут использовать следующие мнемоники для конкретных видов сравнения:
CMPEQPS xmm1,xmm2 — для CMPPS xmm1,xmm2,0
CMPLTPS xmm1,xmm2 — для CMPPS xmm1,xmm2,1
CMPLEPS xmm1,xmm2 — для CMPPS xmm1,xmm2,2
CMPUNORDPS xmm1,xmm2 — для CMPPS xmm1,xmm2,3
CMPNEQPS xmm1,xmm2 — для CMPPS xmm1,xmm2,4
CMPNLTPS xmm1,xmm2 — для CMPPS xmm1,xmm2,5
CMPNLEPS xmm1,xmm2 — для CMPPS xmm1,xmm2,6
CMPORDPS xmm1,xmm2 — для CMPPS xmm1,xmm2,7
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru