SHLD

Cambio de doble precisión izquierda

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F A4 /r ibSHLD r/m16, r16, imm8MRIValidoValidoShift r/m16 a la izquierda imm8 lugares mientras cambian los pedazos de r16 a la derecha.
0F A5 /rSHLD r/m16, r16, CLMRCValidoValidoShift r/m16 a la izquierda de los lugares de CL mientras que los pedazos de r16 de la derecha.
0F A4 /r ibSHLD r/m32, r32, imm8MRIValidoValidoShift r/m32 a la izquierda imm8 lugares mientras cambian los pedazos de r32 a la derecha.
REX.W + 0F A4 /r ibSHLD r/m64, r64, imm8MRIValidoNo codificableShift r/m64 a la izquierda imm8 lugares mientras cambian los pedazos de r64 a la derecha.
0F A5 /rSHLD r/m32, r32, CLMRCValidoValidoShift r/m32 a la izquierda de los lugares de CL mientras que los pedazos de r32 de la derecha.
REX.W + 0F A5 /rSHLD r/m64, r64, CLMRCValidoNo codificableShift r/m64 a la izquierda de los lugares de CL mientras que los pedazos de r64 de la derecha.

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 SHLD se utiliza para turnos de multiprecisión de 64 bits o más.

La instrucción cambia el primer operando (operando de destino) a la izquierda el número de bits especificados por el tercer operando (cuenta operando). El segundo operando (operando de origen) proporciona bits para cambiar de la derecha (comenzando con el bit 0 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; sólo se utilizan bits 0 a 4 de la cuenta. Esto enmascara el recuento a un valor entre 0 y 31. Si un 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, SIZE  COUNT];
          (* Last bit shifted out on exit *)
          FOR i := SIZE  1 DOWN TO COUNT

                DO
                      Bit(tempDEST, i) := Bit(tempDEST, i  COUNT);

                OD;
          FOR i := COUNT  1 DOWN TO 0

                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á 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.

Fuentes