SHRD

Cambio de doble precisión derecho

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F AC /r ibSHRD r/m16, r16, imm8MRIValidoValidoShift r/m16 a la derecha imm8 lugares al cambiar los pedazos de r16 en la izquierda.
0F AD /rSHRD r/m16, r16, CLMRCValidoValidoShift r/m16 a la derecha CL lugares mientras que el cambio de bits de r16 en desde la izquierda.
0F AC /r ibSHRD r/m32, r32, imm8MRIValidoValidoShift r/m32 a la derecha imm8 lugares al cambiar los pedazos de r32 en la izquierda.
REX.W + 0F AC /r ibSHRD r/m64, r64, imm8MRIValidoNo codificableShift r/m64 a la derecha imm8 lugares al cambiar los pedazos de r64 en la izquierda.
0F AD /rSHRD r/m32, r32, CLMRCValidoValidoShift r/m32 a la derecha CL lugares mientras que el cambio de bits de r32 en desde la izquierda.
REX.W + 0F AD /rSHRD r/m64, r64, CLMRCValidoNo codificableShift 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

  1. modrm.rm escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. modrm.reg lecturabyte ModRM, campo reg (bits 5-3)
  3. imm8byte inmediato que sigue a la instruccion

MRC

  1. modrm.rm escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. modrm.reg lecturabyte ModRM, campo reg (bits 5-3)
  3. CL

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

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.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SSSi un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi 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.
#UDSi 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
#UDnivel de privilegio actual es 3. Si el prefijo LOCK es utilizado.

Fuentes