Списки инструкций X86 - X86 instruction listings

В x86 Набор инструкций относится к набору инструкций, которые x86 -совместимый микропроцессоры поддержка. Инструкции обычно являются частью исполняемый файл программа, часто сохраняемая как компьютерный файл и выполняется на процессоре.

Набор инструкций x86 был расширен несколько раз, в результате чего регистры и типы данных, а также новые функции.[1]

целочисленные инструкции x86

Это полный набор команд Intel 8086/8088. Большинство, если не все эти инструкции доступны в 32-битном режиме; они просто работают с 32-битными регистрами (eax, ebxи т. д.) и значения вместо их 16-битных (топор, bxи др.) аналоги. Смотрите также язык ассемблера x86 для быстрого ознакомления с этим семейством процессоров. Обновленный набор инструкций также сгруппирован по архитектуре (i386, i486, i686 ) и в более общем смысле упоминается как x86 32 и x86 64 (также известен как AMD64 ).

Оригинальная инструкция для 8086/8088

Оригинальный набор инструкций 8086/8088
ИнструкцияСмыслЗаметкиКод операции
AAAASCII настроить AL после добавленияиспользуется с распакованными двоично-десятичный код0x37
AADASCII настроить AX перед делениемВ таблице данных 8086/8088 представлена ​​только версия базовой 10 инструкции AAD (код операции 0xD5 0x0A), но подойдет любая другая база. Более поздняя документация Intel также имеет общий вид. NEC V20 и V30 (и, возможно, другие процессоры NEC серии V) всегда используют основание 10 и игнорируют аргумент, что вызывает ряд несовместимостей.0xD5
AAMASCII настроить AX после умноженияДокументирована только версия base 10 (операнд 0xA), см. Примечания для AAD.0xD4
ААСASCII настроить AL после вычитания0x3F
АЦПДобавить с переносомпункт назначения = пункт назначения + источник + carry_flag0x10… 0x15, 0x80… 0x81 / 2, 0x82… 0x83 / 2 (начиная с 80186)
ДОБАВИТЬДобавить(1) г / м + = г / имм; (2) г + = м / имм;0x00… 0x05, 0x80 / ​​0… 0x81 / 0, 0x82 / 0… 0x83 / 0 (с 80186)
ИЛогическое И(1) r / m & = r / imm; (2) r & = m / imm;0x20… 0x25, 0x80… 0x81 / 4, 0x82… 0x83 / 4 (начиная с 80186)
ВЫЗОВПроцедура вызоваОт себя eip; eip указывает на инструкцию сразу после вызова0x9A, 0xE8, 0xFF / 2, 0xFF / 3
CBWПреобразовать байт в слово0x98
CLCясно нести флагCF = 0;0xF8
CLDясно флаг направленияDF = 0;0xFC
CLIясно флаг прерыванияЕСЛИ = 0;0xFA
CMCФлаг переноса дополнения0xF5
CMPСравнить операнды0x38… 0x3D, 0x80… 0x81 / 7, 0x82… 0x83 / 7 (начиная с 80186)
CMPSBСравнить байты в памяти0xA6
CMPSWСравнить слова0xA7
CWDПреобразовать слово в двойное слово0x99
DAAДесятичная корректировка AL после сложения(используется с упакованными двоично-десятичный код )0x27
DASДесятичная корректировка AL после вычитания0x2F
DECУменьшить на 10x48… 0x4F, 0xFE / 1, 0xFF / 1
DIVБеззнаковое деление(1) AX = DX: AX / r / m; в результате DX = остаток (2) AL = AX / r / m; в результате AH = остаток0xF7 / 6, 0xF6 / 6
ESCИспользуется с блок с плавающей запятой0xD8..0xDF
HLTВойти в состояние остановки0xF4
IDIVПодписанный раздел(1) AX = DX: AX / r / m; в результате DX = остаток (2) AL = AX / r / m; в результате AH = остаток0xF7 / 7, 0xF6 / 7
IMULПодпись умножить(1) DX: AX = AX * r / m; (2) AX = AL * r / м0x69, 0x6B (оба с 80186), 0xF7 / 5, 0xF6 / 5, 0x0FAF (с 80386)
ВВход из порта(1) AL = порт [imm]; (2) AL = порт [DX]; (3) AX = порт [imm]; (4) AX = порт [DX];0xE4, 0xE5, 0xEC, 0xED
INCУвеличение на 10x40… 0x47, 0xFE / 0, 0xFF / 0
INTПозвонить прервать0xCC, 0xCD
ВВызов для прерывания при переполнении0xCE
IRETВозврат из прерывания0xCF
JccПерейти, если условие(JA, JAE, JB, JBE, JC, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ)0x70… 0x7F, 0x0F80… 0x0F8F (с 80386)
JCXZПерейти, если CX равен нулю0xE3
JMPПрыгать0xE9… 0xEB, 0xFF / 4, 0xFF / 5
LAHFЗагрузить ФЛАГИ в регистр AH0x9F
СПДУказатель загрузки с помощью DS0xC5
LEAЗагрузить эффективный адрес0x8D
LESЗагрузить ES с помощью указателя0xC4
ЗАМОКПодтвердить сигнал BUS LOCK #(для многопроцессорности)0xF0
ЛОДСБЗагрузить байт строкиесли (DF==0) AL = *SI++; еще AL = *SI--;0xAC
LODSWЗагрузить строковое словоесли (DF==0) ТОПОР = *SI++; еще ТОПОР = *SI--;0xAD
LOOP / LOOPxКонтроль цикла(LOOPE, LOOPNE, LOOPNZ, LOOPZ) если (Икс && --CX) перейти к фунт;0xE0… 0xE2
MOVШагкопирует данные из одного места в другое, (1) г / м = г; (2) г = г / м;0xA0 ... 0xA3
МОВСБПереместить байт из строки в строку
если (DF==0)   *(байт*)DI++ = *(байт*)SI++; еще   *(байт*)DI-- = *(байт*)SI--;
0xA4
MOVSWПереместить слово из строки в строку
если (DF==0)   *(слово*)DI++ = *(слово*)SI++; еще   *(слово*)DI-- = *(слово*)SI--;
0xA5
MULБеззнаковое умножение(1) DX: AX = AX * r / m; (2) AX = AL * r / m;0xF7 / 4, 0xF6 / 4
NEGОтрицание дополнения до двухр/м *= -1;0xF6 / 3… 0xF7 / 3
NOPНет операциикод операции, эквивалентный XCHG EAX, EAX0x90
НЕОтменить операнд, логическое НЕр/м ^= -1;0xF6 / 2… 0xF7 / 2
ИЛИЛогическое ИЛИ(1) р/м |= р/имм; (2) р |= м/имм;0x08… 0x0D, 0x80… 0x81 / 1, 0x82… 0x83 / 1 (начиная с 80186)
ВНЕВывод в порт(1) порт [imm] = AL; (2) порт [DX] = AL; (3) порт [imm] = AX; (4) порт [DX] = AX;0xE6, 0xE7, 0xEE, 0xEF
ПопИзвлечь данные из стекг / м = * СП ++; POP CS (код операции 0x0F) работает только на 8086/8088. Более поздние процессоры используют 0x0F в качестве префикса для новых инструкций.0x07, 0x0F (только 8086/8088), 0x17, 0x1F, 0x58… 0x5F, 0x8F / 0
POPFПоп Регистр ФЛАГОВ из стекаФЛАГИ = * SP ++;0x9D
ОТ СЕБЯПомещать данные в стек*--SP = р/м;0x06, 0x0E, 0x16, 0x1E, 0x50… 0x57, 0x68, 0x6A (оба с 80186), 0xFF / 6
PUSHFПоместите ФЛАГИ в стек*--SP = Флаги;0x9C
RCLПовернуть влево (с переноской)0xC0… 0xC1 / 2 (начиная с 80186), 0xD0… 0xD3 / 2
RCRПовернуть вправо (с переноской)0xC0… 0xC1 / 3 (начиная с 80186), 0xD0… 0xD3 / 3
REPxxПовторите MOVS / STOS / CMPS / LODS / SCAS(REP, REPE, REPNE, REPNZ, REPZ)0xF2, 0xF3
RETВозврат с процедурыНе настоящая инструкция. Ассемблер преобразует их в RETN или RETF в зависимости от модели памяти целевой системы.
RETNВозврат с ближней процедуры0xC2, 0xC3
RETFВозвращение из далекой процедуры0xCA, 0xCB
ROLПовернуть налево0xC0… 0xC1 / 0 (начиная с 80186), 0xD0… 0xD3 / 0
RORПовернуть вправо0xC0… 0xC1 / 1 (начиная с 80186), 0xD0… 0xD3 / 1
SAHFСохраните AH в FLAGS0x9E
SALАрифметический сдвиг влево (сдвиг со знаком влево)(1) г / м << = 1; (2) г / м << = CL;0xC0… 0xC1 / 4 (начиная с 80186), 0xD0… 0xD3 / 4
SARСдвиг арифметически вправо (сдвиг вправо со знаком)(1) (со знаком) r / m >> = 1; (2) (со знаком) r / m >> = CL;0xC0… 0xC1 / 7 (начиная с 80186), 0xD0… 0xD3 / 7
SBBВычитание с заимствованиемальтернативное 1-байтовое кодирование SBB AL, AL доступно через недокументированный Инструкция SALC0x18… 0x1D, 0x80… 0x81 / 3, 0x82… 0x83 / 3 (начиная с 80186)
SCASBСравнить байтовую строку0xAE
SCASWСравнить строку слов0xAF
SHLсдвиг влево (сдвиг без знака влево)0xC0… 0xC1 / 4 (начиная с 80186), 0xD0… 0xD3 / 4
SHRСдвиг вправо (сдвиг вправо без знака)0xC0… 0xC1 / 5 (начиная с 80186), 0xD0… 0xD3 / 5
STCУстановить флаг переносаCF = 1;0xF9
ЗПППУстановить флаг направленияDF = 1;0xFD
ИПППУстановить флаг прерыванияЕСЛИ = 1;0xFB
СТОСБСохранить байт в строкеесли (DF==0) *ES:DI++ = AL; еще *ES:DI-- = AL;0xAA
STOSWСохранить слово в строкеесли (DF==0) *ES:DI++ = ТОПОР; еще *ES:DI-- = ТОПОР;0xAB
SUBВычитание(1) r / m - = r / imm; (2) r - = м / имм;0x28… 0x2D, ​​0x80… 0x81 / 5, 0x82… 0x83 / 5 (начиная с 80186)
ТЕСТОВОЕ ЗАДАНИЕЛогическое сравнение (И)(1) r / m & r / imm; (2) r & m / imm;0x84, 0x84, 0xA8, 0xA9, 0xF6 / 0, 0xF7 / 0
ПОДОЖДИТЕПодождите, пока не будет занятоОжидает, пока вывод BUSY # не станет неактивным (используется с блок с плавающей запятой )0x9B
XCHGОбмен даннымир :=: р/м; А спин-блокировка обычно использует xchg как атомная операция. (кома ошибка ).0x86, 0x87, 0x91… 0x97
XLATПеревод поиска по таблицеведет себя как MOV AL, [BX + AL]0xD7
XORЭксклюзивный или(1) г / м ^ = г / имм; (2) г ^ = м / имм;0x30… 0x35, 0x80… 0x81 / 6, 0x82… 0x83 / 6 (начиная с 80186)

Добавлено в конкретных процессорах

Добавлено с 80186 /80188

ИнструкцияСмыслЗаметки
СВЯЗАННЫЙПроверить индекс массива на соответствие границамвызывает программное прерывание 5, если тест не пройден
ВОЙТИВведите кадр стекаИзменяет стек для входа в процедуру для языка высокого уровня. Принимает два операнда: объем памяти, выделяемой в стеке, и уровень вложенности процедуры.
INSВвод из порта в строкуэквивалентно
В (E)ТОПОР, DXMOV ES:[(E)DI], (E)ТОПОР; отрегулируйте (E) DI в соответствии с размером операнда и DF
УЕХАТЬОставить кадр стекаОсвобождает локальное хранилище стека, созданное предыдущей инструкцией ENTER.
ВЫХОДЫСтрока вывода в портэквивалентно
MOV (E)ТОПОР, DS:[(E)SI]ВНЕ DX, (E)ТОПОР; отрегулируйте (E) SI в соответствии с размером операнда и DF
ПОПАИзвлечь из стека все регистры общего назначенияэквивалентно
Поп DIПоп SIПоп BPПоп ТОПОР ; здесь нет POP SP, все, что он делает, это ДОБАВИТЬ SP, 2 (поскольку AX будет перезаписан позже)Поп BXПоп DXПоп CXПоп ТОПОР
ПУШАПоместите все регистры общего назначения в стекэквивалентно
ОТ СЕБЯ ТОПОРОТ СЕБЯ CXОТ СЕБЯ DXОТ СЕБЯ BXОТ СЕБЯ SP ; Сохраненное значение является начальным значением SP.ОТ СЕБЯ BPОТ СЕБЯ SIОТ СЕБЯ DI
НАЖАТЬ немедленноНемедленно поместить значение байта / слова в стекэквивалентно
ОТ СЕБЯ 12чОТ СЕБЯ 1200 ч
IMUL немедленноЗнаковое умножение непосредственного значения байта / словаэквивалентно
IMUL BX,12чIMUL DX,1200 чIMUL CX, DX, 12чIMUL BX, SI, 1200 чIMUL DI, слово ptr [BX+SI], 12чIMUL SI, слово ptr [BP-4], 1200 ч
SHL / SHR / SAL / SAR / ROL / ROR / RCL / RCR немедленноПовернуть / сдвинуть биты с немедленным значением больше 1эквивалентно
ROL ТОПОР,3SHR BL,3

Добавлено с 80286

ИнструкцияСмыслЗаметки
ARPLНастроить поле RPL селектора
CLTSОчистить флаг переключения задачи в регистре CR0
LARЗагрузить байт прав доступа
LGDTЗагрузить глобальную таблицу дескрипторов
LIDTЗагрузить таблицу дескрипторов прерываний
LLDTЗагрузить локальную таблицу дескрипторов
LMSWЗагрузить слово состояния машины
ЗАГРУЗИТЬЗагрузить все регистры процессора, включая внутренние, такие как GDTНедокументированные, только 80286 и 80386
LSLОграничение сегмента нагрузки
LTRЗагрузить реестр задач
SGDTХранить глобальную таблицу дескрипторов
SIDTТаблица дескрипторов прерываний
SLDTХранить локальную таблицу дескрипторов
SMSWСлово состояния машины
STRРеестр задач магазина
VERRПроверить сегмент для чтения
VERWПроверить сегмент на запись

Добавлено с 80386

