stringtranslate.com

Listados de instrucciones x86

El conjunto de instrucciones x86 se refiere al conjunto de instrucciones que admiten los microprocesadores compatibles con x86 . Las instrucciones suelen ser parte de un programa ejecutable , que a menudo se almacena como un archivo de computadora y se ejecuta en el procesador.

El conjunto de instrucciones x86 se ha ampliado varias veces, introduciendo registros y tipos de datos más amplios, así como nuevas funcionalidades. [1]

Instrucciones de números enteros x86

A continuación se muestra el conjunto completo de instrucciones 8086 / 8088 de Intel (81 instrucciones en total). [2] Estas instrucciones también están disponibles en modo de 32 bits, operan en cambio en registros de 32 bits ( eax , ebx , etc.) y valores en lugar de sus contrapartes de 16 bits ( ax , bx , etc.). El conjunto de instrucciones actualizado está agrupado según la arquitectura ( i186 , i286 , i386 , i486 , i586 / i686 ) y se conoce como (32 bits) x86 y (64 bits) x86-64 (también conocido como AMD64 ).

Instrucciones originales 8086/8088

Este es el conjunto de instrucciones original. En la columna "Notas", r significa registro , m significa dirección de memoria e imm significa inmediato (es decir, un valor).

Agregado en procesadores específicos

Añadido con80186/80188

Añadido con80286

Las nuevas instrucciones agregadas en 80286 agregan compatibilidad con el modo protegido x86 . Algunas de las instrucciones, pero no todas, también están disponibles en modo real .

  1. ^ abcd Los descriptores utilizados por las instrucciones LGDT, LIDTy constan de una estructura de datos de 2 partes. La primera parte es un valor de 16 bits, que especifica el tamaño de la tabla en bytes menos 1. La segunda parte es un valor de 32 bits (valor de 64 bits en modo de 64 bits), que especifica la dirección de inicio lineal de la tabla. SGDTPara y con un tamaño de operando de 16 bits, la dirección se combina con 00FFFFFFh. En las CPU Intel (pero no AMD), las instrucciones y con un tamaño de operando de 16 bits están documentadas (a partir de la revisión 079 de Intel SDM, marzo de 2023) para escribir un descriptor en la memoria con el último byte establecido en 0. Sin embargo, el comportamiento observado es que se escriben los bits 31:24 de la dirección de la tabla de descriptores en su lugar. [3]SIDT
    LGDTLIDTSGDTSIDT
  2. ^ abcd Las instrucciones LGDT, LIDT, LLDTy LTRse serializan en procesadores Pentium y posteriores.
  3. ^ La LMSWinstrucción se serializa en los procesadores Intel desde Pentium en adelante, pero no en los procesadores AMD.
  4. ^ En 80386 y posteriores, la "Palabra de estado de la máquina" es la misma que el registro de control CR0 ; sin embargo, la LMSWinstrucción solo puede modificar los 4 bits inferiores de este registro y no puede borrar el bit 0. La incapacidad de borrar el bit 0 significa que LMSWse puede usar para ingresar pero no para salir del modo protegido x86 .
    En 80286, no es posible salir del modo protegido en absoluto (ni con LMSWni con LOADALL[4] ) sin un reinicio de la CPUMOV ; en 80386 y posteriores, es posible salir del modo protegido, pero esto requiere el uso de la instrucción 80386 y posteriores CR0.
  5. ^ Si CR4.UMIP=1está configurado, entonces las instrucciones SGDT, SIDT, SLDT, SMSWy STRsolo pueden ejecutarse en el anillo 0.
    Estas instrucciones no tenían privilegios en todas las CPU x86 desde 80286 en adelante hasta la introducción de UMIP en 2017. [5] Esto ha sido un problema de seguridad significativo para la virtualización basada en software, ya que permite que un invitado de VM use estas instrucciones para detectar que se está ejecutando dentro de una VM. [6] [7]
  6. ^ abc Las instrucciones SMSW, SLDTy STRsiempre utilizan un tamaño de operando de 16 bits cuando se utilizan con un argumento de memoria. Con un argumento de registro en procesadores 80386 o posteriores, hay tamaños de operando de destino más amplios disponibles y se comportan de la siguiente manera:
    • SMSW:Almacena CR0 completo en modo largo x86-64 , no definido en caso contrario.
    • SLDT:El argumento de 16 bits se extiende a cero en procesadores Pentium Pro y posteriores, no está definido en procesadores anteriores.
    • STR:Argumento de 16 bits que se extiende a cero.
  7. ^ En el modo largo de 64 bits , la instrucción no está disponible: el código de operación se ha reasignado a la instrucción solo en modo de 64 bits .ARPL63 /rMOVSXD
  8. ^ La ARPLinstrucción provoca #UD en modo real y modo virtual 8086 : se sabe que Windows 95 y OS/2 2.x hacen un uso extensivo de esta #UD para usar el 63código de operación como un punto de interrupción de un byte para realizar la transición del modo virtual 8086 al modo kernel. [8] [9]
  9. ^ Los bits 19:16 de esta máscara están documentados como "indefinidos" en las CPU Intel. [10] En las CPU AMD, la máscara está documentada como 0x00FFFF00.
  10. ^ En algunas combinaciones de CPU/microcódigo de Intel a partir de 2019, la VERWinstrucción también vacía los búferes de datos de microarquitectura. Esto permite que se la utilice como parte de soluciones alternativas para vulnerabilidades de seguridad de muestreo de datos de microarquitectura . [11] [12]
  11. ^ ab Sin documentar, solo 80286. [4] [13] [14] (Existe una variante diferente LOADALLcon un código de operación y un diseño de memoria diferentes en 80386).

Añadido con80386

El 80386 agregó soporte para operaciones de 32 bits al conjunto de instrucciones x86. Esto se hizo ampliando los registros de propósito general a 32 bits e introduciendo los conceptos de OperandSize y AddressSize : a la mayoría de las formas de instrucción que anteriormente aceptaban argumentos de datos de 16 bits se les dio la capacidad de aceptar argumentos de 32 bits al establecer su OperandSize en 32 bits, y a las instrucciones que podían aceptar argumentos de dirección de 16 bits se les dio la capacidad de aceptar argumentos de dirección de 32 bits al establecer su AddressSize en 32 bits. (Las formas de instrucción que funcionan con datos de 8 bits continúan siendo de 8 bits independientemente de OperandSize. El uso de un tamaño de datos de 16 bits hará que solo se modifiquen los 16 bits inferiores de los registros de propósito general de 32 bits; los 16 bits superiores se dejan sin cambios).

El tamaño de operando y el tamaño de dirección predeterminados que se utilizan para cada instrucción se determinan mediante el bit D del descriptor de segmento del segmento de código actual; D=0ambos son de 16 bits y D=1ambos de 32 bits. Además, se pueden anular en cada instrucción con dos nuevos prefijos de instrucción que se introdujeron en el 80386:

El 80386 también introdujo dos nuevos registros de segmento FS, GSasí como los registros de control , depuración y prueba x86 .

Las nuevas instrucciones introducidas en el 80386 se pueden subdividir en dos clases:

