PEXTRB, PEXTRD, PEXTRQ
提取字节/字节/字节
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
66 0F 3A 14 /r ib | PEXTRB reg/m8, xmm2, imm8 | A | 有效 | 有效 | 从 xmm2 的字节偏移中从 imm8 中提取一个字节整数值为 reg 或 m8. r3 或 r64 被清零 的上位位. |
66 0F 3A 16 /r ib | PEXTRD r/m3, xmm2, imm8 | A | 有效 | 有效 | 在 imm8 指定的源词偏移时从 xmm2 中提取一个 dword 整数为 r/m32 。 |
66 REX.W 0F 3A 16 /r ib | PEXTRQ r/m64, xmm2, imm8 | A | 有效 | 不可编码 | 在源 qword 偏移 imm8 时,从 xmm2 中提取一个 qword 整数值,输入 r/m64 。 |
VEX.128.66.0F3A.W0 14 /r ib | VPEXTRB reg/m8, xmm2, imm8 | A | v1 | 有效 | 在 imm8 指定的字节偏移时从 xmm2 中提取一个字节整数值为 reg 或 m8 。 r64/r32 的上位数为 0 。 |
VEX.128.66.0F3A.W0 16 /r ib | VPEXTRD r32/m32, xmm2, imm8 | A | 有效 | 有效 | 在 imm8 指定的源词偏移时从 xmm2 中提取一个 dword 整数为 r32/m32 。 |
VEX.128.66.0F3A.W1 16 /r ib | VPEXTRQ r64/m64, xmm2, imm8 | A | 有效 | i2 | 在 imm8 指定的源词偏移时从 xmm2 中提取一个qword 整数,输入 r64/m64 。 |
EVEX.128.66.0F3A.WIG 14 /r ib | VPEXTRB reg/m8, xmm2, imm8 | B | 有效 | 有效 | 在 OR AVX10.1 源字节偏移时从 xmm2 中提取一个字节整数值,由 imm8 指定为 reg 或 m8 。 r64/r32 的上位位被零填充 。 |
EVEX.128.66.0F3A.W0 16 /r ib | VPEXTRD r32/m32, xmm2, imm8 | B | 有效 | 有效 | 在 OR AVX10.1 源 dword 偏移 imm8 时,从 xmm2 中提取一个 dword 整数值,输入 r32/m32 。 |
EVEX.128.66.0F3A.W1 16 /r ib | VPEXTRQ r64/m64, xmm2, imm8 | B | 有效 | n.e.2 | 在 OR AVX10.1 源 dword 偏移 imm8 时从 xmm2 中提取一个 qword 整数值,输入 r64/m64 。 |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移modrm.reglecturaModRM 字节的 reg 字段(第 5-3 位)imm8指令后的立即数字节
B
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移modrm.reglecturaModRM 字节的 reg 字段(第 5-3 位)imm8指令后的立即数字节
Tupla: Tuple1 Scalar
实测开销
正在从 arch-data 加载实测数据...
说明
在 imm8 [3:0] 确定的字节/字节/字节中从源 XMM 寄存器中提取一个字节/字节整数值。 目的地可以是寄存器或字节/字节/qword 内存位置. 如果目的地是寄存器,则寄存器的上位是0延伸.
在遗留的非VEX编码版本中,如果目标操作数是一个寄存器,则PEXTRB/PEXTRD的64位模式中默认的操作数大小是64位,最小的字节/字节数据上方的位被零填充. PEXTRQ在非64位模式中无法编码,在64位模式中需要REX.W.
说明: 在VEX.128编码的版本中,VEX.vvvv是保留的,必须是1111b,VEX.L必须是0,否则指令会是#UD. 在EVEX.128编码的版本中,EVEX.vvvv是保留的,必须是1111b,EVEX.L"L必须是0,否则指令会是#UD. 如果目标操作数是一个寄存器,则VPEXTRB/VPEXTRD的64位模式中默认的操作数大小是64位,在最小的字节/字节/字节数据上方的位被零填充.
行动
CASE of
PEXTRB: SEL := COUNT[3:0];
TEMP := (Src >> SEL*8) AND FFH;
IF (DEST = Mem8)
THEN
Mem8 := TEMP[7:0];
ELSE IF (64-Bit Mode and 64-bit register selected)
THEN
R64[7:0] := TEMP[7:0];
r64[63:8] := ZERO_FILL; };
ELSE
R32[7:0] := TEMP[7:0];
r32[31:8] := ZERO_FILL; };
FI;
PEXTRD:SEL := COUNT[1:0];
TEMP := (Src >> SEL*32) AND FFFF_FFFFH;
DEST := TEMP;
PEXTRQ: SEL := COUNT[0];
TEMP := (Src >> SEL*64);
DEST := TEMP;
EASC:
VPEXTRTD/VPEXTRQ
IF (64-Bit Mode and 64-bit dest operand)
THEN
Src_Offset := imm8[0]
r64/m64 := (Src >> Src_Offset * 64)
ELSE
Src_Offset := imm8[1:0]
r32/m32 := ((Src >> Src_Offset *32) AND 0FFFFFFFFh);
FI
VPEXTRB ( dest=m8)
SRC_Offset := imm8[3:0]
Mem8 := (Src >> Src_Offset*8)
VPEXTRB ( dest=reg)
IF (64-Bit Mode )
THEN
SRC_Offset := imm8[3:0]
DEST[7:0] := ((Src >> Src_Offset*8) AND 0FFh)
DEST[63:8] := ZERO_FILL;
ELSE
SRC_Offset := imm8[3:0];
DEST[7:0] := ((Src >> Src_Offset*8) AND 0FFh);
DEST[31:8] := ZERO_FILL;
FIIntel C/C++ 内在编译器
PEXTRB int _mm_extract_epi8 (__m128i src, const int ndx);
PEXTRD int _mm_extract_epi32 (__m128i src, const int ndx);
PEXTRQ __int64 _mm_extract_epi64 (__m128i src, const int ndx);受影响的旗帜
None.
SIMD 浮点 例外
None.
其他例外
Non-EVEX-encoded discription,参见表2-22,"第5类例外条件".
EVEX-encoded discription,参见表2-59"Type E9NF类例外条件".
Additionally:
#UD If VEX.L = 1 or EVEX.L'L > 0.If VEX.vvvv != 1111B or EVEX.vvvv != 1111B.