ИнструкцияСмыслЗаметки
BSFБитовое сканирование вперед
BSRБитовое сканирование в обратном направлении
BTБитовый тест
BTCБитовый тест и дополнение
БТРБитовый тест и сброс
BTSБитовый тест и установка
CDQПреобразование двойного слова в четверное словоЗнак - расширяет EAX в EDX, образуя четырехслово EDX: EAX. Поскольку (I) DIV использует EDX: EAX в качестве входных данных, CDQ должен вызываться после установки EAX, если EDX не инициализирован вручную (как при делении 64/32) перед (I) DIV.
CMPSDСравнить строковое двойное словоСравнивает ES: [(E) DI] с DS: [(E) SI] и увеличивает или уменьшает как (E) DI, так и (E) SI, в зависимости от DF; может иметь префикс REP
CWDEПреобразовать слово в двойное словоВ отличие от CWD, знак CWDE расширяет AX до EAX вместо AX до DX: AX
IBTSВставить битовую строкуснято с производства с шагом B1 80386
INSDВвод из порта в строковое двойное слово
IRETxВозврат прерывания; Суффикс D означает 32-битный возврат, суффикс F означает, что код эпилога не генерируется (т.е. инструкция LEAVE)Используйте IRETD вместо IRET в 32-битных ситуациях
JECXZПерейти, если ECX равен нулю
LFS, LGSЗагрузить дальний указатель
LSSСегмент стека нагрузки
LODSDЗагрузить двойное слово строкиEAX = * ES: EDI ± ±; (± ± зависит от DF, ES не может быть отменен); может иметь префикс REP
LOOPW, LOOPccWЦикл, условный циклТо же, что и LOOP, LOOPcc для более ранних процессоров
LOOPD, LOOPccDЦикл при равенствеесли (cc && --ECX) goto lbl;, cc = Z(эро), E(qual), NнаZэро N(на)E(квалификация)
MOV в / из CR / DR / TRПереход в / из специальных регистровCR = регистры управления, DR = регистры отладки, TR = тестовые регистры (до 80486)
МОВСДПереместить двойное слово строки* (двойное слово *) ES: EDI ± ± = * (двойное слово *) ESI ± ±; (± ± зависит от DF); может иметь префикс REP
MOVSXПеремещение со знаком-расширением(длинный) r = (знаковый символ) r / m; и подобные
MOVZXПеремещение с нулевым расширением(длинный) r = (unsigned char) r / m; и подобные
OUTSDВывод в порт из строкового двойного слова порт [DX] = * (long *) ESI ± ±; (± ± зависит от DF)
ПОПАДИзвлечь из стека все регистры двойного слова (32-битные)Не выталкивает регистр ESP из стека
ПОПФДВставить данные в регистр EFLAGS
ПУШАДПомещать все регистры двойного слова (32-битные) в стек
ПУШФДПоместить регистр EFLAGS в стек
SCASDДвойное слово данных строки сканированияСравнивает ES: [(E) DI] с EAX и увеличивает или уменьшает (E) DI, в зависимости от DF; может иметь префикс REP
SETccУстановить байт в единицу при условии, в противном случае - в ноль(SETA, SETAE, SETB, SETBE, SETC, SETE, SETG, SETGE, SETL, SETLE, SETNA, SETNAE, SETNB, SETNBE, SETNC, SETNE, SETNG, SETNGE, SETNL, SETNLE, SETNO, SETNP, SETNS, SETNZ, SETO, SETP, SETPE, SETPO, SETS, SETZ)
SHLDСдвиг влево двойное слово
SHRDСдвиг вправо двойное словоr1 = r1 >> CL ∣ r2 << (32-CL); Вместо CL можно использовать сразу 1
STOSDДвойное слово в строке* ES: EDI ± ± = EAX; (± ± зависит от DF, ES не может быть отменен); может иметь префикс REP
XBTSИзвлечь битовую строкуснято с производства с шагом B1 80386

Добавлено с 80486

ИнструкцияСмыслЗаметки
BSWAPОбмен байтамир = р<<24 | р<<8&0x00FF0000 | р>>8&0x0000FF00 | р>>24; Определен только для 32-битных регистров. Обычно используется для переключения между прямым порядком байтов и прямым порядком байтов. При использовании с 16-битными регистрами дает разные результаты на 486,[2] 586, и Bochs /QEMU.[3]
CMPXCHGАТОМНАЯ КОМПАРАТУРА И ОБСЛУЖИВАНИЕУвидеть Сравнить и обменять / на более поздних версиях 80386, как доступен недокументированный код операции
INVDАннулировать внутренние кешиОчистить внутренние кеши
INVLPGПризнать недействительным TLB ВходНедействительная запись TLB для страницы, содержащей указанные данные
WBINVDОбратная запись и недействительный кешЗаписывает все измененные строки кэша во внутреннем кэше процессора в основную память и делает недействительными внутренние кэши.
XADDОбмен и ДОБАВИТЬМеняет первый операнд вторым операндом, затем загружает сумму двух значений в операнд-адресат.

Добавлено с Pentium

ИнструкцияСмыслЗаметки
CPUIDИдентификация процессораВозвращает данные, касающиеся идентификации процессора и его функций, и возвращает данные в регистры EAX, EBX, ECX и EDX. Функции инструкций, указанные в регистре EAX.[1] Это также было добавлено позже 80486 процессоры
CMPXCHG8BСОПРЯЖЕНИЕ И ОБСЛУЖИВАНИЕ 8 байтовСравните EDX: EAX с m64. Если равно, установите ZF и загрузите ECX: EBX в m64. В противном случае очистите ZF и загрузите m64 в EDX: EAX.
RDMSRЧитать от Реестр для конкретной моделиЗагрузить MSR указано ECX в EDX: EAX
RDTSCСчетчик отметок времени ReaDВозвращает количество тактов процессора с тех пор, как процессор был "ОНЛАЙН" (с момента последнего включения системы).
WRMSRЗАПИСЬ в регистр конкретной моделиЗапишите значение в EDX: EAX в MSR указанный ECX
RSM[4]Возобновить из режима управления системойЭто было введено i386SL и позже и также находится в i486SL и позже. Резюме от Режим управления системой (SMM)

Добавлено с Pentium MMX

ИнструкцияСмыслЗаметки
RDPMCПрочтите PMC [счетчик мониторинга производительности]Указывается в регистре ECX в регистрах EDX: EAX

Также были добавлены регистры MMX и инструкции поддержки MMX. Их можно использовать как для операций с целыми числами, так и для операций с плавающей запятой, см. Ниже.

Добавлено с AMD K6

ИнструкцияСмыслЗаметки
SYSCALLфункционально эквивалентен SYSENTER
SYSRETфункционально эквивалентен SYSEXIT

AMD изменила бит определения CPUID для этой функции с K6-II.

Добавлено с Pentium Pro

ИнструкцияСмыслЗаметки
CMOVccУсловный ход(CMOVA, CMOVAE, CMOVB, CMOVBE, CMOVC, CMOVE, CMOVG, CMOVGE, CMOVL, CMOVLE, CMOVNA, CMOVNAE, CMOVNB, CMOVNBE, CMOVNC, CMOVNE, CMOVNG, CMOVNGE, CMOVNLOV, CMOVNLE, CMOVNO, CMOVNOV, CMOVNO , CMOVP, CMOVPE, CMOVPO, CMOVS, CMOVZ)
UD2Неопределенная инструкцияСоздает исключение недопустимого кода операции. Эта инструкция предназначена для тестирования программного обеспечения для явной генерации недопустимого кода операции. Код операции для этой инструкции зарезервирован для этой цели.

Добавлено с Pentium II

ИнструкцияСмыслЗаметки
SYSENTERSYStem вызов ENTERЭта инструкция, которую иногда называют инструкцией быстрого системного вызова, была предназначена для повышения производительности вызовов операционной системы. Обратите внимание, что на Pentium Pro CPUID Инструкция неверно сообщает об этих инструкциях как о наличии.
SYSEXITSYStem вызов EXIT

Добавлено с SSE

ИнструкцияКод операцииСмыслЗаметки
NOP г / м160F 1F / 0Многобайтовая инструкция бездействия.
NOP г / м32
PREFETCHT00F 18/1Предварительная выборка данных с адресаПредварительная выборка на всех уровнях кеша
PREFETCHT10F 18/2Предварительная выборка данных с адресаПредварительная выборка на всех уровнях кеша, ЗА ИСКЛЮЧЕНИЕМ[5][6] L1
PREFETCHT20F 18/3Предварительная выборка данных с адресаПредварительная выборка во все уровни кеша, ЗА ИСКЛЮЧЕНИЕМ L1 и L2
PREFETCHNTA0F 18/0Предварительная выборка данных с адресаПредварительная выборка в невременную структуру кеша, сводя к минимуму загрязнение кеша.
SFENCE0F AE F8Магазин ЗаборПодсказка процессора, чтобы убедиться, что все операции хранилища, которые имели место до вызова SFENCE, видны глобально

Добавлено с SSE2

ИнструкцияКод операцииСмыслЗаметки
CLFLUSH m80F AE / 7Очистка строки кэшаДелает недействительной строку кэша, содержащую линейный адрес, указанный в исходном операнде со всех уровней иерархии кэша процессора.
LFENCE0F AE E8Загрузить заборСериализует операции загрузки.
MFENCE0F AE F0Забор ПамятиВыполняет операцию сериализации для всех инструкций загрузки и сохранения, которые были выданы до инструкции MFENCE.
МОВНТИ м32, р320F C3 / rПереместить двойное слово вне времениПереместите двойное слово из r32 в m32, минимизируя загрязнение иерархии кеша.
ПАУЗАF3 90Подсказка Spin LoopДает подсказку процессору, что следующий код является циклом вращения, для кэшируемости

Добавлено с SSE3

ИнструкцияСмыслЗаметки
МОНИТОР EAX, ECX, EDXНастройка адреса монитораУстанавливает линейный диапазон адресов для аппаратного контроля и активирует монитор.
MWAIT EAX, ECXМонитор ПодождитеПодсказка процессора для остановки выполнения инструкций и перехода в оптимизированное состояние, зависящее от реализации, до возникновения класса событий.

Добавлено с SSE4.2

ИнструкцияКод операцииСмыслЗаметки
CRC32 r32, r / m8F2 0F 38 F0 / rНакопить CRC32Вычисляет CRC значение с использованием полинома CRC-32C (Кастаньоли) 0x11EDC6F41 (нормальная форма 0x1EDC6F41). Это полином, используемый в iSCSI. В отличие от более популярного, используемого в Ethernet, его четность является четной, и поэтому он может обнаруживать любую ошибку с нечетным количеством измененных битов.
CRC32 r32, r / m8F2 REX 0F 38 F0 / r
CRC32 r32, r / m16F2 0F 38 F1 / r
CRC32 r32, r / m32F2 0F 38 F1 / r
CRC32 r64, r / m8F2 REX.W 0F 38 F0 / r
CRC32 r64, r / m64F2 REX.W 0F 38 F1 / r
CRC32 r32, r / m8F2 0F 38 F0 / r

Добавлено с x86-64

ИнструкцияСмыслЗаметки
CDQEЗнак расширить EAX в RAX
CQOЗнак расширить RAX в RDX: RAX
CMPSQCoMPare String Quadword
CMPXCHG16BСОПРЯЖЕНИЕ И ОБСЛУЖИВАНИЕ 16 Байт
IRETQ64-битный возврат из прерывания
JRCXZПерейти, если RCX равен нулю
LODSQLoaD String Quadword
MOVSXDMOV с Sign Extend с 32-разрядной до 64-разрядной версии
POPFQPOP RFLAGS Реестр
PUSHFQPUSH RFLAGS Реестр
RDTSCPСчетчик отметок времени ReaD и идентификатор процессора
SCASQSCAn String Quadword
STOSQSTOre String Quadword
СВОПЫОбменять базу GS с KernelGSBase MSR

Добавлено с AMD-V

ИнструкцияСмыслЗаметкиКод операции
CLGIОчистить глобальный флаг прерыванияОчищает GIF0x0F 0x01 0xDD
INVLPGAНедействительная запись TLB в указанном ASIDДелает недействительным сопоставление TLB для виртуальной страницы, указанной в RAX, и ASID, указанного в ECX.0x0F 0x01 0xDF
MOV (CRn)Переход к регистрам управления или из нихПеремещает 32- или 64-битное содержимое в регистр управления и наоборот.0x0F 0x22 или 0x0F 0x20
MOV (DRn)Переход к регистрам отладки или из нихПеремещает 32- или 64-битное содержимое в регистр управления и наоборот.0x0F 0x21 или 0x0F 0x23
СКИНИТБезопасный запуск и переход с аттестациейПоддающийся проверке запуск надежного программного обеспечения на основе безопасного сравнения хэшей0x0F 0x01 0xDE
СТГИУстановить глобальный флаг прерыванияУстанавливает GIF.0x0F 0x01 0xDC
VMLOADСостояние загрузки из VMCBЗагружает подмножество состояния процессора из VMCB, указанного физическим адресом в регистре RAX.0x0F 0x01 0xDA
VMMCALLВызов VMMИспользуется исключительно для связи с VMM0x0F 0x01 0xD9
VMRUNЗапустить виртуальную машинуВыполняет переключение на гостевую ОС.0x0F 0x01 0xD8
VMSAVEСохранить состояние в VMCBСохраняет дополнительное гостевое состояние в VMCB.0x0F 0x01 0xDB

Добавлено с Intel VT-x

ИнструкцияСмыслЗаметкиКод операции
ИНВЕПТНедействительные переводы, полученные из EPTДелает недействительными записи, производные от EPT, в TLB и кэшах структуры подкачки.0x66 0x0F 0x38 0x80
INVVPIDНедействительный перевод на основе VPIDДелает недействительными записи в TLB и кэшах структуры подкачки на основе VPID.0x66 0x0F 0x38 0x80
VMFUNCВызов функции ВМВызов функции VM, указанной в EAX.0x0F 0x01 0xD4
VMPTRLDУказатель нагрузки на структуру управления виртуальной машинойЗагружает текущий указатель VMCS из памяти.0x0F 0xC7 / 6
VMPTRSTУказатель хранилища на структуру управления виртуальной машинойСохраняет указатель current-VMCS в указанный адрес памяти. Операнд этой инструкции всегда 64-битный и всегда находится в памяти.0x0F 0xC7 / 7
VMCLEARЧеткая структура управления виртуальной машинойЗаписывает любые кэшированные данные в VMCS0x66 0x0F 0xC7 / 6
VMREADЧтение поля из управляющей структуры виртуальной машиныСчитывает поле в VMCS0x0F 0x78
VMWRITEЗапись поля в структуру управления виртуальной машинойИзменяет поле в VMCS0x0F 0x79
VMCALLВызов монитора ВМВызывает функцию монитора ВМ из гостевой системы0x0F 0x01 0xC1
VMLAUNCHЗапустить виртуальную машинуЗапустить виртуальную машину под управлением текущей VMCS0x0F 0x01 0xC2
VMRESUMEВозобновить виртуальную машинуВозобновить виртуальную машину под управлением текущей VMCS0x0F 0x01 0xC3
VMXOFFВыйти из работы VMXОстанавливает аппаратно поддерживаемую среду виртуализации0x0F 0x01 0xC4
VMXONВойдите в операцию VMXПереход в среду виртуализации с аппаратной поддержкой0xF3 0x0F 0xC7 / 6

