SARX, SHLX, SHRX
移动不影响旗帜
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
VEX.LZ.F3.0F38.W0 F7 /r | SARX r32a, r/m32, r32b | RMV | 有效 | 有效 | 用 r32b 中指定的计数将 r/m32 算法右移, 并装入 r32a 。 |
VEX.LZ.66.0F38.W0 F7 /r | SHLX r32a, r/m32, r32b | RMV | 有效 | 有效 | 按逻辑将 r/m32 移动,在 r32b 中指定计数,并装入 r32a 。 |
VEX.LZ.F2.0F38.W0 F7 /r | SHRX r32a, r/m32, r32b | RMV | 有效 | 有效 | 将 r/m32 逻辑上右移,在 r32b 中指定计数,并装入 r32a 。 |
VEX.LZ.F3.0F38.W1 F7 /r | SARX r64a, r/m64, r64b | RMV | 有效 | 不可编码 | 用 r64b 中指定的计数将 r/m64 算法右移, 并装入 r64a 。 |
VEX.LZ.66.0F38.W1 F7 /r | SHLX r64a, r/m64, r64b | RMV | 有效 | 不可编码 | 按逻辑将 r/m64 移动,在 r64b 中指定计数并装入 r64a 。 |
VEX.LZ.F2.0F38.W1 F7 /r | SHRX r64a, r/m64, r64b | RMV | 有效 | 不可编码 | 将 r/m64 逻辑上右移,在 r64b 中指定计数,并装入 r64a 。 |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RMV
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移vex.vvvvlecturaVEX 前缀的 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"十三类例外条件".