PSHUFHW

散装高词

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 70 /r ibPSHUFHW xmm1, xmm2/m128, imm8A有效有效根据imm8的编码,将xmm2/m128中的高单词移动,并将结果存储在xmm1中.
VEX.128.F3.0F.WIG 70 /r ibVPSHUFHW xmm1, xmm2/m128, imm8A有效有效根据imm8的编码,将xmm2/m128中的高单词移动,并将结果存储在xmm1中.
VEX.256.F3.0F.WIG 70 /r ibVPSHUFHW ymm1, ymm2/m256, imm8A有效有效根据imm8的编码,将ymm2/m256中的高单词移动,并将结果存储在ymm1中.
EVEX.128.F3.0F.WIG 70 /r ibVPSHUFHW xmm1 {k1}{z}, xmm2/m128, imm8B有效有效挥舞高句丽xmm2/m128基于AVX512BW或编码在imm8并存储结果AVX10.1 xmm1在写口罩下k1.
EVEX.256.F3.0F.WIG 70 /r ibVPSHUFHW ymm1 {k1}{z}, ymm2/m256, imm8B有效有效挥舞高句丽ymm2/m256基于AVX512BW或编码在imm8并存储结果AVX10.1 ymm1在写口罩下k1.
EVEX.512.F3.0F.WIG 70 /r ibVPSHUFHW zmm1 {k1}{z}, zmm2/m512, imm8B有效有效将zmm2/m512中的高单词以imm8的编码为基础OR AVX10.1,并将结果存储在写面具k1下的zmm1.

操作数编码

每个模式对应上表 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. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  3. imm8指令后的立即数字节

Tupla: Full Mem

实测开销

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

说明

复制字来自源操作数128位车道的高四字,并在用立即数操作数选择的字位位置(相应车道)的目标操作数高四字中插入. 这种256位操作与256位的VPSHUFD指令所使用的车内操作类似,图4-16对此进行了说明. 对于128位操作,只有低128位车道可以运行. 立即数操作数中每个2位字段在目标操作数的高四字形中选择一个单词位置的内容. 立即数操作数字段的二进制编码从源操作数的高四字中选择单词(0,1,2或3,4),以复制到目标操作数. 源操作数的低四字被复制到目标操作数的低四字,每个128位车道.

注意,本指令允许源操作数高四字中的单词复制到目标操作数高四字中的多个单词位置.

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

128位遗产 SSE 版本 : 目标操作数是一个XMM登记册. 源操作数可以是XMM的寄存器,也可以是128位的内存位置. 相应的YMM目的地注册保持不变的位数(MAXVL-1:128).

VEX.128 编码版本 : 目标操作数是一个XMM登记册. 源操作数可以是XMM的寄存器,也可以是128位的内存位置. 目的地YMM的位数(MAXVL-1:128)登记被清零. VEX.vvvv是保留的,必须是1111b,VEX.L必须是0,否则指令会是#UD.

VEX.256 编码版本 : 目标操作数是一个YMM登记册. 源操作数可以是YMM的寄存器,也可以是256位的内存位置.

EVEX 编码版本 : 目标操作数是一个ZMM/YMM/XMM登记册. 源操作数可以是ZMM/YMM/XMM登记器,512/256/128位内存位置. 目的地根据写掩码更新.

说明: 在VEX编码版本中,VEX.vvvv是保留的,必须是1111b,否则指令会#UD.

行动

PSHUFHW (128-bit Legacy SSE Version)
DEST[63:0] := SRC[63:0]
DEST[79:64] := (SRC >> (imm[1:0] *16))[79:64]
DEST[95:80] := (SRC >> (imm[3:2] * 16))[79:64]
DEST[111:96] := (SRC >> (imm[5:4] * 16))[79:64]
DEST[127:112] := (SRC >> (imm[7:6] * 16))[79:64]
DEST[MAXVL-1:128] (Unmodified)

VPSHUFHW (VEX.128 Encoded Version)
DEST[63:0] := SRC1[63:0]
DEST[79:64] := (SRC1 >> (imm[1:0] *16))[79:64]
DEST[95:80] := (SRC1 >> (imm[3:2] * 16))[79:64]
DEST[111:96] := (SRC1 >> (imm[5:4] * 16))[79:64]
DEST[127:112] := (SRC1 >> (imm[7:6] * 16))[79:64]
DEST[MAXVL-1:128] := 0