Добавлено с ПРО

LZCNT, POPCNT (POPulation CouNT) - расширенная обработка битов

Добавлено с ИМТ1

ANDN, BEXTR, BLSI, BLSMSK, BLSR, TZCNT

Добавлено с ИМТ2

BZHI, MULX, PDEP, PEXT, RORX, SARX, SHRX, SHLX

Добавлено с TBM

AMD представила TBM вместе с BMI1 в своем Копер[7] линейка процессоров; более поздние процессоры AMD Jaguar и Zen не поддерживают TBM.[8] Ни один из процессоров Intel (по состоянию на 2020 год) не поддерживает TBM.

ИнструкцияОписание[9]Эквивалентное выражение C[10]
BEXTRИзвлечение битового поля (с немедленным)(src >> начало) & ((1 << len) - 1)
BLCFILLЗаполните с самого нижнего битах & (х + 1)
BLCIИзолировать самый низкий битх | ~ (х + 1)
BLCICИзолировать самый низкий бит и дополнить~ х & (х + 1)
BLCMSKМаска от самого низкого битах ^ (х + 1)
BLCSУстановить самый низкий бит очистких | (х + 1)
BLSFILLЗаполните с самого низкого установленного битах | (х - 1)
BLSICИзолировать младший установленный бит и дополнить~ x | (х - 1)
T1MSKCОбратная маска от замыкающих~ x | (х + 1)
ТЗМСКМаска из конечных нулей~ х & (х - 1)

Добавлено с Набор инструкций CLMUL

ИнструкцияКод операцииОписание
PCLMULQDQ xmmreg, xmmrm, imm66 0f 3a 44 / r ibПроизвести умножение без переноса двух 64-битных многочленов над конечным полем GF(2k).
PCLMULLQLQDQ xmmreg, xmmrm66 0f 3a 44 / r 00Умножьте младшие половины двух регистров.
PCLMULHQLQDQ xmmreg, xmmrm66 0f 3a 44 / r 01Умножьте старшую половину целевого регистра на младшую половину исходного регистра.
PCLMULLQHQDQ xmmreg, xmmrm66 0f 3a 44 / r 10Умножьте младшую половину регистра назначения на старшую половину исходного регистра.
PCLMULHQHQDQ xmmreg, xmmrm66 0f 3a 44 / r 11Умножьте старшие половины двух регистров.

Добавлено с Intel ADX

ИнструкцияОписание
ADCXДобавляет два целых числа без знака плюс перенос, считывая перенос из флага переноса и при необходимости устанавливая его там. Не влияет на другие флаги, кроме переноса.
ADOXДобавляет два целых числа без знака плюс перенос, считывая перенос из флага переполнения и при необходимости устанавливая его там. Не влияет на другие флаги, кроме переполнения.

x87 инструкции с плавающей запятой

Оригинал 8087 инструкции

ИнструкцияСмыслЗаметки
F2XM1точнее, чем для Икс близко к нулю
FABSАбсолютная величина
FADDДобавить
FADDPДобавить и поп
FBLDЗагрузить BCD
FBSTPХранить BCD и pop
FCHSИзменить знак
FCLEXОчистить исключения
FCOMСравнить
FCOMPСравните и поп
FCOMPPСравните и нажмите дважды
FDECSTPУменьшить указатель стека с плавающей запятой
FDISIОтключить прерыванияТолько 8087, иначе FNOP
FDIVДелитьОшибка Pentium FDIV
FDIVPРазделить и поп
FDIVRРазделить наоборот
FDIVRPРазделить перевернутый и поп
FENIРазрешить прерыванияТолько 8087, иначе FNOP
БЕСПЛАТНОБесплатная регистрация
FIADDЦелочисленное сложение
FICOMЦелочисленное сравнение
FICOMPЦелочисленное сравнение и поп
ФИДИВЦелочисленное деление
ФИДИВРЦелочисленное деление перевернуто
FILDЗагрузить целое число
ФИМУЛЦелочисленное умножение
FINCSTPУвеличить указатель стека с плавающей запятой
FINITИнициализировать процессор с плавающей запятой
КулакЦелое число магазина
FISTPЦелочисленное и поп
FISUBЦелочисленное вычитание
FISUBRОбратное целочисленное вычитание
FLDНагрузка с плавающей запятой
FLD1Загрузить 1.0 в стек
FLDCWСлово управления нагрузкой
FLDENVЗагрузить состояние среды
FLDENVWСостояние среды загрузки, 16 бит
FLDL2EЗагрузить журнал2(е) в стек
FLDL2TЗагрузить журнал2(10) в стек
FLDLG2Загрузить журнал10(2) в стек
FLDLN2Загрузить пер (2) в стек
FLDPIЗагрузить π в стек
ФЛДЗЗагрузить 0,0 в стек
FMULУмножить
FMULPУмножить и поп
FNCLEXУдалите исключения, не ждите
FNDISIОтключить прерывания, не ждатьТолько 8087, иначе FNOP
FNENIРазрешить прерывания, не ждатьТолько 8087, иначе FNOP
FNINITИнициализировать процессор с плавающей запятой, без ожидания
FNOPНет операции
FNSAVEСохранение состояния FPU, без ожидания, 8 бит
FNSAVEWСохранение состояния FPU, без ожидания, 16 бит
FNSTCWУправляющее слово магазина, не ждите
FNSTENVХраните среду FPU, не ждите
FNSTENVWХранить среду FPU, не ждать, 16-бит
FNSTSWСлово состояния магазина, не ждите
FPATANЧастичный арктангенс
ФПРЕМЧастичный остаток
FPTANЧастичная касательная
FRNDINTОкруглить до целого числа
FRSTORВосстановить сохраненное состояние
FRSTORWВосстановить сохраненное состояниеВозможно, на самом деле недоступен в 8087
FSAVEСохранить состояние FPU
FSAVEWСохранить состояние FPU, 16 бит
FSCALEМасштабировать в 2 раза
FSQRTКвадратный корень
FSTМагазин с плавающей запятой
FSTCWУправляющее слово магазина
FSTENVХранить среду FPU
FSTENVWХранить среду FPU, 16 бит
FSTPМагазин и поп
FSTSWСлово состояния магазина
FSUBВычесть
ФСУБПВычесть и поп
ФСУБРОбратное вычитание
ФСУБРПОбратное вычитание и поп
FTSTТест на ноль
FWAITПодождите, пока выполняется FPU
FXAMПроверить флаги условий
FXCHБиржевые регистры
FXTRACTИзвлечь экспоненту и мантиссу
FYL2Xу · журнал2 Иксесли у = журналб 2, то база-б логарифм вычисляется
FYL2XP1у · журнал2 (Икс+1)точнее, чем журнал2 z если x близко к нулю

Добавлено в конкретных процессорах

Добавлено с 80287

ИнструкцияСмыслЗаметки
FSETPMУстановить защищенный режимТолько 80287, иначе FNOP

Добавлено с 80387

ИнструкцияСмыслЗаметки
FCOSКосинус
ФЛДЕНВДСостояние загрузки среды, 32-бит
FSAVEDСохранить состояние FPU, 32-бит
FPREM1Частичный остатокВычисляет остаток IEEE
FRSTORDВосстановить сохраненное состояние, 32-бит
ФСИНСинус
ФСИНКОССинус и косинус
ФСТЕНВДСреда Store FPU, 32-битная
FUCOMНеупорядоченное сравнение
FUCOMPНеупорядоченное сравнение и поп
FUCOMPPНеупорядоченное сравнение и два раза

Добавлено с Pentium Pro

  • FCMOV варианты: FCMOVB, FCMOVBE, FCMOVE, FCMOVNB, FCMOVNBE, FCMOVNE, FCMOVNU, FCMOVU
  • FCOMI варианты: FCOMI, FCOMIP, FUCOMI, FUCOMIP

Добавлено с SSE

FXRSTOR, FXSAVE

Они также поддерживаются более поздними версиями Pentium II, которые не содержат поддержки SSE.

Добавлено с SSE3

FISTTP (преобразование x87 в целое число с усечением независимо от слова состояния)

SIMD инструкции

MMX инструкции

Команды MMX работают с регистрами mm, которые имеют ширину 64 бита. Они используются совместно с регистрами FPU.

Оригинальные инструкции MMX

Добавлено с Pentium MMX

ИнструкцияКод операцииСмыслЗаметки
EMMS0F 77Пустое состояние технологии MMXПомечает все регистры x87 FPU для использования FPU
МОВД мм, об / м 320F 6E / rПереместить двойное слово
МОВД r / m32, мм0F 7E / rПереместить двойное слово
MOVQ мм / м64, мм0F 7F / rПереместить четверное слово
MOVQ мм, мм / м 640F 6F / rПереместить четверное слово
MOVQ мм, об / м 64REX.W + 0F 6E / rПереместить четверное слово
MOVQ r / m64, ммREX.W + 0F 7E / rПереместить четверное слово
PACKSSDW мм1, мм2 / м640F 6B / rУпаковать двойные слова в слова (подписанные насыщенностью)
PACKSSWB мм1, мм2 / м640F 63 / rУпаковать слова в байты (подписанные насыщением)
PACKUSWB мм, мм / м 640F 67 / rУпаковать слова в байты (без знака с насыщением)
PADDB мм, мм / м 640F FC / rДобавить упакованные байтовые целые числа
PADDW мм, мм / м 640F FD / rДобавить упакованные целые слова
PADDD мм, мм / м 640F FE / rДобавить упакованные целые числа с двойным словом
PADDQ мм, мм / м 640F D4 / rДобавить упакованные целые числа четверного слова
PADDSB мм, мм / м 640F EC / rДобавить упакованные байтовые целые числа со знаком и насыщать
PADDSW мм, мм / м 640F ED / гДобавить упакованные целые числа со знаком и заполнить
PADDUSB мм, мм / м 640F DC / rДобавить упакованные байтовые целые числа без знака и насыщать
PADDUSW мм, мм / м 640F ДД / гДобавить упакованные целые числа без знака и насыщать
PAND мм, мм / м 640F DB / rПобитовое И
PANDN мм, мм / м 640F DF / rПобитовое И НЕ
POR мм, мм / м 640F EB / rПобитовое ИЛИ
PXOR мм, мм / м 640F EF / rПобитовое исключающее ИЛИ
PCMPEQB мм, мм / м640F 74 / гСравните упакованные байты на предмет равенства
PCMPEQW мм, мм / м640F 75 / rСравните упакованные слова на предмет равенства
PCMPEQD мм, мм / м640F 76 / rСравните упакованные двойные слова на предмет равенства
PCMPGTB мм, мм / м 640F 64 / rСравните упакованные байтовые целые числа со знаком больше чем
PCMPGTW мм, мм / м640F 65 / rСравните упакованные целые числа со знаком слова больше чем
PCMPGTD мм, мм / м 640F 66 / rСравните упакованные целые числа двойного слова со знаком больше чем
PMADDWD мм, мм / м 640F F5 / rУмножение упакованных слов, добавление смежных двойных слов результатов
PMULHW мм, мм / м 640F E5 / rУмножение упакованных целых чисел со знаком, сохранение старших 16 бит результатов
PMULLW мм, мм / м 640F D5 / rУмножить упакованные целые числа со знаком слова, сохранить младшие 16 бит результатов
PSLLW мм1, imm80F 71/6 ibСдвиг влево слова, сдвиг по нулям
PSLLW мм, мм / м 640F F1 / rСдвиг влево слова, сдвиг по нулям
PSLLD мм, imm80F 72/6 ibСдвиг влево двойных слов, сдвиг нулей
PSLLD мм, мм / м 640F F2 / rСдвиг влево двойных слов, сдвиг нулей
PSLLQ мм, imm80F 73/6 ibСдвиг влево четверное слово, сдвиг нулей
PSLLQ мм, мм / м 640F F3 / rСдвиг влево четверное слово, сдвиг нулей
PSRAD мм, imm80F 72/4 ibСдвиг вправо двойных слов, сдвиг в знаковых битах
ПСРАД мм, мм / м 640F E2 / rСдвиг вправо двойных слов, сдвиг в знаковых битах
PSRAW мм, imm80F 71/4 ibСдвиг правых слов, сдвиг знаковых битов
PSRAW мм, мм / м 640F E1 / rСдвиг правых слов, сдвиг знаковых битов
PSRLW мм, imm80F 71/2 ibСдвиг правых слов, сдвиг нулей
PSRLW мм, мм / м 640F D1 / rСдвиг правых слов, сдвиг нулей
ПСРЛД мм, imm80F 72/2 ibСдвиг двойных слов вправо, сдвиг нулей
ПСРЛД мм, мм / м 640F D2 / rСдвиг двойных слов вправо, сдвиг нулей
PSRLQ мм, imm80F 73/2 ibСдвиг правого четверного слова, сдвиг нулей
ПСРЛК мм, мм / м 640F D3 / rСдвиг правого четверного слова, сдвиг нулей
PSUBB мм, мм / м 640F F8 / rВычесть упакованные байтовые целые числа
PSUBW мм, мм / м 640F F9 / rВычесть целые числа упакованных слов
ПСУБД мм, мм / м 640F FA / rВычесть упакованные целые числа двойного слова
ПСУБСБ мм, мм / м 640F E8 / rВычесть подписанные упакованные байты с насыщением
PSUBSW мм, мм / м 640F E9 / rВычесть подписанные упакованные слова с насыщением
PSUBUSB мм, мм / м 640F D8 / rВычесть упакованные байты без знака с насыщением
PSUBUSW мм, мм / м 640F D9 / rВычесть упакованные слова без знака с насыщением
PUNPCKHBW мм, мм / м 640F 68 / rРаспаковывать и чередовать старшие байты
PUNPCKHWD мм, мм / м640F 69 / rРаспаковывать и чередовать слова высокого порядка
PUNPCKHDQ мм, мм / м 640F 6A / rРаспаковывать и чередовать двойные слова высокого порядка
PUNPCKLBW мм, мм / м320F 60 / rРаспаковывать и чередовать младшие байты
PUNPCKLWD мм, мм / м320F 61 / гРаспаковывать и чередовать младшие слова
PUNPCKLDQ мм, мм / м320F 62 / rРаспаковывать и чередовать двойные слова младшего разряда

