SHRD
Cambio de doble precisión derecho
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
0F AC /r ib | SHRD r/m16, r16, imm8 | MRI | Valido | Valido | Shift r/m16 a la derecha imm8 lugares al cambiar los pedazos de r16 en la izquierda. |
0F AD /r | SHRD r/m16, r16, CL | MRC | Valido | Valido | Shift r/m16 a la derecha CL lugares mientras que el cambio de bits de r16 en desde la izquierda. |
0F AC /r ib | SHRD r/m32, r32, imm8 | MRI | Valido | Valido | Shift r/m32 a la derecha imm8 lugares al cambiar los pedazos de r32 en la izquierda. |
REX.W + 0F AC /r ib | SHRD r/m64, r64, imm8 | MRI | Valido | No codificable | Shift r/m64 a la derecha imm8 lugares al cambiar los pedazos de r64 en la izquierda. |
0F AD /r | SHRD r/m32, r32, CL | MRC | Valido | Valido | Shift r/m32 a la derecha CL lugares mientras que el cambio de bits de r32 en desde la izquierda. |
REX.W + 0F AD /r | SHRD r/m64, r64, CL | MRC | Valido | No codificable | Shift r/m64 a la derecha CL lugares mientras que el cambio de bits de r64 en desde la izquierda. |
Codificacion de operandos
Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.
MRI
modrm.rmescriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pidemodrm.reglecturabyte ModRM, campo reg (bits 5-3)imm8byte inmediato que sigue a la instruccion
MRC
modrm.rmescriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pidemodrm.reglecturabyte ModRM, campo reg (bits 5-3)CL
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
La instrucción SHRD es útil para cambios de multiprecisión de 64 bits o más.
La instrucción cambia el primer operando (operando de destino) a la derecha el número de bits especificados por el tercer operando (cuenta operando). El segundo operando (operando de origen) proporciona bits para cambiar de la izquierda (comenzando con el bit mas significativo del operando de destino).
El operando de destino puede ser un registro o una ubicación de memoria; el operando de origen es un registro. El conteo operando es un entero sin firma que se puede almacenar en un byte inmediato o en el registro CL. Si el conteo operando es CL, el recuento de cambios es el AND lógico de CL y una máscara de conteo. En modos no-64-bit y modo 64-bit predeterminado, el ancho de la máscara de conteo es de 5 bits. Sólo se utilizan bits 0 a 4 del registro de cuenta (masking el recuento a un valor entre 0 y 31). Si el conteo es mayor que el tamaño de operando, el resultado es indefinido.
Si el recuento es 1 o mayor, la bandera CF se llena con el último bit desplazado fuera del operando de destino. Para un cambio de 1 bit, la bandera OF se establece si se produjo un cambio de signo; de lo contrario, se pone a cero. Si el conteo operando es 0, las banderas no se ven afectadas.
En modo de 64 bits, el tamaño de operación predeterminado de la instrucción es de 32 bits. El uso de un prefijo REX en forma de REX.R permite el acceso a registros adicionales (R8-R15). Usando un prefijo REX en forma de REX.W promueve la operación a 64 bits (ajustando la máscara de conteo a 6 bits). Vea la tabla resumen al comienzo de esta sección para la codificación de datos y límites.
Operación
IF (In 64-Bit Mode and REX.W = 1)
THEN COUNT := COUNT MOD 64;
ELSE COUNT := COUNT MOD 32;
FI
SIZE := OperandSize;
tempDEST := DEST;
IF COUNT > SIZE
THEN (* Bad parameters *)
tempDEST is undefined;
CF, OF, SF, ZF, AF, PF are undefined;
ELSE IF COUNT >0 (* Perform the shift *)
CF := BIT[tempDEST, COUNT 1]; (* Last bit shifted out on exit *)
FOR i := 0 TO SIZE 1 COUNT
DO
BIT[tempDEST, i] := BIT[tempDEST, i + COUNT];
OD;
FOR i := SIZE COUNT TO SIZE 1
DO
BIT[tempDEST, i] := BIT[SRC, i + COUNT SIZE];
OD;
FI;
DEST := tempDEST;Banderas afectadas
Si el recuento es 1 o mayor, la bandera CF se llena con el último bit desplazado del operando de destino y las banderas SF, ZF y PF se establecen según el valor del resultado. Para un cambio de 1 bit, la bandera OF se establece si se produjo un cambio de signo; de lo contrario, se pone a cero. Para los turnos superiores a 1 bit, la bandera OF no está definida. Si se produce un cambio, la bandera AF no está definida. Si el conteo operando es 0, las banderas no se ven afectadas. Si el conteo es mayor que el tamaño de operando, las banderas quedan indefinidas.
Excepciones
Modo protegido
#GP(0) | Si el destino se encuentra en un segmento no escrito. Si la dirección efectiva un operando de memoria está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS contiene un NULL selector de segmento. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#GP | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#UD | Si se utiliza el prefijo LOCK. |
Modo virtual-8086
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada. |
#UD | Si se utiliza el prefijo LOCK. |
Modo de compatibilidad
| Las mismas excepciones que en modo protegido. |
Modo de 64 bits
#SS(0) | Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. |
#GP(0) | Si la dirección de memoria está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está activada y se hace una referencia de memoria no alineada mientras que |
#UD | nivel de privilegio actual es 3. Si el prefijo LOCK es utilizado. |