Para los formularios de instrucciones donde el tamaño del operando se puede inferir a partir de los argumentos de la instrucción (por ejemplo, ADD EAX,EBXse puede inferir que tiene un OperandSize de 32 bits debido a su uso de EAX como argumento), no se necesitan nuevos mnemónicos de instrucción y no se proporcionan.

  1. ^ Para las instrucciones de cadena de 32 bits, se utiliza la notación ±± para indicar que el registro indicado se decrementa posteriormente en 4 si se indica un segmento, EFLAGS.DF=1y se incrementa posteriormente en 4 en caso contrario.
    Para los operandos en los que se indica el segmento DS, el segmento DS se puede anular con un prefijo de anulación de segmento; cuando se indica el segmento ES, el segmento siempre es ES y no se puede anular.
    La elección de si se utilizan los registros SI/DI de 16 bits o los registros ESI/EDI de 32 bits como registros de dirección a utilizar se realiza mediante AddressSize, que se puede anular con el 67prefijo.
  2. ^ Las instrucciones de cadena de 32 bits aceptan prefijos de repetición de la misma manera que las instrucciones de cadena de 8/16 bits más antiguas.
    Para LODSD, STOSD, y , el prefijo ( ) repetirá la instrucción la cantidad de veces especificada en rCX (CX o ECX, decidido por AddressSize), decrementando rCX para cada iteración (con rCX=0 resultando en no-op y procediendo a la siguiente instrucción). Para y , los prefijos ( ) y ( ) están disponibles, lo que repetirá la instrucción pero solo mientras la condición de bandera (ZF=1 para , ZF=0 para ) sea verdadera.MOVSDINSDOUTSDREPF3
    CMPSDSCASDREPEF3REPNEF2REPEREPNE
  3. ^ En las INSB/W/Dinstrucciones, es posible que los derechos de acceso a la memoria para la ES:[rDI]dirección de memoria no se verifiquen hasta que se haya realizado el acceso al puerto; si esta verificación falla (por ejemplo, por un error de página u otra excepción de memoria), se perderá el elemento de datos leído desde el puerto. Por lo tanto, no se recomienda utilizar esta instrucción para acceder a un puerto de E/S que realice algún tipo de efecto secundario al leer.
  4. ^ El acceso al puerto de E/S solo se permite cuando CPL≤IOPL o los bits del mapa de bits de permiso del puerto de E/S para que el puerto acceda están todos configurados en 0.
  5. ^ La CWDEinstrucción se diferencia de la CWDinstrucción anterior en que CWDextendería el signo del valor de 16 bits en AX a un valor de 32 bits en el par de registros DX:AX.
  6. ^ Para el E3código de operación ( JCXZ/ JECXZ), la elección de si la instrucción utilizará CXo ECXpara su comparación (y en consecuencia qué mnemónico utilizar) se basa en AddressSize, no en OperandSize. (En cambio, OperandSize controla si el destino del salto debe truncarse a 16 bits o no).
    Esto también se aplica a las instrucciones de bucle LOOP, LOOPE, LOOPNE(códigos de operación E0, E1, E2), sin embargo, a diferencia de JCXZ/ JECXZ, a estas instrucciones no se les han dado nuevos mnemónicos para sus variantes que utilizan ECX.
  7. ^ Para PUSHA(D), el valor de SP/ESP introducido en la pila es el valor que tenía justo antes de que la PUSHA(D)instrucción comenzara a ejecutarse.
  8. ^ Para POPA/ POPAD, el elemento de la pila correspondiente a SP/ESP se extrae de la pila (realizando una lectura de memoria), pero no se coloca en SP/ESP.
  9. ^ Las instrucciones PUSHFDy POPFDprovocarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3.
    Las instrucciones PUSHF, POPF, IRETy IRETDprovocarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3 y VME no está habilitado.
  10. ^ Si IRETDse utiliza para volver del modo kernel al modo usuario (lo que implicará un cambio de CPL) y el segmento de pila del modo usuario indicado por SS es un segmento de 16 bits, entonces la IRETDinstrucción solo restaurará los 16 bits más bajos del puntero de pila (ESP/RSP), y los bits restantes mantendrán el valor que tenían en el código kernel antes de IRETD. Esto ha requerido soluciones alternativas complejas tanto en Linux ("ESPFIX") [15] como en Windows. [16] Este problema también afecta a la instrucción de 64 bits posterior IRETQ.
  1. ^ abcd Para las instrucciones BT, BTS, BTRy BTC:
    • Si el primer argumento de la instrucción es un operando de registro y/o el segundo argumento es un inmediato, entonces el índice de bits en el segundo argumento se toma módulo el tamaño del operando (16/32/64, en efecto utilizando solo los 4, 5 o 6 bits inferiores del índice).
    • Si el primer argumento es un operando de memoria y el segundo argumento es un operando de registro, entonces el índice de bit en el segundo argumento se utiliza en su totalidad; se interpreta como un índice de bit con signo que se utiliza para compensar la dirección de memoria que se utilizará para la prueba de bit.
  2. ^ abc Las instrucciones BTS, BTCy BTRaceptan el prefijo LOCK( F0) cuando se utilizan con un argumento de memoria; esto da como resultado que la instrucción se ejecute de forma atómica.
  3. ^ Si se usa el prefijo con el código de operación, la instrucción se ejecutará como en los sistemas que admiten la extensión BMI1. se diferencia de en que pero no está definido para devolver el tamaño del operando si el operando de origen es cero; para otros valores de operando de origen, producen el mismo resultado.F30F BC /rTZCNTTZCNTBSFTZCNTBSR
  4. ^ ab BSFy BSRestablezca el indicador EFLAGS.ZF en 1 si el argumento de origen era todo 0 y en 0 en caso contrario.
    Si el argumento de origen era todo 0, entonces se documenta que el registro de destino se deja sin cambios en los procesadores AMD, pero se establece en un valor indefinido en los procesadores Intel.
  5. ^ Si se utiliza el prefijo con el código de operación, la instrucción se ejecutará como en los sistemas que admiten las extensiones ABM o LZCNT. produce un resultado diferente para la mayoría de los valores de entrada.F30F BD /rLZCNTLZCNTBSR
  6. ^ ab Para SHLDy SHRD, la cantidad de desplazamiento está enmascarada: los 5 bits inferiores se utilizan para un tamaño de operando de 16/32 bits y 6 bits para un tamaño de operando de 64 bits.
    SHLDy SHRDcon argumentos de 16 bits y una cantidad de desplazamiento mayor que 16 producen resultados indefinidos. (Los resultados reales difieren entre las diferentes CPU Intel, con al menos tres comportamientos diferentes conocidos. [17] )
  7. ^ ab Los códigos de condición admitidos para las instrucciones y (códigos de operación y respectivamente, con el nibble x especificando la condición) son:SETccJcc near0F 9x /00F 8x
  8. ^ Para SETcc, aunque el código de operación se especifica comúnmente como /0 (lo que implica que los bits 5:3 del byte ModR/M de la instrucción deben ser 000), los procesadores x86 modernos (Pentium y posteriores) ignoran los bits 5:3 y ejecutarán la instrucción independientemente SETccdel contenido de estos bits.
  9. ^ Para LFS, LGSy LSS, el tamaño de la parte de desplazamiento del puntero lejano está dado por el tamaño del operando; el tamaño de la parte del segmento siempre es de 16 bits. En el modo de 64 bits, el uso del REX.Wprefijo con estas instrucciones hará que carguen un puntero lejano con un desplazamiento de 64 bits en procesadores Intel pero no en procesadores AMD.
  10. ^ abcdef Para MOVlos registros CRx, DRxy TRx, la parte reg del byte ModR/M se utiliza para indicar CRx/DRx/TRxel registro y la parte r/m el registro general. Únicamente para los MOV CRx/DRx/TRxcódigos de operación, se ignoran los dos primeros bits del byte ModR/M ; estos códigos de operación se decodifican y ejecutan como si los dos primeros bits del byte ModR/M fueran 11b.
  11. ^ abcd Para movimientos hacia/desde los registros CRxy DRx, el tamaño del operando siempre es de 64 bits en modo de 64 bits y de 32 bits en caso contrario.
  12. ^ En procesadores anteriores a Pentium , los movimientos hacia CR0no serializarían el flujo de instrucciones; en parte por este motivo, generalmente se requiere realizar un salto lejano inmediatamente después de un MOVa CR0si dicho a MOVse usa para habilitar/deshabilitar el modo protegido y/o la paginación de memoria .
    MOVEl a CR2está catalogado arquitectónicamente como serializador, pero se ha informado que no es serializador en al menos algunos procesadores Intel Core-i7. [18]
    MOV El a CR8(introducido con x86-64) es serializador en procesadores AMD pero no en procesadores Intel.
  13. ^ ab Las MOV TRxinstrucciones se suspendieron a partir de Pentium.
  14. ^ La instrucción INT1/ ICEBP( F1) está presente en todos los procesadores Intel x86 conocidos desde el 80386 en adelante, [19] pero solo está completamente documentada para los procesadores Intel desde la versión de mayo de 2018 del Intel SDM (rev 067) en adelante. [20] Antes de esta versión, la mención de la instrucción en el material de Intel era esporádica, por ejemplo, AP-526 rev 001. [21]
    Para los procesadores AMD, la instrucción ha sido documentada desde 2002. [22]
  15. ^ El funcionamiento del código de operación F1( ICEBP) difiere del funcionamiento del código de operación de interrupción de software normal CD 01de varias maneras:
      En modo protegido, CD 01verificará CPL contra el campo DPL del descriptor de interrupción como una verificación de derechos de acceso, mientras que F1no lo hará.
    • En el modo virtual-8086, CD 01también comprobará CPL contra IOPL como una verificación de derechos de acceso, mientras que F1no lo hará.
    • En el modo virtual-8086 con VME habilitado, la redirección de interrupciones es compatible con CD 01pero no con F1.
  16. ^ La instrucción UMOV está presente únicamente en los procesadores 386 y 486. [19]
  17. ^ ab Las instrucciones XBTSy IBTSse discontinuaron con el paso B1 del 80386.
    Han sido utilizadas por software principalmente para la detección del paso B0 con errores [23] del 80386. Microsoft Windows (v2.01 y posteriores) intentará ejecutar la XBTSinstrucción como parte de su detección de CPU si CPUIDno está presente, y se negará a iniciar si XBTSse encuentra que está funcionando. [24]
  18. ^ ab Para XBTSy IBTS, el argumento r/m representa los datos desde/hacia los cuales extraer/insertar un campo de bits, el argumento reg el campo de bits que se insertará/extraerá, AX/EAX un desplazamiento de bits y CL una longitud del campo de bits. [25]
  19. ^ Sin documentar, sólo 80386. [26]