Инструкции MMX добавлены в определенные процессоры

EMMI инструкции

Добавлено с 6x86MX от Cyrix, сейчас не рекомендуется

PAVEB, PADDSIW, PMAGW, PDISTIB, PSUBSIW, PMVZB, PMULHRW, PMVNZB, PMVLZB, PMVGEZB, PMULHRIW, PMACHRIW

Инструкции MMX добавлены с MMX + и SSE

Следующая инструкция MMX была добавлена ​​с SSE. Они также доступны на Athlon под названием MMX +.

ИнструкцияКод операцииСмысл
MASKMOVQ мм1, мм20F F7 / rЗамаскированный ход квадворда
MOVNTQ m64, мм0F E7 / rПеремещение четверного слова с помощью вневременной подсказки
PSHUFW мм1, мм2 / м64, imm80F 70 / r ibПеремешать упакованные слова
PINSRW мм, r32 / m16, imm80F C4 / rВставить слово
PEXTRW reg, мм, imm80F C5 / rИзвлечь слово
ПМОВМСКБ рег, мм0F D7 / rПереместить байтовую маску
PMINUB мм1, мм2 / м640F DA / rМинимум упакованных беззнаковых байтовых целых чисел
PMAXUB мм1, мм2 / м640F DE / rМаксимальное количество упакованных беззнаковых байтовых целых чисел
PAVGB мм1, мм2 / м640F E0 / rСредние упакованные целые числа
PAVGW мм1, мм2 / м640F E3 / rСредние упакованные целые числа
PMULHUW мм1, мм2 / м640F E4 / rУмножение упакованных беззнаковых целых чисел и сохранение высокого результата
PMINSW мм1, мм2 / м640F EA / rМинимум упакованных целых чисел со знаком со знаком
PMAXSW мм1, мм2 / м640F EE / rМаксимум упакованных целых чисел со знаком со знаком
PSADBW мм1, мм2 / м640F F6 / rВычислить сумму абсолютных разностей
Инструкции MMX добавлены с SSE2

Следующие инструкции MMX были добавлены с SSE2:

ИнструкцияКод операцииСмысл
PSUBQ мм1, мм2 / м640F FB / rВычесть четверное слово целое
PMULUDQ мм1, мм2 / м640F F4 / rУмножение беззнакового двойного слова на целое
Инструкции MMX добавлены с SSSE3
ИнструкцияКод операцииСмысл
PSIGNB мм1, мм2 / м640F 38 08 / гОтрицать / обнулять / сохранять упакованные байтовые целые числа в зависимости от соответствующего знака
PSIGNW мм1, мм2 / м640F 38 09 / гОтрицать / обнулять / сохранять целые числа в сжатом виде в зависимости от соответствующего знака
PSIGND мм1, мм2 / м640F 38 0A / гОтрицать / обнулять / сохранять упакованные целые числа двойного слова в зависимости от соответствующего знака
ПШУФБ мм1, мм2 / м640F 38 00 / гПеремешать байты
PMULHRSW мм1, мм2 / м640F 38 0B / rУмножение 16-битных слов со знаком, масштабирование и округление двойных слов со знаком, упаковка старших 16 бит
PMADDUBSW мм1, мм2 / м640F 38 04 / гУмножение подписанных и беззнаковых байтов, добавление горизонтальной пары подписанных слов, упаковка насыщенных подписанных слов
PHSUBW мм1, мм2 / м640F 38 05 / гВычесть и упаковать 16-битные целые числа со знаком по горизонтали
PHSUBSW мм1, мм2 / м640F 38 07 / rВычесть и упаковать 16-битное целое число со знаком по горизонтали с насыщением
PHSUBD мм1, мм2 / м640F 38 06 / rВычесть и упаковать 32-разрядные целые числа со знаком по горизонтали
PHADDSW мм1, мм2 / м640F 38 03 / гСложите и упакуйте 16-разрядные целые числа со знаком по горизонтали, упакуйте насыщенные целые числа в мм1.
PHADDW мм1, мм2 / м640F 38 01 / гСложить и упаковать 16-битные целые числа по горизонтали
PHADDD мм1, мм2 / м640F 38 02 / гСложить и упаковать 32-битные целые числа по горизонтали
PALIGNR мм1, мм2 / м64, imm80F 3A 0F / r ibОбъединить целевые и исходные операнды, извлечь результат, выровненный по байтам, смещенный вправо
ПАБСБ мм1, мм2 / м640F 38 1C / rВычислить абсолютное значение байтов и сохранить результат без знака
PABSW мм1, мм2 / м640F 38 1D / rВычислить абсолютное значение 16-битных целых чисел и сохранить результат без знака
ПАБСД мм1, мм2 / м640F 38 1E / rВычислить абсолютное значение 32-битных целых чисел и сохранить результат без знака

3DNow! инструкции

Добавлено с К6-2

FEMMS, PAVGUSB, PF2ID, PFACC, PFADD, PFCMPEQ, PFCMPGE, PFCMPGT, PFMAX, PFMIN, PFMUL, PFRCP, PFRCPIT1, PFRCPIT2, PFRSQIT1, PFRSQRT, PFSUB, PIETCHWFSW, PFRSQRT, PFSUB, PFRFWF

3DNow! + Инструкция

Добавлено с Athlon и К6-2 +

PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD

Добавлено с Geode GX

PFRSQRTV, PFRCPV

SSE инструкции

Добавлено с Pentium III

Инструкции SSE работают с регистрами xmm, ширина которых составляет 128 бит.

SSE состоит из следующих инструкций с плавающей запятой SSE SIMD:

ИнструкцияКод операцииСмысл
ANDPS * xmm1, xmm2 / m1280F 54 / rПобитовое логическое И упакованных значений с плавающей запятой одинарной точности
ANDNPS * xmm1, xmm2 / m1280F 55 / rПобитовая логика, а не упакованные значения с плавающей запятой одинарной точности
ORPS * xmm1, xmm2 / m1280F 56 / rПобитовое логическое ИЛИ значений с плавающей запятой одинарной точности
XORPS * xmm1, xmm2 / m1280F 57 / rПобитовое логическое исключающее ИЛИ для значений с плавающей запятой одинарной точности
MOVUPS xmm1, xmm2 / m1280F 10 / гПеремещение невыровненных упакованных значений с плавающей запятой одинарной точности
MOVSS xmm1, xmm2 / m32F3 0F 10 / гПеремещение скалярных значений с плавающей запятой одинарной точности
MOVUPS xmm2 / m128, xmm10F 11 / rПеремещение невыровненных упакованных значений с плавающей запятой одинарной точности
MOVSS xmm2 / m32, xmm1F3 0F 11 / rПеремещение скалярных значений с плавающей запятой одинарной точности
MOVLPS xmm, m640F 12 / rПеремещение значений с плавающей запятой одинарной точности с низкой упаковкой
MOVHLPS xmm1, xmm20F 12 / rПеремещение упакованных значений с плавающей запятой одинарной точности от высокого к низкому
MOVLPS m64, x мм0F 13 / rПеремещение значений с плавающей запятой одинарной точности с низкой упаковкой
UNPCKLPS xmm1, xmm2 / m1280F 14 / rРаспаковка и чередование значений с плавающей запятой одинарной точности с низкой упаковкой
UNPCKHPS xmm1, xmm2 / m1280F 15 / rРаспаковка и чередование упакованных значений с плавающей запятой одинарной точности
MOVHPS xmm, m640F 16 / rПеремещение значений с плавающей запятой одинарной точности с высокой степенью упаковки
MOVLHPS xmm1, xmm20F 16 / rПеремещение упакованных значений с плавающей запятой одинарной точности от меньшего к большему
MOVHPS m64, xмм0F 17 / rПеремещение значений с плавающей запятой одинарной точности с высокой степенью упаковки
MOVAPS xmm1, xmm2 / m1280F 28 / rПеремещение выровненных упакованных значений с плавающей запятой одинарной точности
MOVAPS xmm2 / m128, xmm10F 29 / rПеремещение выровненных упакованных значений с плавающей запятой одинарной точности
MOVNTPS m128, xmm10F 2B / rMove Aligned Four Packed Single-FP Non Temporal
MOVMSKPS reg, xmm0F 50 / гИзвлечь упакованную 4-битную маску знака с плавающей запятой одинарной точности. Старшие биты регистра заполнены нулями.
CVTPI2PS xmm, мм / м640F 2A / rПреобразование упакованных целых двойных слов в упакованные значения FP с одинарной точностью
CVTSI2SS xmm, r / m32F3 0F 2A / rПреобразование целого двойного слова в скалярное значение FP с одинарной точностью
CVTSI2SS xmm, r / m64F3 REX.W 0F 2A / rПреобразование целого числа Qword в скалярное значение FP с одинарной точностью
MOVNTPS m128, xмм0F 2B / rСохранение упакованных значений с плавающей запятой одинарной точности с использованием вневременных подсказок
CVTTPS2PI мм, xмм / м640F 2C / rПреобразование с усечением упакованных значений FP одинарной точности в упакованные целые числа двойного слова
CVTTSS2SI r32, мм / м32F3 0F 2C / rПреобразование со скалярным значением FP одинарной точности с усечением в целое число двойного слова
CVTTSS2SI r64, мм1 / м32F3 REX.W 0F 2C / rПреобразование с усечением скалярного значения FP с одинарной точностью в целое число Qword
CVTPS2PI мм, xмм / м640F 2D / rПреобразование упакованных значений FP с одинарной точностью в упакованные целые числа двойного слова
CVTSS2SI r32, мм / м32F3 0F 2D / rПреобразование скалярного значения FP с одинарной точностью в целое число двойного слова
CVTSS2SI r64, мм1 / м32F3 REX.W 0F 2D / rПреобразование скалярного значения FP одинарной точности в целое число Qword
UCOMISS xmm1, xmm2 / m320F 2E / rНеупорядоченное сравнение скалярных значений с плавающей запятой одинарной точности и установка EFLAGS
КОМИССЫ xmm1, xmm2 / m320F 2F / rСравните скалярные упорядоченные значения с плавающей запятой одинарной точности и установите EFLAGS
SQRTPS xmm1, xmm2 / m1280F 51 / rВычисление квадратного корня из упакованных значений с плавающей запятой одинарной точности
SQRTSS xmm1, xmm2 / m32F3 0F 51 / гВычислить квадратный корень из скалярного значения с плавающей запятой одинарной точности
RSQRTPS xmm1, xmm2 / m1280F 52 / rВычисление обратного квадратного корня упакованного значения с плавающей запятой одинарной точности
RSQRTSS xmm1, xmm2 / m32F3 0F 52 / гВычислить обратную величину квадратного корня скалярного значения с плавающей запятой одинарной точности
RCPPS xmm1, xmm2 / m1280F 53 / гВычисление взаимных значений упакованных значений с плавающей запятой одинарной точности
RCPSS xmm1, xmm2 / m32F3 0F 53 / гВычисление обратных значений скалярных значений с плавающей запятой одинарной точности
ADDPS xmm1, xmm2 / m1280F 58 / rДобавление упакованных значений с плавающей запятой одинарной точности
ADDSS xmm1, xmm2 / m32F3 0F 58 / rДобавление скалярных значений с плавающей запятой одинарной точности
МУЛЬПЫ xmm1, xmm2 / m1280F 59 / rМногократно упакованные значения с плавающей запятой одинарной точности
MULSS xmm1, xmm2 / m32F3 0F 59 / rУмножение скалярных значений с плавающей запятой одинарной точности
SUBPS xmm1, xmm2 / m1280F 5C / rВычитание упакованных значений с плавающей запятой одинарной точности
SUBSS xmm1, xmm2 / m32F3 0F 5C / rВычесть скалярные значения с плавающей запятой одинарной точности
MINPS xmm1, xmm2 / m1280F 5D / rВозврат минимально упакованных значений с плавающей запятой одинарной точности
MINSS xmm1, xmm2 / m32F3 0F 5D / rВозвращает минимальные скалярные значения с плавающей запятой одинарной точности
DIVPS xmm1, xmm2 / m1280F 5E / rРазделение упакованных значений с плавающей запятой одинарной точности
DIVSS xmm1, xmm2 / m32F3 0F 5E / rРазделение скалярных значений с плавающей запятой одинарной точности
MAXPS x мм1, x мм2 / м 1280F 5F / rВозврат максимальных упакованных значений с плавающей запятой одинарной точности
MAXSS xmm1, xmm2 / m32F3 0F 5F / rВозвращает максимальные скалярные значения с плавающей запятой одинарной точности
LDMXCSR m320F AE / 2Загрузить состояние регистра MXCSR
STMXCSR m320F AE / 3Сохранить состояние регистра MXCSR
CMPPS xmm1, xmm2 / m128, imm80F C2 / r ibСравните упакованные значения с плавающей запятой одинарной точности
CMPSS xmm1, xmm2 / m32, imm8F3 0F C2 / r ibСравните скалярные значения с плавающей запятой одинарной точности
ШУФПС xmm1, xmm2 / m128, imm80F C6 / r ibПеремешать упакованные значения с плавающей запятой одинарной точности
  • Одинарные побитовые операции с плавающей запятой ANDPS, ANDNPS, ORPS и XORPS дают тот же результат, что и целые числа SSE2 (PAND, PANDN, POR, PXOR) и двойные (ANDPD, ANDNPD, ORPD, XORPD), но могут привести к дополнительной задержке для домена изменяется при применении значений неправильного типа.[11]

SSE2 инструкции

Добавлено с Pentium 4

SSE2 SIMD инструкции с плавающей запятой

