INSERTPS

插入 标量 单精度浮点 值

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
66 0F 3A 21 /r ibINSERTPS xmm1, xmm2/m32, imm8A有效有效在imm8指定的目的地元素中,将imm8从xmm2/m32中选择的单精度浮点值插入xmm1,并在imm8中表示xmm1中为零输出目的地元素.
VEX.128.66.0F3A.WIG 21 /r ibVINSERTPS xmm1, xmm2, xmm3/m32, imm8B有效有效插入 imm8 从 xmm3/m32 中选择的 单精度浮点 值,并在 imm8 指定的目的地元素中与 xmm2 值合并,并如 imm8 所示,在 xmm1 中写出结果和零出目的地元素.
EVEX.128.66.0F3A.W0 21 /r ibVINSERTPS xmm1, xmm2, xmm3/m32, imm8C有效有效从 xmm3/m32 中插入 imm8 选择的单一精度浮点值 OR AVX10.1,并在 imm8 指定的目的地元素中与 xmm2 的值合并,并如 imm8 所示,在 xmm1 中写入结果和零输出目的地元素.

操作数编码

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

A

  1. modrm.reg lectura y 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 加载实测数据...

说明

(登记来源表)

将单精度标量 浮点元素复制到128位矢量寄存器中. 立即数操作数有三个字段,其中ZMask比特指定目的地的哪些元素将被设定为零,Counter D比特指定目的地的哪个元素将被标量值覆盖,对于矢量寄存器源,Counter S比特指定源的哪个元素将被复制. 当 标量 来源为 内存操作数 时, Counter S 位点会被忽略.

(记忆源形式)

从32位的内存位置和目标操作数中装入一个浮点元素,在立即数操作数的Counter D比特表示的位置上装入第一个源. 基于 立即数操作数 的 Zmask 位点存储在目的地和0 输出目的元素.

128位遗产 SSE 版本 : 第一个来源登记册是XMM登记册。 第二源操作数要么是一个XMM寄存器,要么是一个32位的内存位置. 目的地与第一个来源的XMM寄存器没有区别,对应寄存器目的地的上位(MAXVL-1:128)没有修改.

VEX.128和EVEX编码版本: 目的地和第一个来源登记册是XMM登记册. 第二源操作数要么是一个XMM寄存器,要么是一个32位的内存位置. 对应注册目的地MAXVL-1:128的上位数(MAXVL): 被清零.

如果VINSERTPS被用VEX.L=1编码,试图执行用VEX.L=1编码的指令,将导致#UD例外.

行动

VINSERTPS (VEX.128 and EVEX Encoded Version)
IF (SRC = REG) THEN COUNT_S := imm8[7:6]

    ELSE COUNT_S := 0
COUNT_D := imm8[5:4]
ZMASK := imm8[3:0]
CASE (COUNT_S) OF

    0: TMP := SRC2[31:0]
    1: TMP := SRC2[63:32]
    2: TMP := SRC2[95:64]
    3: TMP := SRC2[127:96]
ESAC;
CASE (COUNT_D) OF
    0: TMP2[31:0] := TMP

          TMP2[127:32] := SRC1[127:32]
    1: TMP2[63:32] := TMP

          TMP2[31:0] := SRC1[31:0]
          TMP2[127:64] := SRC1[127:64]
    2: TMP2[95:64] := TMP
          TMP2[63:0] := SRC1[63:0]
          TMP2[127:96] := SRC1[127:96]
    3: TMP2[127:96] := TMP
          TMP2[95:0] := SRC1[95:0]
ESAC;

IF (ZMASK[0] = 1) THEN DEST[31:0] := 00000000H
    ELSE DEST[31:0] := TMP2[31:0]

IF (ZMASK[1] = 1) THEN DEST[63:32] := 00000000H
    ELSE DEST[63:32] := TMP2[63:32]

IF (ZMASK[2] = 1) THEN DEST[95:64] := 00000000H
    ELSE DEST[95:64] := TMP2[95:64]

IF (ZMASK[3] = 1) THEN DEST[127:96] := 00000000H
    ELSE DEST[127:96] := TMP2[127:96]

DEST[MAXVL-1:128] := 0

INSERTPS (128-bit Legacy SSE Version)
IF (SRC = REG) THEN COUNT_S :=imm8[7:6]

    ELSE COUNT_S :=0
COUNT_D := imm8[5:4]
ZMASK := imm8[3:0]
CASE (COUNT_S) OF

    0: TMP := SRC[31:0]
    1: TMP := SRC[63:32]
    2: TMP := SRC[95:64]
    3: TMP := SRC[127:96]
ESAC;

CASE (COUNT_D) OF
    0: TMP2[31:0] := TMP
          TMP2[127:32] := DEST[127:32]
    1: TMP2[63:32] := TMP
          TMP2[31:0] := DEST[31:0]
          TMP2[127:64] := DEST[127:64]
    2: TMP2[95:64] := TMP


          TMP2[63:0] := DEST[63:0]
          TMP2[127:96] := DEST[127:96]
    3: TMP2[127:96] := TMP
          TMP2[95:0] := DEST[95:0]
ESAC;

IF (ZMASK[0] = 1) THEN DEST[31:0] := 00000000H
    ELSE DEST[31:0] := TMP2[31:0]

IF (ZMASK[1] = 1) THEN DEST[63:32] := 00000000H
    ELSE DEST[63:32] := TMP2[63:32]

IF (ZMASK[2] = 1) THEN DEST[95:64] := 00000000H
    ELSE DEST[95:64] := TMP2[95:64]

IF (ZMASK[3] = 1) THEN DEST[127:96] := 00000000H
    ELSE DEST[127:96] := TMP2[127:96]

DEST[MAXVL-1:128] (Unmodified)

Intel C/C++ 内在编译器

VINSERTPS __m128 _mm_insert_ps(__m128 dst, __m128 src, const int nidx);
INSETRTPS __m128 _mm_insert_ps(__m128 dst, __m128 src, const int nidx);

SIMD 浮点 例外

None.

其他例外

Non-EVEX-encoded discription,参见表2-22,"第5类例外条件",另外还有:

#UD               If VEX.L = 0.

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

来源