VPEXPANDB, VPEXPANDW
扩展字节/字节值
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
EVEX.128.66.0F38.W0 62 /r | VPEXPANDB xmm1{k1}{z}, m128 | A | 有效 | 有效 | 从m128到xmm1,用写掩码 k1,将最多128位的包装字节值AND AVX512VL)OR AVX10.1从m128扩展至xmm1. |
EVEX.128.66.0F38.W0 62 /r | VPEXPANDB xmm1{k1}{z}, xmm2 | B | 有效 | 有效 | 从xmm2到xmm1,用写掩码 k1,将最多128位的包装字节值AND AVX512VL)OR AVX10.1从xmm2扩展至xmm1. |
EVEX.256.66.0F38.W0 62 /r | VPEXPANDB ymm1{k1}{z}, m256 | A | 有效 | 有效 | 从m256到ymm1,用写掩码和k1将256位块的包装字节值AND AVX512VL) OR AVX10.1从m256扩展至ymm1. |
EVEX.256.66.0F38.W0 62 /r | VPEXPANDB ymm1{k1}{z}, ymm2 | B | 有效 | 有效 | 从ymm2到ymm1,用写掩码和k1将256位块的包装字节值AND AVX512VL) OR AVX10.1从ymm2扩展至ymm1. |
EVEX.512.66.0F38.W0 62 /r | VPEXPANDB zmm1{k1}{z}, m512 | A | 有效 | 有效 | 从m512到zmm1,用写掩码 k1,将最多512位的包装字节值OR AVX10.1扩展为zmm1. |
EVEX.512.66.0F38.W0 62 /r | VPEXPANDB zmm1{k1}{z}, zmm2 | B | 有效 | 有效 | 从zmm2到zmm1,用写掩码 k1,将最多512位的包装字节值OR AVX10.1扩展为zmm1. |
EVEX.128.66.0F38.W1 62 /r | VPEXPANDW xmm1{k1}{z}, m128 | A | 有效 | 有效 | 从m128到xmm1,用写掩码 k1,将最多128位的打包字值扩展为AND AVX512VL)OR AVX10.1. |
EVEX.128.66.0F38.W1 62 /r | VPEXPANDW xmm1{k1}{z}, xmm2 | B | 有效 | 有效 | 从xmm2到xmm1,用写掩码 k1,将最多128位的打包字值扩展为AND AVX512VL)OR AVX10.1. |
EVEX.256.66.0F38.W1 62 /r | VPEXPANDW ymm1{k1}{z}, m256 | A | 有效 | 有效 | 从m256到ymm1,用写掩码 k1,将最多256位的包装字值AND AVX512VL)OR AVX10.1从m256扩展至ymm1. |
EVEX.256.66.0F38.W1 62 /r | VPEXPANDW ymm1{k1}{z}, ymm2 | B | 有效 | 有效 | 从ymm2到ymm1,用写掩码 k1,将最多256位的包装字值AND AVX512VL)OR AVX10.1从ymm2扩展至ymm1. |
EVEX.512.66.0F38.W1 62 /r | VPEXPANDW zmm1{k1}{z}, m512 | A | 有效 | 有效 | 从m512到zmm1,用写掩码 k1,将最多512位的包装字值OR AVX10.1扩展为zmm1. |
EVEX.512.66.0F38.W1 62 /r | VPEXPANDW zmm1{k1}{z}, zmm2 | B | 有效 | 有效 | 从zmm2到zmm1,用写掩码 k1,将最多512位块的包装字节整数或AVX10.1值展开. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
Tupla: Tuple1 Scalar
B
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
说明
扩展(loads)最多64字节整数值或32字节整数值,从源操作(memory opend)到目的操作(register opend),基于writemask opend确定的活性元素.
说明: EVEX.vvvv是保留的,必须是1111b,否则指令会#UD.
将128,256或512位块的包装字节整数从源操作数(内存操作数)移动到目标操作数(登记操作数). 此指令用于从 int8 向量寄存器或 内存位置 装入
,同时使用 操作数 写掩码 指出的活性元素将数据插入到目的地矢量登记册的稀疏元素中。
本指令支持内存断层抑制.
注意压缩的移位假设一个预缩放(N)与单个元素的大小相对应,而不是全向量的大小.
行动
VPEXPANDB
(KL, VL) = (16, 128), (32, 256), (64, 512)
k := 0
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
DEST.byte[j] := SRC.byte[k];
k := k + 1
ELSE:
IF *merging-masking*:
*DEST.byte[j] remains unchanged*
ELSE: ; zeroing-masking
DEST.byte[j] := 0
DEST[MAX_VL-1:VL] := 0
VPEXPANDW
(KL, VL) = (8,128), (16,256), (32, 512)
k := 0
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
DEST.word[j] := SRC.word[k];
k := k + 1
ELSE:
IF *merging-masking*:
*DEST.word[j] remains unchanged*
ELSE: ; zeroing-masking
DEST.word[j] := 0
DEST[MAX_VL-1:VL] := 0Intel C/C++ 内在编译器
VPEXPAND __m128i _mm_mask_expand_epi8(__m128i, __mmask16, __m128i);
VPEXPAND __m128i _mm_maskz_expand_epi8(__mmask16, __m128i);
VPEXPAND __m128i _mm_mask_expandloadu_epi8(__m128i, __mmask16, const void*);
VPEXPAND __m128i _mm_maskz_expandloadu_epi8(__mmask16, const void*);
VPEXPAND __m256i _mm256_mask_expand_epi8(__m256i, __mmask32, __m256i);
VPEXPAND __m256i _mm256_maskz_expand_epi8(__mmask32, __m256i);
VPEXPAND __m256i _mm256_mask_expandloadu_epi8(__m256i, __mmask32, const void*);
VPEXPAND __m256i _mm256_maskz_expandloadu_epi8(__mmask32, const void*);
VPEXPAND __m512i _mm512_mask_expand_epi8(__m512i, __mmask64, __m512i);
VPEXPAND __m512i _mm512_maskz_expand_epi8(__mmask64, __m512i);
VPEXPAND __m512i _mm512_mask_expandloadu_epi8(__m512i, __mmask64, const void*);
VPEXPAND __m512i _mm512_maskz_expandloadu_epi8(__mmask64, const void*);
VPEXPANDW __m128i _mm_mask_expand_epi16(__m128i, __mmask8, __m128i);
VPEXPANDW __m128i _mm_maskz_expand_epi16(__mmask8, __m128i);
VPEXPANDW __m128i _mm_mask_expandloadu_epi16(__m128i, __mmask8, const void*);
VPEXPANDW __m128i _mm_maskz_expandloadu_epi16(__mmask8, const void *);
VPEXPANDW __m256i _mm256_mask_expand_epi16(__m256i, __mmask16, __m256i);
VPEXPANDW __m256i _mm256_maskz_expand_epi16(__mmask16, __m256i);
VPEXPANDW __m256i _mm256_mask_expandloadu_epi16(__m256i, __mmask16, const void*);
VPEXPANDW __m256i _mm256_maskz_expandloadu_epi16(__mmask16, const void*);
VPEXPANDW __m512i _mm512_mask_expand_epi16(__m512i, __mmask32, __m512i);
VPEXPANDW __m512i _mm512_maskz_expand_epi16(__mmask32, __m512i);
VPEXPANDW __m512i _mm512_mask_expandloadu_epi16(__m512i, __mmask32, const void*);
VPEXPANDW __m512i _mm512_maskz_expandloadu_epi16(__mmask32, const void*);SIMD 浮点 例外
None.
其他例外
参见表2-51"E4类例外条件".