Инструкции по перемещению данных SSE2
ИнструкцияКод операцииСмысл
MOVAPD xmm1, xmm2 / m12866 0F 28 / rПеремещение выровненных упакованных значений с плавающей запятой двойной точности
MOVAPD x мм2 / м 128, x мм166 0F 29 / rПеремещение выровненных упакованных значений с плавающей запятой двойной точности
MOVNTPD m128, xmm166 0F 2B / rСохранение упакованных значений с плавающей запятой двойной точности с помощью вневременных подсказок
МОВХПД xmm1, m6466 0F 16 / rПеремещение высокоупакованного значения с плавающей запятой двойной точности
MOVHPD m64, xmm166 0F 17 / rПеремещение высокоупакованного значения с плавающей запятой двойной точности
MOVLPD xmm1, m6466 0F 12 / rПереместить низкоупакованное значение с плавающей запятой двойной точности
MOVLPD m64, xmm166 0F 13 / rПереместить низкоупакованное значение с плавающей запятой двойной точности
MOVUPD xmm1, xmm2 / m12866 0F 10 / гПеремещение невыровненных упакованных значений с плавающей запятой двойной точности
MOVUPD xmm2 / m128, xmm166 0F 11 / rПеремещение невыровненных упакованных значений с плавающей запятой двойной точности
MOVMSKPD reg, xmm66 0F 50 / рЭкстракт упакованной маски знака с плавающей запятой двойной точности
MOVSD * xmm1, xmm2 / m64F2 0F 10 / гПеремещение или объединение скалярных значений с плавающей запятой двойной точности
MOVSD xmm1 / m64, xmm2F2 0F 11 / rПеремещение или объединение скалярных значений с плавающей запятой двойной точности
Упакованные арифметические инструкции SSE2
ИнструкцияКод операцииСмысл
ADDPD xmm1, xmm2 / m12866 0F 58 / rДобавление упакованных значений с плавающей запятой двойной точности
ADDSD xmm1, xmm2 / m64F2 0F 58 / rДобавить низкое значение с плавающей запятой двойной точности
DIVPD xmm1, xmm2 / m12866 0F 5E / rРазделение упакованных значений с плавающей запятой двойной точности
DIVSD xmm1, xmm2 / m64F2 0F 5E / rРазделить скалярное значение с плавающей запятой двойной точности
MAXPD x мм1, x мм2 / м 12866 0F 5F / rМаксимум упакованных значений с плавающей запятой двойной точности
MAXSD xmm1, xmm2 / m64F2 0F 5F / rВозвращает максимальное скалярное значение с плавающей запятой двойной точности
MINPD xmm1, xmm2 / m12866 0F 5D / rМинимум упакованных значений с плавающей запятой двойной точности
МИНСД xmm1, xmm2 / m64F2 0F 5D / rВернуть минимальное скалярное значение с плавающей запятой двойной точности
MULPD xmm1, xmm2 / m12866 0F 59 / rМультиупакованные значения с плавающей запятой двойной точности
MULSD xmm1, xmm2 / m64F2 0F 59 / rУмножение скалярного значения с плавающей запятой двойной точности
SQRTPD xmm1, xmm2 / m12866 0F 51 / гКвадратный корень из значений с плавающей запятой двойной точности
SQRTSD xmm1, xmm2 / m64F2 0F 51 / гВычислить квадратный корень из скалярного значения с плавающей запятой двойной точности
SUBPD xmm1, xmm2 / m12866 0F 5C / rВычитание упакованных значений с плавающей запятой двойной точности
SUBSD xmm1, xmm2 / m64F2 0F 5C / rВычесть скалярное значение с плавающей запятой двойной точности
Логические инструкции SSE2
ИнструкцияКод операцииСмысл
ANDPD xmm1, xmm2 / m12866 0F 54 / рПобитовое логическое И упакованных значений с плавающей запятой двойной точности
ANDNPD xmm1, xmm2 / m12866 0F 55 / рПобитовая логика, а не упакованные значения с плавающей запятой двойной точности
ORPD xmm1, xmm2 / m12866 0F 56 / rПобитовое логическое ИЛИ упакованных значений с плавающей запятой двойной точности
XORPD xmm1, xmm2 / m12866 0F 57 / rПобитовое логическое исключающее ИЛИ упакованных значений с плавающей запятой двойной точности
SSE2 сравнить инструкции
ИнструкцияКод операцииСмысл
CMPPD xmm1, xmm2 / m128, imm866 0F C2 / r ibСравните упакованные значения с плавающей запятой двойной точности
CMPSD * xmm1, xmm2 / m64, imm8F2 0F C2 / r ibСравните низкие значения с плавающей запятой двойной точности
COMISD xmm1, xmm2 / m6466 0F 2F / rСравните скалярные упорядоченные значения с плавающей запятой двойной точности и установите EFLAGS
UCOMISD xmm1, xmm2 / m6466 0F 2E / rНеупорядоченное сравнение скалярных значений с плавающей запятой двойной точности и установка EFLAGS
SSE2 инструкции по перемешиванию и распаковке
ИнструкцияКод операцииСмысл
ШУФПД xmm1, xmm2 / m128, imm866 0F C6 / r ibУпакованное чередование пар значений с плавающей запятой двойной точности
УНПЦХПД xmm1, xmm2 / m12866 0F 15 / rРаспаковка и чередование упакованных значений с плавающей запятой двойной точности
UNPCKLPD xmm1, xmm2 / m12866 0F 14 / rРаспаковка и чередование значений с плавающей запятой двойной точности с низкой упаковкой
Инструкции по конвертации SSE2
ИнструкцияКод операцииСмысл
CVTDQ2PD xmm1, xmm2 / m64F3 0F E6 / rПреобразование упакованных целых чисел двойного слова в упакованные значения с плавающей запятой двойной точности
CVTDQ2PS xmm1, xmm2 / m1280F 5B / rПреобразование упакованных целых чисел двойного слова в упакованные значения с плавающей запятой одинарной точности
CVTPD2DQ xmm1, xmm2 / m128F2 0F E6 / rПреобразование упакованных значений с плавающей запятой двойной точности в упакованные целые числа двойного слова
CVTPD2PI мм, xмм / м 12866 0F 2D / rПреобразование упакованных значений FP двойной точности в упакованные целые числа двойного слова
CVTPD2PS xmm1, xmm2 / m12866 0F 5A / rПреобразование упакованных значений с плавающей запятой двойной точности в упакованные значения с плавающей запятой одинарной точности
CVTPI2PD xmm, мм / м6466 0F 2A / rПреобразование упакованных целых чисел двойного слова в упакованные значения FP двойной точности
CVTPS2DQ xmm1, xmm2 / m12866 0F 5B / rПреобразование упакованных значений с плавающей запятой одинарной точности в упакованные целочисленные значения двойного слова со знаком
CVTPS2PD xmm1, xmm2 / m640F 5A / rПреобразование упакованных значений с плавающей запятой одинарной точности в упакованные значения с плавающей запятой двойной точности
CVTSD2SI r32, мм1 / м64F2 0F 2D / rПреобразование скалярного значения с плавающей запятой двойной точности в целое число двойного слова
CVTSD2SI r64, мм1 / м64F2 REX.W 0F 2D / rПреобразование скалярного значения с плавающей запятой двойной точности в четырехсловное целое с расширением знака
CVTSD2SS xmm1, xmm2 / m64F2 0F 5A / rПреобразование скалярного значения с плавающей запятой двойной точности в скалярное значение с плавающей запятой одинарной точности
CVTSI2SD xmm1, r32 / m32F2 0F 2A / rПреобразование целого числа двойного слова в скалярное значение с плавающей запятой двойной точности
CVTSI2SD xmm1, r / m64F2 REX.W 0F 2A / rПреобразование четырехсловного целого числа в скалярное значение с плавающей запятой двойной точности
CVTSS2SD xmm1, xmm2 / m32F3 0F 5A / rПреобразование скалярного значения с плавающей запятой одинарной точности в скалярное значение с плавающей запятой двойной точности
CVTTPD2DQ xmm1, xmm2 / m12866 0F E6 / rПреобразование с усечением упакованных значений с плавающей запятой двойной точности в упакованные целые числа двойного слова
CVTTPD2PI мм, xмм / м 12866 0F 2C / rПреобразование упакованных значений FP двойной точности с усечением в упакованные целые числа двойного слова
CVTTPS2DQ xmm1, xmm2 / m128F3 0F 5B / rПреобразование с усечением упакованных значений с плавающей запятой одинарной точности в упакованные целочисленные значения двойного слова со знаком
CVTTSD2SI r32, мм1 / м64F2 0F 2C / rПреобразование скалярного значения с плавающей запятой двойной точности с усечением в целое число двойного слова со знаком
CVTTSD2SI r64, мм1 / м64F2 REX.W 0F 2C / rПреобразование с усечением скалярного значения с плавающей запятой двойной точности в знаковое целое число Qword

Целочисленные инструкции SSE2 SIMD

SSE2 MMX-подобные инструкции расширены до регистров SSE

SSE2 позволяет выполнять инструкции MMX в регистрах SSE, обрабатывая за один раз вдвое больше данных.

ИнструкцияКод операцииСмысл
МОВД хмм, п / м3266 0F 6E / rПереместить двойное слово
МОВД r / m32, мм66 0F 7E / rПереместить двойное слово
MOVQ xmm1, xmm2 / m64F3 0F 7E / rПереместить четверное слово
MOVQ xmm2 / m64, xmm166 0F D6 / rПереместить четверное слово
MOVQ r / m64, x мм66 REX.W 0F 7E / rПереместить четверное слово
MOVQ xmm, r / m6466 REX.W 0F 6E / rПереместить четверное слово
ПМОВМСКБ рег, xmm66 0F D7 / rПеремещение байтовой маски, обнуление старших битов регистра
PEXTRW reg, xmm, imm866 0F C5 / r ibИзвлеките указанное слово и переместите его в reg, установив биты 15-0 и обнуляя остальные
PINSRW xmm, r32 / m16, imm866 0F C4 / r ibПереместить младшее слово в указанную позицию слова
PACKSSDW xmm1, xmm2 / m12866 0F 6B / rПреобразует 4 упакованных целых числа со знаком двойного слова в 8 упакованных целых чисел со знаком с насыщением
PACKSSWB xmm1, xmm2 / m12866 0F 63 / rПреобразует 8 упакованных целых чисел со знаком в 16 упакованных целых чисел со знаком байтов с насыщением
PACKUSWB xmm1, xmm2 / m12866 0F 67 / rПреобразует 8 целых слов со знаком в 16 целых байтов без знака с насыщением.
PADDB xmm1, xmm2 / m12866 0F FC / rДобавить упакованные байтовые целые числа
PADDW xmm1, xmm2 / m12866 0F FD / rДобавить упакованные целые слова
PADDD xmm1, xmm2 / m12866 0F FE / rДобавить упакованные целые числа с двойным словом
PADDQ xmm1, xmm2 / m12866 0F D4 / rДобавьте упакованные целые числа четверного слова.
PADDSB xmm1, xmm2 / m12866 0F EC / rДобавить упакованные байтовые целые числа со знаком с насыщением
PADDSW xmm1, xmm2 / m12866 0F ED / гДобавить упакованные целые числа со знаком со знаком с насыщенностью
PADDUSB xmm1, xmm2 / m12866 0F DC / rДобавить упакованные байтовые целые числа без знака с насыщением
PADDUSW xmm1, xmm2 / m12866 0F ДД / гДобавить упакованные целые числа без знака с насыщением
PAND xmm1, xmm2 / m12866 0F DB / rПобитовое И
PANDN xmm1, xmm2 / m12866 0F DF / rПобитовое И НЕ
POR xmm1, xmm2 / m12866 0F EB / rПобитовое ИЛИ
PXOR xmm1, xmm2 / m12866 0F EF / rПобитовое исключающее ИЛИ
PCMPEQB xmm1, xmm2 / m12866 0F 74 / рСравните упакованные байты на предмет равенства.
PCMPEQW xmm1, xmm2 / m12866 0F 75 / рСравните упакованные слова на предмет равенства.
PCMPEQD xmm1, xmm2 / m12866 0F 76 / rСравните упакованные двойные слова на предмет равенства.
PCMPGTB xmm1, xmm2 / m12866 0F 64 / рСравните упакованные байтовые целые числа со знаком больше чем
PCMPGTW xmm1, xmm2 / m12866 0F 65 / рСравните упакованные целые числа со знаком слова больше чем
PCMPGTD xmm1, xmm2 / m12866 0F 66 / rСравните упакованные целые числа двойного слова со знаком больше чем
PMULLW xmm1, xmm2 / m12866 0F D5 / rУмножение упакованных целых чисел со знаком с насыщением
PMULHW xmm1, xmm2 / m12866 0F E5 / rУмножьте упакованные целые числа со знаком слова, сохраните старшие 16 бит результатов
PMULHUW xmm1, xmm2 / m12866 0F E4 / rУмножить упакованные целые числа без знака, сохранить старшие 16 бит результатов
PMULUDQ xmm1, xmm2 / m12866 0F F4 / rУмножение упакованных беззнаковых целых двойных слов
PSLLW xmm1, xmm2 / m12866 0F F1 / rСдвиг слов влево при переходе на 0 с
PSLLW xmm1, imm866 0F 71/6 ibСдвиг слов влево при переходе на 0 с
PSLLD xmm1, xmm2 / m12866 0F F2 / rСдвиг двойных слов влево при переходе на 0 с
PSLLD xmm1, imm866 0F 72/6 ibСдвиг двойных слов влево при переходе на 0 с
PSLLQ xmm1, xmm2 / m12866 0F F3 / rСдвинуть четверные слова влево, сдвигая на 0 с
PSLLQ xmm1, imm866 0F 73/6 ibСдвинуть четверные слова влево, сдвигая на 0 с
PSRAD xmm1, xmm2 / m12866 0F E2 / rСдвиг двойного слова вправо при сдвиге битов знака
PSRAD xmm1, imm866 0F 72/4 ibСдвиг двойных слов вправо при сдвиге битов знака
PSRAW xmm1, xmm2 / m12866 0F E1 / rСдвиг слов вправо при сдвиге битов знака
PSRAW xmm1, imm866 0F 71/4 ibСдвиг слов вправо при сдвиге битов знака
PSRLW xmm1, xmm2 / m12866 0F D1 / rСдвиг слов вправо при переходе на 0 с
PSRLW xmm1, imm866 0F 71/2 ibСдвиг слов вправо при переходе на 0 с
ПСРЛД xмм1, xмм2 / м12866 0F D2 / rСдвиг двойных слов вправо при сдвиге на 0 с
ПСРЛД xmm1, imm866 0F 72/2 ibСдвиг двойных слов вправо при сдвиге на 0 с
ПСРЛК хмм1, хмм2 / м12866 0F D3 / rСдвиг четверных слов вправо при сдвиге на 0 с
PSRLQ xmm1, imm866 0F 73/2 ibСдвиг четверных слов вправо при сдвиге на 0 с
PSUBB xmm1, xmm2 / m12866 0F F8 / rВычесть упакованные байтовые целые числа
PSUBW xmm1, xmm2 / m12866 0F F9 / rВычесть целые числа упакованных слов
PSUBD xmm1, xmm2 / m12866 0F FA / rВычесть упакованные целые числа двойного слова
PSUBQ xmm1, xmm2 / m12866 0F FB / rВычтите упакованные целые числа четверного слова.
PSUBSB xmm1, xmm2 / m12866 0F E8 / rВычесть упакованные байтовые целые числа со знаком с насыщением
PSUBSW xmm1, xmm2 / m12866 0F E9 / rВычтите упакованные целые числа со знаком со знаком с насыщением
PMADDWD xmm1, xmm2 / m12866 0F F5 / rУмножьте упакованные целые числа слова, добавьте смежные результаты двойного слова
PSUBUSB xmm1, xmm2 / m12866 0F D8 / rВычтите упакованные байтовые целые числа без знака с насыщением
PSUBUSW xmm1, xmm2 / m12866 0F D9 / rВычтите упакованные целые числа без знака с насыщением
PUNPCKHBW xmm1, xmm2 / m12866 0F 68 / rРаспаковывать и чередовать старшие байты
PUNPCKHWD xmm1, xmm2 / m12866 0F 69 / rРаспаковывать и чередовать слова высокого порядка
PUNPCKHDQ xmm1, xmm2 / m12866 0F 6A / rРаспаковывать и чередовать двойные слова высокого порядка
PUNPCKLBW xmm1, xmm2 / m12866 0F 60 / рЧередовать младшие байты
PUNPCKLWD xmm1, xmm2 / m12866 0F 61 / гЧередовать младшие слова
PUNPCKLDQ xmm1, xmm2 / m12866 0F 62 / rЧередовать двойные слова младшего разряда
PAVGB xmm1, xmm2 / m12866 0F E0, / гСредние упакованные байтовые целые числа без знака с округлением
PAVGW xmm1, xmm2 / m12866 0F E3 / rСредние упакованные целые числа без знака с округлением
PMINUB xmm1, xmm2 / m12866 0F DA / rСравните упакованные байтовые целые числа без знака и сохраните упакованные минимальные значения
PMINSW xmm1, xmm2 / m12866 0F EA / rСравните упакованные целые числа со знаком и сохраните минимальные упакованные значения
PMAXSW xmm1, xmm2 / m12866 0F EE / rСравните упакованные целые числа со знаком и сохраните максимальные упакованные значения
PMAXUB xmm1, xmm2 / m12866 0F DE / rСравните упакованные байтовые целые числа без знака и сохраните упакованные максимальные значения
PSADBW xmm1, xmm2 / m12866 0F F6 / rВычисляет абсолютные разности упакованных целых байтов без знака; затем 8 низких разностей и 8 высоких разностей суммируются по отдельности для получения двух целочисленных результатов без знака.
Целочисленные инструкции SSE2 только для регистров SSE