Añadido con80486

  1. ^ El uso BSWAPde registros de 16 bits no está prohibido per se (se ejecutará sin producir un #UD u otras excepciones) pero está documentado que produce resultados indefinidos: se informa que produce varios resultados diferentes en 486, [27] 586 y Bochs / QEMU . [28]
  2. ^ ab En el Intel 80486 stepping A, [29] la CMPXCHGinstrucción utiliza una codificación diferente: 0F A6 /rpara la variante de 8 bits, 0F A7 /rpara la variante de 16/32 bits. Las 0F B0/B1codificaciones se utilizan en el 80486 stepping B y posteriores. [30] [31]
  3. ^ La CMPXCHGinstrucción se establece EFLAGSde la misma manera que una CMPinstrucción que utiliza el acumulador (AL/AX/EAX/RAX) como su primer argumento.
  4. ^ INVLPG se ejecuta como ninguna operación si el argumento m8 no es válido (por ejemplo, una página no asignada o una dirección no canónica).
    INVLPGse puede utilizar para invalidar entradas TLB para páginas globales individuales.
  5. ^ ab Las instrucciones INVDand WBINVDinvalidarán todas las líneas de caché en las cachés L1 de la CPU. La implementación define si invalidarán también las cachés L2/L3.
    Estas instrucciones son serializadoras; en algunos procesadores, también pueden bloquear las interrupciones hasta su finalización.
  6. ^ En la virtualización Intel VT-xINVD , la instrucción provocará un #VMEXIT obligatorio. Además, en procesadores que admiten Intel SGX , si la PRM (memoria reservada del procesador) se ha configurado mediante los PRMRR (registros de rango PRM), la INVDinstrucción no está permitida y provocará una excepción #GP(0). [32]
  7. ^ Si se utiliza el prefijo con el código de operación, la instrucción se ejecutará como en los procesadores que admiten la extensión WBNOINVD; esto no invalidará el caché.F30F 09WBNOINVD

Añadido enP5/P6-procesadores de clase

Instrucciones de sistema o de enteros que no estaban presentes en el conjunto de instrucciones básicas del 80486, pero que se agregaron en varios procesadores x86 antes de la introducción de SSE. ( Las instrucciones discontinuadas no están incluidas).

  1. ^ En las CPU Intel y AMD, la WRMSRinstrucción también se utiliza para actualizar el microcódigo de la CPU . Esto se hace escribiendo la dirección virtual del nuevo microcódigo para cargarlo en el MSR 79hen las CPU Intel y en el MSR C001_0020h[34] en las CPU AMD.
  2. ^ Las escrituras en los siguientes MSR no se serializan: [35] [36]
  3. ^ El modo de administración del sistema y las RSMinstrucciones estuvieron disponibles en las variantes no SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993.
  4. ^ En algunos procesadores de 32 bits más antiguos, la ejecución CPUIDcon un índice de hoja (EAX) mayor que 0 puede dejar a EBX y ECX sin modificar, manteniendo sus valores anteriores. Por este motivo, se recomienda poner a cero EBX y ECX antes de ejecutar CPUID.
    Entre los procesadores que presentan este comportamiento se incluyen Cyrix MII [41] e IDT WinChip 2. [42]

    En el modo de 64 bits, CPUIDestablecerá los 32 bits superiores de RAX, RBX, RCX y RDX en cero.
  5. ^ En algunos procesadores Intel a partir de Ivy Bridge , existen MSR que se pueden usar para restringir CPUIDal anillo 0. Dichos MSR están documentados al menos para Ivy Bridge [43] y Denverton. [44]
    La capacidad de restringir CPUIDal anillo 0 también existe en los procesadores AMD que admiten la función "CpuidUserDis" ( Zen 4 "Raphael" y posteriores). [45]
  6. ^ab CPUIDtambién está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium.
  7. ^ En las CPU Cyrix 5x86 y 6x86, CPUIDno está habilitado de forma predeterminada y debe habilitarse a través de un registro de configuración de Cyrix.
  8. ^ En las CPU NexGen, CPUIDsolo es compatible con algunos BIOS del sistema. En algunas CPU NexGen que sí lo son CPUID, EFLAGS.ID no es compatible, pero EFLAGS.AC sí, lo que complica la detección de la CPU. [46]
  9. ^ A diferencia de la instrucción anterior CMPXCHG, la CMPXCHG8Binstrucción no modifica ningún bit EFLAGS que no sea ZF.
  10. ^ LOCK CMPXCHG8B con un operando de registro (que es una codificación no válida) puede provocar bloqueos en algunas CPU Intel Pentium ( error Pentium F00F ).
  11. ^ abc En los procesadores IDT WinChip, Transmeta Crusoe y Rise mP6, la CMPXCHG8Binstrucción siempre es compatible, sin embargo, puede faltar el bit CPUID. Esta es una solución temporal para un error en Windows NT. [47]
  12. ^ ab Las instrucciones RDTSCy RDPMCno están ordenadas con respecto a otras instrucciones, y pueden muestrear sus respectivos contadores antes de que se ejecuten las instrucciones anteriores o después de que se hayan ejecutado las instrucciones posteriores. Las invocaciones de RDPMC(pero no de RDTSC) pueden reordenarse entre sí incluso para lecturas del mismo contador.
    Para imponer el orden con respecto a otras instrucciones, se necesitan LFENCEinstrucciones de serialización (por ejemplo, CPUID). [48]
  13. ^ El TSC de tipo fijo se introdujo en dos etapas:
    TSC constante
    TSC se ejecuta a una velocidad fija siempre que el núcleo del procesador no esté en un modo de suspensión profunda ( C2 o más profundo), pero no está sincronizado entre los núcleos de la CPU. Introducido en Intel Prescott , Yonah y Bonnell . También presente en todas las CPU Transmeta y VIA Nano [49] . No tiene un bit CPUID.
    TSC invariante
    TSC funcionando a una velocidad fija y permaneciendo sincronizado entre los núcleos de la CPU en todos los estados P, C y T (pero no necesariamente en los estados S).
    Presente en AMD K10 y posteriores; Intel Nehalem / Saltwell [50] y posteriores; Zhaoxin WuDaoKou [51] y posteriores. Se indica con un bit CPUID (hoja 8000_0007:EDX[8]).
  14. ^ RDTSC se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0.
    En Intel Pentium y AMD K5, RDTSCno se puede ejecutar en modo Virtual-8086. [52] Los procesadores posteriores eliminaron esta restricción.
  15. ^ RDPMC se puede ejecutar fuera del anillo 0 solo si CR4.PCE=1.
  16. ^ La RDPMCinstrucción no está presente en los procesadores VIA anteriores al Nano.
  17. ^ Los códigos de condición admitidos para la instrucción (código de operación , con el nibble x especificando la condición) son:CMOVcc0F 4x /r
  18. ^ En el modo de 64 bits, CMOVcccon un tamaño de operando de 32 bits se borrarán los 32 bits superiores del registro de destino incluso si la condición es falsa.
    En el caso CMOVccde un operando de origen de memoria, la CPU siempre leerá el operando de la memoria (lo que puede provocar excepciones de memoria y rellenos de línea de caché) incluso si no se cumple la condición para el movimiento. (La extensión Intel APX define un conjunto de nuevas variantes codificadas con EVEXCMOVcc que suprimirán las excepciones de memoria si la condición es falsa).
  19. ^ En las variantes VIA C3 anteriores a Nehemías ("Samuel"/"Ezra"), se ha informado que las formas reg,regpero no reg,[mem]de las CMOVccinstrucciones están presentes como instrucciones no documentadas. [53]
  20. ^ Las codificaciones de bytes recomendadas por Intel para NOP multibyte de longitudes de 2 a 9 bytes en modo de 32/64 bits son (en hexadecimal): [54]

    Para los casos en los que es necesario utilizar más de 9 bytes de relleno NOP, se recomienda utilizar varios NOP.

  21. ^ A diferencia de otras instrucciones agregadas en Pentium Pro , el NOP largo no tiene un bit de función CPUID .
  22. ^ 0F 1F /0 El NOP largo se introdujo en Pentium Pro, pero permaneció sin documentar hasta 2006. [56] Todo el 0F 18..1Frango de códigos de operación estaba NOPen Pentium Pro. Sin embargo, a excepción de 0F 1F /0, Intel no garantiza que estos códigos de operación permanecerán NOPen procesadores futuros, y de hecho ha asignado algunos de estos códigos de operación a otras instrucciones en al menos algunos procesadores. [57]
  23. ^ Documentado para AMD x86-64 desde 2002. [58]
  24. ^ Si bien el 0F 0Bcódigo de operación se reservó oficialmente como un código de operación no válido desde Pentium en adelante, solo se le asignó el mnemónico UD2desde Pentium Pro en adelante. [60]
  25. ^ ab GNU Binutils ha utilizado los mnemónicos UD2Ay UD2Bpara los códigos 0F 0Bde 0F B9operación y desde la versión 2.7. [61]
    Ni UD2Ani UD2Boriginalmente tomaban ningún argumento; UD2Bluego se modificó para aceptar un byte ModR/M , en la versión 2.30 de Binutils. [62]
  26. ^ La instrucción UD2( 0F 0B) también impedirá que los bytes subsiguientes se decodifiquen como instrucciones, incluso de manera especulativa. Por este motivo, si una instrucción de bifurcación indirecta va seguida de algo que no es código, se recomienda colocar una UD2instrucción después de la bifurcación indirecta. [63]
  27. ^ ab Los códigos de operación UD0/1/2 - 0F 0B, 0F B9y 0F FF- provocarán una excepción #UD en todos los procesadores x86 desde el 80186 en adelante (excepto los procesadores NEC de la serie V ), pero no se reservaron explícitamente para este propósito hasta los procesadores de clase P5.
  28. ^ Si bien el 0F B9código de operación se reservó oficialmente como un código de operación no válido desde Pentium en adelante, recién se le asignó su mnemónico UD1mucho más tarde: AMD APM comenzó a incluirse UD1en sus mapas de códigos de operación desde la rev 3.17 en adelante, [65] mientras que Intel SDM comenzó a incluirlo desde la rev 061 en adelante. [66]
  29. ^ ab Se sabe que tanto para los códigos de 0F B9operación como para 0F FFlos códigos de operación, las diferentes implementaciones x86 difieren en cuanto a si los códigos de operación aceptan un byte ModR/M . [67] [68]
  30. ^ Para el 0F FFcódigo de operación, el OIOmnemónico fue introducido por Cyrix, [69] mientras que el UD0menmonic (sin argumentos) fue introducido por AMD e Intel al mismo tiempo que el UD1mnemónico para 0F B9. [65] [66] La documentación posterior de Intel (pero no AMD) modificó su descripción de UD0para agregar un byte ModR/M y tomar dos argumentos. [70]
  31. ^ En el K6, las instrucciones SYSCALL/ SYSRETestaban disponibles en el Modelo 7 ("Little Foot" de 250 nm) y posteriores, pero no en el anterior Modelo 6. [72]
  32. ^ SYSCALL y SYSRETse convirtieron en parte integral de x86-64; como resultado, las instrucciones están disponibles en modo de 64 bits en todos los procesadores x86-64 de AMD, Intel, VIA y Zhaoxin.
    Fuera del modo de 64 bits, las instrucciones solo están disponibles en procesadores AMD.
  33. ^ La semántica exacta de SYSRETdifiere levemente entre los procesadores AMD e Intel: las direcciones de retorno no canónicas hacen que se lance una excepción #GP en el anillo 3 en las CPU AMD, pero en el anillo 0 en las CPU Intel. Se sabe que esto causa problemas de seguridad. [73]
  34. ^ ab Para las instrucciones SYSRETy SYSEXITen x86-64, es necesario agregar el REX.Wprefijo para las variantes que volverán al código de modo de usuario de 64 bits.
    Las codificaciones de estas instrucciones sin el REX.Wprefijo se utilizan para volver al código de modo de usuario de 32 bits. (Ninguna de estas instrucciones se puede utilizar para volver al código de modo de usuario de 16 bits).
  35. ^ abc Las instrucciones SYSRET, SYSENTERy SYSEXITno están disponibles en el modo Real . ( SYSENTERSin embargo, están disponibles en el modo Virtual 8086 .)
  36. ^ Las CPUIDbanderas que indican soporte para SYSENTER/ SYSEXITestán establecidas en el Pentium Pro, aunque el procesador no admita oficialmente estas instrucciones. [74]
    Pruebas de terceros indican que los códigos de operación están presentes en el Pentium Pro pero tienen demasiados errores para ser utilizables. [75]
  37. ^ En las CPU AMD, las instrucciones SYSENTERy SYSEXITno están disponibles en el modo largo x86-64 (#UD).
  38. ^ En las CPU Transmeta, las instrucciones SYSENTERy SYSEXITsolo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [77]
  39. ^ Sobre Nehemías, SYSENTERy SYSEXITestán disponibles sólo en el paso 8 y posteriores. [78]

Agregado como extensiones del conjunto de instrucciones

Añadido conx86-64

Estas instrucciones sólo se pueden codificar en modo de 64 bits. Se dividen en cuatro grupos:

La mayoría de las instrucciones con un tamaño de operando de 64 bits lo codifican mediante un REX.Wprefijo; en ausencia del REX.Wprefijo, se codifica la instrucción correspondiente con un tamaño de operando de 32 bits. Este mecanismo también se aplica a la mayoría de las demás instrucciones con un tamaño de operando de 32 bits. Estas no se incluyen aquí porque no obtienen un nuevo mnemónico en la sintaxis de Intel cuando se utilizan con un tamaño de operando de 64 bits.

  1. ^ El operando de memoria CMPXCHG16Bdebe estar alineado con 16 bytes.
  2. ^ La CMPXCHG16Binstrucción no estaba presente en algunos de los primeros procesadores Intel/AMD x86-64. En los procesadores Intel, la instrucción no estaba presente en el paso D de Xeon "Nocona" , [79] pero se agregó en el paso E. [80] En los procesadores de la familia AMD K8 , se agregó en el paso F, al mismo tiempo que se introdujo el soporte para DDR2. [81]
    Por este motivo, CMPXCHG16Btiene su propio indicador CPUID, separado del resto de x86-64.
  3. ^ Se permiten codificaciones sin el prefijo REX.W, pero no se recomiendan [82] : dichas codificaciones se comportan de manera idéntica a las de 16/32 bits ( ).MOVSXDMOV8B /r

Extensiones de manipulación de bits

Instrucciones de manipulación de bits. Para todas las instrucciones codificadas en VEX definidas por BMI1 y BMI2, el tamaño del operando puede ser de 32 o 64 bits, controlados por el bit VEX.W; ninguna de estas instrucciones está disponible en variantes de 16 bits.

  1. ^ En las CPU AMD, la extensión "ABM" proporciona tanto POPCNTy LZCNT. Sin embargo, en las CPU Intel, el bit CPUID para "ABM" solo está documentado para indicar la presencia de la LZCNTinstrucción y aparece como "LZCNT", mientras que POPCNTtiene su propio bit de función CPUID independiente.
    Sin embargo, todos los procesadores conocidos que implementan las extensiones "ABM"/"LZCNT" también implementan POPCNTy configuran el bit de función CPUID para POPCNT, por lo que la distinción es solo teórica.
    (Lo inverso no es cierto: existen procesadores que admiten POPCNTABM pero no lo admiten, como Intel Nehalem y VIA Nano 3000).
  2. ^ La LZCNTinstrucción se ejecutará como BSRen los sistemas que no admiten las extensiones LZCNT o ABM. BSRCalcula el índice del bit establecido más alto en el operando de origen, lo que produce un resultado diferente LZCNTpara la mayoría de los valores de entrada.
  3. ^ La TZCNTinstrucción se ejecutará como BSFen los sistemas que no admiten la extensión BMI1. BSFproduce el mismo resultado que TZCNTpara todos los valores de operandos de entrada excepto cero, para el cual TZCNTdevuelve el tamaño del operando de entrada, pero BSFproduce un comportamiento indefinido (deja el destino sin modificar en la mayoría de las CPU modernas).
  4. ^ Para BEXTR, la posición inicial y la longitud no están enmascaradas y pueden tomar valores de 0 a 255. Si los bits seleccionados se extienden más allá del final del r/margumento (que tiene el tamaño de operando habitual de 32/64 bits), entonces los bits en exceso se leen como 0.
  5. ^ En los procesadores AMD anteriores a Zen 3, las instrucciones PEXTy PDEPson bastante lentas [83] y presentan una temporización dependiente de los datos debido al uso de una implementación microcodificada (alrededor de 18 a 300 ciclos, dependiendo de la cantidad de bits establecidos en el argumento de máscara). Como resultado, a menudo es más rápido usar otras secuencias de instrucciones en estos procesadores. [84] [85]

Agregado con Intel TSX

Añadido conCertificado Intel CET

Intel CET (Control-Flow Enforcement Technology) agrega dos características distintivas para ayudar a proteger contra vulnerabilidades de seguridad como la programación orientada al retorno : una pila de sombra (CET_SS) y seguimiento de rama indirecta (CET_IBT).

  1. ^ ab Las instrucciones RDSSPDy RDSSPQactúan como NOP en procesadores donde las pilas de sombra están deshabilitadas o no se admite CET.
  2. ^ ab ENDBR32y ENDBR64actúan como NOP en procesadores que no admiten CET_IBT o donde IBT está deshabilitado.
  3. ^ Este prefijo tiene la misma codificación que el prefijo DS: segmento anulado; a partir de abril de 2022, la documentación de Intel no parece especificar si este prefijo también conserva su antigua función de anulación de segmento cuando se usa como prefijo sin seguimiento, ni proporciona un mnemónico oficial para este prefijo. [86] [87] (GNU binutils usa "notrack" [88] )

Agregado con XSAVE

Las extensiones del conjunto de instrucciones XSAVE están diseñadas para guardar o restaurar el estado extendido de la CPU (normalmente con el fin de cambiar de contexto ) de una manera que se pueda ampliar para cubrir nuevas extensiones del conjunto de instrucciones sin que el código de cambio de contexto del SO necesite comprender los detalles de las nuevas extensiones. Esto se hace definiendo una serie de componentes de estado , cada uno con un tamaño y un desplazamiento dentro de un área de almacenamiento determinada, y cada uno correspondiente a un subconjunto del estado necesario para una extensión de la CPU u otra. La hoja EAX=0Dh CPUID se utiliza para proporcionar información sobre qué componentes de estado admite la CPU y cuáles son sus tamaños/desplazamientos, de modo que el SO pueda reservar la cantidad adecuada de espacio y establecer los bits de habilitación asociados.

  1. ^ En Intel APX, las instrucciones XSAVE*y XRSTOR*no se pueden codificar con el prefijo REX2.
  2. ^ XSAVE se agregó en los pasos E0/R0 de Penryn y no está disponible en pasos anteriores.
  3. ^ En algunos procesadores (empezando por Skylake , Goldmont y Zen 1 ), XGETBVse permite ejecutar con ECX=1; esto no retornará XCR1(no existe dicho registro), sino que retornará XCR0con AND bit a bit el valor actual del mapa de bits del componente de estado "XINUSE" (un mapa de bits de los componentes de estado XSAVE que no se sabe que estén en su estado inicial).
    La presencia de esta funcionalidad XGETBVse indica mediante CPUID .(EAX=0Dh,ECX=1):EAX[bit 2].
  4. ^ La XSETBVinstrucción provocará un #VMEXIT obligatorio si se ejecuta bajo la virtualización Intel VT-x .

Agregado con otras extensiones de proveedores cruzados

  1. ^ abc Los procesadores AMD Athlon anteriores al Athlon XP no soportaban SSE completo, pero sí introducían las instrucciones no SIMD de SSE como parte de las "Extensiones MMX" . [89] Estas extensiones (sin SSE completo) también están presentes en los procesadores Geode GX2 y Geode posteriores.
  2. ^ abcdefg Todas las PREFETCH*instrucciones son instrucciones de sugerencia que solo afectan al rendimiento, no a la semántica del programa. Si se proporciona una dirección no válida (por ejemplo, la dirección de una página no asignada o una dirección no canónica), la instrucción actuará como una NOP sin generar excepciones.
  3. ^ abc Para las instrucciones SFENCE, LFENCEy MFENCE, se ignoran los 3 bits inferiores del byte ModR/M, y cualquier valor de x en el rango 0..7 dará como resultado una instrucción válida.
  4. ^ La SFENCEinstrucción garantiza que todos los almacenamientos de memoria después de la SFENCEinstrucción se hagan observables globalmente después de todos los almacenamientos de memoria antes de SFENCE. Esto impone un ordenamiento en los almacenamientos que de otro modo se pueden reordenar, como los almacenamientos no temporales y los almacenamientos en regiones de memoria WC (Write-Combining). [90]
    En las CPU Intel, así como en las CPU AMD desde Zen1 en adelante (pero no en las CPU AMD más antiguas), SFENCEtambién actúa como una barrera de reordenamiento en los vaciados/escrituras de caché realizados con las instrucciones CLFLUSH, CLFLUSHOPTy CLWB. (Las CPU AMD más antiguas requieren MFENCEordenar CLFLUSH.)
    SFENCEno está ordenado con respecto a LFENCE, y una SFENCE+LFENCEsecuencia no es suficiente para evitar que una carga se reordene más allá de un almacenamiento anterior. [91] Para evitar dicho reordenamiento, es necesario ejecutar una MFENCE, LOCKo una instrucción de serialización.
  5. ^ La LFENCEinstrucción asegura que todas las cargas de memoria después de la LFENCEinstrucción se hagan observables globalmente después de todas las cargas de memoria antes de la LFENCE.
    En todas las CPU Intel que admiten SSE2, la LFENCEinstrucción proporciona una garantía de ordenación más fuerte: [92] es dispatch-serializing , lo que significa que las instrucciones después de la LFENCEinstrucción pueden comenzar a ejecutarse solo después de que todas las instrucciones anteriores se hayan retirado (lo que garantizará que todas las cargas anteriores, pero no necesariamente los almacenamientos, se hayan completado). El efecto de la dispatch-serializing es que LFENCEtambién actúa como una barrera de especulación y una barrera de reordenamiento para los accesos a recursos que no son de memoria, como los contadores de rendimiento (a los que se accede mediante eg RDTSCo RDPMC) y los MSR x2apic .
    En las CPU AMD, LFENCEno es necesariamente dispatch-serializing de forma predeterminada; sin embargo, en todas las CPU AMD que admiten cualquier forma de no-dispatch-serializing LFENCE, se puede hacer que dispatch-serializing configure el bit 1 de MSR C001_1029. [93]
  6. ^ La MFENCEinstrucción garantiza que todas las cargas de memoria, los almacenamientos y los vaciados de la línea de caché después de la MFENCEinstrucción se hagan observables globalmente después de todas las cargas de memoria, los almacenamientos y los vaciados de la línea de caché antes de MFENCE.
    En las CPU Intel, noMFENCE se serializa mediante despacho y, por lo tanto, no se puede usar por sí solo para hacer cumplir el orden en los accesos a recursos que no son de memoria, como los contadores de rendimiento y los MSR x2apic. todavía se ordena con respecto a , por lo que si es necesario hacer cumplir el orden entre los almacenamientos de memoria y los accesos posteriores que no son de memoria, dicho orden se puede obtener emitiendo un seguido de un . [48] [94] En las CPU AMD, se serializa.MFENCELFENCEMFENCELFENCE
    MFENCE
  7. ^ El funcionamiento de la PAUSEinstrucción en modo de 64 bits, a diferencia de NOP, no se ve afectado por la presencia del REX.Rprefijo. Ni , NOPni , PAUSEse ven afectados por los otros bits del REXprefijo. Algunos ejemplos de códigos de operación 90con varios prefijos en modo de 64 bits son:
    • 90esNOP
    • 41 90esXCHG R8D,EAX
    • 4E 90esNOP
    • 49 90esXCHG R8,RAX
    • F3 90esPAUSE
    • F3 41 90esPAUSE
    • F3 4F 90esPAUSE
  8. ^ La duración real de la pausa que realiza la PAUSEinstrucción depende de la implementación.
    En sistemas sin SSE2, PAUSEse ejecutará como NOP.
  9. ^ En la virtualización VT-x o AMD-V, la ejecución PAUSErepetida en un intervalo de tiempo breve puede provocar un error #VMEXIT. La cantidad de PAUSEejecuciones y la duración del intervalo que pueden provocar un error #VMEXIT dependen de cada plataforma.
  10. ^ Si bien la CLFLUSHinstrucción se introdujo junto con SSE2, tiene su propio indicador CPUID y puede estar presente en procesadores que no implementan SSE2 o estar ausente en procesadores que sí implementan SSE2. (Por ejemplo, AMD Geode LX admite CLFLUSHSSE2 pero no lo hace).
  11. ^ Si bien las instrucciones MONITORy MWAITse introdujeron al mismo tiempo que SSE3, tienen su propio indicador CPUID que debe verificarse por separado del indicador CPUID de SSE3 (por ejemplo, Athlon 64 X2 y VIA C7 admitían SSE3 pero no MONITOR).
  12. ^ ab Para las instrucciones MONITORy MWAIT, la documentación antigua de Intel [95] enumera mnemónicos de instrucciones con operandos explícitos ( MONITOR EAX,ECX,EDXy MWAIT EAX,ECX), mientras que la documentación más reciente omite estos operandos. Los ensambladores/desensambladores pueden admitir una o ambas de estas variantes. [96]
  13. ^ Para MONITOR, el segmento DS: se puede reemplazar con un prefijo de segmento.
    El área de memoria que se monitoreará no será solo el byte único especificado por DS:rAX, sino una región de memoria lineal que contiene el byte; el tamaño y la alineación de esta región de memoria dependen de la implementación y se pueden consultar a través de CPUID.
    La ubicación de memoria a monitorear debe tener un tipo de memoria WB (caché con escritura diferida), o de lo contrario, el monitoreo puede fallar.
  14. ^ A partir de abril de 2024, no se han definido extensiones ni sugerencias para la MONITORinstrucción. Por lo tanto, la instrucción requiere ECX=0 e ignora EDX.
  15. ^ En algunos procesadores, como Intel Xeon Phi x200 [97] y AMD K10 [98] y posteriores, existen MSR documentados que se pueden usar para habilitar MONITORy MWAITejecutar en Ring 3.
  16. ^ La espera realizada por MWAITpuede finalizar por eventos del sistema distintos a una escritura en la memoria (por ejemplo, desalojos de la línea de caché, interrupciones); el conjunto exacto de eventos que pueden hacer que finalice la espera es específico de la implementación.
    Independientemente de si la espera finalizó por una escritura en la memoria o por algún otro evento, la monitorización habrá finalizado y será necesario configurar la monitorización nuevamente MONITORantes de volver a usarla MWAITpara esperar a que se realicen escrituras en la memoria.
  17. ^ Las banderas de extensión disponibles para MWAITel registro ECX son:
  18. ^ Las banderas de sugerencias disponibles para MWAITel registro EAX son:

    Los estados C son estados de energía específicos del procesador, que no necesariamente corresponden 1:1 a los estados C de ACPI .

  19. ^ Para la GETSECinstrucción, el REX.Wprefijo habilita direcciones de 64 bits solo para la función de hoja EXITAC; de lo contrario, los prefijos REX están permitidos, pero se ignoran para la instrucción.
  20. ^ Las funciones de hoja definidas para GETSEC(seleccionadas por EAX) son:

    Cualquier valor no admitido en EAX provoca una excepción #UD.

  21. ^ Para GETSEC, la mayoría de las funciones de hoja están restringidas al Anillo 0, pero las funciones de hoja CAPACIDADES (EAX=0) y PARÁMETROS (EAX=6) están disponibles en el Anillo 3.
  22. ^ ab El valor de "identificación del núcleo" leído por RDTSCPy RDPIDes en realidad el TSC_AUXMSR (MSR C000_0103h). Si este valor corresponde realmente a una identificación de procesador es una cuestión de convención del sistema operativo.
  23. ^ A diferencia de la RDTSCinstrucción anterior, RDTSCPretrasará la lectura de TSC hasta que todas las instrucciones anteriores se hayan retirado, lo que garantiza el orden con respecto a las cargas de memoria anteriores (pero no a los almacenamientos). RDTSCPSin embargo, no está ordenado con respecto a las instrucciones posteriores.
  24. ^ RDTSCP se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0.
  25. ^ Se agregó soporte RDTSCPen el paso F del AMD K8, y no está disponible en pasos anteriores.
  26. ^ Si bien la POPCNTinstrucción se introdujo al mismo tiempo que SSE4.2, no se considera parte de SSE4.2, sino una extensión independiente con su propio indicador CPUID.
    En los procesadores AMD, se considera parte de la extensión ABM, pero aún tiene su propio indicador CPUID.
  27. ^ Los tipos de invalidación definidos para INVPCID(seleccionados por el argumento de registro) son:

    Cualquier valor no admitido en el argumento de registro provoca una excepción #GP.

  28. ^ A diferencia de la INVLPGinstrucción anterior, INVPCIDprovocará una excepción #GP si la dirección de memoria proporcionada no es canónica. Se sabe que esta discrepancia causa problemas de seguridad. [102]
  29. ^ Las instrucciones PREFETCHy PREFETCHWson partes obligatorias de la extensión del conjunto de instrucciones 3DNow!, pero también están disponibles como una extensión independiente en sistemas que no admiten 3DNow!
  30. ^ Los códigos de operación para PREFETCHy PREFETCHW( 0F 0D /r) se ejecutan como NOP en las CPU Intel desde Cedar Mill ( Pentium 4 de 65 nm ) en adelante, con PREFETCHWfuncionalidad de precarga desde Broadwell en adelante.
  31. ^ La instrucción PREFETCH( 0F 0D /0) es una instrucción 3DNow!,
    presente en todos los procesadores con 3DNow! pero no necesariamente en procesadores con la extensión PREFETCHW. En las CPU AMD con PREFETCHW, se documenta que tanto el código de operación 0F 0D /0como los códigos de operación 0F 0D /2../7realizan prefetch.
    En los procesadores Intel con PREFETCHW, se documenta que estos códigos de operación realizan NOP reservados [103] (excepto en 0F 0D /2Xeon Phi únicamente); pruebas de terceros [104] indican que algunos o todos estos códigos de operación pueden realizar prefetch en al menos algunas CPU Intel Core.PREFETCHWT1 m8
  32. ^ abc Las extensiones del conjunto de instrucciones SMAP, PKU y RDPID son compatibles con los pasos 2 [105] y posteriores de Zhaoxin LuJiaZui, pero no con los pasos anteriores.
  33. ^ A diferencia de la instrucción anterior RDTSCP, que también se puede utilizar para leer el ID del procesador, el modo de usuario RDPIDno se deshabilita mediante CR4.TSD=1.
  34. ^ Para MOVDIR64, la dirección de destino dada por ES:reg debe estar alineada a 64 bytes.
    El tamaño del operando para el argumento de registro está dado por el tamaño de la dirección, que puede ser reemplazado por el 67hprefijo.
    El argumento de fuente de memoria de 64 bytes no necesita estar alineado a 64 bytes y no se garantiza que se lea de forma atómica.
  35. ^ La WBNOINVDinstrucción se ejecutará como WBINVDsi se ejecutara en un sistema que no admite la extensión WBNOINVD.
    WBINVDSe diferencia de WBNOINVDen que WBINVDinvalidará todas las líneas de caché después de la escritura diferida.

Agregado con otras extensiones específicas de Intel

  1. ^ a b The branch hint mnemonics HWNT and HST are listed in early Willamette documentation only[106] - later Intel documentation lists the branch hint prefixes without assigning them a mnemonic.[107]
  2. ^ a b The 2E and 3E prefixes are interpreted as branch hints only when used with the Jcc conditional branch instructions (opcodes 70..7F and 0F 80..8F) - when used with other opcodes, they may take other meanings (e.g. for instructions with memory operands outside 64-bit mode, they will work as segment-override prefixes CS: and DS:, respectively). On processors that don't support branch hints, these prefixes are accepted but ignored when used with Jcc.
  3. ^ Branch hints are supported on all NetBurst (Pentium 4 family) processors - but not supported on any other known processor prior to their re-introduction in "Redwood Cove" CPUs, starting with "Meteor Lake" in 2023.
  4. ^ The leaf functions defined for ENCLS (selected by EAX) are:

    Any unsupported value in EAX causes a #GP exception.

  5. ^ SGX is deprecated on desktop/laptop processors from 11th generation (Rocket Lake, Tiger Lake) onwards, but continues to be available on Xeon-branded server parts.[111]
  6. ^ The leaf functions defined for ENCLU (selected by EAX) are:

    Any unsupported value in EAX causes a #GP exception.
    The EENTER and ERESUME functions cannot be executed inside an SGX enclave – the other functions can only be executed inside an enclave.

  7. ^ ENCLU can only be executed in ring 3, not rings 0/1/2.
  8. ^ The leaf functions defined for ENCLV (selected by EAX) are:

    Any unsupported value in EAX causes a #GP exception.
    The ENCLV instruction is only present on systems that support the EPC Oversubscription Extensions to SGX ("OVERSUB").

  9. ^ ENCLV is only available if Intel VMX operation is enabled with VMXON, and will produce #UD otherwise.
  10. ^ For PTWRITE, the write to the Processor Trace Packet will only happen if a set of enable-bits (the "TriggerEn", "ContextEn", "FilterEn" bits of the RTIT_STATUS MSR and the "PTWEn" bit of the RTIT_CTL MSR) are all set to 1.
    The PTWRITE instruction is indicated in the SDM to cause an #UD exception if the 66h instruction prefix is used, regardless of other prefixes.
  11. ^ The leaf functions defined for PCONFIG (selected by EAX) are:

    Any unsupported value in EAX causes a #GP(0) exception.

  12. ^ For CLDEMOTE, the cache level that it will demote a cache line to is implementation-dependent.
    Since the instruction is considered a hint, it will execute as a NOP without any exceptions if the provided memory address is invalid or not in the L1 cache. It may also execute as a NOP under other implementation-dependent circumstances as well.
    On systems that do not support the CLDEMOTE extension, it executes as a NOP.
  13. ^ Intel documentation lists Tremont and Alder Lake as the processors in which CLDEMOTE was introduced. However, as of May 2022, no Tremont or Alder Lake models have been observed to have the CPUID feature bit for CLDEMOTE set, while several of them have the CPUID bit cleared.[114]
    As of April 2023, the CPUID feature bit for CLDEMOTE has been observed to be set for Sapphire Rapids.[115]
  14. ^ For UMONITOR, the operand size of the address argument is given by the address size, which may be overridden by the 67h prefix. The default segment used is DS:, which can be overridden with a segment prefix.
  15. ^ a b For the UMWAIT and TPAUSE instructions, the operating system can use the IA32_UMWAIT_CONTROL MSR to limit the maximum amount of time that a single UMWAIT/TPAUSE invocation is permitted to wait. The UMWAIT and TPAUSE instructions will set RFLAGS.CF to 1 if they reached the IA32_UMWAIT_CONTROL-defined time limit and 0 otherwise.
  16. ^ TPAUSE and UMWAIT can be run outside Ring 0 only if CR4.TSD=0.
  17. ^ For the register argument to the UMWAIT and TPAUSE instructions, the following flag bits are supported:
  18. ^ While serialization can be performed with older instructions such as e.g. CPUID and IRET, these instructions perform additional functions, causing side-effects and reduced performance when stand-alone instruction serialization is needed. (CPUID additionally has the issue that it causes a mandatory #VMEXIT when executed under virtualization, which causes a very large overhead.) The SERIALIZE instruction performs serialization only, avoiding these added costs.
  19. ^ A bitmap of CPU history components that can be reset through HRESET is provided by CPUID.(EAX=20h,ECX=0):EBX.
    As of July 2023, the following bits are defined:
  20. ^ The register argument to SENDUIPI is an index to pick an entry from the UITT (User-Interrupt Target Table, a table specified by the new UINTR_TT and UINT_MISC MSRs.)
  21. ^ On Sapphire Rapids processors, the UIRET instruction always sets UIF (User Interrupt Flag) to 1. On Sierra Forest and later processors, UIRET will set UIF to the value of bit 1 of the value popped off the stack for RFLAGS - this functionality is indicated by CPUID.(EAX=7,ECX=1):EDX[17].
  22. ^ The condition codes supported for the CMPccXADD instructions (opcode VEX.128.66.0F38 Ex /r with the x nibble specifying the condition) are:
  23. ^ Even though the CMPccXADD instructions perform a locked memory operation, they do not require or accept the LOCK (F0h) prefix - attempting to use this prefix results in #UD.
  24. ^ a b In initial implementations, the PREFETCHIT0 and PREFETCHIT1 instructions will perform code prefetch only when using the RIP-relative addressing mode and act as NOPs otherwise.
    The PREFETCHI instructions are hint instructions only - if an attempt is made to prefetch an invalid address, the instructions will act as NOPs with no exceptions generated. On processors that support Long-NOP but do not support the PREFETCHI instructions, these instructions will always act as NOPs.

Added with other AMD-specific extensions

  1. ^ The standard way to access the CR8 register is to use an encoding that makes use of the REX.R prefix, e.g. 44 0F 20 07 (MOV RDI,CR8). However, the REX.R prefix is only available in 64-bit mode.
    The AltMovCr8 extension adds an additional method to access CR8, using the F0 (LOCK) prefix instead of REX.R – this provides access to CR8 outside 64-bit mode.
  2. ^ a b Like other variants of MOV to/from the CRx registers, the AltMovCr8 encodings ignore the top 2 bits of the instruction's ModR/M byte, and always execute as if these two bits are set to 11b.
    The AltMovCr8 encodings are available in 64-bit mode. However, combining the LOCK prefix with the REX.R prefix is not permitted and will cause an #UD exception.
  3. ^ Support for AltMovCR8 was added in stepping F of the AMD K8, and is not available on earlier steppings.
  4. ^ For CLZERO, the address size and 67h prefix control whether to use AX, EAX or RAX as address. The default segment DS: can be overridden by a segment-override prefix. The provided address does not need to be aligned – hardware will align it as necessary.
    The CLZERO instruction is intended for recovery from otherwise-fatal Machine Check errors. It is non-cacheable, cannot be used to allocate a cache line without a memory access, and should not be used for fast memory clears.[117]
  5. ^ The register numbering used by RDPRU does not necessarily match that of RDMSR/WRMSR.
    The registers supported by RDPRU as of December 2022 are:

    Unsupported values in ECX return 0.

  6. ^ If CR4.TSD=1, then the RDPRU instruction can only run in ring 0.

x87 floating-point instructions

The x87 coprocessor, if present, provides support for floating-point arithmetic. The coprocessor provides eight data registers, each holding one 80-bit floating-point value (1 sign bit, 15 exponent bits, 64 mantissa bits) – these registers are organized as a stack, with the top-of-stack register referred to as "st" or "st(0)", and the other registers referred to as st(1),st(2),...st(7). It additionally provides a number of control and status registers, including "PC" (precision control, to control whether floating-point operations should be rounded to 24, 53 or 64 mantissa bits) and "RC" (rounding control, to pick rounding-mode: round-to-zero, round-to-positive-infinity, round-to-negative-infinity, round-to-nearest-even) and a 4-bit condition code register "CC", whose four bits are individually referred to as C0,C1,C2 and C3). Not all of the arithmetic instructions provided by x87 obey PC and RC.

Original 8087 instructions

  1. ^ x87 coprocessors (other than the 8087) handle exceptions in a fairly unusual way. When an x87 instruction generates an unmasked arithmetic exception, it will still complete without causing a CPU fault – instead of causing a fault, it will record within the coprocessor information needed to handle the exception (instruction pointer, opcode, data pointer if the instruction had a memory operand) and set FPU status-word flag to indicate that a pending exception is present. This pending exception will then cause a CPU fault when the next x87, MMX or WAIT instruction is executed.
    The exception to this is x87's "Non-Waiting" instructions, which will execute without causing such a fault even if a pending exception is present (with some caveats, see application note AP-578[118]). These instructions are mostly control instructions that can inspect and/or modify the pending-exception state of the x87 FPU.
  2. ^ For each non-waiting x87 instruction whose mnemonic begins with FN, there exists a pseudo-instruction that has the same mnemonic except without the N. These pseudo-instructions consist of a WAIT instruction (opcode 9B) followed by the corresponding non-waiting x87 instruction. For example:
    • FNCLEX is an instruction with the opcode DB E2. The corresponding pseudo-instruction FCLEX is then encoded as 9B DB E2.
    • FNSAVE ES:[BX+6] is an instruction with the opcode 26 DD 77 06. The corresponding pseudo-instruction FSAVE ES:[BX+6] is then encoded as 9B 26 DD 77 06
    These pseudo-instructions are commonly recognized by x86 assemblers and disassemblers and treated as single instructions, even though all x86 CPUs with x87 coprocessors execute them as a sequence of two instructions.
  3. ^ a b c d On 80387 and later x87 FPUs, FLDENV, F(N)STENV, FRSTOR and F(N)SAVE exist in 16-bit and 32-bit variants. The 16-bit variants will load/store a 14-byte floating-point environment data structure to/from memory – the 32-bit variants will load/store a 28-byte data structure instead. (F(N)SAVE/FRSTOR will additionally load/store an additional 80 bytes of FPU data register content after the FPU environment, for a total of 94 or 108 bytes). The choice between the 16-bit and 32-bit variants is based on the CS.D bit and the presence of the 66h instruction prefix. On 8087 and 80287, only the 16-bit variants are available.
    64-bit variants of these instructions do not exist – using REX.W under x86-64 will cause the 32-bit variants to be used. Since these can only load/store the bottom 32 bits of FIP and FDP, it is recommended to use FXSAVE64/FXRSTOR64 instead if 64-bit operation is desired.
  4. ^ a b In the case of an x87 instruction producing an unmasked FPU exception, the 8087 FPU will signal an IRQ some indeterminate time after the instruction was issued. This may not always be possible to handle,[119] and so the FPU offers the F(N)DISI and F(N)ENI instructions to set/clear the Interrupt Mask bit (bit 7) of the x87 Control Word,[120] to control the interrupt.
    Later x87 FPUs, from 80287 onwards, changed the FPU exception mechanism to instead produce a CPU exception on the next x87 instruction. This made the Interrupt Mask bit unnecessary, so it was removed.[121] In later Intel x87 FPUs, the F(N)ENI and F(N)DISI instructions were kept for backwards compatibility, executing as NOPs that do not modify any x87 state.
  5. ^ a b c FST/FSTP with an 80-bit destination (m80 or st(i)) and an sNaN source value will produce exceptions on AMD but not Intel FPUs.
  6. ^ FSTP ST(0) is a commonly used idiom for popping a single register off the x87 register stack.
  7. ^ a b c d e f g h i Intel x87 alias opcode. Use of this opcode is not recommended.
    On the Intel 8087 coprocessor, several reserved opcodes would perform operations behaving similarly to existing defined x87 instructions. These opcodes were documented for the 8087[122] and 80287,[123] but then omitted from later manuals until the October 2017 update of the Intel SDM.[124]
    They are present on all known Intel x87 FPUs but unavailable on some older non-Intel FPUs, such as AMD Geode GX/LX, DM&P Vortex86[125] and NexGen 586PF.[126]
  8. ^ a b On the 8087 and 80287, FBSTP and the load-constant instructions always use the round-to-nearest rounding mode. On the 80387 and later x87 FPUs, these instructions will use the rounding mode specified in the x87 RC register.
  9. ^ a b c d e f g h i For the FADDP, FSUBP, FSUBRP, FMULP, FDIVP, FDIVRP, FCOM, FCOMP and FXCH instructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument.
  10. ^ On Intel Pentium and later processors, FXCH is implemented as a register renaming rather than a true data move. This has no semantic effect, but enables zero-cycle-latency operation. It also allows the instruction to break data dependencies for the x87 top-of-stack value, improving attainable performance for code optimized for these processors.
  11. ^ The result of executing the FBLD instruction on non-BCD data is undefined.
  12. ^ On early Intel Pentium processors, floating-point divide was subject to the Pentium FDIV bug. This also affected instructions that perform divide as part of their operations, such as FPREM and FPATAN.[127]
  13. ^ The FXAM instruction will set C0, C2 and C3 based on value type in st(0) as follows:

    C1 is set to the sign-bit of st(0), regardless of whether st(0) is Empty or not.

  14. ^ For FXTRACT, if st(0) is zero or ±∞, then M is set equal to st(0). If st(0) is zero, E is set to 0 on 8087/80287 but -∞ on 80387 and later. If st(0) is ±∞, then E is set to +∞.
  15. ^ For FPREM, if the quotient Q is larger than , then the remainder calculation may have been done only partially – in this case, the FPREM instruction will need to be run again in order to complete the remainder calculation. This is indicated by the instruction setting C2 to 1.
    If the instruction did complete the remainder calculation, it will set C2 to 0 and set the three bits {C0,C3,C1} to the bottom three bits of the quotient Q.
    On 80387 and later, if the instruction didn't complete the remainder calculation, then the computed remainder Q used for argument reduction will have been rounded to a multiple of 8 (or larger power-of-2), so that the bottom 3 bits of the quotient can still be correctly retrieved in a later pass that does complete the remainder calculation.
  16. ^ The remainder computation done by the FPREM instruction is always exact with no roundoff errors.
  17. ^ For the FSCALE instruction on 8087 and 80287, st(1) is required to be in the range . Also, its absolute value must be either 0 or at least 1. If these requirements are not satisfied, the result is undefined.
    These restrictions were removed in the 80387.
  18. ^ For FSCALE, rounding is only applied in the case of overflow, underflow or subnormal result.
  19. ^ The x87 transcendental instructions do not obey PC or RC, but instead compute full 80-bit results. These results are not necessarily correctly rounded (see Table-maker's dilemma) – they may have an error of up to ±1 ulp on Pentium or later, or up to ±1.5 ulps on earlier x87 coprocessors.
  20. ^ a b For the FYL2X and FYL2XP1 instructions, the maximum error bound of ±1 ulp only holds for st(1)=1.0 – for other values of st(1), the error bound is increased to ±1.35 ulps.
  21. ^ For FPATAN, the following adjustments are done as compared to just computing a one-argument arctangent of the ratio :
    • If both st(0) and st(1) are ±∞, then the arctangent is computed as if each of st(0) and st(1) had been replaced with ±1 of the same sign. This produces a result that is an odd multiple of .
    • If both st(0) and st(1) are ±0, then the arctangent is computed as if st(0) but not st(1) had been replaced with ±1 of the same sign, producing a result of ±0 or .
    • If st(0) is negative (has sign bit set), then an addend of with the same sign as st(1) is added to the result.
  22. ^ While FNOP is a no-op in the sense that will leave the x87 FPU register stack unmodified, it may still modify FIP and CC, and it may fault if a pending x87 FPU exception is present.

x87 instructions added in later processors

  1. ^ The x87 FPU needs to know whether it is operating in Real Mode or Protected Mode because the floating-point environment accessed by the F(N)SAVE, FRSTOR, FLDENV and F(N)STENV instructions has different formats in Real Mode and Protected Mode. On 80287, the F(N)SETPM instruction is required to communicate the real-to-protected mode transition to the FPU. On 80387 and later x87 FPUs, real↔protected mode transitions are communicated automatically to the FPU without the need for any dedicated instructions – therefore, on these FPUs, FNSETPM executes as a NOP that does not modify any FPU state.
  2. ^ Not including discontinued instructions specific to particular 80387-compatible FPU models.
  3. ^ a b For the FUCOM and FUCOMP instructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument.
  4. ^ The 80387 FPREM1 instruction differs from the older FPREM (D9 F8) instruction in that the quotient Q is rounded to integer with round-to-nearest-even rounding rather than the round-to-zero rounding used by FPREM. Like FPREM, FPREM1 always computes an exact result with no roundoff errors. Like FPREM, it may also perform a partial computation if the quotient is too large, in which case it must be run again.
  5. ^ a b c Due to the x87 FPU performing argument reduction for sin/cos with only about 68 bits of precision, the value of k used in the calculation of FSIN, FCOS and FSINCOS is not precisely 1.0, but instead given by[128][129]This argument reduction inaccuracy also affects the FPTAN instruction.
  6. ^ The FCOMI, FCOMIP, FUCOMI and FUCOMIP instructions write their results to the ZF, CF and PF bits of the EFLAGS register. On Intel but not AMD processors, the SF, AF and OF bits of EFLAGS are also zeroed out by these instructions.
  7. ^ The FXSAVE and FXRSTOR instructions were added in the "Deschutes" revision of Pentium II, and are not present in earlier "Klamath" revision.
    They are also present in AMD K7.
    They are also considered an integral part of SSE and are therefore present in all processors with SSE.
  8. ^ a b The FXSAVE and FXRSTOR instructions will save/restore SSE state only on processors that support SSE. Otherwise, they will only save/restore x87 and MMX state.
    The x87 section of the state saved/restored by FXSAVE/FXRSTOR has a completely different layout than the data structure of the older F(N)SAVE/FRSTOR instructions, enabling faster save/restore by avoiding misaligned loads and stores.
  9. ^ a b When floating-point emulation is enabled with CR0.EM=1, FXSAVE(64) and FXRSTOR(64) are considered to be x87 instructions and will accordingly produce an #NM (device-not-available) exception. Other than WAIT, these are the only opcodes outside the D8..DF ESC opcode space that exhibit this behavior. (All opcodes in D8..DF will produce #NM if CR0.EM=1, even for undefined opcodes that would produce #UD otherwise.)
  10. ^ Unlike the older F(N)SAVE instruction, FXSAVE will not initialize the FPU after saving its state to memory, but instead leave the x87 coprocessor state unmodified.

SIMD instructions

Cryptographic instructions

Virtualization instructions

Other instructions

x86 also includes discontinued instruction sets which are no longer supported by Intel and AMD, and undocumented instructions which execute but are not officially documented.

See also

References

  1. ^ "Re: Intel Processor Identification and the CPUID Instruction". Retrieved 2013-04-21.
  2. ^ "Intel 80x86 Instruction Set Summary" (PDF). eecs.wsu.edu.
  3. ^ Michal Necasek, SGDT/SIDT Fiction and Reality, 4 May 2017. Archived on 29 Nov 2023.
  4. ^ a b Intel, Undocumented iAPX 286 Test Instruction. Archived on 20 Dec 2023.
  5. ^ WikiChip, UMIP – x86. Archived on 16 Mar 2023.
  6. ^ Oracle Corp, Oracle® VM VirtualBox Administrator's Guide for Release 6.0, section 3.5: Details About Software Virtualization. Archived on 8 Dec 2023.
  7. ^ MBC Project, Virtual Machine Detection (permanent link) or Virtual Machine Detection (non permanent link)
  8. ^ Andrew Schulman, "Unauthorized Windows 95" (ISBN 1-56884-169-8), chapter 8, p.249,257.
  9. ^ US Patent 4974159, "Method of transferring control in a multitasking computer system" mentions 63h/ARPL.
  10. ^ Intel, Pentium® Processor Family Developer’s Manual, Volume 3, 1995, order no. 241430-004, section 12.7, p. 323
  11. ^ Intel, How Microarchitectural Data Sampling works, see mitigations section. Archived on Apr 22,2022
  12. ^ Linux kernel documentation, Microarchitectural Data Sampling (MDS) mitigation Archived 2020-10-21 at the Wayback Machine
  13. ^ VCF Forums, I found the SAVEALL opcode, jun 21, 2019. Archived on 13 Apr 2023.
  14. ^ rep lodsb, Intel 286 secrets: ICE mode and F1 0F 04, aug 12, 2022. Archived on 8 Dec 2023.
  15. ^ LKML, (PATCH) x86-64, espfix: Don't leak bits 31:16 of %esp returning to 16-bit stack, Apr 29, 2014. Archived on Jan 4, 2018
  16. ^ Raymond Chen, Getting MS-DOS games to run on Windows 95: Working around the iretd problem, Apr 4, 2016. Archived on Mar 15, 2019
  17. ^ sandpile.org, x86 architecture rFLAGS register, see note #7
  18. ^ Can Bölük, Speculating the entire x86-64 Instruction Set In Seconds with This One Weird Trick, Mar 22, 2021. Archived on Mar 23, 2021.
  19. ^ a b Robert Collins, Undocumented OpCodes, 29 july 1995. Archived on 21 feb 2001
  20. ^ Michal Necasek, ICEBP finally documented, OS/2 Museum, May 25, 2018. Archived on 6 June 2018
  21. ^ Intel, AP-526: Optimization For Intel's 32-bit Processors, order no. 242816-001, october 1995 – lists INT1 on page 86.
  22. ^ AMD, AMD 64-bit Technology, vol 2: System Programming, order no. 24593, rev 3.06, aug 2002, page 248
  23. ^ "Intel 80386 CPU Information | PCjs Machines". www.pcjs.org.
  24. ^ Geoff Chappell, CPU Identification before CPUID
  25. ^ Jeff Parsons, Obsolete 80386 Instructions: IBTS and XBTS, PCjs Machines. Archived on Sep 19, 2020.
  26. ^ Robert Collins, The LOADALL Instruction. Archived from the original on Jun 5, 1997.
  27. ^ Toth, Ervin (1998-03-16). "BSWAP with 16-bit registers". Archived from the original on 1999-11-03. The instruction brings down the upper word of the doubleword register without affecting its upper 16 bits.
  28. ^ Coldwin, Gynvael (2009-12-29). "BSWAP + 66h prefix". Retrieved 2018-10-03. internal (zero-)extending the value of a smaller (16-bit) register … applying the bswap to a 32-bit value "00 00 AH AL", … truncated to lower 16-bits, which are "00 00". … Bochs … bswap reg16 acts just like the bswap reg32 … QEMU … ignores the 66h prefix
  29. ^ Intel "i486 Microprocessor" (April 1989, order no. 240440-001) p.142 lists CMPXCHG with 0F A6/A7 encodings.
  30. ^ Intel "i486 Microprocessor" (November 1989, order no. 240440-002) p.135 lists CMPXCHG with 0F B0/B1 encodings.
  31. ^ "Intel 486 & 486 POD CPUID, S-spec, & Steppings".
  32. ^ Intel, Software Guard Extensions Programming Reference, order no. 329298-002, oct 2014, sections 3.5 and 3.6.5.
  33. ^ Frank van Gilluwe, "The Undocumented PC, second edition", 1997, ISBN 0-201-47950-8, page 55
  34. ^ AMD, Revision Guide for AMD Athlon 64 and AMD Opteron Processors pub.no. 25759, rev 3.79, July 2009, page 34. Archived on 20 Dec 2023.
  35. ^ Intel, Software Developer’s Manual, vol 3A, order no. 253668-078, Dec 2022, section 9.3, page 299.
  36. ^ Intel, CPUID Enumeration and Architectural MSRs, 8 Aug 2023. Archived on 23 May 2024.
  37. ^ "RSM—Resume from System Management Mode". Archived from the original on 2012-03-12.
  38. ^ Microprocessor Report, System Management Mode Explained (vol 6, no. 8, june 17, 1992). Archived on Jun 29, 2022.
  39. ^ Ellis, Simson C., "The 386 SL Microprocessor in Notebook PCs", Intel Corporation, Microcomputer Solutions, March/April 1991, page 20
  40. ^ Cyrix 486SLC/e Data Sheet (1992), section 2.6.4
  41. ^ Linux 6.3 kernel sources, /arch/x86/include/asm/cpuid.h, line 69
  42. ^ gcc-patches mailing list, CPUID Patch for IDT Winchip, May 21, 2019. Archived on Apr 27, 2023.
  43. ^ Intel, Intel® Virtualization Technology FlexMigration Application Note order no. 323850-004, oct 2012, section 2.3.2 on page 12. Archived on Oct 13, 2014.
  44. ^ Intel, Atom Processor C3000 Product Family Datasheet order no. 337018-002, Feb 2018, pages 133, 3808 and 3814. Archived on Feb 9, 2022.
  45. ^ AMD, AMD64 Architecture Programmer’s Manual Volume 3 pub.no. 24594, rev 3.34, oct 2022, p. 165 (entry on CPUID instruction)
  46. ^ Robert Collins, CPUID Algorithm Wars, nov 1996. Archived from the original on dec 18, 2000.
  47. ^ Geoff Chappell, CMPXCHG8B Support in the 32-Bit Windows Kernel, 23 jan 2008. Archived on 5 Nov 2023.
  48. ^ a b Intel, Software Developer's Manual, order no. 325426-077, Nov 2022 – the entry on the RDTSC instruction on p.1739 describes the instruction sequences required to order the RDTSC instruction with respect to earlier and later instructions.
  49. ^ Linux kernel 5.4.12, /arch/x86/kernel/cpu/centaur.c
  50. ^ Stack Overflow, Can constant non-invariant tsc change frequency across cpu states? Accessed 24 Jan 2023. Archived on 24 Jan 2023.
  51. ^ CPU-World, CPUID for Zhaoxin KaiXian KX-5000 KX-5650 (by timw4mail), 24 Apr 2024. Archived on 26 Apr 2024.
  52. ^ Michal Necasek, "Undocumented RDTSC", 27 Apr 2018. Archived on 16 Dec 2023.
  53. ^ Willy Tarreau, Re: i686 quirk for AMD Geode, Linux Kernel Mailing List, 10 Nov 2009.
  54. ^ Intel, Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1, order no. 248966-050US, April 2024, section 3.5.1.9, page 119. Archived on 9 May 2024.
  55. ^ JookWiki, "nopl", sep 24, 2022 – provides a lengthy account of the history of the long NOP and the issues around it. Archived on oct 28, 2022.
  56. ^ Intel Community: Multibyte NOP Made Official. Archived on 7 Apr 2022.
  57. ^ Intel Software Developers Manual, vol 3B (order no 253669-076us, December 2021), section 22.15 "Reserved NOP"
  58. ^ AMD, AMD 64-bit Technology – AMD x86-64 Architecture Programmer’s Manual Volume 3, publication no. 24594, rev 3.02, aug 2002, page 379.
  59. ^ Debian bug report logs, -686 build uses long noops, that are unsupported by Transmeta Crusoe, immediate crash on boot, see messages 148 and 158 for NOPL on VIA C7. Archived on 1 Aug 2019
  60. ^ Intel, Intel Architecture Software Developer’s Manual, Volume 2, 1997, order no. 243191-001, pages 3-9 and A-7.
  61. ^ John Hassey, Pentium Pro changes, GAS2 mailing list, 28 dec 1995 – patch that added the UD2A and UD2B instruction mnemomics to GNU Binutils. Archived on 25 Jul 2023.
  62. ^ Jan Beulich, x86: correct UDn, binutils-gdb mailing list, 23 nov 2017 – Binutils patch that added ModR/M byte to UD1/UD2B and added UD0. Archived on 25 Jul 2023.
  63. ^ Intel, Intel Pentium 4 and Intel Xeon Processor Optimization Reference Manual, order no. 248966-007, see "Assembly/Compiler Coding Rule 13" on page 74. Archived from the original on 16 Mar 2003.
  64. ^ Intel, Pentium® Processor Family Developer's Manual Volume 3, 1995. order no. 241430-004, appendix A, page 943 – reserves the opcodes 0F 0B and 0F B9.
  65. ^ a b AMD, AMD64 Architecture Programmer’s Manual Volume 3, publication no. 24594, rev 3.17, dec 2011 – see page 416 for UD0 and page 415 and 419 for UD1.
  66. ^ a b Intel, Software Developer's Manual, vol 2B, order no. 253667-061, dec 2016 – lists UD1 (with ModR/M byte) and UD0 (without ModR/M byte) on page 4-687.
  67. ^ Stecklina, Julian (2019-02-08). "Fingerprinting x86 CPUs using Illegal Opcodes". x86.lol. Archived from the original on 15 Dec 2023. Retrieved 2023-12-15.
  68. ^ "ud0 length fix · intelxed/xed@7561f54". GitHub. Archived from the original on 1 Jun 2023. Retrieved 2023-12-15.
  69. ^ a b Cyrix, 6x86 processor data book, 1996, order no. 94175-01, table 6-20, page 209 – uses the mnemonic OIO ("Official invalid opcode") for the 0F FF opcode.
  70. ^ Intel, Software Developer's Manual, vol 2B, order no. 253667-064, oct 2017 – lists UD0 (with ModR/M byte) on page 4-683.
  71. ^ AMD, AMD-K5 Processor Technical Reference Manual, Nov 1996, order no. 18524C/0, section 3.3.7, page 90 – reserves the 0F FF opcode without assigning it a mnemonic.
  72. ^ AMD, AMD-K6 Processor Data Sheet, order no. 20695H/0, March 1998, section 24.2, page 283.
  73. ^ George Dunlap, The Intel SYSRET Privilege Escalation, The Xen Project., 13 june 2012. Archived on Mar 15, 2019.
  74. ^ Intel, AP-485: Intel® Processor Identification and the CPUID Instruction, order no. 241618-039, may 2012, section 5.1.2.5, page 32
  75. ^ Michal Necasek, "SYSENTER, Where Are You?", 20 Jul 2017. Archived on 29 Nov 2023.
  76. ^ AMD, Athlon Processor x86 Code Optimization Guide, publication no. 22007, rev K, feb 2002, appendix F, page 284. Archived on 13 Apr 2017.
  77. ^ Transmeta, Processor Recognition, May 7, 2002.
  78. ^ VIA, VIA C3 Nehemiah Processor Datasheet, rev 1.13, sep 29, 2004, page 17
  79. ^ CPU-World, CPUID for Intel Xeon 3.40 GHz – Nocona stepping D CPUID without CMPXCHG16B
  80. ^ CPU-World, CPUID for Intel Xeon 3.60 GHz – Nocona stepping E CPUID with CMPXCHG16B
  81. ^ SuperUser StackExchange, How prevalent are old x64 processors lacking the cmpxchg16b instruction?
  82. ^ Intel SDM order no. 325462-077, apr 2022, vol 2B, p.4-130 "MOVSX/MOVSXD-Move with Sign-Extension" lists MOVSXD without REX.W as "discouraged"
  83. ^ Anandtech, AMD Zen 3 Ryzen Deep Dive Review, nov 5, 2020, page 6
  84. ^ @instlatx64 (October 31, 2020). "Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7" (Tweet). Retrieved 2023-01-20 – via Twitter.
  85. ^ Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub.
  86. ^ Intel, Control-flow Enforcement Technology Specification (v3.0, order no. 334525-003, March 2019)
  87. ^ Intel SDM, rev 076, December 2021, volume 1, section 18.3.1
  88. ^ Binutils mailing list: x86: CET v2.0: Update NOTRACK prefix
  89. ^ AMD, Extensions to the 3DNow! and MMX Instruction Sets, ref no. 22466D/0, March 2000, p.11
  90. ^ Hadi Brais, The Significance of the x86 SFENCE instruction, 26 Feb 2019.
  91. ^ Intel, Software Developer's Manual, order no. 325426-077, Nov 2022, Volume 1, section 11.4.4.3, page 276.
  92. ^ Hadi Brais, The Significance of the LFENCE instruction, 14 May 2018
  93. ^ AMD, Software techniques for managing speculation on AMD processor, rev 3.8.22, 8 March 2022, page 4. Archived on 13 March 2022.
  94. ^ Intel, Software Developer's Manual, order no. 325426-084, June 2024, vol 3A, section 11.12.3, page 3411 - covers the use of the MFENCE;LFENCE sequence to enforce ordering between a memory store and a later x2apic MSR write. Archived on 4 Jul 2024
  95. ^ Intel, Prescott New Instructions Software Developer’s Guide, order no. 252490-003, june 2003, pages 3-26 and 3-38 list MONITOR and MWAIT with explicit operands. Archived on 9 May 2005.
  96. ^ Flat Assembler messageboard, "BLENDVPS/BLENDVPD/PBLENDVB syntax", also covers MONITOR/MWAIT mnemonics. Archived on 6 Nov 2022.
  97. ^ Intel, Intel® Xeon Phi™ Product Family x200 (KNL) User mode (ring 3) MONITOR and MWAIT (archived 5 mar 2017)
  98. ^ AMD, BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors, order no. 31116, rev 3.62, page 419. Archived on Apr 8, 2024.
  99. ^ R. Zhang et al, (M)WAIT for It: Bridging the Gap between Microarchitectural and Architectural Side Channels, 3 Jan 2023, page 5. Archived from the original on 5 Jan 2023.
  100. ^ Intel, Architecture Instruction Set Extensions Programming Reference, order no. 319433-052, March 2024, chapter 17. Archived on Apr 7, 2024.
  101. ^ Guru3D, VIA Zhaoxin x86 4 and 8-core SoC processors launch, Jan 22, 2018
  102. ^ Vulners, x86: DoS from attempting to use INVPCID with a non-canonical addresses, 20 nov 2018
  103. ^ Intel, Intel® 64 and IA-32 Architectures Software Developer’s Manual volume 3, order no. 325384-078, december 2022, chapter 23.15
  104. ^ Catherine Easdon, Undocumented CPU Behaviour on x86 and RISC-V Microarchitectures: A Security Perspective, 10 May 2019, page 39
  105. ^ Instlatx64, Zhaoxin Kaixian KX-6000G CPUID dump, May 15, 2023
  106. ^ Intel, Willamette Processor Software Developer’s Guide, order no. 245355-001, feb 2000, section 3.5.3, page 294 - lists HWNT/HST mnemonics for the branch hint prefixes. Archived from the original on 5 Feb 2005.
  107. ^ Intel, Software Developer's Manual, order no. 325462-083, March 2024 - volume 1, chapter 11.4.5, page 281 and volume 2A, chapter 2.1.1, page 525.
  108. ^ Intel, Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1, order no. 248966-050US, April 2024, chapter 2.1.1.1, page 46.
  109. ^ a b c Intel, Intel® Software Guard Extensions (Intel® SGX) Architecture for Oversubscription of Secure Memory in a Virtualized Environment, 25 Jun 2017.
  110. ^ Intel, Runtime Microcode Updates with Intel® Software Guard Extensions, sep 2021, order no. 648682 rev 1.0. Archived from the original on 31 mar 2023.
  111. ^ Intel, 11th Generation Intel® Core™ Processor Desktop Datasheet, Volume 1, may 2022, order no. 634648-004, section 3.5, page 65
  112. ^ Intel, Which Platforms Support Intel® Software Guard Extensions (Intel® SGX) SGX2? Archived on 5 May 2022.
  113. ^ Intel, Trust Domain CPU Architectural Extensions, order no. 343754-002, may 2021.
  114. ^ @InstLatX64 (May 3, 2022). "The CLDEMOTE Story" (Tweet). Retrieved 2023-01-23 – via Twitter.
  115. ^ @Instlatx64 (Apr 17, 2023). "20-Core Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 CPUID dump" (Tweet). Retrieved 2023-04-20 – via Twitter.
  116. ^ Intel, Intel Data Streaming Accelerator Architecture Specification, order no. 341204-004, Sep 2022, pages 13 and 23. Archived on 20 Jul 2023.
  117. ^ Wikichip, CLZERO – x86
  118. ^ Intel, Application note AP-578: Software and Hardware Considerations for FPU Exception Handlers for Intel Architecture Processors, order no. 243291-002, February 1997
  119. ^ Intel, Application Note AP-113: Getting Started With The Numeric Data Processor, feb 1981, pages 24-25
  120. ^ Intel, 8087 Math Coprocessor, oct 1989, order no. 285385-007, page 3-100, fig 9
  121. ^ Intel, 80287 80-bit HMOS Numeric Processor Extension, feb 1983, order no. 201920-001, page 14
  122. ^ Intel, iAPX86, 88 User's Manual, 1981 (order no. 210201-001), p. 797
  123. ^ Intel 80286 and 80287 Programmers Reference Manual, 1987 (order no. 210498-005), p. 485
  124. ^ Intel Software Developer's Manual volume 3B, revision 064, section 22.18.9
  125. ^ "GCC Bugzilla – 37179 – GCC emits bad opcode 'ffreep'".
  126. ^ Michael Steil, FFREEP – the assembly instruction that never existed
  127. ^ Dusko Koncaliev, Pentium FDIV Bug
  128. ^ Bruce Dawson, Intel Underestimates Error Bounds by 1.3 quintillion
  129. ^ Intel SDM, rev 053 and later, describes the exact argument reduction procedure used for FSIN, FCOS, FSINCOS and FPTAN in volume 1, section 8.3.8

External links