SARX, SHLX, SHRX

Cambio sin afectar banderas

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
VEX.LZ.F3.0F38.W0 F7 /rSARX r32a, r/m32, r32bRMVValidoValidoShift r/m32 aritméticamente derecha con el conteo especificado en r32b y carga en r32a.
VEX.LZ.66.0F38.W0 F7 /rSHLX r32a, r/m32, r32bRMVValidoValidoShift r/m32 lógicamente izquierda con el conteo especificado en r32b y carga en r32a.
VEX.LZ.F2.0F38.W0 F7 /rSHRX r32a, r/m32, r32bRMVValidoValidoShift r/m32 lógicamente derecho con el conteo especificado en r32b y carga en r32a.
VEX.LZ.F3.0F38.W1 F7 /rSARX r64a, r/m64, r64bRMVValidoNo codificableShift r/m64 aritméticamente derecha con el conteo especificado en r64b y carga en r64a.
VEX.LZ.66.0F38.W1 F7 /rSHLX r64a, r/m64, r64bRMVValidoNo codificableShift r/m64 lógicamente izquierda con el conteo especificado en r64b y carga en r64a.
VEX.LZ.F2.0F38.W1 F7 /rSHRX r64a, r/m64, r64bRMVValidoNo codificableShift r/m64 lógicamente derecho con el conteo especificado en r64b y carga en r64a.

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.

RMV

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

Coste medido

Cargando las mediciones de arch-data...

Descripción

Cambia los bits del primer operando de origen (el segundo operando) a la izquierda o derecha por un valor COUNT especificado en el segundo operando de origen (el tercer operando). El resultado está escrito al operando de destino (el primer operando).

La derecha aritmética del cambio (SARX) y las instrucciones de la derecha lógica del cambio (SHRX) desplazan los bits del operando de destino a la derecha (hacia lugares de bits menos significativos), SARX mantiene y propaga el bit mas significativo ( bit del signo) mientras cambia.

El cambio lógico a la izquierda (SHLX) desplaza los bits del operando de destino a la izquierda (hacia lugares más significativos).

Esta instrucción no es compatible en modo real y modo virtual-8086. El tamaño de operando es siempre 32 bits si no en modo de 64 bits. En modo de 64 bits tamaño de operando 64 requiere VEX.W1. VEX.W1 es ignorado en modos no-64-bit. Un intento de ejecutar esta instrucción con VEX.L no igual a 0 causará #UD.

Si el valor especificado en el primer operando de origen excede OperandSize -1, el valor COUNT está enmascarado.

Las instrucciones SARX,SHRX y SHLX no actualizan las banderas.

Operación

TEMP := SRC1;
IF VEX.W1 and CS.L = 1
THEN

    countMASK := 3FH;
ELSE

    countMASK := 1FH;
FI
COUNT := SRC2 AND countMASK;

DO WHILE (COUNT  0)
    IF instruction is SHLX
          THEN
                TEMP := TEMP *2;


         ELSE IF instruction is SHRX

         THEN

                TEMP := TEMP /2; //unsigned divide

         ELSE   // SARX

                TEMP := TEMP /2; // signed divide, round toward negative infinity

    FI;

    COUNT := COUNT - 1;

OD

DEST := TEMP;

Banderas afectadas

None.

SIMD coma flotante Excepciones

None.

Otras excepciones

Ver Tabla 2-29, "Tipo 13 Condiciones de Excepción de Clase".

Fuentes