Следующие инструкции можно использовать только для регистров SSE, поскольку по своей природе они не работают с регистрами MMX.

ИнструкцияКод операцииСмысл
MASKMOVDQU xmm1, xmm266 0F F7 / rНевременное сохранение выбранных байтов из регистра XMM в память
MOVDQ2Q мм, x ммF2 0F D6 / rПереместите младшее четверное слово из XMM в регистр MMX.
MOVDQA xmm1, xmm2 / m12866 0F 6F / rПереместить выровненное двойное четверное слово
MOVDQA xmm2 / m128, xmm166 0F 7F / rПереместить выровненное двойное четверное слово
MOVDQU xmm1, xmm2 / m128F3 0F 6F / rПеремещение невыровненного двойного четверного слова
MOVDQU xmm2 / m128, xmm1F3 0F 7F / rПеремещение невыровненного двойного четверного слова
MOVQ2DQ x мм, ммF3 0F D6 / rПереместить четверное слово из регистра MMX в младшее четверное слово регистра XMM
MOVNTDQ m128, xmm166 0F E7 / rСохранение упакованных целых чисел с использованием вневременных подсказок
PSHUFHW xmm1, xmm2 / m128, imm8F3 0F 70 / r ibВ случайном порядке собраны высокие слова.
PSHUFLW xmm1, xmm2 / m128, imm8F2 0F 70 / r ibПеремешайте упакованные низкие слова.
ПШУФД xmm1, xmm2 / m128, imm866 0F 70 / r ibПеремешайте упакованные двойные слова.
PSLLDQ xmm1, imm866 0F 73/7 ibПакетный сдвиг влево логических двойных четверных слов.
ПСРЛДК xmm1, imm866 0F 73/3 ibУпакованный сдвиг вправо логических двойных четверных слов.
PUNPCKHQDQ xmm1, xmm2 / m12866 0F 6D / rРаспаковать и чередовать четверные слова высокого порядка,
PUNPCKLQDQ xmm1, xmm2 / m12866 0F 6C / rЧередовать младшие четверные слова,

SSE3 инструкции

Добавлен Pentium 4 с поддержкой SSE3

SSE3 SIMD инструкции с плавающей запятой

ИнструкцияКод операцииСмыслЗаметки
ADDSUBPS xmm1, xmm2 / m128F2 0F D0 / rСложение / вычитание значений с плавающей запятой одинарной точностидля сложной арифметики
ADDSUBPD xmm1, xmm2 / m12866 0F D0 / rСложение / вычитание значений с плавающей запятой двойной точности
MOVDDUP xmm1, xmm2 / m64F2 0F 12 / rПереместить значение с плавающей запятой двойной точности и дублировать
MOVSLDUP xmm1, xmm2 / m128F3 0F 12 / rПеремещение и дублирование четных индексных значений с плавающей запятой одинарной точности
MOVSHDUP xmm1, xmm2 / m128F3 0F 16 / rПеремещение и дублирование значений с плавающей запятой одинарной точности с нечетным индексом
HADDPS xmm1, xmm2 / m128F2 0F 7C / rГоризонтальное добавление упакованных значений с плавающей запятой одинарной точностидля графики
HADDPD xmm1, xmm2 / m12866 0F 7C / rГоризонтальное добавление упакованных значений с плавающей запятой двойной точности
HSUBPS xmm1, xmm2 / m128F2 0F 7D / rГоризонтальное вычитание упакованных значений с плавающей запятой одинарной точности
HSUBPD xmm1, xmm2 / m12866 0F 7D / rГоризонтальное вычитание упакованных значений с плавающей запятой двойной точности

Целочисленные инструкции SSE3 SIMD

ИнструкцияКод операцииСмыслЗаметки
LDDQU xmm1, memF2 0F F0 / rЗагрузить невыровненные данные и вернуть двойное четверное словоИнструктивно эквивалентен MOVDQU. Для кодирования видео

SSSE3 инструкции

Добавлено с Xeon 5100 серии и начальная Ядро 2

Следующие MMX-подобные инструкции, расширенные до регистров SSE, были добавлены с SSSE3.

ИнструкцияКод операцииСмысл
PSIGNB xmm1, xmm2 / m12866 0F 38 08 / рОтрицать / обнулять / сохранять упакованные байтовые целые числа в зависимости от соответствующего знака
PSIGNW xmm1, xmm2 / m12866 0F 38 09 / рОтрицать / обнулять / сохранять целые числа в сжатом виде в зависимости от соответствующего знака
PSIGND xmm1, xmm2 / m12866 0F 38 0A / rОтменить / обнулить / сохранить упакованные целые числа двойного слова в зависимости от соответствующего
ПШУФБ xmm1, xmm2 / m12866 0F 38 00 / рПеремешать байты
PMULHRSW xmm1, xmm2 / m12866 0F 38 0B / rУмножение 16-битных слов со знаком, масштабирование и округление двойных слов со знаком, упаковка старших 16 бит
PMADDUBSW xmm1, xmm2 / m12866 0F 38 04 / рУмножение подписанных и беззнаковых байтов, добавление горизонтальной пары подписанных слов, упаковка насыщенных подписанных слов
PHSUBW xmm1, xmm2 / m12866 0F 38 05 / рВычесть и упаковать 16-битные целые числа со знаком по горизонтали
PHSUBSW x мм1, x мм2 / м 12866 0F 38 07 / rВычесть и упаковать 16-битное целое число со знаком по горизонтали с насыщением
PHSUBD xmm1, xmm2 / m12866 0F 38 06 / рВычесть и упаковать 32-разрядные целые числа со знаком по горизонтали
PHADDSW xmm1, xmm2 / m12866 0F 38 03 / рСложить и упаковать 16-битные целые числа со знаком по горизонтали с насыщением
PHADDW xmm1, xmm2 / m12866 0F 38 01 / рСложить и упаковать 16-битные целые числа по горизонтали
PHADDD xmm1, xmm2 / m12866 0F 38 02 / рСложить и упаковать 32-битные целые числа по горизонтали
PALIGNR xmm1, xmm2 / m128, imm866 0F 3A 0F / r ibОбъединить целевые и исходные операнды, извлечь результат, выровненный по байтам, смещенный вправо
ПАБСБ xmm1, xmm2 / m12866 0F 38 1C / rВычислить абсолютное значение байтов и сохранить результат без знака
PABSW xmm1, xmm2 / m12866 0F 38 1D / rВычислить абсолютное значение 16-битных целых чисел и сохранить результат без знака
PABSD xmm1, xmm2 / m12866 0F 38 1E / rВычислить абсолютное значение 32-битных целых чисел и сохранить результат без знака

SSE4 инструкции

SSE4.1

Добавлено с Ядро 2 произведено в 45 нм

SSE4.1 SIMD-инструкции с плавающей запятой
ИнструкцияКод операцииСмысл
DPPS xmm1, xmm2 / m128, imm866 0F 3A 40 / r ibВыборочно умножать упакованные значения с плавающей запятой SP, складывать и выборочно сохранять
DPPD xmm1, xmm2 / m128, imm866 0F 3A 41 / r ibВыборочно умножать упакованные значения с плавающей запятой DP, складывать и выборочно сохранять
BLENDPS xmm1, xmm2 / m128, imm866 0F 3A 0C / r ibВыбрать упакованные значения с плавающей запятой одинарной точности из указанной маски
BLENDVPS xmm1, xmm2 / m128, 66 0F 38 14 / гВыбрать упакованные значения с плавающей запятой одинарной точности из указанной маски
BLENDPD xmm1, xmm2 / m128, imm866 0F 3A 0D / r ibВыбрать упакованные значения DP-FP из указанной маски
BLENDVPD xmm1, xmm2 / m128, 66 0F 38 15 / гВыберите упакованные значения DP FP из указанной маски
ROUNDPS xmm1, xmm2 / m128, imm866 0F 3A 08 / r ibКруглые упакованные значения с плавающей запятой одинарной точности
ROUNDSS xmm1, xmm2 / m32, imm866 0F 3A 0A / r ibОкругление значения с плавающей запятой одинарной точности с низкой упаковкой
ROUNDPD xmm1, xmm2 / m128, imm866 0F 3A 09 / r ibКруглые упакованные значения с плавающей запятой двойной точности
ROUNDSD xmm1, xmm2 / m64, imm866 0F 3A 0B / r ibОкругление низкоупакованного значения с плавающей запятой двойной точности
ВСТАВКИ xmm1, xmm2 / m32, imm866 0F 3A 21 / r ibВставить выбранное значение с плавающей запятой одинарной точности в указанный элемент назначения и обнулить элементы назначения
ВЫДЕРЖКИ reg / m32, xmm1, imm866 0F 3A 17 / r ibИзвлечь одно значение с плавающей запятой одинарной точности по указанному смещению и сохранить результат (с расширением нулями, если применимо)
SSE4.1 Целочисленные инструкции SIMD
ИнструкцияКод операцииСмысл
MPSADBW xmm1, xmm2 / m128, imm866 0F 3A 42 / r ibСуммирует абсолютную 8-битную целочисленную разность соседних групп из 4-х байтовых целых чисел с начальным смещением
PHMINPOSUW xmm1, xmm2 / m12866 0F 38 41 / rНайдите минимальное слово без знака
PMULLD xmm1, xmm2 / m12866 0F 38 40 / рУмножьте упакованные целые числа со знаком двойного слова и сохраните младшие 32 бита.
PMULDQ xmm1, xmm2 / m12866 0F 38 28 / рУмножьте упакованные целые числа двойного слова со знаком и сохраните результат четверного слова
PBLENDVB xmm1, xmm2 / m128, 66 0F 38 10 / рВыбрать байтовые значения из указанной маски
PBLENDW xmm1, xmm2 / m128, imm866 0F 3A 0E / r ibВыбрать слова из указанной маски
PMINSB xmm1, xmm2 / m12866 0F 38 38 / rСравнить упакованные байтовые целые числа со знаком
PMINUW xmm1, xmm2 / m12866 0F 38 3A / rСравнить упакованные целые числа без знака
PMINSD xmm1, xmm2 / m12866 0F 38 39 / рСравнить упакованные целые числа двойного слова со знаком
PMINUD xmm1, xmm2 / m12866 0F 38 3B / rСравнить упакованные целые числа двойного слова без знака
PMAXSB xmm1, xmm2 / m12866 0F 38 3C / rСравнить упакованные байтовые целые числа со знаком
PMAXUW xmm1, xmm2 / m12866 0F 38 3E / rСравнить упакованные целые числа без знака
PMAXSD xmm1, xmm2 / m12866 0F 38 3D / рСравнить упакованные целые числа двойного слова со знаком
PMAXUD xmm1, xmm2 / m12866 0F 38 3F / rСравнить упакованные целые числа двойного слова без знака
PINSRB xmm1, r32 / m8, imm866 0F 3A 20 / r ibВставить байтовое целочисленное значение в указанный элемент назначения
PINSRD xmm1, r / m32, imm866 0F 3A 22 / r ibВставить целочисленное значение двойного слова в указанный целевой элемент
PINSRQ xmm1, r / m64, imm866 REX.W 0F 3A 22 / r ibВставить целочисленное значение qword в указанный элемент назначения
PEXTRB reg / m8, xmm2, imm866 0F 3A 14 / r ibИзвлечь байтовое целочисленное значение при смещении исходного байта, старшие биты обнуляются.
PEXTRW reg / m16, xmm, imm866 0F 3A 15 / r ibИзвлечь слово и скопировать в младшие 16 бит, с нулевым расширением
PEXTRD r / m32, xmm2, imm866 0F 3A 16 / r ibИзвлечь целочисленное значение двойного слова при смещении исходного двойного слова
PEXTRQ r / m64, xmm2, imm866 REX.W 0F 3A 16 / r ibИзвлечь целочисленное значение qword в исходном смещении qword
PMOVSXBW xmm1, xmm2 / m6466 0f 38 20 / rЗнак расширить 8 упакованных 8-битных целых чисел до 8 упакованных 16-битных целых чисел
PMOVZXBW xmm1, xmm2 / m6466 0f 38 30 / rНоль расширить 8 упакованных 8-битных целых чисел до 8 упакованных 16-битных целых чисел
PMOVSXBD xmm1, xmm2 / m3266 0f 38 21 / rЗнак расширить 4 упакованных 8-битных целых до 4 упакованных 32-битных целых числа
PMOVZXBD xmm1, xmm2 / m3266 0f 38 31 / rНоль расширить 4 упакованных 8-битных целых до 4 упакованных 32-битных целых числа
PMOVSXBQ xmm1, xmm2 / m1666 0f 38 22 / rЗнак расширить 2 упакованных 8-битных целых до 2 упакованных 64-битных целых числа
PMOVZXBQ xmm1, xmm2 / m1666 0f 38 32 / rНоль расширить 2 упакованных 8-битных целых до 2 упакованных 64-битных целых числа
PMOVSXWD xmm1, xmm2 / m6466 0f 38 23 / rЗнак расширить 4 упакованных 16-битных целых до 4 упакованных 32-битных целых числа
PMOVZXWD xmm1, xmm2 / m6466 0f 38 33 / rНоль расширить 4 упакованных 16-битных целых до 4 упакованных 32-битных целых числа
PMOVSXWQ xmm1, xmm2 / m3266 0f 38 24 / rЗнак расширить 2 упакованных 16-битных целых до 2 упакованных 64-битных целых числа
PMOVZXWQ xmm1, xmm2 / m3266 0f 38 34 / rНоль расширить 2 упакованных 16-битных целых до 2 упакованных 64-битных целых числа
PMOVSXDQ xmm1, xmm2 / m6466 0f 38 25 / rЗнак расширить 2 упакованных 32-битных целых числа до 2 упакованных 64-битных целых
PMOVZXDQ xmm1, xmm2 / m6466 0f 38 35 / rНоль расширить 2 упакованных 32-битных целых числа до 2 упакованных 64-битных целых числа
ПТЕСТ xmm1, xmm2 / m12866 0F 38 17 / rУстановите ZF, если результатом И является все 0, установите CF, если результатом И НЕ является все 0
PCMPEQQ xmm1, xmm2 / m12866 0F 38 29 / рСравните упакованные qword на равенство
PACKUSDW xmm1, xmm2 / m12866 0F 38 2B / rПреобразование 2 × 4 упакованных целых чисел со знаком двойного слова в 8 упакованных целых чисел без знака с насыщением
MOVNTDQA xmm1, m12866 0F 38 2A / rПеремещение двойного четверного слова с использованием невременной подсказки, если тип памяти WC