VPSHUFHW (VEX.256 Encoded Version)
DEST[63:0] := SRC1[63:0]
DEST[79:64] := (SRC1 >> (imm[1:0] *16))[79:64]
DEST[95:80] := (SRC1 >> (imm[3:2] * 16))[79:64]
DEST[111:96] := (SRC1 >> (imm[5:4] * 16))[79:64]
DEST[127:112] := (SRC1 >> (imm[7:6] * 16))[79:64]
DEST[191:128] := SRC1[191:128]
DEST[207192] := (SRC1 >> (imm[1:0] *16))[207:192]
DEST[223:208] := (SRC1 >> (imm[3:2] * 16))[207:192]
DEST[239:224] := (SRC1 >> (imm[5:4] * 16))[207:192]
DEST[255:240] := (SRC1 >> (imm[7:6] * 16))[207:192]
DEST[MAXVL-1:256] := 0

VPSHUFHW (EVEX Encoded Versions)
(KL, VL) = (8, 128), (16, 256), (32, 512)
IF VL >= 128

    TMP_DEST[63:0] := SRC1[63:0]
    TMP_DEST[79:64] := (SRC1 >> (imm[1:0] *16))[79:64]
    TMP_DEST[95:80] := (SRC1 >> (imm[3:2] * 16))[79:64]
    TMP_DEST[111:96] := (SRC1 >> (imm[5:4] * 16))[79:64]
    TMP_DEST[127:112] := (SRC1 >> (imm[7:6] * 16))[79:64]
FI;
IF VL >= 256
    TMP_DEST[191:128] := SRC1[191:128]
    TMP_DEST[207:192] := (SRC1 >> (imm[1:0] *16))[207:192]
    TMP_DEST[223:208] := (SRC1 >> (imm[3:2] * 16))[207:192]
    TMP_DEST[239:224] := (SRC1 >> (imm[5:4] * 16))[207:192]
    TMP_DEST[255:240] := (SRC1 >> (imm[7:6] * 16))[207:192]
FI;
IF VL >= 512
    TMP_DEST[319:256] := SRC1[319:256]
    TMP_DEST[335:320] := (SRC1 >> (imm[1:0] *16))[335:320]


    TMP_DEST[351:336] := (SRC1 >> (imm[3:2] * 16))[335:320]
    TMP_DEST[367:352] := (SRC1 >> (imm[5:4] * 16))[335:320]
    TMP_DEST[383:368] := (SRC1 >> (imm[7:6] * 16))[335:320]
    TMP_DEST[447:384] := SRC1[447:384]
    TMP_DEST[463:448] := (SRC1 >> (imm[1:0] *16))[463:448]
    TMP_DEST[479:464] := (SRC1 >> (imm[3:2] * 16))[463:448]
    TMP_DEST[495:480] := (SRC1 >> (imm[5:4] * 16))[463:448]
    TMP_DEST[511:496] := (SRC1 >> (imm[7:6] * 16))[463:448]
FI;

FOR j := 0 TO KL-1

i := j * 16

IF k1[j] OR *no writemask*

     THEN DEST[i+15:i] := TMP_DEST[i+15:i];

     ELSE

             IF *merging-masking*            ; merging-masking

                 THEN *DEST[i+15:i] remains unchanged*

                 ELSE *zeroing-masking*      ; zeroing-masking

                    DEST[i+15:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0

Intel C/C++ 内在编译器

VPSHUFHW __m512i _mm512_shufflehi_epi16(__m512i a, int n);
VPSHUFHW __m512i _mm512_mask_shufflehi_epi16(__m512i s, __mmask16 k, __m512i a, int n );
VPSHUFHW __m512i _mm512_maskz_shufflehi_epi16( __mmask16 k, __m512i a, int n );
VPSHUFHW __m256i _mm256_mask_shufflehi_epi16(__m256i s, __mmask8 k, __m256i a, int n );
VPSHUFHW __m256i _mm256_maskz_shufflehi_epi16( __mmask8 k, __m256i a, int n );
VPSHUFHW __m128i _mm_mask_shufflehi_epi16(__m128i s, __mmask8 k, __m128i a, int n );
VPSHUFHW __m128i _mm_maskz_shufflehi_epi16( __mmask8 k, __m128i a, int n );
(V)PSHUFHW __m128i _mm_shufflehi_epi16(__m128i a, int n) VPSHUFHW __m256i _mm256_shufflehi_epi16(__m256i a, const int n);

受影响的旗帜

None.

SIMD 浮点 例外

None.

其他例外

Non-EVEX-encoded discription,参见表2-21"第4类例外条件".

EVEX-编码指令,参见表2-52中的例外类型E4NF.nb,"Type E4NF类例外条件".

Additionally:

#UD                    If VEX.vvvv != 1111B, or EVEX.vvvv != 1111B.

来源