SARX, SHLX, SHRX

移动不影响旗帜

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
VEX.LZ.F3.0F38.W0 F7 /rSARX r32a, r/m32, r32bRMV有效有效用 r32b 中指定的计数将 r/m32 算法右移, 并装入 r32a 。
VEX.LZ.66.0F38.W0 F7 /rSHLX r32a, r/m32, r32bRMV有效有效按逻辑将 r/m32 移动,在 r32b 中指定计数,并装入 r32a 。
VEX.LZ.F2.0F38.W0 F7 /rSHRX r32a, r/m32, r32bRMV有效有效将 r/m32 逻辑上右移,在 r32b 中指定计数,并装入 r32a 。
VEX.LZ.F3.0F38.W1 F7 /rSARX r64a, r/m64, r64bRMV有效不可编码用 r64b 中指定的计数将 r/m64 算法右移, 并装入 r64a 。
VEX.LZ.66.0F38.W1 F7 /rSHLX r64a, r/m64, r64bRMV有效不可编码按逻辑将 r/m64 移动,在 r64b 中指定计数并装入 r64a 。
VEX.LZ.F2.0F38.W1 F7 /rSHRX r64a, r/m64, r64bRMV有效不可编码将 r/m64 逻辑上右移,在 r64b 中指定计数,并装入 r64a 。

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

RMV

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  3. vex.vvvv lecturaVEX 前缀的 vvvv 字段(按位取反)

实测开销

正在从 arch-data 加载实测数据...

说明

将第一个源操作符(第二个源操作符)的位移到左侧或右侧,由第二个源操作符(第三个源操作符)中指定的 COUNT 值表示. 结果写给目标操作数(第一个操作数).

转动算术右侧(SARX)和转动逻辑右侧(SHRX)指令将目标操作数的位移到右侧(转动不太显著的位移位置),SARX在转动时保留并宣传最显著的位移(符号位).

逻辑左移 (SHLX) 将 目标操作数 的位移到左移 (向更显著的位移位置) .

此指令不支持真实模式和 虚拟 8086 模式 。 操作数大小如果不是64位模式,总是32位. 在64位模式操作数大小 64中需要VEX.W1. VEX.W1在非64位模式中被忽略. 试图用不等于0的 VEX.L 执行此指令将导致 #UD.

如果 第一源操作数 中指定的值超过 OperondSize -1,则 COUNT 值被遮掩.

SARX,SHRX,和SHLX指令不更新旗帜.

行动

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;

受影响的旗帜

None.

SIMD 浮点 例外

None.

其他例外

参见表2-29"十三类例外条件".

来源