SSE4a

Добавлено с Феном процессоры

  • EXTRQ / INSERTQ
  • МОВНЦД / МОВНЦС

SSE4.2

Добавлено с Nehalem процессоры

ИнструкцияКод операцииСмысл
PCMPESTRI xmm1, xmm2 / m128, imm866 0F 3A 61 / r imm8Упакованное сравнение строковых данных с явной длиной, генерируя индекс
PCMPESTRM xmm1, xmm2 / m128, imm866 0F 3A 60 / r imm8Упакованное сравнение строковых данных с явной длиной, генерация маски
PCMPISTRI xmm1, xmm2 / m128, imm866 0F 3A 63 / r imm8Упакованное сравнение строковых данных с неявной длиной, генерируя индекс
PCMPISTRM xmm1, xmm2 / m128, imm866 0F 3A 62 / r imm8Упакованное сравнение строковых данных с неявной длиной, генерация маски
PCMPGTQ xmm1, xmm2 / m12866 0F 38 37 / rСравните упакованные qword со знаком для большего, чем.

SSE5 производные инструкции

SSE5 был предложенным расширением SSE AMD. В комплект поставки не входил полный набор инструкций Intel SSE4, что делало его конкурентом SSE4, а не преемником. AMD решила не реализовывать SSE5, как предлагалось изначально, однако были представлены производные расширения SSE.

XOP

Представлен с ядром процессора Bulldozer, снова удален из Дзен (микроархитектура) вперед.

Ревизия большей части набора инструкций SSE5

F16C

Преобразование с плавающей запятой половинной точности.

ИнструкцияСмысл
VCVTPH2PS xmmreg, xmmrm64Преобразование четырех значений с плавающей запятой половинной точности в памяти или нижней половины регистра XMM в четыре значения с плавающей запятой одинарной точности в регистре XMM
VCVTPH2PS ymmreg, xmmrm128Преобразование восьми значений с плавающей запятой половинной точности в памяти или регистре XMM (нижняя половина регистра YMM) в восемь значений с плавающей запятой одинарной точности в регистре YMM
VCVTPS2PH xmmrm64, xmmreg, imm8Преобразование четырех значений с плавающей запятой одинарной точности в регистре XMM в значения с плавающей запятой половинной точности в памяти или в нижнюю половину регистра XMM
VCVTPS2PH xmmrm128, ymmreg, imm8Преобразование восьми значений с плавающей запятой одинарной точности в регистре YMM в значения с плавающей запятой половинной точности в памяти или регистре XMM

FMA3

Поддерживается в процессорах AMD, начиная с архитектуры Piledriver, и в процессорах Intel, начиная с процессоров Haswell и процессорах Broadwell, с 2014 года.

Слитное умножение-сложение (вектор с плавающей запятой умножение – накопление) с тремя операндами.

ИнструкцияСмысл
VFMADD132PDПлавное умножение упакованных значений с плавающей запятой двойной точности
VFMADD213PDПлавное умножение упакованных значений с плавающей запятой двойной точности
VFMADD231PDПлавное умножение упакованных значений с плавающей запятой двойной точности
VFMADD132PSПлавное умножение упакованных значений с плавающей запятой одинарной точности
VFMADD213PSПлавное умножение упакованных значений с плавающей запятой одинарной точности
VFMADD231PSПлавное умножение упакованных значений с плавающей запятой одинарной точности
VFMADD132SDПлавное умножение-сложение скалярных значений с плавающей запятой двойной точности
VFMADD213SDПлавное умножение-сложение скалярных значений с плавающей запятой двойной точности
VFMADD231SDПлавное умножение-сложение скалярных значений с плавающей запятой двойной точности
VFMADD132SSОбъединенное умножение-сложение скалярных значений с плавающей запятой одинарной точности
VFMADD213SSОбъединенное умножение-сложение скалярных значений с плавающей запятой одинарной точности
VFMADD231SSОбъединенное умножение-сложение скалярных значений с плавающей запятой одинарной точности
VFMADDSUB132PDПлавное умножение и чередование чисел с плавающей запятой двойной точности
VFMADDSUB213PDПлавное умножение и чередование чисел с плавающей запятой двойной точности
VFMADDSUB231PDПлавное умножение и чередование чисел с плавающей запятой двойной точности
VFMADDSUB132PSПлавное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFMADDSUB213PSПлавное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFMADDSUB231PSПлавное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFMSUB132PDПлавное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFMSUB213PDПлавное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFMSUB231PDПлавное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFMSUB132PSПлавное умножение-вычитание упакованных значений с плавающей запятой одинарной точности
VFMSUB213PSПлавное умножение-вычитание упакованных значений с плавающей запятой одинарной точности
VFMSUB231PSПлавное умножение-вычитание упакованных значений с плавающей запятой одинарной точности
VFMSUB132SDУмножение-вычитание скалярных значений с плавающей запятой двойной точности
VFMSUB213SDУмножение-вычитание скалярных значений с плавающей запятой двойной точности
VFMSUB231SDУмножение-вычитание скалярных значений с плавающей запятой двойной точности
VFMSUB132SSОбъединенное умножение-вычитание скалярных значений с плавающей запятой одинарной точности
VFMSUB213SSОбъединенное умножение-вычитание скалярных значений с плавающей запятой одинарной точности
VFMSUB231SSОбъединенное умножение-вычитание скалярных значений с плавающей запятой одинарной точности
VFMSUBADD132PDВычитание / сложение упакованных значений с плавающей запятой двойной точности с объединенным множителем и чередованием
VFMSUBADD213PDВычитание / сложение упакованных значений с плавающей запятой двойной точности с объединенным множителем и чередованием
VFMSUBADD231PDВычитание / сложение упакованных значений с плавающей запятой двойной точности с объединенным множителем и чередованием
VFMSUBADD132PSВычитание / сложение упакованных значений с плавающей запятой одинарной точности с несколькими переменными числами
VFMSUBADD213PSВычитание / сложение упакованных значений с плавающей запятой одинарной точности с несколькими переменными числами
VFMSUBADD231PSВычитание / сложение упакованных значений с плавающей запятой одинарной точности с несколькими переменными числами
VFNMADD132PDПлавное отрицательное умножение упакованных значений с плавающей запятой двойной точности
VFNMADD213PDПлавное отрицательное умножение упакованных значений с плавающей запятой двойной точности
VFNMADD231PDОбъединенное отрицательное умножение упакованных значений с плавающей запятой двойной точности
VFNMADD132PSСмешанное отрицательное умножение упакованных значений с плавающей запятой одинарной точности
VFNMADD213PSСмешанное отрицательное умножение упакованных значений с плавающей запятой одинарной точности
VFNMADD231PSСмешанное отрицательное умножение упакованных значений с плавающей запятой одинарной точности
VFNMADD132SDОбъединенное отрицательное умножение скалярных значений с плавающей запятой двойной точности
VFNMADD213SDОбъединенное отрицательное умножение скалярных значений с плавающей запятой двойной точности
VFNMADD231SDОбъединенное отрицательное умножение скалярных значений с плавающей запятой двойной точности
VFNMADD132SSОбъединенное отрицательное умножение скалярных значений с плавающей запятой одинарной точности
VFNMADD213SSОбъединенное отрицательное умножение скалярных значений с плавающей запятой одинарной точности
VFNMADD231SSОбъединенное отрицательное умножение скалярных значений с плавающей запятой одинарной точности
VFNMSUB132PDПлавное отрицательное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFNMSUB213PDПлавное отрицательное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFNMSUB231PDПлавное отрицательное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFNMSUB132PSОбъединенное отрицательное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFNMSUB213PSОбъединенное отрицательное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFNMSUB231PSОбъединенное отрицательное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFNMSUB132SDОбъединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой двойной точности
VFNMSUB213SDОбъединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой двойной точности
VFNMSUB231SDОбъединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой двойной точности
VFNMSUB132SSОбъединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой одинарной точности
VFNMSUB213SSОбъединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой одинарной точности
VFNMSUB231SSОбъединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой одинарной точности

FMA4

Поддерживается в процессорах AMD, начиная с архитектуры Bulldozer. По состоянию на 2017 год не поддерживается ни одним чипом Intel.

Слитное умножение-сложение с четырьмя операндами. FMA4 была реализована аппаратно до FMA3.

ИнструкцияКод операцииСмыслЗаметки
VFMADDPD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 69 / r / is4Плавное умножение упакованных значений с плавающей запятой двойной точности
VFMADDPS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 68 / r / is4Плавное умножение упакованных значений с плавающей запятой одинарной точности
VFMADDSD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 6B / r / is4Плавное умножение-сложение скалярных значений с плавающей запятой двойной точности
VFMADDSS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 6A / r / is4Объединенное умножение-сложение скалярных значений с плавающей запятой одинарной точности
VFMADDSUBPD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 5D / r / is4Плавное умножение и чередование чисел с плавающей запятой двойной точности
VFMADDSUBPS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 5C / r / is4Плавное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFMSUBADDPD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 5F / r / is4Вычитание / сложение упакованных значений с плавающей запятой двойной точности с объединенным множителем и чередованием
VFMSUBADDPS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 5E / r / is4Вычитание / сложение упакованных значений с плавающей запятой одинарной точности с несколькими переменными числами
VFMSUBPD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 6D / r / is4Плавное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFMSUBPS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 6C / r / is4Плавное умножение-вычитание упакованных значений с плавающей запятой одинарной точности
VFMSUBSD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 6F / r / is4Умножение-вычитание скалярных значений с плавающей запятой двойной точности
VFMSUBSS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 6E / r / is4Объединенное умножение-вычитание скалярных значений с плавающей запятой одинарной точности
VFNMADDPD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 79 / r / is4Плавное отрицательное умножение упакованных значений с плавающей запятой двойной точности
VFNMADDPS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 78 / r / is4Смешанное отрицательное умножение упакованных значений с плавающей запятой одинарной точности
VFNMADDSD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 7B / r / is4Объединенное отрицательное умножение скалярных значений с плавающей запятой двойной точности
VFNMADDSS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 7A / r / is4Объединенное отрицательное умножение скалярных значений с плавающей запятой одинарной точности
VFNMSUBPD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 7D / r / is4Плавное отрицательное умножение-вычитание упакованных значений с плавающей запятой двойной точности
VFNMSUBPS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 7C / r / is4Объединенное отрицательное умножение и вычитание упакованных значений с плавающей запятой одинарной точности
VFNMSUBSD xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 7F / r / is4Объединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой двойной точности
VFNMSUBSS xmm0, xmm1, xmm2, xmm3C4E3 WvvvvL01 7E / r / is4Объединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой одинарной точности

AVX

AVX были впервые поддержаны Intel с Sandy Bridge и AMD с Бульдозер.

Векторные операции с 256-битными регистрами.

ИнструкцияОписание
VBROADCASTSSСкопируйте 32-битный, 64-битный или 128-битный операнд памяти во все элементы векторного регистра XMM или YMM.
VBROADCASTSD
VBROADCASTF128
VINSERTF128Заменяет нижнюю или верхнюю половину 256-битного регистра YMM на значение 128-битного исходного операнда. Другая половина пункта назначения не изменилась.
VEXTRACTF128Извлекает нижнюю или верхнюю половину 256-битного регистра YMM и копирует значение в 128-битный целевой операнд.
ВМАСКМОВПСУсловно считывает любое количество элементов из операнда векторной памяти SIMD в регистр назначения, оставляя остальные элементы вектора непрочитанными и устанавливая соответствующие элементы в регистре назначения на ноль. В качестве альтернативы, условно записывает любое количество элементов из операнда векторного регистра SIMD в векторный операнд памяти, оставляя оставшиеся элементы операнда памяти неизменными. В архитектуре процессора AMD Jaguar эта инструкция с операндом источника памяти занимает более 300 тактовых циклов, когда маска равна нулю, и в этом случае инструкция не должна делать ничего. Кажется, это недостаток дизайна.[12]
ВМАСКМОВПД
ВПЕРМИЛПСПерестановка в переулке. Перемешайте 32-битные или 64-битные векторные элементы одного входного операнда. Это внутренние 256-битные инструкции, что означает, что они работают со всеми 256 битами с двумя отдельными 128-битными перетасовками, поэтому они не могут перемещаться по 128-битным полосам.[13]
ВПЕРМИЛПД
VPERM2F128Перемешайте четыре 128-битных векторных элемента двух 256-битных исходных операндов в 256-битный целевой операнд с непосредственной константой в качестве селектора.
ВЗЕРОАЛЛУстановите все регистры YMM в ноль и пометьте их как неиспользуемые. Используется при переключении между 128-битным использованием и 256-битным использованием.
VZEROUPPERУстановите верхнюю половину всех регистров YMM в ноль. Используется при переключении между 128-битным использованием и 256-битным использованием.

AVX2

Представлено в Intel Микроархитектура Haswell и AMD Экскаватор.

Расширение большинства векторных целочисленных инструкций SSE и AVX до 256 бит

