PINSRB, PINSRD, PINSRQ

插入字节/字节/字节

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
66 0F 3A 20 /r ibPINSRB xmm1, r32/m8, imm8A有效有效在xmm1指定的imm8中,将r32/m8的字节整数值插入xmm1.
66 0F 3A 22 /r ibPINSRD xmm1, r/m3, imm8A有效有效在 imm8 指定的目的地元素中,在 xmm1 中插入 r/m3 的 dword 整数值.
66 REX.W 0F 3A 22 /r ibPINSRQ xmm1, r/m64, imm8A有效n. e.在imm8指定的目的地元素中,将r/m64的qword整数值插入xmm1.
VEX.128.66.0F3A.W0 20 /r ibVPINSRB xmm1, xmm2, r32/m8, imm8Bv1有效将 r32/m8 的字节整数合并,并将 xmm2 的剩余值在 imm8 的字节抵消时合并为 xmm1 。
VEX.128.66.0F3A.W0 22 /r ibVPINSRD xmm1, xmm2, r/m3, imm8B有效有效从 r32/m32 插入一个 dword 整数值,从 xmm2 插入 xmm1 ,在 imm8 中以 dword 抵消.
VEX.128.66.0F3A.W1 22 /r ibVPINSRQ xmm1, xmm2, r/m64, imm8B有效i2从 r64/m64 插入一个 qword 整数值,从 xmm2 插入 xmm1 在 imm8 的 qword 中抵消.
EVEX.128.66.0F3A.WIG 20 /r ibVPINSRB xmm1, xmm2, r32/m8, imm8C有效有效将 r32/m8 和 OR AVX10.1 剩余 xmm2 的字节整数合并为 xmm1 ,以 imm8 的字节抵消.
EVEX.128.66.0F3A.W0 22 /r ibVPINSRD xmm1, xmm2, r32/m32, imm8C有效有效从 r32/m32 OR AVX10.1 插入一个 dword 整数值,从 xmm2 插入 xmm1 ,在 imm8 中以 dword 抵消.
EVEX.128.66.0F3A.W1 22 /r ibVPINSRQ xmm1, xmm2, r64/m64, imm8C有效n.e.2从 r64/m64 OR AVX10.1 插入一个 qword 整数值,从 xmm2 插入 xmm1 在 imm8 的 qword 中抵消.

操作数编码

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

A

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  3. imm8指令后的立即数字节

B

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

C

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. evex.vvvv lecturaEVEX 前缀的 vvvv 字段(按位取反)
  3. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  4. imm8指令后的立即数字节

Tupla: Tuple1 Scalar

实测开销

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

说明

复制源操作数(第二代操作数)的字节/dword/qword,并在与伯爵操作数(第三代操作数)指定的位置插入目标操作数(第一代操作数). (目的地寄存器中的其他元素不动. ) 源操作数可以是通用寄存器或内存位置. (当源操作数是一个通用寄存器时,PINSRB复制了寄存器的低字节. ) 目标操作数是一个XMM寄存器. 计数操作数为8位即时. 在 XMM 记录器中指定 qword[dword,字节] 位置时, 操作数 计数的 [2, 4] 最小位指定位置 。

在64位模式中,没有用VEX/EVEX编码,使用REX前缀形式为REX.R,允许此指令访问额外的注册(XMM8-XMM15,R8-15). 使用REX.W允许使用64位普通用途登记册。

128位遗产 SSE 版本 : 相应的YMM目的地注册保持不变的位数(MAXVL-1:128).

VEX.128 编码版本 : 目的地的位数(MAXVL-1:128)登记被清零. VEX.L必须是0,否则指令会#UD. 在非64位模式下试图执行VPINSRQ将导致#UD.

EVEX.128 编码版本 : 目的地的位数(MAXVL-1:128)登记被清零. EVEX.L'L必须是0,否则指令会#UD.

行动

CASE OF

    PINSRB: SEL := COUNT[3:0];
                MASK := (0FFH << (SEL * 8));
                TEMP := (((SRC[7:0] << (SEL *8)) AND MASK);

    PINSRD: SEL := COUNT[1:0];
                MASK := (0FFFFFFFFH << (SEL * 32));
                TEMP := (((SRC << (SEL *32)) AND MASK) ;

    PINSRQ: SEL := COUNT[0]
                MASK := (0FFFFFFFFFFFFFFFFH << (SEL * 64));
                TEMP := (((SRC << (SEL *64)) AND MASK) ;

ESAC;
          DEST := ((DEST AND NOT MASK) OR TEMP);

VPINSRB (VEX/EVEX Encoded Version)
SEL := imm8[3:0]
DEST[127:0] := write_b_element(SEL, SRC2, SRC1)
DEST[MAXVL-1:128] := 0

VPINSRD (VEX/EVEX Encoded Version)
SEL := imm8[1:0]
DEST[127:0] := write_d_element(SEL, SRC2, SRC1)
DEST[MAXVL-1:128] := 0

VPINSRQ (VEX/EVEX Encoded Version)
SEL := imm8[0]
DEST[127:0] := write_q_element(SEL, SRC2, SRC1)
DEST[MAXVL-1:128] := 0

Intel C/C++ 内在编译器

PINSRB __m128i _mm_insert_epi8 (__m128i s1, int s2, const int ndx);
PINSRD __m128i _mm_insert_epi32 (__m128i s2, int s, const int ndx);
PINSRQ __m128i _mm_insert_epi64(__m128i s2, __int64 s, const int ndx);

受影响的旗帜

None.

SIMD 浮点 例外

None.

其他例外

EVEX-encoded 指令,参见表2-22,"第5类例外条件".

EVEX-encoded discription,参见表2-59"Type E9NF类例外条件".

Additionally:

#UD               If VEX.L = 1 or EVEX.L'L > 0.

来源