El conjunto de instrucciones x86 se refiere al conjunto de instrucciones que admiten los microprocesadores compatibles con x86 . Las instrucciones suelen formar parte de un programa ejecutable , a menudo almacenado como un archivo de computadora y ejecutado 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 funciones. [1]
A continuación se muestra el conjunto completo de instrucciones 8086/8088 de Intel (81 instrucciones en total). La mayoría, si no todas, estas instrucciones están disponibles en modo de 32 bits; simplemente operan con registros y valores de 32 bits ( eax , ebx , etc.) en lugar de sus contrapartes de 16 bits ( ax , bx , etc.). El conjunto de instrucciones actualizado también se agrupa según la arquitectura ( i386 , i486 , i686 ) y, de forma más general, se denomina x86 (32 bits) y x86-64 (64 bits) (también conocido como AMD64 ).
Las nuevas instrucciones agregadas en 80286 agregan soporte para el modo protegido x86 . Algunas, pero no todas, las instrucciones también están disponibles en modo real .
LGDT
, LIDT
y SGDT
constan SIDT
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 inicial lineal de la tabla. LGDT
y LIDT
con un tamaño de operando de 16 bits, la dirección se aplica mediante AND con 00FFFFFFh. En las CPU Intel (pero no AMD), las instrucciones SGDT
y SIDT
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, se observó El comportamiento es que en su lugar se escriben los bits 31:24 de la dirección de la tabla de descriptores. [2]LGDT
,, y se serializan en LIDT
procesadores Pentium y posteriores .LLDT
LMSW
LTR
LMSW
instrucción solo puede modificar los 4 bits inferiores de este registro y no puede borrar el bit 0. La imposibilidad de borrar el bit 0 significa que LMSW
puede se puede usar para ingresar pero no salir del modo protegido x86 . LMSW
ni con LOADALL
[3] ) sin reiniciar la CPU ; en 80386 y posteriores, es posible salir del modo protegido, pero esto requiere el uso de 80386-y -más tarde MOV
a la CR0
instrucción.CR4.UMIP=1
está configurado, las instrucciones SGDT
,,, y solo se pueden ejecutar 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. [4]SIDT
Este ha sido un problema de seguridad importante SLDT
para
el software -virtualización basada en, ya que permite que estas instrucciones sean utilizadas por una VM invitada para detectar que se está ejecutando dentro de una VM. [5] [6]SMSW
STR
SMSW
y siempre usan un tamaño SLDT
de STR
operando de 16 bits cuando se usan con un argumento de memoria. Con un argumento de registro en procesadores 80386 o posteriores, hay disponibles tamaños de operandos de destino más amplios y se comportan de la siguiente manera:SMSW
: Almacena CR0 completo en modo largo x86-64 , de lo contrario no está definido.SLDT
: Argumento de 16 bits con extensión cero en procesadores Pentium Pro y posteriores, indefinido en procesadores anteriores.STR
: Argumento de 16 bits que se extiende a cero.ARPL
63 /r
MOVSXD
ARPL
instrucció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 este #UD para usar el 63
có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. [7] [8]0x00FFFF00
.VERW
instrucción también vacía los búferes de datos de microarquitectura. Esto permite que se utilice como parte de soluciones alternativas para las vulnerabilidades de seguridad de muestreo de datos de microarquitectura . [10] [11]LOADALL
con un código de operación y diseño de memoria diferentes en 80386).El 80386 agregó soporte para operación 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 ; la mayoría de las formas de instrucción que anteriormente tomaban argumentos de datos de 16 bits tuvieron la capacidad de tomar argumentos de 32 bits configurando su OperandSize en 32. bits, y a las instrucciones que podían tomar argumentos de dirección de 16 bits se les dio la capacidad de tomar argumentos de dirección de 32 bits configurando su AddressSize en 32 bits. (Los formularios de instrucciones que funcionan con datos de 8 bits siguen siendo de 8 bits independientemente del OperandSize. El uso de un tamaño de datos de 16 bits provocará que solo se modifiquen los 16 bits inferiores de los registros de propósito general de 32 bits; los 16 superiores los bits no se modifican.)
El OperandSize y AddressSize predeterminados que se usarán para cada instrucción viene dado por el bit D del descriptor de segmento del segmento de código actual: D=0
ambos son de 16 bits y D=1
ambos de 32 bits. Además, se pueden anular por instrucción con dos nuevos prefijos de instrucción que se introdujeron en 80386:
66h
: Anulación de tamaño de operando. Cambiará OperandSize de 16 bits a 32 bits si CS.D=0
, o de 32 bits a 16 bits si CS.D=1
.67h
: Anulación del tamaño de dirección. Cambiará AddressSize de 16 bits a 32 bits si CS.D=0
, o de 32 bits a 16 bits si CS.D=1
.El 80386 también introdujo los dos nuevos registros de segmento FS
y los registros de control , depuración y prueba GS
x86 .
Las nuevas instrucciones introducidas en el 80386 se pueden subdividir en términos generales en dos clases:
CWDE
, LODSD
)SHLD
, SETcc
)Para formularios de instrucción donde el tamaño del operando se puede inferir a partir de los argumentos de la instrucción (por ejemplo, ADD EAX,EBX
se puede inferir que tiene un tamaño de operando de 32 bits debido al uso de EAX como argumento), no se necesitan ni se proporcionan nuevos mnemónicos de instrucción.
EFLAGS.DF=1
y se incrementa posteriormente en 4 en caso contrario. 67
prefijo.LODSD
, STOSD
, y , el MOVSD
prefijo ( ) repetirá la instrucción el número de veces especificado en rCX (CX o ECX, decidido por AddressSize), disminuyendo rCX para cada iteración (con rCX=0 dando como resultado no operativo 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.INSD
OUTSD
REP
F3
CMPSD
SCASD
REPE
F3
REPNE
F2
REPE
REPNE
INSB/W/D
instrucciones, es posible que los derechos de acceso a la memoria para la ES:[rDI]
dirección de la memoria no se verifiquen hasta después de que se haya realizado el acceso al puerto; si esta verificación falla (por ejemplo, falla de página u otra excepción de memoria), entonces el elemento de datos leído desde el puerto se pierde . Como tal, no se recomienda utilizar esta instrucción para acceder a un puerto de E/S que produzca algún tipo de efecto secundario tras la lectura.CWDE
instrucción difiere de la CWD
instrucción anterior en que CWD
extendería con signo el valor de 16 bits en AX a un valor de 32 bits en el par de registros DX:AX.E3
código de operación ( JCXZ
/ JECXZ
), la elección de si se usará la instrucción CX
o ECX
para su comparación (y, en consecuencia, qué mnemotécnico usar) se basa en AddressSize, no en OperandSize. (OperandSize en cambio controla si el destino del salto debe truncarse a 16 bits o no). 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 mnemotécnicos para sus variantes que usan ECX.PUSHA(D)
, el valor de SP/ESP insertado en la pila es el valor que tenía justo antes de que la PUSHA(D)
instrucción comenzara a ejecutarse.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.PUSHFD
y POPFD
causarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3. PUSHF
instrucciones POPF
, IRET
y IRETD
causarán una excepción #GP si se ejecutan en modo Virtual-8086 si IOPL no es 3 y VME no está habilitado .IRETD
se usa para regresar del modo kernel al modo usuario (lo que implicará un cambio de CPL) y el segmento de pila en modo usuario indicado por SS es un segmento de 16 bits, entonces la IRETD
instrucción solo restaurará los 16 bits inferiores de la pila. puntero (ESP/RSP), y los bits restantes conservan cualquier valor que tuvieran en el código del núcleo antes del archivo IRETD
. Esto ha requerido soluciones complejas tanto en Linux ("ESPFIX") [14] como en Windows. [15]IRETQ
Este problema también afecta a las instrucciones posteriores de 64 bits .BT
, BTS
y :BTR
BTC
BTS
instrucciones BTC
y BTR
aceptan el prefijo LOCK
( F0
) cuando se usan con un argumento de memoria; esto da como resultado que la instrucción se ejecute atómicamente.F3
prefijo se usa con el 0F BC /r
código de operación, la instrucción se ejecutará como TZCNT
en los sistemas que admiten la extensión BMI1. TZCNT
difiere de BSF
eso, TZCNT
pero no BSR
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.BSF
y BSR
establezca el indicador EFLAGS.ZF en 1 si el argumento fuente era todo 0 y 0 en caso contrario. F3
prefijo se usa con el 0F BD /r
código de operación, la instrucción se ejecutará como LZCNT
en sistemas que admiten las extensiones ABM o LZCNT. LZCNT
produce un resultado diferente al BSR
de la mayoría de los valores de entrada.SHLD
y 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. SHLD
y SHRD
con argumentos de 16 bits y una cantidad de desplazamiento mayor que 16 produce resultados indefinidos. (Los resultados reales difieren entre las diferentes CPU Intel, y se conocen al menos tres comportamientos diferentes. [16] )SETcc
Jcc near
0F 9x /0
0F 8x
SETcc
, si bien 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 SETcc
independientemente del contenido de estos bits.LFS
, el tamaño de la parte de desplazamiento del puntero lejano viene dado por el tamaño del operando; el tamaño de la parte del segmento es siempre de 16 bits. En el modo de 64 bits, el uso del prefijo con estas instrucciones hará que se cargue un puntero lejano con un desplazamiento de 64 bits en los procesadores Intel pero no en los procesadores AMD.LGS
LSS
REX.W
MOV
los registros y hacia/desde CRx
, la parte reg del byte ModR/M se utiliza para indicar el registro y la parte r/m el registro general. Exclusivamente para los códigos de operación, los dos bits superiores del byte ModR/M se ignoran; estos códigos de operación se decodifican y ejecutan como si los dos bits superiores del byte ModR/M fueran .DRx
TRx
CRx/DRx/TRx
MOV CRx/DRx/TRx
11b
CRx
y DRx
, el tamaño del operando es siempre de 64 bits en el modo de 64 bits y de 32 bits en caso contrario.CR0
no serializarían el flujo de instrucciones; en parte por esta razón, generalmente es necesario realizar un salto lejano inmediatamente después de a MOV
si CR0
se MOV
usa para habilitar/deshabilitar el modo protegido y/o la memoria . paginación . MOV
a CR2
está catalogado arquitectónicamente como serializado, pero se ha informado que no se serializa en al menos algunos procesadores Intel Core-i7. [17]MOV
a CR8
(introducido con x86-64) no se serializa.MOV TRx
instrucciones se suspendieron a partir del Pentium.INT1
/ ICEBP
( F1
) está presente en todos los procesadores Intel x86 conocidos desde 80386 en adelante, [18] pero solo está completamente documentada para los procesadores Intel desde la versión de mayo de 2018 de Intel SDM (rev 067) en adelante. [19] Antes de esta publicación, la mención de la instrucción en material de Intel era esporádica, por ejemplo, AP-526 rev 001. [20]F1
( ICEBP
) difiere del funcionamiento del código de operación de interrupción de software normal CD 01
en varios aspectos:CD 01
comparará CPL con el campo DPL del descriptor de interrupción como una verificación de derechos de acceso, mientras que F1
no lo hará.CD 01
también comparará CPL con IOPL como verificación de derechos de acceso, mientras que F1
no lo hará.CD 01
pero no F1
.XBTS
y IBTS
se suspendieron con el paso B1 de 80386. XBTS
instrucción. como parte de su detección de CPU si CPUID
no está presente y se negará a arrancar si XBTS
se encuentra que está funcionando. [23]XBTS
y IBTS
, el argumento r/m representa los datos para extraer/insertar un campo de bits desde/hacia, el argumento reg el campo de bits que se insertará/extraerá, AX/EAX un desplazamiento de bits y CL una longitud de campo de bits. [24]BSWAP
con 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, [26] 586, y Bochs / QEMU . [27]CMPXCHG
instrucción utiliza una codificación diferente: 0F A6 /r
para la variante de 8 bits, 0F A7 /r
para la variante de 16/32 bits. Las 0F B0/B1
codificaciones se utilizan en 80486 paso B y posteriores. [29] [30]CMPXCHG
instrucción se establece EFLAGS
de la misma manera que una CMP
instrucción que usa el acumulador (AL/AX/EAX/RAX) como lo haría su primer argumento.INVLPG
se ejecuta como sin operación si el argumento m8 no es válido (por ejemplo, una página no asignada o una dirección no canónica). INVLPG
se puede utilizar para invalidar entradas TLB para páginas globales individuales.INVD
y WBINVD
invalidarán todas las líneas de caché en las cachés L1 de la CPU. Está definido por la implementación si también invalidarán las cachés L2/L3. INVD
instrucción no está permitida y provocará una excepción #GP(0). (El PRM es necesario para Intel SGX). [31]F3
prefijo se usa con el 0F 09
código de operación, la instrucción se ejecutará como WBNOINVD
en los procesadores que admiten la extensión WBNOINVD; esto no invalidará el caché.Instrucciones de entero/sistema que no estaban presentes en el conjunto de instrucciones básico 80486, pero que se agregaron en varios procesadores x86 antes de la introducción de SSE. ( Las instrucciones descontinuadas no están incluidas).
WRMSR
instrucció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 MSR 79h
en CPU Intel y MSR C001_0020h
[33] en CPU AMD.RSM
instrucciones estuvieron disponibles en variantes que no son SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993.CPUID
con un índice de hoja (EAX) mayor que 0 puede dejar EBX y ECX sin modificar, manteniendo sus valores anteriores. Por este motivo, se recomienda poner a cero EBX y ECX antes de ejecutar CPUID
. CPUID
establecerá los 32 bits superiores de RAX, RBX, RCX y RDX en cero.CPUID
al anillo 0. Dichos MSR están documentados al menos para Ivy Bridge [41] y Denverton. [42]CPUID
al anillo 0 también existe en los procesadores AMD que admiten la función "CpuidUserDis" ( Zen 4 "Raphael" y posteriores). [43]CPUID
también está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium.CPUID
no está habilitado de forma predeterminada y debe habilitarse a través de un registro de configuración de Cyrix.CPUID
solo es compatible con algunos BIOS del sistema. En algunas CPU NexGen que sí admiten CPUID
, EFLAGS.ID no es compatible pero sí EFLAGS.AC, lo que complica la detección de la CPU. [44]CMPXCHG
, la CMPXCHG8B
instrucción no modifica ningún bit EFLAGS que no sea ZF.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 ).CMPXCHG8B
instrucción siempre es compatible, sin embargo, es posible que falte su bit CPUID. Esta es una solución para un error en Windows NT. [45]RDTSC
y RDPMC
no están ordenadas con respecto a otras instrucciones y pueden probar 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 RDTSC
) se pueden reordenar entre sí incluso para lecturas del mismo contador. LFENCE
instrucciones de serialización (p. ej. ). [46]CPUID
8000_0007:EDX[8]
).RDTSC
se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0
. RDTSC
no se puede ejecutar en modo Virtual-8086. [50] Los procesadores posteriores eliminaron esta restricción.RDPMC
se puede ejecutar fuera del anillo 0 solo si CR4.PCE=1
.RDPMC
instrucción no está presente en los procesadores VIA anteriores al Nano.CMOVcc
0F 4x /r
CMOVcc
con 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. CMOVcc
de un operando de origen de memoria, la CPU siempre leerá el operando de la memoria, lo que podría provocar excepciones de memoria y rellenos de líneas de caché, incluso si no se cumple la condición para el movimiento. (La extensión Intel APX define una variante codificada en EVEXCMOVcc
que suprimirá las excepciones de memoria si la condición es falsa).0F 1F /0
Mientras, NOP se introdujo en el Pentium Pro, pero permaneció sin documentar hasta 2006. [52]
Toda la 0F 18..1F
gama de códigos de operación estaba NOP
en Pentium Pro. Sin embargo, a excepción de 0F 1F /0
, Intel no garantiza que estos códigos de operación permanecerán NOP
en procesadores futuros y, de hecho, ha asignado algunos de estos códigos de operación a otras instrucciones en al menos algunos procesadores. [53]0F 0B
código de operación se reservó oficialmente como código de operación no válido desde Pentium en adelante, solo se le asignó el mnemotécnico UD2
desde Pentium Pro en adelante. [55]UD2A
y UD2B
para los códigos de operación 0F 0B
y 0F B9
desde la versión 2.7. [56]UD2A
ni UD2B
originalmente tomó ningún argumento; UD2B
luego se modificó para aceptar un byte ModR/M , en la versión 2.30 de Binutils. [57]0F 0B
y 0F B9
- 0F FF
provocarán una excepción #UD en todos los procesadores x86 desde 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. .0F B9
có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ó su mnemotécnico UD1
mucho más tarde: AMD APM comenzó a incluirlo UD1
en sus mapas de códigos de operación desde la rev 3.17 en adelante, [59] mientras que Intel SDM comenzó a incluirlo desde la rev 061 en adelante. . [60]0F B9
como 0F FF
, se sabe que las diferentes implementaciones x86 difieren con respecto a si los códigos de operación aceptan un byte ModR/M . [61] [62]0F FF
código de operación, OIO
Cyrix introdujo el mnemónico, [63]UD0
mientras que AMD e Intel introdujeron el mnemónico (sin argumentos) al mismo tiempo que el UD1
mnemónico para 0F B9
. [59] [60] La documentación posterior de Intel (pero no de AMD) modificó su descripción para UD0
agregar un byte ModR/M y tomar dos argumentos. [64]SYSCALL
/ SYSRET
estaban disponibles en el Modelo 7 (250 nm "Little Foot") y posteriores, no en el Modelo 6 anterior. [66]SYSCALL
y SYSRET
se 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. SYSRET
difiere ligeramente entre los procesadores AMD e Intel: las direcciones de retorno no canónicas provocan que se genere 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. [67]SYSRET
y SYSEXIT
en x86-64, es necesario agregar el REX.W
prefijo para las variantes que volverán al código de modo de usuario de 64 bits. REX.W
prefijo 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).SYSRET
no están disponibles en modo Real . ( Sin embargo, está disponible en modo Virtual 8086 ).SYSENTER
SYSEXIT
SYSENTER
CPUID
banderas que indican soporte para SYSENTER
/ SYSEXIT
están configuradas en el Pentium Pro, aunque el procesador no admite oficialmente estas instrucciones. [68]SYSENTER
y SYSEXIT
no están disponibles en el modo largo x86-64 (#UD).SYSENTER
y SYSEXIT
solo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [71]SYSENTER
y SYSEXIT
están disponibles solo en el paso 8 y posteriores. [72]Estas instrucciones sólo se pueden codificar en modo de 64 bits. Se dividen en cuatro grupos:
MOVSXD
reemplazar ARPL
)SWAPGS
)JRCXZ
)La mayoría de las instrucciones con un tamaño de operando de 64 bits lo codifican mediante un REX.W
prefijo; en ausencia del REX.W
prefijo, 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 otras instrucciones con un tamaño de operando de 32 bits. Estos no se enumeran aquí porque no obtienen una nueva mnemónica en la sintaxis de Intel cuando se usan con un tamaño de operando de 64 bits.
CMPXCHG16B
debe estar alineado con 16 bytes.CMPXCHG16B
instrucción estaba ausente en algunos de los primeros procesadores Intel/AMD x86-64. En los procesadores Intel, faltaba la instrucción en el paso D de Xeon "Nocona" , [73] pero se agregó en el paso E. [74] En los procesadores de la familia AMD K8 , se agregó en el paso F, al mismo tiempo que se introdujo el soporte DDR2. . [75]CMPXCHG16B
tiene su propio indicador CPUID, separado del resto de x86-64.MOVSXD
MOV
8B /r
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, controlado por el bit VEX.W; ninguna de estas instrucciones está disponible en variantes de 16 bits.
POPCNT
y LZCNT
. Sin embargo, en las CPU Intel, el bit CPUID para "ABM" solo está documentado para indicar la presencia de la LZCNT
instrucción y aparece como "LZCNT", mientras que POPCNT
tiene su propio bit de característica CPUID independiente. POPCNT
y configuran el bit de característica CPUID para POPCNT, por lo que la distinción es sólo teórica. POPCNT
ABM pero no, como Intel Nehalem y VIA Nano 3000).LZCNT
instrucción se ejecutará como BSR
en sistemas que no admiten las extensiones LZCNT o ABM. BSR
calcula el índice del bit establecido más alto en el operando de origen, produciendo un resultado diferente al LZCNT
de la mayoría de los valores de entrada.TZCNT
instrucción se ejecutará como BSF
en sistemas que no admiten la extensión BMI1. BSF
produce el mismo resultado que TZCNT
para todos los valores de operando de entrada excepto cero, para el cual TZCNT
devuelve el tamaño del operando de entrada, pero BSF
produce un comportamiento indefinido (deja el destino sin modificar en la mayoría de las CPU modernas).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/m
argumento (que tiene el tamaño de operando habitual de 32/64 bits), entonces los bits sobrantes se leer como 0.PEXT
y PDEP
son bastante lentas [77] y exhiben una sincronizació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 la máscara) . Como resultado, suele ser más rápido utilizar otras secuencias de instrucciones en estos procesadores. [78] [79]Intel CET (Tecnología Control-Flow Enforcement) agrega dos características distintas para ayudar a proteger contra vulnerabilidades de seguridad, como la programación orientada al retorno : una pila oculta (CET_SS) y un seguimiento de rama indirecta (CET_IBT).
RDSSPD
y RDSSPQ
actúan como NOP en procesadores donde las pilas ocultas están deshabilitadas o no se admite CET.ENDBR32
y ENDBR64
actúan como NOP en procesadores que no admiten CET_IBT o donde IBT está deshabilitado.PREFETCH*
instrucciones son instrucciones de sugerencias con efectos solo en el rendimiento, no en la semántica del programa. Proporcionar una dirección no válida (por ejemplo, la dirección de una página no asignada o una dirección no canónica) hará que la instrucción actúe como un NOP sin que se genere ninguna excepción.SFENCE
instrucciones LFENCE
y MFENCE
, los 3 bits inferiores del byte ModR/M se ignoran y cualquier valor de x en el rango 0..7 dará como resultado una instrucción válida.SFENCE
instrucción garantiza que todos los almacenes de memoria posteriores a la SFENCE
instrucción se hagan observables globalmente después de todos los almacenes de memoria anteriores a SFENCE
. Esto impone el orden en los almacenes que de otro modo podrían reordenarse, como los almacenes no temporales y los almacenes en regiones de memoria WC (combinación de escritura). [84]SFENCE
también actúa como una barrera de reordenamiento en los vaciados/escrituras de caché realizados con las instrucciones CLFLUSH
, CLFLUSHOPT
y CLWB
. (Las CPU AMD más antiguas requieren MFENCE
ordenar CLFLUSH
.) SFENCE
no está ordenado con respecto a LFENCE
, y una SFENCE+LFENCE
secuencia no es suficiente para evitar que una carga se reordene más allá de un almacén anterior. [85] Para evitar tal reordenamiento, es necesario ejecutar una instrucción de serialización MFENCE
.LOCK
LFENCE
instrucción garantiza que todas las cargas de memoria posteriores a la LFENCE
instrucción se hagan observables globalmente después de todas las cargas de memoria anteriores a LFENCE
. LFENCE
instrucción proporciona una garantía de pedido más sólida: [86] es Dispatch-serializing , lo que significa que las instrucciones posteriores a la LFENCE
instrucción pueden comenzar a ejecutarse solo después de que se hayan retirado todas las instrucciones anteriores (lo que garantizará que todas cargas anteriores pero no necesariamente las tiendas se han completado). El efecto de la serialización de envío es que LFENCE
tambié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 contadores de rendimiento (a los que se accede a través de, por ejemplo, RDTSC
o RDPMC
) y MSR x2apic . LFENCE
no es necesariamente la serialización de envío de forma predeterminada; sin embargo, en todas las CPU AMD que admiten cualquier forma de serialización sin envío LFENCE
, se puede realizar la serialización de envío configurando el bit 1 de MSR C001_1029
. [87]MFENCE
instrucción garantiza que todas las cargas de memoria, almacenes y vaciados de líneas de caché después de la MFENCE
instrucción se hagan globalmente observables después de todas las cargas de memoria, almacenes y vaciados de líneas de caché antes del MFENCE
. MFENCE
es una serialización de envío y, por lo tanto, no se puede utilizar para imponer orden en los accesos a recursos que no son de memoria, como contadores de rendimiento y MSR x2apic. todavía está ordenado con respecto a , por lo que si se necesita una barrera de memoria con serialización de envío, se puede obtener emitiendo un seguido de un . [46] En las CPU AMD, se está serializando.MFENCE
LFENCE
MFENCE
LFENCE
MFENCE
PAUSE
instrucción en modo de 64 bits, a diferencia de NOP
, no se ve afectado por la presencia del REX.R
prefijo. Ni NOP
ni PAUSE
se ven afectados por los demás bits del REX
prefijo. Algunos ejemplos de código de operación 90
con varios prefijos en modo de 64 bits son:90
esNOP
41 90
esXCHG R8D,EAX
4E 90
esNOP
49 90
esXCHG R8,RAX
F3 90
esPAUSE
F3 41 90
esPAUSE
F3 4F 90
esPAUSE
PAUSE
instrucción depende de la implementación. PAUSE
se ejecutará como NOP.PAUSE
muchas veces en un intervalo de tiempo corto puede provocar un #VMEXIT. El número de PAUSE
ejecuciones y la duración del intervalo que pueden activar #VMEXIT son específicos de la plataforma.CLFLUSH
instrucción se introdujo junto con SSE2, tiene su propio indicador CPUID y puede estar presente en procesadores que no implementan SSE2 y/o ausente en procesadores que implementan SSE2. (Por ejemplo, AMD Geode LX es compatible CLFLUSH
pero no SSE2).MONITOR
y MWAIT
se introdujeron al mismo tiempo que SSE3, tienen su propio indicador CPUID que debe verificarse por separado del indicador CPUID SSE3 (por ejemplo, Athlon64 X2 y VIA C7 admitían SSE3 pero no MONITOR).MONITOR
y MWAIT
, la documentación anterior de Intel [88] enumera mnemotécnicos de instrucciones con operandos explícitos ( MONITOR EAX,ECX,EDX
y MWAIT EAX,ECX
), mientras que la documentación más nueva omite estos operandos. Los ensambladores/desensambladores pueden admitir una o ambas variantes. [89] MONITOR
, el segmento DS: se puede anular con un prefijo de segmento. MONITOR
instrucción. Como tal, la instrucción requiere ECX=0 e ignora EDX.MONITOR
y MWAIT
ejecutar en Ring 3.MWAIT
puede finalizar mediante eventos del sistema distintos de una escritura en la memoria (por ejemplo, desalojos de línea de caché, interrupciones); el conjunto exacto de eventos que pueden causar que finalice la espera es específico de la implementación. MONITOR
antes de realizar más MWAIT
mensajes.MWAIT
en el registro ECX son:MWAIT
en el 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 ACPI .
GETSEC
instrucción, el REX.W
prefijo 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.GETSEC
(seleccionadas por EAX) son:Cualquier valor no admitido en EAX provoca una excepción #UD.
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.XGETBV
se permite la ejecución con ECX=1; esto no devolverá XCR1
(no existe tal registro), sino que devolverá XCR0
bit a bit con AND con el valor actual del estado "XINUSE". mapa de bits del componente (un mapa de bits de componentes de estado XSAVE que no se sabe que estén en su estado inicial). XGETBV
se indica mediante CPUID . (EAX=0Dh,ECX=1):EAX[bit 2].RDTSCP
y RDPID
es en realidad el TSC_AUX
MSR (MSR C000_0103h
). Si este valor corresponde realmente a una ID de procesador es una cuestión de convención del sistema operativo.RDTSC
RDTSCP
RDTSCP
RDTSCP
se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0
.RDTSCP
en el paso F de AMD K8 y no está disponible en pasos anteriores.POPCNT
instrucción se introdujo al mismo tiempo que SSE4.2, no se considera parte de SSE4.2, sino una extensión separada con su propio indicador CPUID. INVPCID
(seleccionados por argumento de registro) son:Cualquier valor no admitido en el argumento de registro provoca una excepción #GP.
INVLPG
, INVPCID
provocará una excepción #GP si la dirección de memoria proporcionada no es canónica. Se sabe que esta discrepancia causa problemas de seguridad. [94]PREFETCH
y PREFETCHW
son partes obligatorias de 3DNow! extensión del conjunto de instrucciones, pero también están disponibles como una extensión independiente en sistemas que no son compatibles con 3DNow!PREFETCH
y PREFETCHW
( 0F 0D /r
) se ejecutan como NOP en CPU Intel desde Cedar Mill ( Pentium 4 de 65 nm ) en adelante, y PREFETCHW
obtienen funcionalidad de captación previa desde Broadwell en adelante.PREFETCH
( 0F 0D /0
) es 3DNow! Instrucción, presente en todos los procesadores con 3DNow! pero no necesariamente en procesadores con la extensión PREFETCHW. 0F 0D /0
como los códigos de operación 0F 0D /2../7
realizan una captación previa. 0F 0D /2
en PREFETCHWT1 m8
Xeon Phi únicamente); las pruebas de terceros [96] indican que algunos o todos estos códigos de operación pueden estar realizando una búsqueda previa en al menos algunos Intel. CPU centrales.RDTSCP
que también se puede usar para leer la ID del procesador, el modo de usuario RDPID
no está deshabilitado por CR4.TSD=1
.WBNOINVD
instrucción se ejecutará como WBINVD
si se ejecutara en un sistema que no admite la extensión WBNOINVD. WBINVD
difiere de WBNOINVD
que WBINVD
invalidará todas las líneas de caché después de la reescritura.ENCLS
(seleccionadas por EAX) son:Cualquier valor no admitido en EAX provoca una excepción #GP.
ENCLU
(seleccionadas por EAX) son:Cualquier valor no admitido en EAX provoca una excepción #GP.
Las funciones ENTER y ERESUME no se pueden ejecutar dentro de un enclave SGX; las otras funciones solo se pueden ejecutar dentro de un enclave.
ENCLU
solo se puede ejecutar en el anillo 3, no en los anillos 0/1/2.ENCLV
(seleccionadas por EAX) son:Cualquier valor no admitido en EAX provoca una excepción #GP.
La ENCLV
instrucción solo está presente en sistemas que admiten Extensiones de sobresuscripción EPC a SGX ("OVERSUB").
ENCLV
solo está disponible si la operación Intel VMX está habilitada con VMXON
y, de lo contrario, producirá #UD.PTWRITE
, la escritura en el paquete de seguimiento del procesador solo se producirá si un conjunto de bits de habilitación (los bits "TriggerEn", "ContextEn", "FilterEn" del RTIT_STATUS
MSR y el bit "PTWEn" del RTIT_CTL
MSR) están todos configurados. a 1. PTWRITE
instrucción está indicada en el SDM para provocar una excepción #UD si se utiliza el prefijo de instrucción 66h, independientemente de otros prefijos.MOVDIR64
, la dirección de destino proporcionada por ES:reg debe estar alineada con 64 bytes. 67h
prefijo. PCONFIG
(seleccionadas por EAX) son:Cualquier valor no admitido en EAX provoca una excepción #GP(0).
CLDEMOTE
, el nivel de caché al que degradará una línea de caché depende de la implementación. UMONITOR
, el tamaño del operando del argumento de dirección viene dado por el tamaño de la dirección, que puede ser anulado por el 67h
prefijo. El segmento predeterminado utilizado es DS:, que se puede anular con un prefijo de segmento.UMWAIT
, el sistema operativo puede usar MSR para limitar la cantidad máxima de tiempo que se permite esperar IA32_UMWAIT_CONTROL
una única invocación. UMWAIT
La UMWAIT
instrucción se establecerá RFLAGS.CF
en 1 si alcanzó el IA32_UMWAIT_CONTROL
límite de tiempo definido y en 0 en caso contrario.TPAUSE
y UMWAIT
se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0
.CPUID
y IRET
, estas instrucciones realizan funciones adicionales, lo que provoca efectos secundarios y un rendimiento reducido cuando se necesita la serialización de instrucciones independientes. ( CPUID
Además, tiene el problema de que provoca un #VMEXIT obligatorio cuando se ejecuta en virtualización, lo que provoca una sobrecarga muy grande). La SERIALIZE
instrucción realiza solo serialización, evitando estos costos adicionales.HRESET
SENDUIPI
es un índice para seleccionar una entrada de la UITT (tabla de destino de interrupción de usuario, una tabla especificada por los nuevos UINTR_TT
y UINT_MISC
MSR ) .REX.R
prefijo, por ejemplo 44 0F 20 07
( MOV RDI,CR8
). Sin embargo, el REX.R
prefijo sólo está disponible en modo de 64 bits. F0
( LOCK
) en lugar de REX.R
; esto proporciona acceso a CR8 fuera del modo de 64 bits.11b
. LOCK
prefijo con el REX.R
prefijo y provocará una excepción #UD.CLZERO
, el tamaño de la dirección y el prefijo 67h controlan si se utiliza AX, EAX o RAX como dirección. El segmento predeterminado DS: se puede anular mediante un prefijo de anulación de segmento. No es necesario alinear la dirección proporcionada: el hardware la alineará según sea necesario. CLZERO
instrucción está destinada a la recuperación de errores de Machine Check que de otro modo serían fatales. No se puede almacenar en caché, no se puede utilizar para asignar una línea de caché sin acceso a la memoria y no se debe utilizar para borrar la memoria rápidamente. [105]RDPRU
no coincide necesariamente con la de RDMSR
/ WRMSR
. RDPRU
diciembre de 2022 son:Los valores no admitidos en ECX devuelven 0.
CR4.TSD=1
, entonces la RDPRU
instrucción solo puede ejecutarse en el anillo 0.El coprocesador x87 , si está presente, proporciona soporte para aritmética de punto flotante. El coprocesador proporciona ocho registros de datos, cada uno con un valor de punto flotante de 80 bits (1 bit de signo, 15 bits de exponente, 64 bits de mantisa); estos registros están organizados como una pila, y el registro de la parte superior de la pila se denomina "st" o "st(0)", y los demás registros denominados st(1),st(2),...st(7). Además, proporciona una serie de registros de control y estado, incluido "PC" (control de precisión, para controlar si las operaciones de punto flotante deben redondearse a 24, 53 o 64 bits de mantisa) y "RC" (control de redondeo, para seleccionar el redondeo). modo: redondeo a cero, redondeo a infinito positivo, redondeo a infinito negativo, redondeo a par más cercano) y un registro de código de condición de 4 bits "CC", cuyos cuatro bits están referidos individualmente como C0, C1, C2 y C3). No todas las instrucciones aritméticas proporcionadas por x87 obedecen a PC y RC.
WAIT
se ejecute el siguiente x87, MMX o instrucción. FN
, existe una pseudoinstrucción que tiene el mismo mnemotécnico excepto sin la N. Estas pseudoinstrucciones constan de una WAIT
instrucción (código de operación 9B
) seguida de la correspondiente instrucción x87 que no espera. Por ejemplo:FNCLEX
es una instrucción con el código de operación DB E2
. La pseudoinstrucción correspondiente FCLEX
se codifica entonces como 9B DB E2
.FNSAVE ES:[BX+6]
es una instrucción con el código de operación 26 DD 77 06
. La pseudoinstrucción correspondiente FSAVE ES:[BX+6]
se codifica entonces como9B 26 DD 77 06
FLDENV
, F(N)STENV
y existen en variantes FRSTOR
de F(N)SAVE
16 y 32 bits. Las variantes de 16 bits cargarán/almacenarán una estructura de datos de entorno de punto flotante de 14 bytes hacia/desde la memoria; las variantes de 32 bits cargarán/almacenarán una estructura de datos de 28 bytes. ( F(N)SAVE
/ FRSTOR
cargará/almacenará adicionalmente 80 bytes adicionales de contenido del registro de datos de FPU después del entorno de FPU, para un total de 94 o 108 bytes). La elección entre las variantes de 16 y 32 bits se basa en el CS.D
bit y en la presencia del 66h
prefijo de instrucción. En 8087 y 80287, sólo están disponibles las variantes de 16 bits. REX.W
en x86-64 hará que se utilicen las variantes de 32 bits. Dado que estos solo pueden cargar/almacenar los 32 bits inferiores de FIP y FDP, se recomienda utilizar FXSAVE64
/ FXRSTOR64
en su lugar si se desea una operación de 64 bits.F(N)DISI
y F(N)ENI
para configurar/borrar el bit de máscara de interrupción (bit 7) de la palabra de control x87, [108] para controlar la interrupción. F(N)ENI
y F(N)DISI
se mantuvieron para compatibilidad con versiones anteriores, ejecutándose como NOP que no modifican ningún estado de x87.FST
/ FSTP
con un destino de 80 bits (m80 o st(i)) y un valor de origen sNaN producirá excepciones en las FPU de AMD pero no en las de Intel.FSTP ST(0)
es un modismo comúnmente utilizado para extraer un solo registro de la pila de registros x87.FBSTP
y las instrucciones de carga constante siempre utilizan el modo de redondeo de redondeo al más cercano. En las FPU x87 80387 y posteriores, estas instrucciones utilizarán el modo de redondeo especificado en el registro RC x87.FADDP
, FSUBP
, FSUBRP
, FMULP
, FDIVP
, FDIVRP
, y , los FCOM
ensambladores /desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Estas variantes son equivalentes a variantes que utilizan st(1) como primer argumento.FCOMP
FXCH
FXCH
se implementa como un cambio de nombre de registro en lugar de un verdadero movimiento de datos. Esto no tiene ningún efecto semántico, pero permite el funcionamiento con latencia de ciclo cero. También permite que la instrucción rompa las dependencias de datos para el valor superior de la pila x87, mejorando el rendimiento alcanzable para el código optimizado para estos procesadores.FBLD
instrucción en datos que no son BCD no está definido.FPREM
y FPATAN
. [115]FXAM
instrucción establecerá C0, C2 y C3 según el tipo de valor en st(0) de la siguiente manera:C1 se establece en el bit de signo de st(0), independientemente de si st(0) está vacío o no.
FXTRACT
, si st(0) es cero o ±∞, entonces M se iguala a st(0). Si st(0) es cero, E se establece en 0 en 8087/80287 pero -∞ en 80387 y posteriores. Si st(0) es ±∞, entonces E se establece en +∞.FPREM
, si el cociente Q es mayor que , es posible que el cálculo del resto se haya realizado solo parcialmente; en este caso, será necesario ejecutar la instrucción nuevamente para completar el cálculo del resto. Esto se indica mediante la configuración de la instrucción en 1. Si la instrucción completó el cálculo del resto, se establecerá en 0 y establecerá los tres bits en los tres bits inferiores del cociente Q. En 80387 y posteriores, si la instrucción no completó el cálculo del resto, entonces el resto calculado Q utilizado para la reducción de argumentos se habrá redondeado a un múltiplo de 8 (o una potencia de 2 mayor), de modo que los 3 bits inferiores del cociente aún se puede recuperar correctamente en una pasada posterior que complete el cálculo del resto.FPREM
C2
C2
{C0,C3,C1}
FPREM
instrucción es siempre exacto y sin errores de redondeo.FSCALE
instrucciones sobre 8087 y 80287, se requiere que st(1) esté en el rango . Además, su valor absoluto debe ser 0 o al menos 1. Si no se cumplen estos requisitos, el resultado no está definido. Estas restricciones fueron eliminadas en el 80387.FSCALE
, el redondeo solo se aplica en caso de desbordamiento, desbordamiento insuficiente o resultado subnormal.FYL2X
y FYL2XP1
, el límite de error máximo de ±1 ulp solo es válido para st(1)=1,0; para otros valores de st(1), el límite de error aumenta a ±1,35 ulps.FPATAN
, se realizan los siguientes ajustes en comparación con simplemente calcular un arcotangente de la relación de un argumento :FNOP
es una operación no operativa en el sentido de que dejará la pila de registros de FPU x87 sin modificar, aún puede modificar FIP y CC, y puede fallar si hay una excepción pendiente de FPU x87.F(N)SAVE
, y tiene diferentes formatos en modo real y en modo protegido FRSTOR
. En 80287, se requiere la instrucción para comunicar la transición del modo real al protegido a la FPU. En las FPU 80387 y posteriores x87, las transiciones de modo real↔protegido se comunican automáticamente a la FPU sin necesidad de instrucciones dedicadas; por lo tanto, en estas FPU, se ejecuta como un NOP que no modifica ningún estado de la FPU.FLDENV
F(N)STENV
F(N)SETPM
FNSETPM
FUCOM
y FUCOMP
, los ensambladores/desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Estas variantes son equivalentes a variantes que utilizan st(1) como primer argumento.FPREM1
instrucción 80387 se diferencia de la instrucción anterior FPREM
( D9 F8
) en que el cociente Q se redondea a un número entero con redondeo al par más cercano en lugar del redondeo a cero utilizado por FPREM
. Al igual que FPREM
, FPREM1
siempre calcula un resultado exacto sin errores de redondeo. Al igual que FPREM
, también puede realizar un cálculo parcial si el cociente es demasiado grande, en cuyo caso debe ejecutarse nuevamente.FSIN
FCOS
FSINCOS
FPTAN
instrucción.FCOMI
, y escriben sus resultados en los FCOMIP
bits y del registro . En los procesadores Intel, pero no en los AMD , estas instrucciones también ponen a cero los bits , y de .FUCOMI
FUCOMIP
ZF
CF
PF
EFLAGS
SF
AF
OF
EFLAGS
FXSAVE
y FXRSTOR
se agregaron en la revisión "Deschutes" del Pentium II y no están presentes en la revisión anterior "Klamath". FXSAVE
y FXRSTOR
guardarán/restaurarán el estado de SSE solo en procesadores que admitan SSE. De lo contrario, solo guardarán/restaurarán el estado x87 y MMX. FXSAVE
/ tiene un diseño completamente diferente a la estructura de datos de las instrucciones / FXRSTOR
anteriores , lo que permite guardar/restaurar más rápido al evitar cargas y almacenamientos desalineados.F(N)SAVE
FRSTOR
CR0.EM=1
y se consideran instrucciones x87 y, en consecuencia, producirán una FXSAVE(64)
excepción #NM (dispositivo no disponible). Aparte de , estos son los únicos códigos de operación fuera del espacio de códigos de operación ESC que exhiben este comportamiento. (Todos los códigos de operación producirán #NM si , incluso los códigos de operación no definidos que producirían #UD de lo contrario).FXRSTOR(64)
WAIT
D8..DF
D8..DF
CR0.EM=1
F(N)SAVE
FXSAVE
Las instrucciones MMX operan en registros mm, que tienen 64 bits de ancho. Se comparten con los registros de la FPU.
Agregado con Pentium MMX
Las siguientes instrucciones MMX se agregaron con SSE. También están disponibles en el Athlon con el nombre MMX+.
Las siguientes instrucciones MMX se agregaron con SSE2:
Agregado con Pentium III
Las instrucciones SSE operan en registros xmm, que tienen 128 bits de ancho.
SSE consta de las siguientes instrucciones de punto flotante SSE SIMD:
Agregado con Pentium 4
SSE2 permite la ejecución de instrucciones MMX en registros SSE, procesando el doble de datos a la vez.
Las siguientes instrucciones se pueden utilizar sólo en registros SSE, ya que por su naturaleza no funcionan en registros MMX.
Agregado con Pentium 4 compatible con SSE3
Agregado con la serie Xeon 5100 y Core 2 inicial
Las siguientes instrucciones similares a MMX extendidas a los registros SSE se agregaron con SSSE3
Añadido con Core 2 fabricado en 45nm
Agregado con procesadores Phenom
Agregado con procesadores Nehalem
Conversión de coma flotante de media precisión.
AVX fue compatible por primera vez con Intel con Sandy Bridge y con AMD con Bulldozer .
Operaciones vectoriales en registros de 256 bits.
Introducido en la microarquitectura Haswell de Intel y Excavator de AMD .
Ampliación de la mayoría de las instrucciones SSE y AVX de enteros vectoriales a 256 bits
Las instrucciones de suma múltiple fusionadas de punto flotante se introducen en x86 como dos extensiones de conjunto de instrucciones, "FMA3" y "FMA4", las cuales se basan en AVX para proporcionar un conjunto de instrucciones escalares/vectoriales utilizando xmm/ymm/zmm. registros vectoriales. FMA3 define un conjunto de instrucciones de suma y multiplicación fusionadas de 3 operandos que toman tres operandos de entrada y escriben su resultado en el primero de ellos. FMA4 define un conjunto de instrucciones de suma multiplicada fusionada de 4 operandos que toman cuatro operandos de entrada: un operando de destino y tres operandos de origen.
FMA3 es compatible con CPU Intel que comienzan con Haswell , CPU AMD que comienzan con Piledriver y CPU Zhaoxin que comienzan con YongFeng. FMA4 solo era compatible con las CPU AMD Family 15h (Bulldozer) y se abandonó a partir de AMD Zen . Las extensiones FMA3/FMA4 no se consideran una parte intrínseca de AVX o AVX2, aunque todos los procesadores Intel y AMD (pero no Zhaoxin) que admiten AVX2 también admiten FMA3. Sin embargo, las instrucciones FMA3 (en formato codificado en EVEX) son instrucciones básicas AVX-512 .
Los conjuntos de instrucciones FMA3 y FMA4 definen un conjunto de 10 operaciones de suma-multiplicación fusionada, todas disponibles en variantes FP32 y FP64. Para cada una de estas variantes, FMA3 define tres ordenamientos de operandos mientras que FMA4 define dos.
Codificación FMA3
Las instrucciones FMA3 están codificadas con los prefijos VEX o EVEX , en el formato o . El bit VEX.W/EVEX.W selecciona el formato de punto flotante (W=0 significa FP32 , W=1 significa FP64 ). El byte del código de operación consta de dos cuartetos, donde el cuarteto superior selecciona el orden de los operandos ( ='132', ='213', ='231') y el cuarteto inferior (valores 6..F) selecciona cuál de los 10 fusionados. operaciones de multiplicación y suma a realizar. ( y fuera de los rangos dados dará como resultado algo que no es una instrucción FMA3).
En el nivel del lenguaje ensamblador, el orden de los operandos se especifica en el mnemotécnico de la instrucción:VEX.66.0F38 xy /r
EVEX.66.0F38 xy /r
xy
x
9
A
B
y
x
y
vfmadd132sd xmm1,xmm2,xmm3
llevará a caboxmm1 ← (xmm1*xmm3)+xmm2
vfmadd213sd xmm1,xmm2,xmm3
llevará a caboxmm1 ← (xmm2*xmm1)+xmm3
vfmadd231sd xmm1,xmm2,xmm3
llevará a caboxmm1 ← (xmm2*xmm3)+xmm1
Para todas las variantes de FMA3, los dos primeros argumentos deben ser argumentos de registro vectorial xmm/ymm/zmm, mientras que el último argumento puede ser un registro vectorial o un argumento de memoria. Según AVX-512, las variantes codificadas con EVEX admiten transmisiones, máscaras operativas y controles de redondeo codificados con prefijo EVEX.
La extensión AVX512-FP16, introducida en Sapphire Rapids , agrega variantes FP16 de las instrucciones FMA3; todas ellas toman la forma con el byte de código de operación que funciona de la misma manera que para las variantes FP32/FP64. (Para las instrucciones FMA4, no se definen variantes de FP16). Codificación FMA4
Las instrucciones FMA4 están codificadas con el prefijo VEX en el formulario (no se definen codificaciones EVEX). El byte del código de operación utiliza su bit inferior para seleccionar el formato de punto flotante (0=FP32, 1=FP64) y los bits restantes para seleccionar una de las 10 operaciones de suma y multiplicación fusionadas a realizar.EVEX.66.MAP6.W0 xy /r
VEX.66.0F3A xx /r ib
xx
Para FMA4, el orden de los operandos está controlado por el bit VEX.W. Si VEX.W=0, entonces el tercer operando es el operando r/m especificado por el byte ModR/M de la instrucción y el cuarto operando es un operando de registro, especificado por los bits 7:4 de la parte ib (inmediata de 8 bits). de la instrucción. Si VEX.W=1, entonces estos dos operandos se intercambian. Por ejemplo:
vfmaddsd xmm1,xmm2,[mem],xmm3
funcionará xmm1 ← (xmm2*[mem])+xmm3
y requerirá una codificación W=0.vfmaddsd xmm1,xmm2,xmm3,[mem]
funcionará xmm1 ← (xmm2*xmm3)+[mem]
y requerirá una codificación W=1.vfmaddsd xmm1,xmm2,xmm3,xmm4
funcionará xmm1 ← (xmm2*xmm3)+xmm4
y se puede codificar con W=0 o W=1.
Tabla de códigos de operación
Las 10 operaciones de suma, multiplicación fusionada y las 110 variantes de instrucciones a las que dan lugar se muestran en la siguiente tabla, con las instrucciones FMA4 resaltadas con * y color de celda amarillo, y las instrucciones FMA3 no resaltadas:
AVX-512 , presentado en 2014, agrega registros vectoriales de 512 bits de ancho (extendiendo los registros de 256 bits, que se convierten en las mitades inferiores de los nuevos registros) y duplica su recuento a 32; Por tanto, los nuevos registros se denominan desde zmm0 hasta zmm31. Agrega ocho registros de máscara, denominados k0 a k7, que pueden usarse para restringir operaciones a partes específicas de un registro vectorial. A diferencia de las extensiones de conjuntos de instrucciones anteriores, AVX-512 se implementa en varios grupos; sólo la extensión básica ("AVX-512F") es obligatoria. [121] La mayoría de las instrucciones agregadas también se pueden utilizar con los registros de 256 y 128 bits.
Intel AMX agrega ocho nuevos registros de mosaicos, tmm0
cada tmm7
uno con una matriz , con una capacidad máxima de 16 filas de 64 bytes por registro de mosaicos. También agrega un TILECFG
registro para configurar los tamaños de las matrices reales contenidas en cada uno de los ocho registros de mosaicos, y un conjunto de instrucciones para realizar multiplicaciones de matrices en estos registros.
TILEZERO
de la instrucción . Los bits 7:6 deben configurarse en 11b y los bits 2:0 deben configurarse en 000b.TILELOADD
instrucciones TILELOADDT1
y TILESTORED
, el argumento de memoria debe usar un modo de direccionamiento de memoria con el byte SIB. En este modo de direccionamiento, el registro base y el desplazamiento se utilizan para especificar la dirección inicial para que la primera fila del mosaico se cargue/almacene desde/en la memoria; la escala y el índice se utilizan para especificar un paso por fila. TILECFG.start_row
, de modo que la instrucción pueda continuar en un mosaico parcialmente cargado/almacenado después de la interrupción.6 nuevas instrucciones.
RDRAND
y RDSEED
pueden no obtener y devolver un número aleatorio si los generadores de números aleatorios de la CPU no pueden seguir el ritmo de la emisión de estas instrucciones; si esto sucede, entonces el software puede volver a intentar las instrucciones (aunque el número de reintentos debe ser limitado). para garantizar el progreso [122] ). Las instrucciones se establecen EFLAGS.CF
en 1 si se obtuvo con éxito un número aleatorio y en 0 en caso contrario. Si no se obtiene un número aleatorio, el registro de destino de la instrucción también se establecerá en 0.7 nuevas instrucciones.
Estas instrucciones, disponibles en Tiger Lake y procesadores Intel posteriores, están diseñadas para permitir el cifrado/descifrado con una clave AES sin tener acceso a ninguna copia no cifrada de la clave durante el proceso de cifrado/descifrado real.
Las instrucciones VIA/Zhaoxin PadLock son instrucciones diseñadas para aplicar primitivas criptográficas de forma masiva, similares a las instrucciones de cadena repetida 8086. Como tal, a menos que se especifique lo contrario, toman, según corresponda, punteros a datos de origen en ES:rSI y datos de destino en ES:rDI, y un tamaño de datos o recuento en rCX. Al igual que las antiguas instrucciones de cadena, todas están diseñadas para ser interrumpibles.
REP XCRYPT*
es una estructura de datos de 128 bits con el siguiente diseño:REP XCRYPT
instrucciones: un modo de resumen para las instrucciones CBC y CFB, y la capacidad de usar datos de entrada/salida que no están alineados en 16 bytes para las instrucciones que no son ECB.REP XSHA*
instrucciones habilitará un modo de operación alternativo, donde rCX especifica la cantidad de bloques de 64 bytes y donde el procedimiento de extensión de longitud estándar FIPS-180-2 en se omite el final del cálculo del hash. Esto lo convierte en una variante más adecuada para la transmisión de datos que la variante EAX=0 original. [124] Esta funcionalidad también existe para CCS_HASH
.REP MONTMUL
contiene seis elementos de 32 bits, donde el primero es un inverso modular negado de los 32 bits inferiores del módulo y los 5 restantes son punteros a varios buffers de memoria:CCS_ENCRYPT
palabra de control en rAX tiene el siguiente formato:Los bits restantes en rAX deben establecerse en ceros.
De los bits 10:6 en rAX (selección de modo de bloque), se debe establecer exactamente un bit, o de lo contrario el comportamiento no estará definido.
VMRUN
, y , la elección de AX/EAX/RAX depende del tamaño de VMLOAD
la dirección, que se puede anular con el prefijo 67h.VMSAVE
INVLPGA
VMRUN
instrucción cargará solo un subconjunto limitado del estado de la CPU; VMLOAD
debe ejecutarse antes VMRUN
de cargar un estado adicional. VMSAVE
es necesario para almacenar estados adicionales. VMSAVE
/ VMLOAD
, el VMM puede mejorar el rendimiento absteniéndose de realizar VMSAVE
/ VMLOAD
antes de volver a ingresar a la máquina virtual con VMRUN
.VMLOAD
y VMSAVE
también se pueden ejecutar en modo invitado.STGI
y CLGI
también se pueden ejecutar en modo invitado.VMGEXIT
se ejecuta como VMMCALL
si no lo hubiera ejecutado un invitado SEV-ES.Instrucciones de virtualización Intel. VT-x también es compatible con algunos procesadores de VIA y Zhaoxin.
VMXON
, todas las instrucciones VT-x (excepto VMXON
) causarán #UD.VMPTRLD
, VMPTRST
y VMCLEAR
es VMXON
una dirección física de 64 bits.VMXON
es la dirección física de 64 bits de una "región VMXON", que es una región de 4 Kbytes que debe estar alineada en 4 Kbytes. El procesador puede utilizar esta región para admitir la operación VMX de una manera dependiente de la implementación y el software nunca debe acceder a ella hasta que el procesador haya abandonado la operación VMX a través de la VMXOFF
instrucción.VMREAD
.VMWRITE
VMCALL
instrucción también puede ser ejecutada por el VMM; al hacerlo, se producirá una salida especial de la VM SMM.VMFUNC
en el registro EAX son:SEAMOPS
en el registro RAX son:Cualquier valor no admitido en RAX provocará una excepción #GP(0).
x86 también incluye conjuntos de instrucciones descontinuados que ya no son compatibles con Intel y AMD, e instrucciones no documentadas que se ejecutan pero no están documentadas oficialmente.
Las CPU x86 contienen instrucciones no documentadas que se implementan en los chips pero que no figuran en algunos documentos oficiales. Se pueden encontrar en varias fuentes en Internet, como la Lista de interrupciones de Ralf Brown y en sandpile.org.
Algunas de estas instrucciones están ampliamente disponibles en muchas o la mayoría de las CPU x86, mientras que otras son específicas de una gama limitada de CPU.
INT1
en la página 86.La instrucción baja la palabra superior del registro de palabra doble sin afectar sus 16 bits superiores.
interno (cero) extendiendo el valor de un registro más pequeño (16 bits)... aplicando el bswap a un valor de 32 bits "00 00 AH AL",... truncado a 16 bits inferiores, que son "00 00".
… Bochs … bswap reg16 actúa igual que bswap reg32 … QEMU … ignora el prefijo 66h
CMPXCHG
con 0F A6/A7
codificaciones.CMPXCHG
con 0F B0/B1
codificaciones.CPUID
instrucción)RDTSC
instrucción en la página 1739 describe las secuencias de instrucciones necesarias para ordenar la RDTSC
instrucción con respecto a las instrucciones anteriores y posteriores.UD2A
y UD2B
a GNU Binutils. Archivado el 25 de julio de 2023.UD1
/ UD2B
y agregó UD0
. Archivado el 25 de julio de 2023.0F 0B
y 0F B9
.UD0
y las páginas 415 y 419 para obtener más información UD1
.UD1
(con byte ModR/M ) y UD0
(sin byte ModR/M) en la página 4-687.OIO
("Código de operación oficial no válido") para el 0F FF
código de operación.UD0
(con byte ModR/M) en la página 4-683.0F FF
código de operación sin asignarle un mnemotécnico.MONITOR
y MWAIT
con operandos explícitos.MONITOR
/ MWAIT
mnemónicosFSIN
en FCOS
el volumen 1, sección 8.3.8FSINCOS
FPTAN
NOP
descripción de las instrucciones).UD0
y UD1
.El uso del prefijo REP o REPNE con una instrucción MUL o IMUL niega el producto.
El uso del prefijo REP o REPNE con una instrucción IDIV niega el cociente.
0F 0A
para la instrucción de invalidación de mensajes de SCC.