ИнструкцияОписание
VBROADCASTSSСкопируйте 32-битный или 64-битный регистровый операнд во все элементы векторного регистра XMM или YMM. Это регистровые версии тех же инструкций в AVX1. Однако 128-битной версии нет, но тот же эффект может быть просто достигнут с помощью VINSERTF128.
VBROADCASTSD
VPBROADCASTBСкопируйте 8, 16, 32 или 64-битный целочисленный регистр или операнд памяти во все элементы векторного регистра XMM или YMM.
VPBROADCASTW
VPBROADCASTD
VPBROADCASTQ
VBROADCASTI128Скопируйте 128-битный операнд памяти во все элементы векторного регистра YMM.
VINSERTI128Заменяет нижнюю или верхнюю половину 256-битного регистра YMM значением 128-битного исходного операнда. Другая половина пункта назначения не изменилась.
VEXTRACTI128Извлекает нижнюю или верхнюю половину 256-битного регистра YMM и копирует значение в 128-битный целевой операнд.
VGATHERDPDСобирает значения с плавающей запятой одинарной или двойной точности с использованием 32- или 64-битных индексов и масштабирования.
VGATHERQPD
VGATHERDPS
VGATHERQPS
VPGATHERDDСобирает 32- или 64-битные целые числа с использованием 32- или 64-битных индексов и масштабирования.
VPGATHERDQ
VPGATHERQD
VPGATHERQQ
ВПМАСКМОВДУсловно считывает любое количество элементов из операнда векторной памяти SIMD в регистр назначения, оставляя остальные элементы вектора непрочитанными и устанавливая соответствующие элементы в регистре назначения на ноль. В качестве альтернативы, условно записывает любое количество элементов из операнда векторного регистра SIMD в операнд векторной памяти, оставляя остальные элементы операнда памяти неизменными.
VPMASKMOVQ
VPERMPSПеремешайте восемь 32-битных векторных элементов одного 256-битного исходного операнда в 256-битный целевой операнд с регистром или операндом памяти в качестве селектора.
VPERMD
ВПЕРМПДПеремешайте четыре 64-битных векторных элемента одного 256-битного исходного операнда в 256-битный целевой операнд с регистром или операндом памяти в качестве селектора.
VPERMQ
VPERM2I128Перемешайте (два из) четырех 128-битных векторных элементов два 256-битные исходные операнды в 256-битный целевой операнд с непосредственной константой в качестве селектора.
VPBLENDDDoubleword немедленная версия инструкций PBLEND от SSE4.
VPSLLVDСдвиг влево логичный. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом.
VPSLLVQ
ВПСРЛВДСдвиг вправо логичный. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом.
VPSRLVQ
ВПСРАВДСдвиг вправо арифметически. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом.

AVX-512

Представлено в Intel Ксеон Пхи х200

Векторные операции над 512-битными регистрами.

Основание AVX-512

ИнструкцияОписание
VBLENDMPDСмешивание векторов float64 с помощью opmask control
VBLENDMPSСмешивание векторов float32 с помощью opmask control
VPBLENDMDСмешайте векторы int32 с помощью элемента управления opmask
VPBLENDMQСмешайте векторы int64 с помощью элемента управления opmask
VPCMPDСравнить подписанные / беззнаковые двойные слова в маске
VPCMPUD
VPCMPQСравнить четверные слова со знаком / без знака в маску
VPCMPUQ
VPTESTMDЛогическое И и установка маски для 32- или 64-битных целых чисел.
VPTESTMQ
ВПТЕСТНМДЛогическая И-НЕ и маска для 32- или 64-битных целых чисел.
VPTESTNMQ
VCOMPRESSPDХранение разреженно упакованных значений с плавающей запятой двойной / одинарной точности в плотной памяти
VCOMPRESSPS
VPCOMPRESSDСохранение разреженно упакованных целочисленных значений двойного / четверного слова в плотной памяти / регистре
VPCOMPRESSQ
VEXPANDPDЗагрузка разреженно упакованных значений с плавающей запятой двойной / одинарной точности из плотной памяти
VEXPANDPS
VPEXPANDDЗагрузка разреженно упакованных целочисленных значений двойного слова / четверного слова из плотной памяти / регистра
VPEXPANDQ
VPERMI2PDПолная перестановка с одинарной / двойной плавающей запятой, перезаписывающая индекс.
VPERMI2PS
VPERMI2DПолная перестановка двойного слова / четверного слова, перезаписывающая индекс.
VPERMI2Q
VPERMT2PSПолная перестановка с одинарной / двойной плавающей запятой, перезапись первого источника.
VPERMT2PD
VPERMT2DПолная перестановка двойного слова / четверного слова, перезаписывающая первый источник.
VPERMT2Q
VSHUFF32x4Перемешать четыре упакованных 128-битных строки.
VSHUFF64x2
VSHUFFI32x4
VSHUFFI64x2
VPTERNLOGDПобитовая тернарная логика
VPTERNLOGQ
VPMOVQDПреобразование четверного слова или двойного слова в двойное слово, слово или байт; ненасыщенный, насыщенный или насыщенный без знака. Обратный знак / ноль продлить инструкции из SSE4.1.
VPMOVSQD
VPMOVUSQD
VPMOVQW
VPMOVSQW
VPMOVUSQW
VPMOVQB
VPMOVSQB
VPMOVUSQB
VPMOVDW
VPMOVSDW
VPMOVUSDW
ВПМОВДБ
VPMOVSDB
VPMOVUSDB
VCVTPS2UDQПреобразование с усечением или без него упакованных чисел с плавающей запятой одинарной или двойной точности в упакованные целые числа без знака с двойным словом.
VCVTPD2UDQ
VCVTTPS2UDQ
VCVTTPD2UDQ
VCVTSS2USIПреобразование с усечением или без него, скалярное число с плавающей запятой одиночной или двойной точности в целое число без знака с двойным словом.
VCVTSD2USI
VCVTTSS2USI
VCVTTSD2USI
VCVTUDQ2PSПреобразование упакованных беззнаковых целых двойных слов в упакованные числа с плавающей запятой одинарной или двойной точности.
VCVTUDQ2PD
VCVTUSI2PSПреобразование скалярных беззнаковых целых двойных слов в числа с плавающей запятой одинарной или двойной точности.
VCVTUSI2PD
VCVTUSI2SDПреобразуйте скалярные целые числа без знака в числа с плавающей запятой одинарной или двойной точности.
VCVTUSI2SS
VCVTQQ2PDПреобразуйте упакованные целые числа четверного слова в упакованные числа с плавающей запятой одинарной или двойной точности.
VCVTQQ2PS
VGETEXPPDПреобразование показателей упакованных значений fp в значения fp
VGETEXPPS
VGETEXPSDКонвертировать показатель степени скалярного значения fp в значение fp
VGETEXPSS
ВГЕТМАНТПДИзвлечь вектор нормализованных мантисс из вектора float32 / float64
ВГЕТМАНТПС
ВГЕТМАНЦДИзвлечь float32 / float64 из нормализованных мантисса из скаляра float32 / float64
ВГЕТМАНЦЫ
VFIXUPIMMPDИсправить специальные упакованные значения float32 / float64
VFIXUPIMMPS
VFIXUPIMMSDИсправить специальное скалярное значение float32 / float64
VFIXUPIMMS
VRCP14PDВычислить приблизительные обратные значения упакованных значений float32 / float64
VRCP14PS
VRCP14SDВычислить приблизительные обратные значения скалярного значения float32 / float64
VRCP14SS
VRNDSCALEPSОкругление упакованных значений float32 / float64 для включения заданного количества дробных битов
VRNDSCALEPD
VRNDSCALESSКруглое скалярное значение float32 / float64 для включения заданного количества дробных битов
VRNDSCALESD
VRSQRT14PDВычислить приблизительные значения, обратные квадратным корням упакованных значений float32 / float64
VRSQRT14PS
VRSQRT14SDВычислить приблизительную величину, обратную квадратному корню из скалярного значения float32 / float64
VRSQRT14SS
VSCALEFPSМасштабирование упакованных значений float32 / float64 со значениями float32 / float64
VSCALEFPD
VSCALEFSSМасштабировать скалярное значение float32 / float64 со значением float32 / float64
VSCALEFSD
ВАЛИГНДВыравнивание векторов двойных или четверных слов
VALIGNQ
VPABSQУпакованное четверное слово абсолютного значения
VPMAXSQМаксимум упакованного четверного слова со знаком / без знака
VPMAXUQ
VPMINSQМинимум упакованного четверного слова со знаком / без знака
VPMINUQ
VPROLDБит повернуть влево или вправо
ВПРОЛВД
VPROLQ
VPROLVQ
ВПРОРД
ВПРОРВД
VPRORQ
VPRORVQ
VPSCATTERDDСкаттер-упакованное двойное слово / четверное слово с индексами двойного слова и четверного слова со знаком
VPSCATTERDQ
VPSCATTERQD
VPSCATTERQQ
VSCATTERDPSScatter упакованный float32 / float64 с индексами двойного слова и четверного слова со знаком
VSCATTERDPD
VSCATTERQPS
VSCATTERQPD

Криптографические инструкции

Инструкции Intel AES

6 новых инструкций.

ИнструкцияОписание
AESENCВыполните один раунд AES поток шифрования
ЭЗЕНКЛАСТВыполните последний раунд потока шифрования AES
AESDECВыполните один раунд потока дешифрования AES
AESDECLASTВыполните последний раунд потока дешифрования AES
ЭСКЕЙГЕНАССИСТПомощь в генерации раундового ключа AES
AESIMCПомощь в столбцах обратного смешивания AES

RDRAND и RDSEED

ИнструкцияОписание
RDRANDПрочитать случайное число
RDSEEDПрочитать случайное начальное число

Инструкции Intel SHA

7 новых инструкций.

ИнструкцияОписание
SHA1RNDS4Выполните четыре раунда операции SHA1
SHA1NEXTEВычислить переменную состояния SHA1 E после четырех раундов
SHA1MSG1Выполните промежуточное вычисление для следующих четырех слов сообщения SHA1
SHA1MSG2Выполните окончательный расчет для следующих четырех слов сообщения SHA1
SHA256RNDS2Выполните два раунда операции SHA256
SHA256MSG1Выполните промежуточное вычисление для следующих четырех слов сообщения SHA256
SHA256MSG2Выполните окончательный расчет для следующих четырех слов сообщения SHA256

Недокументированные инструкции

Недокументированные инструкции x86

Процессоры x86 содержат недокументированные инструкции которые реализованы на чипах, но не указаны в некоторых официальных документах. Их можно найти в различных источниках в Интернете, таких как Список прерываний Ральфа Брауна и в sandpile.org

МнемоническийКод операцииОписаниеСтатус
AAM imm8D4 imm8Разделите AL на imm8, поместите частное в AH, а остаток в AL.Доступен, начиная с 8086, задокументирован, начиная с Pentium (в более ранней документации аргументы не указаны)
AAD imm8D5 imm8Аналог умножения AAMДоступно, начиная с 8086, задокументировано, начиная с Pentium (в более ранней документации аргументы не указаны)
SALCD6Установите AL в зависимости от значения флага переноса (1-байтовая альтернатива SBB AL, AL)Доступен, начиная с 8086, но задокументирован только начиная с Pentium Pro.
ICEBPF1Однобайтовое пошаговое исключение / вызов ICEДоступно, начиная с 80386, задокументировано (как INT1) начиная с Pentium Pro
Неизвестная мнемоника0F 04Точная цель неизвестна, вызывает зависание процессора (HCF ). Единственный выход - перезагрузка процессора.[14]

В некоторых реализациях эмулируется через BIOS как остановка последовательность.[15]

В сообщение на форуме Vintage Computing Federation, эта инструкция обозначается как СОХРАНИТЬ. Он взаимодействует с режимом ICE.

Доступно только на 80286
ЗАГРУЗИТЬ0F 05Загружает все регистры из адреса памяти 0x000800HДоступно только на 80286
ЗАГРУЗИТЬ0F 07Загружает все регистры из адреса памяти ES: EDIДоступно только на 80386
UD10F B9Умышленно неопределенная инструкция, но в отличие от UD2 не опубликована
ALTINST0F 3FПерейти и выполнить инструкции в недокументированном Альтернативный набор инструкций.Доступно только на некоторых процессорах x86 производства VIA Technologies.

Недокументированные инструкции x87

FFREEP выполняет FFREE ST (i) и выталкивает стек

Смотрите также

использованная литература

  1. ^ а б "Re: Идентификация процессора Intel и инструкция CPUID". Получено 2013-04-21.
  2. ^ Тот, Эрвин (1998-03-16). «BSWAP с 16-битными регистрами». Архивировано из оригинал на 1999-11-03. Команда опускает верхнее слово регистра двойного слова, не затрагивая его старшие 16 бит.
  3. ^ Колдвин, Гинваэль (29 декабря 2009 г.). «Префикс BSWAP + 66h». Получено 2018-10-03. внутреннее (нулевое) расширение значения меньшего (16-битного) регистра… применение bswap к 32-битному значению «00 00 AH AL»,… усеченное до младших 16 битов, которые равны «00 00». … Bochs… bswap reg16 действует так же, как bswap reg32… QEMU… игнорирует префикс 66h
  4. ^ «RSM - Возобновление из режима управления системой». Архивировано 12 марта 2012 года.CS1 maint: BOT: статус исходного URL-адреса неизвестен (ссылка на сайт)
  5. ^ Справочное руководство по оптимизации архитектур Intel 64 и IA-32, раздел 7.3.2
  6. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, раздел 4.3, подраздел «PREFETCHh - предварительная выборка данных в кеши»
  7. ^ Холлингсворт, Брент. "Новые" Бульдозер "и" Пиледривер "инструкция" (pdf). Advanced Micro Devices, Inc. Получено 11 декабря 2014.
  8. ^ «Семейство 16h AMD A-Series, техническое описание» (PDF). amd.com. AMD. Октябрь 2013. Получено 2014-01-02.
  9. ^ «Руководство программиста по архитектуре AMD64, том 3: общие и системные инструкции» (PDF). amd.com. AMD. Октябрь 2013. Получено 2014-01-02.
  10. ^ "tbmintrin.h из GCC 4.8". Получено 2014-03-17.
  11. ^ https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf раздел 3.5.2.3
  12. ^ «Микроархитектура процессоров Intel, AMD и VIA: руководство по оптимизации для программистов сборки и производителей компиляторов» (PDF). Получено 17 октября, 2016.
  13. ^ «Шахматное программирование AVX2». Получено 17 октября, 2016.
  14. ^ "Re: Недокументированные коды операций (HINT_NOP)". Архивировано из оригинал на 2004-11-06. Получено 2010-11-07.
  15. ^ "Re: Также некоторые недокументированные коды операций 0Fh". Архивировано из оригинал на 2003-06-26. Получено 2010-11-07.

внешние ссылки