Эта статья может быть слишком длинной для чтения и удобной навигации . ( Ноябрь 2017 г. ) |
Набор инструкций x86 относится к набору инструкций, которые поддерживают микропроцессоры, совместимые с x86 . Инструкции обычно являются частью исполняемой программы, часто хранятся в виде компьютерного файла и выполняются на процессоре.
Набор инструкций x86 был расширен несколько раз, введены более широкие регистры и типы данных, а также новые функции. [1]
целочисленные инструкции x86 [ править ]
Ниже приведен полный набор инструкций Intel 8086/8088 (всего 81 инструкция). Большинство, если не все эти инструкции доступны в 32-битном режиме; они просто работают с 32-битными регистрами ( eax , ebx и т. д.) и значениями вместо своих 16-битных ( ax , bx и т. д.) аналогов. См. Также язык ассемблера x86 для быстрого ознакомления с этим семейством процессоров. Обновленный набор команд также сгруппирован по архитектуре ( i386 , i486 , i686 ) и в более общем смысле называется x86 32 и x86 64 (также известный как AMD64 ).
Исходные инструкции для 8086/8088 [ править ]
Инструкция | Смысл | Ноты | Код операции |
---|---|---|---|
AAA | ASCII настроить AL после добавления | используется с распакованной двоично-десятичной кодировкой | 0x37 |
AAD | ASCII настроить AX перед делением | В таблице данных 8086/8088 указана только базовая версия 10 инструкции AAD ( код операции 0xD5 0x0A), но подойдет любая другая версия . Более поздняя документация Intel также имеет общий вид. NEC V20 и V30 (и, возможно, другие процессоры NEC серии V) всегда используют основание 10 и игнорируют аргумент, что вызывает ряд несовместимостей. | 0xD5 |
AAM | ASCII настроить AX после умножения | Документирована только версия base 10 (операнд 0xA), см. Примечания для AAD. | 0xD4 |
ААС | ASCII настроить AL после вычитания | 0x3F | |
АЦП | Добавить с переносом | destination = destination + source + carry_flag | 0x10… 0x15, 0x80… 0x81 / 2, 0x82… 0x83 / 2 (начиная с 80186) |
ДОБАВЛЯТЬ | Добавлять | (1) r/m += r/imm; (2)r += m/imm; | 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) |
ВЫЗОВ | Процедура вызова | push eip; eip points to the instruction directly after the call | 0x9A, 0xE8, 0xFF / 2, 0xFF / 3 |
CBW | Преобразовать байт в слово | 0x98 | |
CLC | Очистить флаг переноса | CF = 0; | 0xF8 |
CLD | Флаг четкого направления | DF = 0; | 0xFC |
CLI | Очистить флаг прерывания | IF = 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 | Уменьшить на 1 | 0x48… 0x4F, 0xFE / 1, 0xFF / 1 | |
DIV | Беззнаковое деление | (1) в AX = DX:AX / r/m; результате DX = remainder (2) в AL = AX / r/m; результатеAH = remainder | 0xF7 / 6, 0xF6 / 6 |
ESC | Используется с блоком с плавающей запятой | 0xD8..0xDF | |
HLT | Войти в состояние остановки | 0xF4 | |
IDIV | Подписанный раздел | (1) в AX = DX:AX / r/m; результате DX = remainder (2) в AL = AX / r/m; результатеAH = remainder | 0xF7 / 7, 0xF6 / 7 |
IMUL | Подпись умножить | (1) DX:AX = AX * r/m; (2)AX = AL * r/m | 0x69, 0x6B (оба с 80186), 0xF7 / 5, 0xF6 / 5, 0x0FAF (с 80386) |
В | Вход из порта | (1) AL = port[imm]; (2) AL = port[DX]; (3) AX = port[imm]; (4)AX = port[DX]; | 0xE4, 0xE5, 0xEC, 0xED |
INC | Увеличение на 1 | 0x40… 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 | Загрузить ФЛАГИ в регистр AH | 0x9F | |
СПД | Загрузить указатель с помощью DS | 0xC5 | |
LEA | Загрузить эффективный адрес | 0x8D | |
LES | Загрузить ES с помощью указателя | 0xC4 | |
ЗАМОК | Подтвердить сигнал BUS LOCK # | (для многопроцессорности) | 0xF0 |
ЛОДСБ | Загрузить байт строки | if (DF==0) AL = *SI++; else AL = *SI--; | 0xAC |
LODSW | Загрузить строковое слово | if (DF==0) AX = *SI++; else AX = *SI--; | 0xAD |
LOOP / LOOPx | Контроль цикла | ( LOOPE, LOOPNE, LOOPNZ, LOOPZ )if (x && --CX) goto lbl; | 0xE0… 0xE2 |
MOV | Переехать | копирует данные из одного места в другое, (1) r/m = r; (2)r = r/m; | 0xA0 ... 0xA3 |
МОВСБ | Переместить байт из строки в строку | если ( DF == 0 ) * ( байт * ) DI ++ = * ( байт * ) SI ++ ; иначе * ( байт * ) DI - = * ( байт * ) SI - ; | 0xA4 |
MOVSW | Переместить слово из строки в строку | if ( DF == 0 ) * ( слово * ) DI ++ = * ( слово * ) SI ++ ; else * ( слово * ) DI - = * ( слово * ) SI - ; | 0xA5 |
MUL | Беззнаковое умножение | (1) DX:AX = AX * r/m; (2)AX = AL * r/m; | 0xF7 / 4, 0xF6 / 4 |
NEG | Отрицание дополнения до двух | r/m *= -1; | 0xF6 / 3… 0xF7 / 3 |
NOP | Нет операции | код операции, эквивалентный XCHG EAX, EAX | 0x90 |
НЕТ | Отменить операнд, логическое НЕ | r/m ^= -1; | 0xF6 / 2… 0xF7 / 2 |
ИЛИ ЖЕ | Логическое ИЛИ | (1) (2)r/m |= r/imm; r |= m/imm; | 0x08… 0x0D, 0x80… 0x81 / 1, 0x82… 0x83 / 1 (начиная с 80186) |
ИЗ | Вывод в порт | (1) port[imm] = AL; (2) port[DX] = AL; (3) port[imm] = AX; (4)port[DX] = AX; | 0xE6, 0xE7, 0xEE, 0xEF |
Поп | Извлечь данные из стека | r/m = *SP++; POP CS (код операции 0x0F) работает только на 8086/8088. Более поздние процессоры используют 0x0F в качестве префикса для новых инструкций. | 0x07, 0x0F (только 8086/8088), 0x17, 0x1F, 0x58… 0x5F, 0x8F / 0 |
POPF | Поп ФЛАГИ регистр из стека | FLAGS = *SP++; | 0x9D |
ТОЛКАТЬ | Помещать данные в стек | *--SP = r/m; | 0x06, 0x0E, 0x16, 0x1E, 0x50… 0x57, 0x68, 0x6A (оба с 80186), 0xFF / 6 |
PUSHF | Поместите ФЛАГИ в стек | *--SP = FLAGS; | 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 в FLAGS | 0x9E | |
SAL | Сдвиг арифметически влево (сдвиг влево со знаком) | (1) r/m <<= 1; (2)r/m <<= CL; | 0xC0… 0xC1 / 4 (начиная с 80186), 0xD0… 0xD3 / 4 |
SAR | Сдвиг арифметически вправо (сдвиг вправо со знаком) | (1) (signed) r/m >>= 1; (2)(signed) r/m >>= CL; | 0xC0… 0xC1 / 7 (начиная с 80186), 0xD0… 0xD3 / 7 |
SBB | Вычитание с заимствованием | альтернативное 1-байтовое кодирование SBB AL, AL доступно через недокументированную инструкцию SALC | 0x18… 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 |
ИППП | Установить флаг прерывания | IF = 1; | 0xFB |
СТОСБ | Сохранить байт в строке | if (DF==0) *ES:DI++ = AL; else *ES:DI-- = AL; | 0xAA |
STOSW | Сохранить слово в строке | if (DF==0) *ES:DI++ = AX; else *ES:DI-- = AX; | 0xAB |
SUB | Вычитание | (1) r/m -= r/imm; (2)r -= m/imm; | 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 | Обмен данными | r :=: r/m; Спинлки обычно используют XCHG в качестве атомарной операции . ( ошибка комы ). | 0x86, 0x87, 0x91… 0x97 |
XLAT | Перевод поиска по таблице | ведет себя как MOV AL, [BX+AL] | 0xD7 |
XOR | Эксклюзивный или | (1) r/m ^= r/imm; (2)r ^= m/imm; | 0x30… 0x35, 0x80… 0x81 / 6, 0x82… 0x83 / 6 (начиная с 80186) |
Добавлено в конкретных процессорах [ править ]
Добавлено с 80186 / 80188 [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
ГРАНИЦА | Проверить индекс массива на соответствие границам | вызывает программное прерывание 5, если тест не пройден |
ВХОДИТЬ | Введите кадр стека | Изменяет стек для входа в процедуру для языка высокого уровня. Принимает два операнда: объем памяти, выделяемой в стеке, и уровень вложенности процедуры. |
INS | Ввод из порта в строку | эквивалент:IN ( E ) AX , DX MOV ES : [( E ) DI ], ( E ) AX ; отрегулируйте (E) DI в соответствии с размером операнда и DF |
ОСТАВЛЯТЬ | Оставить кадр стека | Освобождает локальное хранилище стека, созданное предыдущей инструкцией ENTER. |
ВЫХОДЫ | Строка вывода в порт | эквивалент:MOV ( E ) AX , DS : [( E ) SI ] OUT DX , ( E ) AX ; отрегулируйте (E) SI в соответствии с размером операнда и DF |
ПОПА | Извлечь из стека все регистры общего назначения | эквивалент:POP DI POP SI POP BP POP AX ; здесь нет POP SP, все, что он делает, это ADD SP, 2 (поскольку AX будет перезаписан позже) POP BX POP DX POP CX POP AX |
ПУША | Поместить все регистры общего назначения в стек | эквивалент:PUSH AX PUSH CX PUSH DX PUSH BX PUSH SP ; Сохраненное значение является начальным значением SP PUSH BP PUSH SI PUSH DI |
НАЖАТЬ немедленно | Немедленно поместить значение байта / слова в стек | пример:PUSH 12h PUSH 1200H |
IMUL немедленно | Знаковое умножение непосредственного значения байта / слова | пример:IMUL BX , 12h IMUL DX , 1200h IMUL CX , DX , 12h IMUL BX , SI , 1200h IMUL DI , слово ptr [ BX + SI ], 12h IMUL SI , слово ptr [ BP - 4 ], 1200h |
SHL / SHR / SAL / SAR / ROL / ROR / RCL / RCR немедленно | Повернуть / сдвинуть биты с немедленным значением больше 1 | пример:ROL AX , 3 SHR 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 |
ПЕТЛЯ, ПЕТЛЯ cc W | Цикл, условный цикл | То же, что LOOP, LOOP cc для более ранних процессоров |
LOOPD, LOOPccD | Цикл при равенстве | if (cc && --ECX) goto lbl; , cc = Z (ero), E (qual), N на Z ero, N (on) E (qual) |
MOV в / из CR / DR / TR | Переход в / из специальных регистров | CR = регистры управления, DR = регистры отладки, TR = тестовые регистры (до 80486) |
МОВСД | Переместить двойное слово строки | *(dword*)ES:EDI±± = *(dword*)ESI±±; (± ± зависит от DF); может иметь префикс REP |
MOVSX | Перемещение со знаком-расширением | (long)r = (signed char) r/m; и подобные |
MOVZX | Перемещение с нулевым расширением | (long)r = (unsigned char) r/m; и подобные |
OUTSD | Вывод в порт из строкового двойного слова | port[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 | Обмен байтами | r = r<<24 | r<<8&0x00FF0000 | r>>8&0x0000FF00 | r>>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] | Возобновить из режима управления системой | Это было введено в i 386SL и более поздних версиях, а также в i 486SL и более поздних версиях. Выход из режима управления системой (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, CMOVNOV, CMOVNLE, CMOVNO, CMOVNOV, CMOVNLE, CMOVNO , CMOVP, CMOVPE, CMOVPO, CMOVS, CMOVZ) |
UD2 | Неопределенная инструкция | Создает исключение недопустимого кода операции. Эта инструкция предназначена для тестирования программного обеспечения, чтобы явно сгенерировать недопустимый код операции. Код операции для этой инструкции зарезервирован для этой цели. |
Добавлено с Pentium II [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
SYSENTER | SYStem вызов ENTER | Эта инструкция, которую иногда называют инструкцией быстрого системного вызова, была предназначена для повышения производительности вызовов операционной системы. Обратите внимание, что на Pentium Pro инструкция CPUID неверно сообщает об этих инструкциях как о доступных. |
SYSEXIT | SYStem вызов EXIT |
Добавлено с помощью SSE [ править ]
Инструкция | Код операции | Смысл | Ноты |
---|---|---|---|
NOP г / м16 | 0F 1F / 0 | Многобайтовая инструкция бездействия. | |
NOP г / м32 | |||
PREFETCHT0 | 0F 18/1 | Предварительная выборка данных с адреса | Предварительная загрузка на всех уровнях кеша |
PREFETCHT1 | 0F 18/2 | Предварительная выборка данных с адреса | Предварительная выборка на всех уровнях кеша, ЗА ИСКЛЮЧЕНИЕМ [5] [6] L1 |
PREFETCHT2 | 0F 18/3 | Предварительная выборка данных с адреса | Предварительная выборка во все уровни кэша, ЗА ИСКЛЮЧЕНИЕМ L1 и L2 |
PREFETCHNTA | 0F 18/0 | Предварительная выборка данных с адреса | Предварительная выборка в невременную структуру кеша, сводя к минимуму загрязнение кеша. |
SFENCE | 0F AE F8 | Магазин Забор | Подсказка процессора, чтобы убедиться, что все операции хранилища, которые произошли до вызова SFENCE, видны глобально |
Добавлено с SSE2 [ править ]
Инструкция | Код операции | Смысл | Ноты |
---|---|---|---|
CLFLUSH m8 | 0F AE / 7 | Очистка строки кэша | Делает недействительной строку кэша, содержащую линейный адрес, указанный в исходном операнде со всех уровней иерархии кэша процессора. |
LFENCE | 0F AE E8 | Загрузить забор | Сериализует операции загрузки. |
MFENCE | 0F AE F0 | Забор Памяти | Выполняет операцию сериализации для всех инструкций загрузки и сохранения, которые были выданы до инструкции MFENCE. |
МОВНТИ м32, р32 | 0F C3 / r | Переместить двойное слово вне времени | Переместите двойное слово с r32 на m32, минимизируя загрязнение иерархии кеша. |
ПАУЗА | F3 90 | Подсказка Spin Loop | Дает подсказку процессору, что следующий код является циклом вращения, для кэшируемости. |
Добавлено с SSE3 [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
MONITOR EAX, ECX, EDX | Настройка адреса монитора | Устанавливает линейный диапазон адресов для аппаратного мониторинга и активирует монитор. |
MWAIT EAX, ECX | Монитор Подождите | Подсказка процессора для остановки выполнения инструкции и перехода в оптимизированное состояние, зависящее от реализации, до возникновения класса событий. |
Добавлено с SSE4.2 [ править ]
Инструкция | Код операции | Смысл | Ноты |
---|---|---|---|
CRC32 r32, r / m8 | F2 0F 38 F0 / r | Накопить CRC32 | Вычисляет значение CRC с использованием полинома CRC-32C (Кастаньоли) 0x11EDC6F41 (нормальная форма 0x1EDC6F41). Это полином, используемый в iSCSI. В отличие от более популярного, используемого в Ethernet, его четность является четной, и поэтому он может обнаруживать любую ошибку с нечетным количеством измененных битов. |
CRC32 r32, r / m8 | F2 REX 0F 38 F0 / r | ||
CRC32 r32, r / m16 | F2 0F 38 F1 / r | ||
CRC32 r32, r / m32 | F2 0F 38 F1 / r | ||
CRC32 r64, r / m8 | F2 REX.W 0F 38 F0 / r | ||
CRC32 r64, r / m64 | F2 REX.W 0F 38 F1 / r | ||
CRC32 r32, r / m8 | F2 0F 38 F0 / r |
Добавлено с x86-64 [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
CDQE | Знак расширить EAX в RAX | |
CQO | Знак расширить RAX в RDX: RAX | |
CMPSQ | CoMPare String Quadword | |
CMPXCHG16B | СОПРЯЖЕНИЕ И ОБСЛУЖИВАНИЕ 16 Байт | |
IRETQ | 64-битный возврат из прерывания | |
JRCXZ | Перейти, если RCX равен нулю | |
LODSQ | LoaD String Quadword | |
MOVSXD | MOV с Sign Extend с 32-разрядной до 64-разрядной версии | |
POPFQ | POP RFLAGS Реестр | |
PUSHFQ | PUSH RFLAGS Реестр | |
RDTSCP | Счетчик отметок времени ReaD и идентификатор процессора | |
SCASQ | SCAn String Quadword | |
STOSQ | STOre String Quadword | |
СВОПЫ | Обменять базу GS с KernelGSBase MSR |
Добавлен с помощью AMD-V [ править ]
Инструкция | Смысл | Ноты | Код операции |
---|---|---|---|
CLGI | Очистить глобальный флаг прерывания | Очищает GIF | 0x0F 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 | Используется исключительно для связи с VMM | 0x0F 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 | Вызов функции ВМ | Вызов функции виртуальной машины, указанной в EAX. | 0x0F 0x01 0xD4 |
VMPTRLD | Указатель нагрузки на структуру управления виртуальной машиной | Загружает текущий указатель VMCS из памяти. | 0x0F 0xC7 / 6 |
VMPTRST | Указатель хранилища на структуру управления виртуальной машиной | Сохраняет указатель current-VMCS по указанному адресу памяти. Операнд этой инструкции всегда 64-битный и всегда находится в памяти. | 0x0F 0xC7 / 7 |
VMCLEAR | Четкая структура управления виртуальной машиной | Записывает любые кэшированные данные в VMCS | 0x66 0x0F 0xC7 / 6 |
VMREAD | Чтение поля из управляющей структуры виртуальной машины | Считывает поле в VMCS | 0x0F 0x78 |
VMWRITE | Запись поля в структуру управления виртуальной машиной | Изменяет поле в VMCS | 0x0F 0x79 |
VMCALL | Вызов монитора ВМ | Вызывает функцию монитора ВМ из гостевой системы | 0x0F 0x01 0xC1 |
VMLAUNCH | Запустить виртуальную машину | Запустить виртуальную машину под управлением текущей VMCS | 0x0F 0x01 0xC2 |
VMRESUME | Возобновить виртуальную машину | Возобновить виртуальную машину под управлением текущей VMCS | 0x0F 0x01 0xC3 |
VMXOFF | Выйти из работы VMX | Останавливает аппаратно поддерживаемую среду виртуализации | 0x0F 0x01 0xC4 |
VMXON | Войдите в операцию VMX | Переход в среду виртуализации с аппаратной поддержкой | 0xF3 0x0F 0xC7 / 6 |
Добавлен с помощью ПРО [ править ]
LZCNT , POPCNT (POPulation CouNT) - расширенная обработка битов
Добавлено с BMI1 [ править ]
ANDN, BEXTR, BLSI, BLSMSK, BLSR, TZCNT
Добавлено с ИМТ2 [ править ]
BZHI, MULX, PDEP, PEXT, RORX, SARX, SHRX, SHLX
Добавлено с помощью TBM [ править ]
AMD представила TBM вместе с BMI1 в своей линейке процессоров Piledriver [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, imm | 66 0f 3a 44 / r ib | Выполните умножение без переноса двух 64-битных многочленов над конечным полем GF (2 k ). |
PCLMULLQLQDQ xmmreg, xmmrm | 66 0f 3a 44 / r 00 | Умножьте младшие половины двух регистров. |
PCLMULHQLQDQ xmmreg, xmmrm | 66 0f 3a 44 / r 01 | Умножьте старшую половину регистра назначения на младшую половину исходного регистра. |
PCLMULLQHQDQ xmmreg, xmmrm | 66 0f 3a 44 / r 10 | Умножьте младшую половину регистра назначения на старшую половину исходного регистра. |
PCLMULHQHQDQ xmmreg, xmmrm | 66 0f 3a 44 / r 11 | Умножьте старшие половины двух регистров. |
Добавлено с Intel ADX [ править ]
Инструкция | Описание |
---|---|
ADCX | Добавляет два целых числа без знака плюс перенос, считывая перенос из флага переноса и, при необходимости, устанавливая его там. Не влияет на другие флаги, кроме керри. |
ADOX | Добавляет два целых числа без знака плюс перенос, считывая перенос из флага переполнения и при необходимости устанавливая его там. Не влияет на другие флаги, кроме переполнения. |
инструкции x87 с плавающей запятой [ править ]
Оригинальные 8087 инструкции [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
F2XM1 | точнее, чем для x, близкого к нулю | |
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 (e) в стек | |
FLDL2T | Загрузите журнал 2 (10) в стопку | |
FLDLG2 | Загрузить журнал 10 (2) в стопку | |
FLDLN2 | Загрузите ln (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 | y · log 2 x | если y = log b 2 , то вычисляется логарифм по основанию b. |
FYL2XP1 | у · журнал 2 ( х +1) | точнее, чем log 2 z, если x близко к нулю |
Добавлено в конкретных процессорах [ править ]
Добавлен с номером 80287 [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
FSETPM | Установить защищенный режим | Только 80287, иначе FNOP |
Добавлен с номером 80387 [ править ]
Инструкция | Смысл | Ноты |
---|---|---|
FCOS | Косинус | |
ФЛДЕНВД | Состояние загрузки среды, 32-разрядная версия | |
ПРАВИЛЬНО | Сохранить состояние 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
Инструкция | Код операции | Смысл | Ноты |
---|---|---|---|
EMMS | 0F 77 | Пустое состояние технологии MMX | Помечает все регистры x87 FPU для использования FPU |
МОВД мм, п / м 32 | 0F 6E / r | Переместить двойное слово | |
МОВД r / m32, мм | 0F 7E / r | Переместить двойное слово | |
MOVQ мм / м64, мм | 0F 7F / r | Переместить четверное слово | |
MOVQ мм, мм / м 64 | 0F 6F / r | Переместить четверное слово | |
MOVQ мм, об / м 64 | REX.W + 0F 6E / r | Переместить четверное слово | |
MOVQ r / m64, мм | REX.W + 0F 7E / r | Переместить четверное слово | |
PACKSSDW мм1, мм2 / м64 | 0F 6B / r | Упаковать двойные слова в слова (подписанные насыщенностью) | |
PACKSSWB мм1, мм2 / м64 | 0F 63 / r | Упаковать слова в байты (подписанные насыщением) | |
PACKUSWB мм, мм / м 64 | 0F 67 / r | Упаковать слова в байты (без знака с насыщением) | |
PADDB мм, мм / м 64 | 0F FC / r | Добавить упакованные байтовые целые числа | |
PADDW мм, мм / м 64 | 0F FD / r | Добавить упакованные целые слова | |
PADDD мм, мм / м 64 | 0F FE / r | Добавить упакованные целые числа с двойным словом | |
PADDQ мм, мм / м 64 | 0F D4 / r | Добавить упакованные целые числа четверного слова | |
PADDSB мм, мм / м 64 | 0F EC / r | Добавить упакованные байтовые целые числа со знаком и насыщать | |
PADDSW мм, мм / м 64 | 0F ED / г | Добавить упакованные целые числа со знаком и заполнить | |
PADDUSB мм, мм / м 64 | 0F DC / r | Добавить упакованные байтовые целые числа без знака и насыщать | |
PADDUSW мм, мм / м 64 | 0F ДД / г | Добавить упакованные целые числа без знака и насыщать | |
PAND мм, мм / м 64 | 0F DB / r | Побитовое И | |
PANDN мм, мм / м 64 | 0F DF / r | Побитовое И НЕ | |
POR мм, мм / м 64 | 0F EB / r | Побитовое ИЛИ | |
PXOR мм, мм / м 64 | 0F EF / r | Побитовое исключающее ИЛИ | |
PCMPEQB мм, мм / м64 | 0F 74 / г | Сравните упакованные байты на предмет равенства | |
PCMPEQW мм, мм / м64 | 0F 75 / r | Сравните упакованные слова на равенство | |
PCMPEQD мм, мм / м64 | 0F 76 / r | Сравните упакованные двойные слова на равенство | |
PCMPGTB мм, мм / м 64 | 0F 64 / r | Сравните упакованные байтовые целые числа со знаком больше чем | |
PCMPGTW мм, мм / м64 | 0F 65 / r | Сравнить упакованные целые числа со знаком слова больше чем | |
PCMPGTD мм, мм / м 64 | 0F 66 / r | Сравните упакованные целые числа двойного слова со знаком больше чем | |
PMADDWD мм, мм / м 64 | 0F F5 / r | Умножение упакованных слов, добавление смежных двойных слов результатов | |
PMULHW мм, мм / м64 | 0F E5 / r | Умножение упакованных целых чисел со знаком, сохранение старших 16 бит результатов | |
PMULLW мм, мм / м 64 | 0F D5 / r | Умножение упакованных целых чисел со знаком, сохранение младших 16 бит результатов | |
PSLLW мм1, imm8 | 0F 71/6 ib | Сдвиг влево слова, сдвиг по нулям | |
PSLLW мм, мм / м 64 | 0F F1 / r | Сдвиг влево слова, сдвиг по нулям | |
PSLLD мм, imm8 | 0F 72/6 ib | Сдвиг влево двойных слов, сдвиг нулей | |
PSLLD мм, мм / м 64 | 0F F2 / r | Сдвиг влево двойных слов, сдвиг нулей | |
PSLLQ мм, imm8 | 0F 73/6 ib | Сдвиг влево четверное слово, сдвиг по нулям | |
PSLLQ мм, мм / м 64 | 0F F3 / r | Сдвиг влево четверное слово, сдвиг по нулям | |
PSRAD мм, imm8 | 0F 72/4 ib | Сдвиг вправо двойных слов, сдвиг в знаковых битах | |
ПСРАД мм, мм / м 64 | 0F E2 / r | Сдвиг вправо двойных слов, сдвиг в знаковых битах | |
PSRAW мм, imm8 | 0F 71/4 ib | Сдвиг правых слов, сдвиг знаковых бит | |
PSRAW мм, мм / м 64 | 0F E1 / r | Сдвиг правых слов, сдвиг знаковых бит | |
PSRLW мм, imm8 | 0F 71/2 ib | Сдвинуть правильные слова, сдвинуть нули | |
PSRLW мм, мм / м 64 | 0F D1 / r | Сдвинуть правильные слова, сдвинуть нули | |
ПСРЛД мм, imm8 | 0F 72/2 ib | Сдвиг двойных слов вправо, сдвиг нулей | |
ПСРЛД мм, мм / м 64 | 0F D2 / r | Сдвиг двойных слов вправо, сдвиг нулей | |
PSRLQ мм, imm8 | 0F 73/2 ib | Сдвиг правого четверного слова, сдвиг нулей | |
ПСРЛК мм, мм / м 64 | 0F D3 / r | Сдвиг правого четверного слова, сдвиг нулей | |
PSUBB мм, мм / м 64 | 0F F8 / r | Вычесть упакованные байтовые целые числа | |
PSUBW мм, мм / м 64 | 0F F9 / r | Вычесть целые числа упакованных слов | |
ПСУБД мм, мм / м 64 | 0F FA / r | Вычтите упакованные целые числа двойного слова | |
ПСУБСБ мм, мм / м 64 | 0F E8 / r | Вычесть подписанные упакованные байты с насыщением | |
PSUBSW мм, мм / м 64 | 0F E9 / r | Вычесть подписанные упакованные слова с насыщением | |
PSUBUSB мм, мм / м 64 | 0F D8 / r | Вычесть беззнаковые упакованные байты с насыщением | |
PSUBUSW мм, мм / м 64 | 0F D9 / r | Вычесть упакованные слова без знака с насыщением | |
PUNPCKHBW мм, мм / м 64 | 0F 68 / r | Распаковывать и чередовать старшие байты | |
PUNPCKHWD мм, мм / м 64 | 0F 69 / r | Распаковывать и чередовать слова высокого порядка | |
PUNPCKHDQ мм, мм / м 64 | 0F 6A / r | Распаковывать и чередовать двойные слова высокого порядка | |
PUNPCKLBW мм, мм / м32 | 0F 60 / r | Распаковывать и чередовать младшие байты | |
PUNPCKLWD мм, мм / м32 | 0F 61 / г | Распаковывать и чередовать младшие слова | |
PUNPCKLDQ мм, мм / м32 | 0F 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, мм2 | 0F F7 / r | Замаскированный ход квадворда |
MOVNTQ m64, мм | 0F E7 / r | Перемещение четверного слова с помощью вневременной подсказки |
PSHUFW мм1, мм2 / м64, imm8 | 0F 70 / r ib | Перемешать упакованные слова |
PINSRW мм, r32 / m16, imm8 | 0F C4 / r | Вставить слово |
PEXTRW reg, мм, imm8 | 0F C5 / r | Извлечь слово |
ПМОВМСКБ рег, мм | 0F D7 / r | Переместить байтовую маску |
PMINUB мм1, мм2 / м64 | 0F DA / r | Минимум упакованных беззнаковых байтовых целых чисел |
PMAXUB мм1, мм2 / м64 | 0F DE / r | Максимум упакованных беззнаковых байтовых целых чисел |
PAVGB мм1, мм2 / м64 | 0F E0 / r | Средние упакованные целые числа |
PAVGW мм1, мм2 / м64 | 0F E3 / r | Средние упакованные целые числа |
PMULHUW мм1, мм2 / м64 | 0F E4 / r | Умножение упакованных беззнаковых целых чисел и сохранение высокого результата |
PMINSW мм1, мм2 / м64 | 0F EA / r | Минимум упакованных целых чисел со знаком со знаком |
PMAXSW мм1, мм2 / м64 | 0F EE / r | Максимум упакованных целых чисел со знаком со знаком |
PSADBW мм1, мм2 / м64 | 0F F6 / r | Вычислить сумму абсолютных разностей |
Инструкции MMX добавлены с SSE2 [ править ]
Следующие инструкции MMX были добавлены с SSE2:
Инструкция | Код операции | Смысл |
---|---|---|
PSUBQ мм1, мм2 / м64 | 0F FB / r | Вычесть четверное слово целое |
PMULUDQ мм1, мм2 / м64 | 0F F4 / r | Умножение беззнакового двойного слова на целое |
Инструкции MMX добавлены с SSSE3 [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
PSIGNB мм1, мм2 / м64 | 0F 38 08 / г | Отрицать / обнулять / сохранять упакованные байтовые целые числа в зависимости от соответствующего знака |
PSIGNW мм1, мм2 / м64 | 0F 38 09 / г | Отрицать / обнулять / сохранять упакованные целые слова в зависимости от соответствующего знака |
PSIGND мм1, мм2 / м64 | 0F 38 0A / r | Отрицать / обнулять / сохранять упакованные целые числа двойного слова в зависимости от соответствующего знака |
ПШУФБ мм1, мм2 / м64 | 0F 38 00 / г | Перемешать байты |
PMULHRSW мм1, мм2 / м64 | 0F 38 0B / r | Умножение 16-битных слов со знаком, масштабирование и округление двойных слов со знаком, упаковка старших 16 бит |
PMADDUBSW мм1, мм2 / м64 | 0F 38 04 / г | Умножение подписанных и беззнаковых байтов, добавление горизонтальной пары подписанных слов, упаковка насыщенных подписанных слов |
PHSUBW мм1, мм2 / м64 | 0F 38 05 / г | Вычесть и упаковать 16-битные целые числа со знаком по горизонтали |
PHSUBSW мм1, мм2 / м64 | 0F 38 07 / r | Вычесть и упаковать 16-битное целое число со знаком по горизонтали с насыщением |
PHSUBD мм1, мм2 / м64 | 0F 38 06 / r | Вычесть и упаковать 32-разрядные целые числа со знаком по горизонтали |
PHADDSW мм1, мм2 / м64 | 0F 38 03 / г | Сложите и упакуйте 16-разрядные целые числа со знаком по горизонтали, упакуйте насыщенные целые числа в мм1. |
PHADDW мм1, мм2 / м64 | 0F 38 01 / г | Сложить и упаковать 16-битные целые числа по горизонтали |
PHADDD мм1, мм2 / м64 | 0F 38 02 / г | Сложить и упаковать 32-битные целые числа по горизонтали |
PALIGNR мм1, мм2 / м64, imm8 | 0F 3A 0F / r ib | Объединить целевые и исходные операнды, извлечь результат, выровненный по байтам, со смещением вправо |
ПАБСБ мм1, мм2 / м64 | 0F 38 1C / r | Вычислить абсолютное значение байтов и сохранить результат без знака |
PABSW мм1, мм2 / м64 | 0F 38 1D / r | Вычислить абсолютное значение 16-битных целых чисел и сохранить результат без знака |
ПАБСД мм1, мм2 / м64 | 0F 38 1E / r | Вычислить абсолютное значение 32-битных целых чисел и сохранить результат без знака |
3DNow! инструкции [ редактировать ]
Добавлен с K6-2
FEMMS, PAVGUSB, PF2ID, PFACC, PFADD, PFCMPEQ, PFCMPGE, PFCMPGT, PFMAX, PFMIN, PFMUL, PFRCP, PFRCPIT1, PFRCPIT2, PFRSQIT1, PFRSQRT, PFSUB, PIETCHWFSW, PFRSQRT, PFSUB, PFRFWF
3DNow! + Инструкции [ редактировать ]
Добавлен Athlon и K6-2 + [ править ]
PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
Добавлено с помощью Geode GX [ править ]
PFRSQRTV, PFRCPV
Инструкции SSE [ править ]
Добавлен с Pentium III
Инструкции SSE работают с регистрами xmm, ширина которых составляет 128 бит.
SSE состоит из следующих инструкций с плавающей запятой SSE SIMD:
Инструкция | Код операции | Смысл |
---|---|---|
ANDPS * xmm1, xmm2 / m128 | 0F 54 / r | Побитовое логическое И упакованных значений с плавающей запятой одинарной точности |
ANDNPS * xmm1, xmm2 / m128 | 0F 55 / r | Побитовая логика, а не упакованные значения с плавающей запятой одинарной точности |
ORPS * xmm1, xmm2 / m128 | 0F 56 / r | Побитовое логическое ИЛИ значений с плавающей запятой одинарной точности |
XORPS * xmm1, xmm2 / m128 | 0F 57 / r | Побитовое логическое исключающее ИЛИ для значений с плавающей запятой одинарной точности |
MOVUPS xmm1, xmm2 / m128 | 0F 10 / г | Перемещение невыровненных упакованных значений с плавающей запятой одинарной точности |
MOVSS xmm1, xmm2 / m32 | F3 0F 10 / г | Перемещение скалярных значений с плавающей запятой одинарной точности |
MOVUPS xmm2 / m128, xmm1 | 0F 11 / r | Перемещение невыровненных упакованных значений с плавающей запятой одинарной точности |
MOVSS xmm2 / m32, xmm1 | F3 0F 11 / r | Перемещение скалярных значений с плавающей запятой одинарной точности |
MOVLPS xmm, m64 | 0F 12 / r | Перемещение значений с плавающей запятой одинарной точности с низкой упаковкой |
MOVHLPS xmm1, xmm2 | 0F 12 / r | Перемещение упакованных значений с плавающей запятой одинарной точности от высокого к низкому |
MOVLPS m64, x мм | 0F 13 / r | Перемещение значений с плавающей запятой одинарной точности с низкой упаковкой |
UNPCKLPS xmm1, xmm2 / m128 | 0F 14 / r | Распаковка и чередование значений с плавающей запятой одинарной точности с низкой упаковкой |
UNPCKHPS xmm1, xmm2 / m128 | 0F 15 / г | Распаковка и чередование упакованных значений с плавающей запятой одинарной точности |
MOVHPS xmm, m64 | 0F 16 / r | Перемещение высокоупакованных значений с плавающей запятой одинарной точности |
MOVLHPS xmm1, xmm2 | 0F 16 / r | Перемещение упакованных значений с плавающей запятой одинарной точности от меньшего к большему |
MOVHPS m64, xмм | 0F 17 / r | Перемещение высокоупакованных значений с плавающей запятой одинарной точности |
MOVAPS xmm1, xmm2 / m128 | 0F 28 / r | Перемещение выровненных упакованных значений с плавающей запятой одинарной точности |
MOVAPS xmm2 / m128, xmm1 | 0F 29 / r | Перемещение выровненных упакованных значений с плавающей запятой одинарной точности |
MOVNTPS m128, xmm1 | 0F 2B / r | Move Aligned с четырьмя упаковками Single-FP Non Temporal |
MOVMSKPS reg, xmm | 0F 50 / г | Извлечь упакованную 4-битную маску знака с плавающей запятой одинарной точности. Старшие биты регистра заполнены нулями. |
CVTPI2PS x мм, мм / м 64 | 0F 2A / r | Преобразование упакованных целых чисел двойного слова в упакованные значения FP с одинарной точностью |
CVTSI2SS xmm, r / m32 | F3 0F 2A / r | Преобразование целого двойного слова в скалярное значение FP с одинарной точностью |
CVTSI2SS xmm, r / m64 | F3 REX.W 0F 2A / r | Преобразование целого числа Qword в скалярное значение FP с одинарной точностью |
MOVNTPS m128, xмм | 0F 2B / r | Сохранение упакованных значений с плавающей запятой одинарной точности с использованием вневременных подсказок |
CVTTPS2PI мм, xмм / м64 | 0F 2C / r | Преобразование с усечением упакованных значений FP одинарной точности в упакованные целые числа двойного слова |
CVTTSS2SI r32, мм / м32 | F3 0F 2C / r | Преобразование с усечением скалярного значения FP с одинарной точностью в целое число двойного слова |
CVTTSS2SI r64, мм1 / м32 | F3 REX.W 0F 2C / r | Преобразование со скалярным значением FP одинарной точности с усечением в целое число Qword |
CVTPS2PI мм, xмм / м64 | 0F 2D / r | Преобразование упакованных значений FP с одинарной точностью в упакованные целые числа двойного слова |
CVTSS2SI r32, мм / м32 | F3 0F 2D / r | Преобразование скалярного значения FP с одинарной точностью в целое число двойного слова |
CVTSS2SI r64, мм1 / м32 | F3 REX.W 0F 2D / r | Преобразование скалярного значения FP с одинарной точностью в целое число Qword |
UCOMISS xmm1, xmm2 / m32 | 0F 2E / r | Неупорядоченное сравнение скалярных значений с плавающей запятой одинарной точности и установка EFLAGS |
КОМИССЫ xmm1, xmm2 / m32 | 0F 2F / r | Сравните скалярные упорядоченные значения с плавающей запятой одинарной точности и установите EFLAGS |
SQRTPS xmm1, xmm2 / m128 | 0F 51 / г | Вычисление квадратного корня из упакованных значений с плавающей запятой одинарной точности |
SQRTSS xmm1, xmm2 / m32 | F3 0F 51 / г | Вычислить квадратный корень из скалярного значения с плавающей запятой одинарной точности |
RSQRTPS xmm1, xmm2 / m128 | 0F 52 / r | Вычислить обратную величину квадратного корня упакованного значения с плавающей запятой одинарной точности |
RSQRTSS xmm1, xmm2 / m32 | F3 0F 52 / г | Вычислить обратную величину квадратного корня скалярного значения с плавающей запятой одинарной точности |
RCPPS xmm1, xmm2 / m128 | 0F 53 / г | Вычисление взаимных значений упакованных значений с плавающей запятой одинарной точности |
RCPSS xmm1, xmm2 / m32 | F3 0F 53 / г | Вычисление обратных значений скалярных значений с плавающей запятой одинарной точности |
ADDPS xmm1, xmm2 / m128 | 0F 58 / r | Добавление упакованных значений с плавающей запятой одинарной точности |
ADDSS xmm1, xmm2 / m32 | F3 0F 58 / r | Добавление скалярных значений с плавающей запятой одинарной точности |
МУЛЬПЫ xmm1, xmm2 / m128 | 0F 59 / r | Многократно упакованные значения с плавающей запятой одинарной точности |
MULSS xmm1, xmm2 / m32 | F3 0F 59 / r | Умножение скалярных значений с плавающей запятой одинарной точности |
SUBPS xmm1, xmm2 / m128 | 0F 5C / r | Вычитание упакованных значений с плавающей запятой одинарной точности |
SUBSS xmm1, xmm2 / m32 | F3 0F 5C / r | Вычесть скалярные значения с плавающей запятой одинарной точности |
MINPS xmm1, xmm2 / m128 | 0F 5D / r | Возврат минимально упакованных значений с плавающей запятой одинарной точности |
MINSS xmm1, xmm2 / m32 | F3 0F 5D / r | Возвращает минимальные скалярные значения с плавающей запятой одинарной точности |
DIVPS xmm1, xmm2 / m128 | 0F 5E / r | Разделение упакованных значений с плавающей запятой одинарной точности |
DIVSS xmm1, xmm2 / m32 | F3 0F 5E / r | Разделение скалярных значений с плавающей запятой одинарной точности |
MAXPS x мм1, x мм2 / м 128 | 0F 5F / r | Возврат максимальных упакованных значений с плавающей запятой одинарной точности |
MAXSS xmm1, xmm2 / m32 | F3 0F 5F / r | Возвращает максимальные скалярные значения с плавающей запятой одинарной точности |
LDMXCSR m32 | 0F AE / 2 | Загрузить состояние регистра MXCSR |
STMXCSR m32 | 0F AE / 3 | Сохранить состояние регистра MXCSR |
CMPPS xmm1, xmm2 / m128, imm8 | 0F C2 / r ib | Сравните упакованные значения с плавающей запятой одинарной точности |
CMPSS xmm1, xmm2 / m32, imm8 | F3 0F C2 / r ib | Сравните скалярные значения с плавающей запятой одинарной точности |
ШУФПС xmm1, xmm2 / m128, imm8 | 0F 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 / m128 | 66 0F 28 / r | Перемещение выровненных упакованных значений с плавающей запятой двойной точности |
MOVAPD x мм2 / м 128, x мм1 | 66 0F 29 / r | Перемещение выровненных упакованных значений с плавающей запятой двойной точности |
МОВНТПД м128, мм1 | 66 0F 2B / r | Сохранение упакованных значений с плавающей запятой двойной точности с использованием вневременных подсказок |
MOVHPD xmm1, m64 | 66 0F 16 / r | Перемещение высокоупакованного значения с плавающей запятой двойной точности |
MOVHPD m64, xmm1 | 66 0F 17 / r | Перемещение высокоупакованного значения с плавающей запятой двойной точности |
MOVLPD xmm1, m64 | 66 0F 12 / r | Переместить низкоупакованное значение с плавающей точкой двойной точности |
MOVLPD m64, xmm1 | 66 0F 13 / r | Переместить низкоупакованное значение с плавающей точкой двойной точности |
MOVUPD xmm1, xmm2 / m128 | 66 0F 10 / г | Перемещение невыровненных упакованных значений с плавающей запятой двойной точности |
MOVUPD xmm2 / m128, xmm1 | 66 0F 11 / r | Перемещение невыровненных упакованных значений с плавающей запятой двойной точности |
MOVMSKPD reg, xmm | 66 0F 50 / р | Извлечь упакованную маску знака с плавающей запятой двойной точности |
MOVSD * xmm1, xmm2 / m64 | F2 0F 10 / г | Перемещение или объединение скалярных значений с плавающей запятой двойной точности |
MOVSD xmm1 / m64, xmm2 | F2 0F 11 / r | Перемещение или объединение скалярных значений с плавающей запятой двойной точности |
Упакованные арифметические инструкции SSE2 [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
ADDPD xmm1, xmm2 / m128 | 66 0F 58 / r | Добавление упакованных значений с плавающей запятой двойной точности |
ADDSD xmm1, xmm2 / m64 | F2 0F 58 / r | Добавить низкое значение с плавающей запятой двойной точности |
DIVPD xmm1, xmm2 / m128 | 66 0F 5E / r | Разделение упакованных значений с плавающей запятой двойной точности |
DIVSD xmm1, xmm2 / m64 | F2 0F 5E / r | Разделить скалярное значение с плавающей запятой двойной точности |
MAXPD x мм1, x мм2 / м 128 | 66 0F 5F / r | Максимум упакованных значений с плавающей запятой двойной точности |
MAXSD xmm1, xmm2 / m64 | F2 0F 5F / r | Возвращает максимальное скалярное значение с плавающей запятой двойной точности |
MINPD xmm1, xmm2 / m128 | 66 0F 5D / r | Минимум упакованных значений с плавающей запятой двойной точности |
MINSD xmm1, xmm2 / m64 | F2 0F 5D / r | Вернуть минимальное скалярное значение с плавающей запятой двойной точности |
MULPD xmm1, xmm2 / m128 | 66 0F 59 / r | Мультиупакованные значения с плавающей запятой двойной точности |
MULSD xmm1, xmm2 / m64 | F2 0F 59 / r | Умножение скалярного значения с плавающей запятой двойной точности |
SQRTPD xmm1, xmm2 / m128 | 66 0F 51 / г | Квадратный корень из значений с плавающей запятой двойной точности |
SQRTSD xmm1, xmm2 / m64 | F2 0F 51 / г | Вычислить квадратный корень из скалярного значения с плавающей запятой двойной точности |
SUBPD xmm1, xmm2 / m128 | 66 0F 5C / r | Вычитание упакованных значений с плавающей запятой двойной точности |
SUBSD xmm1, xmm2 / m64 | F2 0F 5C / r | Вычесть скалярное значение с плавающей запятой двойной точности |
Логические инструкции SSE2 [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
ANDPD xmm1, xmm2 / m128 | 66 0F 54 / р | Побитовое логическое И упакованных значений с плавающей запятой двойной точности |
ANDNPD xmm1, xmm2 / m128 | 66 0F 55 / р | Побитовая логика, а не упакованные значения с плавающей запятой двойной точности |
ORPD xmm1, xmm2 / m128 | 66 0F 56 / r | Побитовое логическое ИЛИ упакованных значений с плавающей запятой двойной точности |
XORPD xmm1, xmm2 / m128 | 66 0F 57 / r | Побитовое логическое исключающее ИЛИ упакованных значений с плавающей запятой двойной точности |
SSE2 инструкции по сравнению [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
CMPPD xmm1, xmm2 / m128, imm8 | 66 0F C2 / r ib | Сравните упакованные значения с плавающей запятой двойной точности |
CMPSD * xmm1, xmm2 / m64, imm8 | F2 0F C2 / r ib | Сравните низкие значения с плавающей запятой с двойной точностью |
COMISD xmm1, xmm2 / m64 | 66 0F 2F / r | Сравните скалярные упорядоченные значения с плавающей запятой двойной точности и установите EFLAGS |
UCOMISD xmm1, xmm2 / m64 | 66 0F 2E / r | Неупорядоченное сравнение скалярных значений с плавающей запятой двойной точности и установка EFLAGS |
SSE2 инструкции по перемешиванию и распаковке [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
ШУФПД xmm1, xmm2 / m128, imm8 | 66 0F C6 / r ib | Упакованное чередование пар значений с плавающей запятой двойной точности |
УНПЦХПД xmm1, xmm2 / m128 | 66 0F 15 / г | Распаковка и чередование упакованных значений с плавающей запятой двойной точности |
UNPCKLPD xmm1, xmm2 / m128 | 66 0F 14 / r | Распаковка и чередование значений с плавающей запятой двойной точности с низкой упаковкой |
Инструкции по преобразованию SSE2 [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
CVTDQ2PD xmm1, xmm2 / m64 | F3 0F E6 / r | Преобразование упакованных целых чисел двойного слова в упакованные значения с плавающей запятой двойной точности |
CVTDQ2PS xmm1, xmm2 / m128 | 0F 5B / r | Преобразование упакованных целых чисел двойного слова в упакованные значения с плавающей запятой одинарной точности |
CVTPD2DQ xmm1, xmm2 / m128 | F2 0F E6 / r | Преобразование упакованных значений с плавающей запятой двойной точности в упакованные целые числа двойного слова |
CVTPD2PI мм, x мм / м 128 | 66 0F 2D / r | Преобразование упакованных значений FP двойной точности в упакованные целые числа двойного слова |
CVTPD2PS xmm1, xmm2 / m128 | 66 0F 5A / r | Преобразование упакованных значений с плавающей запятой двойной точности в упакованные значения с плавающей запятой одинарной точности |
CVTPI2PD xmm, мм / м64 | 66 0F 2A / r | Преобразование упакованных целых чисел двойного слова в упакованные значения FP двойной точности |
CVTPS2DQ xmm1, xmm2 / m128 | 66 0F 5B / r | Преобразование упакованных значений с плавающей запятой одинарной точности в упакованные целочисленные значения двойного слова со знаком |
CVTPS2PD xmm1, xmm2 / m64 | 0F 5A / r | Преобразование упакованных значений с плавающей запятой одинарной точности в упакованные значения с плавающей запятой двойной точности |
CVTSD2SI r32, мм1 / м64 | F2 0F 2D / r | Преобразование скалярного значения с плавающей запятой двойной точности в целое число двойного слова |
CVTSD2SI r64, мм1 / м64 | F2 REX.W 0F 2D / r | Преобразование скалярного значения с плавающей запятой двойной точности в целое число с четырьмя словами с расширением знака |
CVTSD2SS xmm1, xmm2 / m64 | F2 0F 5A / r | Преобразование скалярного значения с плавающей запятой двойной точности в скалярное значение с плавающей запятой одинарной точности |
CVTSI2SD xmm1, r32 / m32 | F2 0F 2A / r | Преобразование целого числа двойного слова в скалярное значение с плавающей запятой двойной точности |
CVTSI2SD xmm1, r / m64 | F2 REX.W 0F 2A / r | Преобразование четырехсловного целого числа в скалярное значение с плавающей запятой двойной точности |
CVTSS2SD xmm1, xmm2 / m32 | F3 0F 5A / r | Преобразование скалярного значения с плавающей запятой одинарной точности в скалярное значение с плавающей запятой двойной точности |
CVTTPD2DQ xmm1, xmm2 / m128 | 66 0F E6 / r | Преобразование с усечением упакованных значений с плавающей запятой двойной точности в упакованные целые числа двойного слова |
CVTTPD2PI мм, xмм / м 128 | 66 0F 2C / r | Преобразование с усечением упакованных значений FP двойной точности в упакованные целые числа двойного слова |
CVTTPS2DQ xmm1, xmm2 / m128 | F3 0F 5B / r | Преобразование с усечением упакованных значений с плавающей запятой одинарной точности в упакованные целочисленные значения двойного слова со знаком |
CVTTSD2SI r32, мм1 / м64 | F2 0F 2C / r | Преобразование с усечением скалярного значения с плавающей запятой двойной точности в целое число двойного слова со знаком |
CVTTSD2SI r64, мм1 / м64 | F2 REX.W 0F 2C / r | Преобразование с усечением скалярного значения с плавающей запятой двойной точности в знаковое целое число Qword |
- CMPSD и MOVSD имеют то же имя, что и мнемоника строковых инструкций CMPSD (CMPS) и MOVSD (MOVS) ; Однако, бывший относятся к скалярным двойной точности с плавающими точками , тогда как latters см двойной строки.
Целочисленные инструкции SSE2 SIMD [ править ]
SSE2 MMX-подобные инструкции расширены до регистров SSE [ править ]
SSE2 позволяет выполнять инструкции MMX в регистрах SSE, одновременно обрабатывая вдвое больший объем данных.
Инструкция | Код операции | Смысл |
---|---|---|
МОВД хмм, п / м32 | 66 0F 6E / r | Переместить двойное слово |
МОВД r / m32, мм | 66 0F 7E / r | Переместить двойное слово |
MOVQ xmm1, xmm2 / m64 | F3 0F 7E / r | Переместить четверное слово |
MOVQ xmm2 / m64, xmm1 | 66 0F D6 / r | Переместить четверное слово |
MOVQ r / m64, x мм | 66 REX.W 0F 7E / r | Переместить четверное слово |
MOVQ xmm, r / m64 | 66 REX.W 0F 6E / r | Переместить четверное слово |
ПМОВМСКБ рег, xмм | 66 0F D7 / r | Перемещение байтовой маски, обнуление старших битов регистра |
PEXTRW reg, xmm, imm8 | 66 0F C5 / r ib | Извлеките указанное слово и переместите его в reg, установив биты 15-0 и обнуляя остальные |
PINSRW xmm, r32 / m16, imm8 | 66 0F C4 / r ib | Переместить младшее слово в указанную позицию слова |
PACKSSDW xmm1, xmm2 / m128 | 66 0F 6B / r | Преобразует 4 упакованных целых числа со знаком двойного слова в 8 упакованных целых чисел со знаком с насыщением |
PACKSSWB xmm1, xmm2 / m128 | 66 0F 63 / r | Преобразует 8 упакованных целых чисел со знаком в 16 упакованных целых чисел со знаком байтов с насыщением. |
PACKUSWB xmm1, xmm2 / m128 | 66 0F 67 / r | Преобразует 8 целых слов со знаком в 16 целых байтов без знака с насыщением. |
PADDB xmm1, xmm2 / m128 | 66 0F FC / r | Добавить упакованные байтовые целые числа |
PADDW xmm1, xmm2 / m128 | 66 0F FD / r | Добавить упакованные целые слова |
PADDD xmm1, xmm2 / m128 | 66 0F FE / r | Добавить упакованные целые числа с двойным словом |
PADDQ xmm1, xmm2 / m128 | 66 0F D4 / r | Добавьте упакованные целые числа четверного слова. |
PADDSB xmm1, xmm2 / m128 | 66 0F EC / r | Добавить упакованные байтовые целые числа со знаком с насыщением |
PADDSW xmm1, xmm2 / m128 | 66 0F ED / г | Добавить упакованные целые числа со знаком со знаком с насыщенностью |
PADDUSB xmm1, xmm2 / m128 | 66 0F DC / r | Добавить упакованные байтовые целые числа без знака с насыщением |
PADDUSW xmm1, xmm2 / m128 | 66 0F ДД / г | Добавить упакованные целые числа без знака с насыщением |
PAND xmm1, xmm2 / m128 | 66 0F DB / r | Побитовое И |
PANDN xmm1, xmm2 / m128 | 66 0F DF / r | Побитовое И НЕ |
POR xmm1, xmm2 / m128 | 66 0F EB / r | Побитовое ИЛИ |
PXOR xmm1, xmm2 / m128 | 66 0F EF / r | Побитовое исключающее ИЛИ |
PCMPEQB xmm1, xmm2 / m128 | 66 0F 74 / р | Сравните упакованные байты на предмет равенства. |
PCMPEQW xmm1, xmm2 / m128 | 66 0F 75 / р | Сравните упакованные слова на предмет равенства. |
PCMPEQD xmm1, xmm2 / m128 | 66 0F 76 / r | Сравните упакованные двойные слова на предмет равенства. |
PCMPGTB xmm1, xmm2 / m128 | 66 0F 64 / р | Сравните упакованные байтовые целые числа со знаком больше чем |
PCMPGTW xmm1, xmm2 / m128 | 66 0F 65 / р | Сравнить упакованные целые числа со знаком слова больше чем |
PCMPGTD xmm1, xmm2 / m128 | 66 0F 66 / r | Сравните упакованные целые числа двойного слова со знаком больше чем |
PMULLW xmm1, xmm2 / m128 | 66 0F D5 / r | Умножение упакованных целых чисел со знаком со знаком с насыщением |
PMULHW xmm1, xmm2 / m128 | 66 0F E5 / r | Умножьте упакованные целые числа со знаком слова, сохраните старшие 16 бит результатов. |
PMULHUW xmm1, xmm2 / m128 | 66 0F E4 / r | Умножить упакованные целые числа без знака, сохранить старшие 16 бит результатов |
PMULUDQ xmm1, xmm2 / m128 | 66 0F F4 / r | Умножение упакованных беззнаковых целых двойных слов |
PSLLW xmm1, xmm2 / m128 | 66 0F F1 / r | Сдвиг слов влево при переходе на 0 с |
PSLLW xmm1, imm8 | 66 0F 71/6 ib | Сдвиг слов влево при переходе на 0 с |
PSLLD xmm1, xmm2 / m128 | 66 0F F2 / r | Сдвиг двойных слов влево при сдвиге на 0 с |
PSLLD xmm1, imm8 | 66 0F 72/6 ib | Сдвиг двойных слов влево при сдвиге на 0 с |
PSLLQ xmm1, xmm2 / m128 | 66 0F F3 / r | Сдвинуть четверные слова влево, сдвигая на 0 с |
PSLLQ xmm1, imm8 | 66 0F 73/6 ib | Сдвинуть четверные слова влево, сдвигая на 0 с |
PSRAD xmm1, xmm2 / m128 | 66 0F E2 / r | Сдвиг двойного слова вправо при сдвиге битов знака |
PSRAD xmm1, imm8 | 66 0F 72/4 ib | Сдвиг двойных слов вправо при сдвиге битов знака |
PSRAW xmm1, xmm2 / m128 | 66 0F E1 / r | Сдвиг слов вправо при сдвиге битов знака |
PSRAW xmm1, imm8 | 66 0F 71/4 ib | Сдвиг слов вправо при сдвиге битов знака |
PSRLW xmm1, xmm2 / m128 | 66 0F D1 / r | Сдвиг слов вправо при сдвиге на 0 с |
PSRLW xmm1, imm8 | 66 0F 71/2 ib | Сдвиг слов вправо при сдвиге на 0 с |
ПСРЛД xмм1, xмм2 / м128 | 66 0F D2 / r | Сдвиг двойных слов вправо при сдвиге на 0 с |
ПСРЛД xmm1, imm8 | 66 0F 72/2 ib | Сдвиг двойных слов вправо при сдвиге на 0 с |
ПСРЛК хмм1, хмм2 / м128 | 66 0F D3 / r | Сдвиг четверных слов вправо при сдвиге на нули |
ПСРЛК xmm1, imm8 | 66 0F 73/2 ib | Сдвиг четверных слов вправо при сдвиге на нули |
PSUBB xmm1, xmm2 / m128 | 66 0F F8 / r | Вычесть упакованные байтовые целые числа |
PSUBW xmm1, xmm2 / m128 | 66 0F F9 / r | Вычесть целые числа упакованных слов |
PSUBD xmm1, xmm2 / m128 | 66 0F FA / r | Вычтите упакованные целые числа двойного слова |
PSUBQ xmm1, xmm2 / m128 | 66 0F FB / r | Вычтите упакованные целые числа четверного слова. |
PSUBSB xmm1, xmm2 / m128 | 66 0F E8 / r | Вычесть упакованные байтовые целые числа со знаком с насыщением |
PSUBSW xmm1, xmm2 / m128 | 66 0F E9 / r | Вычтите упакованные целые числа со знаком со знаком с насыщением |
PMADDWD xmm1, xmm2 / m128 | 66 0F F5 / r | Умножьте целые числа упакованного слова, добавьте смежные результаты двойного слова |
PSUBUSB xmm1, xmm2 / m128 | 66 0F D8 / r | Вычесть упакованные байтовые целые числа без знака с насыщением |
PSUBUSW xmm1, xmm2 / m128 | 66 0F D9 / r | Вычтите упакованные целые числа без знака с насыщением |
PUNPCKHBW xmm1, xmm2 / m128 | 66 0F 68 / r | Распаковывать и чередовать старшие байты |
PUNPCKHWD xmm1, xmm2 / m128 | 66 0F 69 / r | Распаковывать и чередовать слова высокого порядка |
PUNPCKHDQ xmm1, xmm2 / m128 | 66 0F 6A / r | Распаковывать и чередовать двойные слова высокого порядка |
PUNPCKLBW xmm1, xmm2 / m128 | 66 0F 60 / р | Чередовать младшие байты |
PUNPCKLWD xmm1, xmm2 / m128 | 66 0F 61 / г | Чередовать младшие слова |
PUNPCKLDQ xmm1, xmm2 / m128 | 66 0F 62 / r | Чередовать двойные слова младшего разряда |
PAVGB xmm1, xmm2 / m128 | 66 0F E0, / г | Средние упакованные байтовые целые числа без знака с округлением |
PAVGW xmm1, xmm2 / m128 | 66 0F E3 / r | Средние упакованные целые числа без знака с округлением |
PMINUB xmm1, xmm2 / m128 | 66 0F DA / r | Сравните упакованные байтовые целые числа без знака и сохраните упакованные минимальные значения |
PMINSW xmm1, xmm2 / m128 | 66 0F EA / r | Сравните упакованные целые числа со знаком и сохраните минимальные упакованные значения |
PMAXSW xmm1, xmm2 / m128 | 66 0F EE / r | Сравните упакованные целые числа со знаком и сохраните максимальные упакованные значения |
PMAXUB xmm1, xmm2 / m128 | 66 0F DE / r | Сравните упакованные байтовые целые числа без знака и сохраните упакованные максимальные значения |
PSADBW xmm1, xmm2 / m128 | 66 0F F6 / r | Вычисляет абсолютные разности упакованных беззнаковых целых байтов; затем 8 низких разностей и 8 высоких разностей суммируются по отдельности для получения двух целочисленных результатов без знака. |
Целочисленные инструкции SSE2 только для регистров SSE [ править ]
Следующие инструкции можно использовать только с регистрами SSE, поскольку по своей природе они не работают с регистрами MMX.
Инструкция | Код операции | Смысл |
---|---|---|
MASKMOVDQU xmm1, xmm2 | 66 0F F7 / r | Невременное сохранение выбранных байтов из регистра XMM в память |
MOVDQ2Q мм, x мм | F2 0F D6 / r | Переместите младшее четверное слово из XMM в регистр MMX. |
MOVDQA xmm1, xmm2 / m128 | 66 0F 6F / r | Переместить выровненное двойное четверное слово |
MOVDQA xmm2 / m128, xmm1 | 66 0F 7F / r | Переместить выровненное двойное четверное слово |
MOVDQU xmm1, xmm2 / m128 | F3 0F 6F / r | Переместить невыровненное двойное четверное слово |
MOVDQU xmm2 / m128, xmm1 | F3 0F 7F / r | Переместить невыровненное двойное четверное слово |
MOVQ2DQ x мм, мм | F3 0F D6 / r | Переместить четверное слово из регистра MMX в младшее четверное слово регистра XMM |
MOVNTDQ m128, xmm1 | 66 0F E7 / r | Сохранение упакованных целых чисел с использованием вневременных подсказок |
PSHUFHW xmm1, xmm2 / m128, imm8 | F3 0F 70 / r ib | В случайном порядке собраны высокие слова. |
PSHUFLW xmm1, xmm2 / m128, imm8 | F2 0F 70 / r ib | Перемешайте упакованные низкие слова. |
ПШУФД xmm1, xmm2 / m128, imm8 | 66 0F 70 / r ib | Перемешайте упакованные двойные слова. |
PSLLDQ xmm1, imm8 | 66 0F 73/7 ib | Упакованный сдвиг влево логических двойных четверных слов. |
PSRLDQ xmm1, imm8 | 66 0F 73/3 ib | Упакованный сдвиг вправо логических двойных четверных слов. |
PUNPCKHQDQ xmm1, xmm2 / m128 | 66 0F 6D / r | Распаковать и чередовать четверные слова высокого порядка, |
PUNPCKLQDQ xmm1, xmm2 / m128 | 66 0F 6C / r | Чередовать младшие четверные слова, |
Инструкции SSE3 [ править ]
Добавлен Pentium 4 с поддержкой SSE3
Команды SSE3 SIMD с плавающей запятой [ править ]
Инструкция | Код операции | Смысл | Ноты |
---|---|---|---|
ADDSUBPS xmm1, xmm2 / m128 | F2 0F D0 / r | Сложение / вычитание значений с плавающей запятой одинарной точности | для сложной арифметики |
ADDSUBPD xmm1, xmm2 / m128 | 66 0F D0 / r | Сложение / вычитание значений с плавающей запятой двойной точности | |
MOVDDUP xmm1, xmm2 / m64 | F2 0F 12 / r | Переместить значение с плавающей запятой двойной точности и продублировать | |
MOVSLDUP xmm1, xmm2 / m128 | F3 0F 12 / r | Перемещение и дублирование четных индексных значений с плавающей запятой одинарной точности | |
MOVSHDUP xmm1, xmm2 / m128 | F3 0F 16 / r | Перемещение и дублирование нечетных индексов одинарной точности с плавающей запятой | |
HADDPS xmm1, xmm2 / m128 | F2 0F 7C / r | Горизонтальное добавление упакованных значений с плавающей запятой одинарной точности | для графики |
HADDPD xmm1, xmm2 / m128 | 66 0F 7C / r | Горизонтальное добавление упакованных значений с плавающей запятой двойной точности | |
HSUBPS xmm1, xmm2 / m128 | F2 0F 7D / r | Горизонтальное вычитание упакованных значений с плавающей запятой одинарной точности | |
HSUBPD xmm1, xmm2 / m128 | 66 0F 7D / r | Горизонтальное вычитание упакованных значений с плавающей запятой двойной точности |
Целочисленные инструкции SSE3 SIMD [ править ]
Инструкция | Код операции | Смысл | Ноты |
---|---|---|---|
LDDQU xmm1, mem | F2 0F F0 / r | Загрузить невыровненные данные и вернуть двойное четверное слово | По инструкции эквивалент MOVDQU. Для кодирования видео |
Инструкции SSSE3 [ править ]
Добавлен с серией Xeon 5100 и начальным Core 2
Следующие MMX-подобные инструкции, расширенные до регистров SSE, были добавлены с SSSE3.
Инструкция | Код операции | Смысл |
---|---|---|
PSIGNB xmm1, xmm2 / m128 | 66 0F 38 08 / р | Отрицать / обнулять / сохранять упакованные байтовые целые числа в зависимости от соответствующего знака |
PSIGNW xmm1, xmm2 / m128 | 66 0F 38 09 / р | Отрицать / обнулять / сохранять упакованные целые слова в зависимости от соответствующего знака |
PSIGND xmm1, xmm2 / m128 | 66 0F 38 0A / r | Отменить / обнулить / сохранить упакованные целые числа двойного слова в зависимости от соответствующего |
ПШУФБ xmm1, xmm2 / m128 | 66 0F 38 00 / р | Перемешать байты |
PMULHRSW xmm1, xmm2 / m128 | 66 0F 38 0B / r | Умножение 16-битных слов со знаком, масштабирование и округление двойных слов со знаком, упаковка старших 16 бит |
PMADDUBSW xmm1, xmm2 / m128 | 66 0F 38 04 / р | Умножение подписанных и беззнаковых байтов, добавление горизонтальной пары подписанных слов, упаковка насыщенных подписанных слов |
PHSUBW xmm1, xmm2 / m128 | 66 0F 38 05 / р | Вычесть и упаковать 16-битные целые числа со знаком по горизонтали |
PHSUBSW x мм1, x мм2 / м 128 | 66 0F 38 07 / r | Вычесть и упаковать 16-битное целое число со знаком по горизонтали с насыщением |
PHSUBD x мм1, x мм2 / м 128 | 66 0F 38 06 / р | Вычесть и упаковать 32-разрядные целые числа со знаком по горизонтали |
PHADDSW xmm1, xmm2 / m128 | 66 0F 38 03 / r | Сложить и упаковать 16-битные целые числа со знаком по горизонтали с насыщением |
PHADDW xmm1, xmm2 / m128 | 66 0F 38 01 / р | Сложить и упаковать 16-битные целые числа по горизонтали |
PHADDD xmm1, xmm2 / m128 | 66 0F 38 02 / р | Сложить и упаковать 32-битные целые числа по горизонтали |
PALIGNR xmm1, xmm2 / m128, imm8 | 66 0F 3A 0F / r ib | Объединить целевые и исходные операнды, извлечь результат, выровненный по байтам, со смещением вправо |
ПАБСБ xmm1, xmm2 / m128 | 66 0F 38 1C / r | Вычислить абсолютное значение байтов и сохранить результат без знака |
PABSW xmm1, xmm2 / m128 | 66 0F 38 1D / r | Вычислить абсолютное значение 16-битных целых чисел и сохранить результат без знака |
PABSD xmm1, xmm2 / m128 | 66 0F 38 1E / r | Вычислить абсолютное значение 32-битных целых чисел и сохранить результат без знака |
Инструкции SSE4 [ править ]
SSE4.1 [ править ]
Добавлен Core 2, изготовленный по 45 нм
SSE4.1 SIMD-инструкции с плавающей запятой [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
DPPS xmm1, xmm2 / m128, imm8 | 66 0F 3A 40 / r ib | Выборочно умножать упакованные значения с плавающей запятой SP, складывать и выборочно сохранять |
DPPD xmm1, xmm2 / m128, imm8 | 66 0F 3A 41 / r ib | Выборочно умножайте упакованные значения с плавающей запятой DP, складывайте и выборочно сохраняйте |
БЛЭНДПС xmm1, xmm2 / m128, imm8 | 66 0F 3A 0C / r ib | Выбрать упакованные значения с плавающей запятой одинарной точности из указанной маски |
BLENDVPS xmm1, xmm2 / m128, <XMM0> | 66 0F 38 14 / г | Выбрать упакованные значения с плавающей запятой одинарной точности из указанной маски |
BLENDPD xmm1, xmm2 / m128, imm8 | 66 0F 3A 0D / r ib | Выберите упакованные значения DP-FP из указанной маски |
BLENDVPD xmm1, xmm2 / m128, <XMM0> | 66 0F 38 15 / г | Выбрать упакованные значения DP FP из указанной маски |
ROUNDPS xmm1, xmm2 / m128, imm8 | 66 0F 3A 08 / r ib | Круглые упакованные значения с плавающей запятой одинарной точности |
ROUNDSS xmm1, xmm2 / m32, imm8 | 66 0F 3A 0A / r ib | Округление значения с плавающей запятой одинарной точности с низкой упаковкой |
ROUNDPD xmm1, xmm2 / m128, imm8 | 66 0F 3A 09 / r ib | Круглые упакованные значения с плавающей запятой двойной точности |
ROUNDSD xmm1, xmm2 / m64, imm8 | 66 0F 3A 0B / r ib | Округление значения с плавающей запятой двойной точности с низкой упаковкой |
ВСТАВКИ xmm1, xmm2 / m32, imm8 | 66 0F 3A 21 / r ib | Вставить выбранное значение с плавающей запятой одинарной точности в указанный целевой элемент и обнулить целевые элементы |
ВЫДЕРЖКИ reg / m32, xmm1, imm8 | 66 0F 3A 17 / r ib | Извлечь одно значение с плавающей запятой одинарной точности по указанному смещению и сохранить результат (с расширением нулями, если применимо) |
Целочисленные инструкции SSE4.1 SIMD [ править ]
Инструкция | Код операции | Смысл |
---|---|---|
MPSADBW xmm1, xmm2 / m128, imm8 | 66 0F 3A 42 / r ib | Суммирует абсолютную 8-битную целочисленную разность смежных групп из 4-х байтовых целых чисел с начальным смещением |
PHMINPOSUW xmm1, xmm2 / m128 | 66 0F 38 41 / r | Найдите минимальное слово без знака |
PMULLD xmm1, xmm2 / m128 | 66 0F 38 40 / р | Умножьте упакованные целые числа со знаком двойного слова и сохраните младшие 32 бита. |
PMULDQ xmm1, xmm2 / m128 | 66 0F 38 28 / р | Умножьте упакованные целые числа двойного слова со знаком и сохраните результат четверного слова |
PBLENDVB xmm1, xmm2 / m128, <XMM0> | 66 0F 38 10 / р | Выбрать байтовые значения из указанной маски |
PBLENDW xmm1, xmm2 / m128, imm8 | 66 0F 3A 0E / r ib | Выбрать слова из указанной маски |
PMINSB xmm1, xmm2 / m128 | 66 0F 38 38 / р | Сравнить упакованные байтовые целые числа со знаком |
PMINUW xmm1, xmm2 / m128 | 66 0F 38 3A / r | Сравнить упакованные целые числа без знака |
PMINSD xmm1, xmm2 / m128 | 66 0F 38 39 / р | Сравнить упакованные целые числа двойного слова со знаком |
PMINUD xmm1, xmm2 / m128 | 66 0F 38 3B / r | Сравнить упакованные целые числа двойного слова без знака |
PMAXSB xmm1, xmm2 / m128 | 66 0F 38 3C / r | Сравнить упакованные байтовые целые числа со знаком |
PMAXUW xmm1, xmm2 / m128 | 66 0F 38 3E / r | Сравнить упакованные целые числа без знака |
PMAXSD xmm1, xmm2 / m128 | 66 0F 38 3D / р | Сравнить упакованные целые числа двойного слова со знаком |
PMAXUD xmm1, xmm2 / m128 | 66 0F 38 3F / r | Сравнить упакованные целые числа двойного слова без знака |
PINSRB xmm1, r32 / m8, imm8 | 66 0F 3A 20 / r ib | Вставить байтовое целочисленное значение в указанный элемент назначения |
PINSRD xmm1, r / m32, imm8 | 66 0F 3A 22 / r ib | Вставить целочисленное значение двойного слова в указанный целевой элемент |
PINSRQ xmm1, r / m64, imm8 | 66 REX.W 0F 3A 22 / r ib | Вставить целочисленное значение qword в указанный элемент назначения |
PEXTRB reg / m8, xmm2, imm8 | 66 0F 3A 14 / r ib | Извлечь байтовое целочисленное значение при смещении исходного байта, старшие биты обнуляются. |
PEXTRW reg / m16, xmm, imm8 | 66 0F 3A 15 / r ib | Извлечь слово и скопировать в младшие 16 бит, с нулевым расширением |
PEXTRD r / m32, xmm2, imm8 | 66 0F 3A 16 / r ib | Извлечь целочисленное значение двойного слова при смещении исходного двойного слова |
PEXTRQ r / m64, xmm2, imm8 | 66 REX.W 0F 3A 16 / r ib | Извлечь целочисленное значение qword в исходном смещении qword |
PMOVSXBW xmm1, xmm2 / m64 | 66 0f 38 20 / r | Знак расширить 8 упакованных 8-битных целых чисел до 8 упакованных 16-битных целых чисел |
PMOVZXBW xmm1, xmm2 / m64 | 66 0f 38 30 / r | Ноль расширить 8 упакованных 8-битных целых чисел до 8 упакованных 16-битных целых чисел |
PMOVSXBD xmm1, xmm2 / m32 | 66 0f 38 21 / r | Знак расширить 4 упакованных 8-битных целых до 4 упакованных 32-битных целых числа |
PMOVZXBD xmm1, xmm2 / m32 | 66 0f 38 31 / r | Ноль расширить 4 упакованных 8-битных целых до 4 упакованных 32-битных целых числа |
PMOVSXBQ xmm1, xmm2 / m16 | 66 0f 38 22 / r | Знак расширить 2 упакованных 8-битных целых до 2 упакованных 64-битных целых числа |
PMOVZXBQ xmm1, xmm2 / m16 | 66 0f 38 32 / r | Ноль расширить 2 упакованных 8-битных целых до 2 упакованных 64-битных целых числа |
PMOVSXWD xmm1, xmm2 / m64 | 66 0f 38 23 / r | Знак расширить 4 упакованных 16-битных целых до 4 упакованных 32-битных целых числа |
PMOVZXWD xmm1, xmm2 / m64 | 66 0f 38 33 / r | Ноль расширить 4 упакованных 16-битных целых до 4 упакованных 32-битных целых числа |
PMOVSXWQ xmm1, xmm2 / m32 | 66 0f 38 24 / r | Знак расширить 2 упакованных 16-битных целых до 2 упакованных 64-битных целых числа |
PMOVZXWQ xmm1, xmm2 / m32 | 66 0f 38 34 / r | Ноль расширить 2 упакованных 16-битных целых до 2 упакованных 64-битных целых числа |
PMOVSXDQ xmm1, xmm2 / m64 | 66 0f 38 25 / r | Знак расширить 2 упакованных 32-битных целых числа до 2 упакованных 64-битных целых |
PMOVZXDQ xmm1, xmm2 / m64 | 66 0f 38 35 / r | Ноль расширить 2 упакованных 32-битных целых числа до 2 упакованных 64-битных целых числа |
ПТЕСТ xmm1, xmm2 / m128 | 66 0F 38 17 / r | Установите ZF, если результатом И является все 0, установите CF, если результатом И НЕ является все 0 |
PCMPEQQ xmm1, xmm2 / m128 | 66 0F 38 29 / р | Сравните упакованные qword на равенство |
PACKUSDW xmm1, xmm2 / m128 | 66 0F 38 2B / r | Преобразование 2 × 4 упакованных целых чисел со знаком двойного слова в 8 упакованных целых чисел без знака с насыщением |
MOVNTDQA xmm1, m128 | 66 0F 38 2A / r | Перемещение двойного четверного слова с использованием невременной подсказки, если тип памяти WC |
SSE4a [ править ]
Добавлено с процессорами Phenom
- EXTRQ / INSERTQ
- МОВНЦД / МОВНЦС
SSE4.2 [ править ]
Добавлено с процессорами Nehalem
Инструкция | Код операции | Смысл |
---|---|---|
PCMPESTRI xmm1, xmm2 / m128, imm8 | 66 0F 3A 61 / r imm8 | Упакованное сравнение строковых данных с явной длиной, генерируя индекс |
PCMPESTRM xmm1, xmm2 / m128, imm8 | 66 0F 3A 60 / r imm8 | Упакованное сравнение строковых данных с явной длиной, генерация маски |
PCMPISTRI xmm1, xmm2 / m128, imm8 | 66 0F 3A 63 / r imm8 | Упакованное сравнение строковых данных с неявной длиной, генерируя индекс |
PCMPISTRM xmm1, xmm2 / m128, imm8 | 66 0F 3A 62 / r imm8 | Упакованное сравнение строковых данных с неявной длиной, генерация маски |
PCMPGTQ xmm1, xmm2 / m128 | 66 0F 38 37 / р | Сравните упакованные qword со знаком для большего, чем. |
Инструкции, производные от SSE5 [ править ]
SSE5 был предложенным расширением SSE AMD. В комплект поставки не входил полный набор инструкций Intel SSE4, что делало его конкурентом SSE4, а не преемником. AMD решила не реализовывать SSE5, как предлагалось изначально, однако были представлены производные расширения SSE.
XOP [ править ]
Представлено ядром процессора Bulldozer, удалено из Zen (микроархитектура) и далее.
Ревизия большей части набора инструкций 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, xmm3 | C4E3 WvvvvL01 69 / r / is4 | Плавное умножение упакованных значений с плавающей запятой двойной точности | |
VFMADDPS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 68 / r / is4 | Плавное умножение упакованных значений с плавающей запятой одинарной точности | |
VFMADDSD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 6B / r / is4 | Объединенное умножение-сложение скалярных значений с плавающей запятой двойной точности | |
VFMADDSS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 6A / r / is4 | Объединенное умножение-сложение скалярных значений с плавающей запятой одинарной точности | |
VFMADDSUBPD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 5D / r / is4 | Плавное умножение и вычитание упакованных значений с плавающей запятой двойной точности | |
VFMADDSUBPS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 5C / r / is4 | Плавное умножение и чередование значений сложения / вычитания упакованных значений с плавающей запятой одинарной точности | |
VFMSUBADDPD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 5F / r / is4 | Вычитание / сложение упакованных значений с плавающей запятой двойной точности с совмещенным умножением и чередованием | |
VFMSUBADDPS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 5E / r / is4 | Вычитание / сложение упакованных значений с плавающей запятой одинарной точности с объединенным множителем-чередованием | |
VFMSUBPD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 6D / r / is4 | Плавное умножение-вычитание упакованных значений с плавающей запятой двойной точности | |
VFMSUBPS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 6C / r / is4 | Плавное умножение-вычитание упакованных значений с плавающей запятой одинарной точности | |
VFMSUBSD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 6F / r / is4 | Плавное умножение-вычитание скалярных значений с плавающей запятой двойной точности | |
VFMSUBSS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 6E / r / is4 | Плавное умножение-вычитание скалярных значений с плавающей запятой одинарной точности | |
VFNMADDPD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 79 / r / is4 | Плавное отрицательное умножение упакованных значений с плавающей запятой двойной точности | |
VFNMADDPS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 78 / r / is4 | Плавное отрицательное умножение упакованных значений с плавающей запятой одинарной точности | |
VFNMADDSD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 7B / r / is4 | Объединенное отрицательное умножение скалярных значений с плавающей запятой двойной точности | |
VFNMADDSS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 7A / r / is4 | Объединенное отрицательное умножение-сложение скалярных значений с плавающей запятой одинарной точности | |
VFNMSUBPD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 7D / r / is4 | Объединенное отрицательное умножение-вычитание упакованных значений с плавающей запятой двойной точности | |
VFNMSUBPS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 7C / r / is4 | Объединенное отрицательное умножение-вычитание упакованных значений с плавающей запятой одинарной точности | |
VFNMSUBSD xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 7F / r / is4 | Объединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой двойной точности | |
VFNMSUBSS xmm0, xmm1, xmm2, xmm3 | C4E3 WvvvvL01 7E / r / is4 | Объединенное отрицательное умножение-вычитание скалярных значений с плавающей запятой одинарной точности |
AVX [ править ]
AVX впервые был поддержан Intel с Sandy Bridge и AMD с Bulldozer .
Векторные операции с 256-битными регистрами.
Инструкция | Описание |
---|---|
VBROADCASTS | Скопируйте 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 Excavator .
Расширение большинства векторных целочисленных инструкций SSE и AVX до 256 бит
Инструкция | Описание |
---|---|
VBROADCASTS | Скопируйте 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-битный целевой операнд с непосредственной константой в качестве селектора. |
VPBLENDD | Doubleword немедленная версия инструкций PBLEND из SSE4 . |
VPSLLVD | Сдвиг влево логичный. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом. |
VPSLLVQ | |
ВПСРЛВД | Сдвиг вправо логичный. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом. |
VPSRLVQ | |
ВПСРАВД | Сдвиг вправо арифметически. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом. |
AVX-512 [ править ]
Представлен в Intel Xeon Phi x200
Векторные операции над 512-битными регистрами.
Основа AVX-512 [ править ]
Инструкция | Описание |
---|---|
VBLENDMPD | Смешивание векторов float64 с помощью opmask control |
VBLENDMPS | Смешивание векторов float32 с помощью opmask control |
VPBLENDMD | Смешивание векторов int32 с помощью opmask control |
VPBLENDMQ | Смешивание векторов int64 с помощью элемента управления opmask |
VPCMPD | Сравнить подписанные / беззнаковые двойные слова в маске |
VPCMPUD | |
VPCMPQ | Сравнить четверные слова со знаком / без знака в маску |
VPCMPUQ | |
ВПТЕСТМД | Логическое И и установка маски для 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 | |
VSCATTERDPS | Скаттер упакованный 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 imm8 | D4 imm8 | Разделите AL на imm8, поместите частное в AH, а остаток в AL. | Доступен, начиная с 8086, задокументирован, начиная с Pentium (в более ранней документации аргументы не указаны) |
AAD imm8 | D5 imm8 | Аналог умножения AAM | Доступен, начиная с 8086, задокументирован, начиная с Pentium (в более ранней документации аргументы не указаны) |
SALC | D6 | Установите AL в зависимости от значения флага переноса (1-байтовая альтернатива SBB AL, AL) | Доступен, начиная с 8086, но задокументирован только после Pentium Pro. |
ICEBP | F1 | Однобайтное пошаговое исключение / Invoke 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 |
? | 0F 0E | На AMD K6 и более поздних версиях сопоставляется с операцией FEMMS (быстрое удаление состояния MMX), возможно, идентифицировано как манипуляция с микрокодом на Intel | |
UD1 | 0F B9 | Умышленно неопределенная инструкция, но в отличие от UD2 она не была опубликована | |
ALTINST | 0F 3F | Переходите и выполняйте инструкции в недокументированном наборе альтернативных инструкций . | Доступно только на некоторых процессорах x86 производства VIA Technologies . |
Недокументированные инструкции x87 [ править ]
FFREEP выполняет FFREE ST (i) и выталкивает стек
См. Также [ править ]
- CLMUL
- RDRAND
- Расширения Larrabee
- Расширенные векторные расширения 2
- Наборы команд обработки битов
- CPUID
Ссылки [ править ]
- ^ a b «Re: Идентификация процессора Intel и инструкция CPUID» . Проверено 21 апреля 2013 .
- ^ Тот, Эрвин (1998-03-16). «BSWAP с 16-битными регистрами» . Архивировано из оригинала на 1999-11-03.
Команда опускает верхнее слово регистра двойного слова, не затрагивая его старшие 16 бит.
- ^ Coldwin, Gynvael (2009-12-29). «Префикс BSWAP + 66h» . Проверено 3 октября 2018 .
внутреннее (нулевое) расширение значения меньшего (16-битного) регистра… применение bswap к 32-битному значению «00 00 AH AL»,… усеченное до младших 16 битов, которые равны «00 00».
… Bochs… bswap reg16 действует так же, как bswap reg32… QEMU… игнорирует префикс 66h
- ^ «RSM - Возобновить из режима управления системой» . Архивировано 12 марта 2012 года.CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
- ^ Справочное руководство по оптимизации архитектур Intel 64 и IA-32 , раздел 7.3.2
- ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 , раздел 4.3, подраздел «PREFETCHh - предварительная выборка данных в кэши»
- ^ Холлингсворт, Брент. "Новые" Бульдозеры "и" Пиледриверы "инструкции" (pdf) . Advanced Micro Devices, Inc . Проверено 11 декабря 2014 .
- ^ "Семейство 16h AMD A-Series Data Sheet" (PDF) . amd.com . AMD . Октябрь 2013 . Проверено 2 января 2014 .
- ^ "Руководство программиста архитектуры AMD64, Том 3: Общие и системные инструкции" (PDF) . amd.com . AMD . Октябрь 2013 . Проверено 2 января 2014 .
- ^ "tbmintrin.h из GCC 4.8" . Проверено 17 марта 2014 .
- ^ https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf раздел 3.5.2.3
- ^ «Микроархитектура процессоров Intel, AMD и VIA: руководство по оптимизации для программистов сборки и производителей компиляторов» (PDF) . Проверено 17 октября, 2016 .
- ^ "Шахматное программирование AVX2" . Проверено 17 октября, 2016 .
- ^ "Re: Недокументированные коды операций (HINT_NOP)" . Архивировано из оригинала на 2004-11-06 . Проверено 7 ноября 2010 .
- ^ "Re: Также некоторые недокументированные коды операций 0Fh" . Архивировано из оригинала на 2003-06-26 . Проверено 7 ноября 2010 .
Внешние ссылки [ править ]
В сборке Wikibook x86 есть страница на тему: Инструкции для X86. |
- Бесплатная документация по IA-32 и x86-64 , предоставленная Intel
- Справочник по коду операции и инструкциям x86
- Справочник по инструкциям x86 и amd64
- Таблицы инструкций: списки задержек инструкций, пропускной способности и сбоев микроопераций для процессоров Intel, AMD и VIA.
- Список инструкций Netwide Assembler (из Netwide Assembler )