VMASKMOV
有条件的 SIMD 包装负载和存储
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
VEX.128.66.0F38.W0 2C /r | VMASKMOVPS xmm1, xmm2, m128 | RVM | 有效 | 有效 | 有条件地加载来自M m128的包装单精度值,使用xmm2的掩码,并在xmm1存储. |
VEX.256.66.0F38.W0 2C /r | VMASKMOVPS ymm1, ymm2, m256 | RVM | 有效 | 有效 | 有条件地加载来自M m256的包装单精度值,使用ymm2的掩码,并在ymm1存储. |
VEX.128.66.0F38.W0 2D /r | VMASKMOVPD xmm1, xmm2, m128 | RVM | 有效 | 有效 | 有条件地加载来自M m128的双精度值,使用xmm2的掩码,并在xmm1存储. |
VEX.256.66.0F38.W0 2D /r | VMASKMOVPD ymm1, ymm2, m256 | RVM | 有效 | 有效 | 有条件地加载来自M m256的双精度值,使用ymm2的掩码,并在ymm1存储. |
VEX.128.66.0F38.W0 2E /r | VMASKMOVPS m128, xmm1, xmm2 | MVR | 有效 | 有效 | 有条件地存储来自R xmm2的包装单精度值,使用xmm1中的面具. |
VEX.256.66.0F38.W0 2E /r | VMASKMOVPS m256, ymm1, ymm2 | MVR | 有效 | 有效 | 有条件地存储来自R ymm2的包装单精度值,使用ymm1中的面具. |
VEX.128.66.0F38.W0 2F /r | VMASKMOVPD m128, xmm1, xmm2 | MVR | 有效 | 有效 | 有条件地存储来自R xmm2的双精度值,使用xmm1中的掩码. |
VEX.256.66.0F38.W0 2F /r | VMASKMOVPD m256, ymm1, ymm2 | MVR | 有效 | 有效 | 有条件地存储来自R ymm2的双精度值,使用ymm1中的掩码. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RVM
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)vex.vvvvlecturaVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
MVR
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移vex.vvvvlecturaVEX 前缀的 vvvv 字段(按位取反)modrm.reglecturaModRM 字节的 reg 字段(第 5-3 位)
实测开销
未实测:不在 64 位处理器上运行。
说明
有条件地从第二源操作数将打包的数据元素移动到目标操作数的相应数据元素中,这取决于每个数据元素相关的掩码位. 面具位点在 第一源操作数 中指定.
每个数据元素的掩码位是第一源操作数中该元素中最重要的位. 如果面具是1,则相应的数据元素从第二源操作数复制到目标操作数. 如果遮罩为0,则在这些指令的负载形式中将相应的数据元素设定为0,在存储形式中未修改.
第二源操作数是这些指令的负载形式的内存地址. 目标操作数是这些指令的存储形式的内存地址. 其他的操作数既是XMM登记册(用于VEX.128版本),也是YMM登记册(用于VEX.256版本).
故障仅因口罩位要求的内存访问导致故障而发生. 如果 内存位置 的相应掩码位为 0, 则不会因引用任何 内存位置 出现错误 。 例如,如果面具比特是全部零,就不会检测出故障.
与之前的MASKMOV指令(MASKMOVQ和MASKMOVDQU)不同,这些指令不应用非时空提示.
校正检查报告上使用低于所有1的口罩位的指令行为与所有1的口罩位的指令行为相同.
VMASKMOV不应用于访问映射的 I/O 和未刻录的内存,因为它的单个负载或存储的存取和订购是具体执行的.
如果面具比特表示数据不应加载或存储呼号A和D比特,则将按执行方式设置. 然而,A和D比特总是为数据实际被加载/存储的页面设定.
注:对于负载表,第一个来源(口罩)编码为VEX.vvvv;第二个来源编码为rm field,目的地登记册编码为reg field.
注:对于存储表,第一个来源(面具)在VEX.vvvv编码;第二个来源寄存器在reg field编码,目的地内存位置在rm field编码.
行动
VMASKMOVPS -128-bit load
DEST[31:0] := IF (SRC1[31]) Load_32(mem) ELSE 0
DEST[63:32] := IF (SRC1[63]) Load_32(mem + 4) ELSE 0
DEST[95:64] := IF (SRC1[95]) Load_32(mem + 8) ELSE 0
DEST[127:97] := IF (SRC1[127]) Load_32(mem + 12) ELSE 0
DEST[MAXVL-1:128] := 0
VMASKMOVPS - 256-bit load
DEST[31:0] := IF (SRC1[31]) Load_32(mem) ELSE 0
DEST[63:32] := IF (SRC1[63]) Load_32(mem + 4) ELSE 0
DEST[95:64] := IF (SRC1[95]) Load_32(mem + 8) ELSE 0
DEST[127:96] := IF (SRC1[127]) Load_32(mem + 12) ELSE 0
DEST[159:128] := IF (SRC1[159]) Load_32(mem + 16) ELSE 0
DEST[191:160] := IF (SRC1[191]) Load_32(mem + 20) ELSE 0
DEST[223:192] := IF (SRC1[223]) Load_32(mem + 24) ELSE 0
DEST[255:224] := IF (SRC1[255]) Load_32(mem + 28) ELSE 0
VMASKMOVPD - 128-bit load
DEST[63:0] := IF (SRC1[63]) Load_64(mem) ELSE 0
DEST[127:64] := IF (SRC1[127]) Load_64(mem + 16) ELSE 0
DEST[MAXVL-1:128] := 0
VMASKMOVPD - 256-bit load
DEST[63:0] := IF (SRC1[63]) Load_64(mem) ELSE 0
DEST[127:64] := IF (SRC1[127]) Load_64(mem + 8) ELSE 0
DEST[195:128] := IF (SRC1[191]) Load_64(mem + 16) ELSE 0
DEST[255:196] := IF (SRC1[255]) Load_64(mem + 24) ELSE 0
VMASKMOVPS - 128-bit store
IF (SRC1[31]) DEST[31:0] := SRC2[31:0]
IF (SRC1[63]) DEST[63:32] := SRC2[63:32]
IF (SRC1[95]) DEST[95:64] := SRC2[95:64]
IF (SRC1[127]) DEST[127:96] := SRC2[127:96]
VMASKMOVPS - 256-bit store
IF (SRC1[31]) DEST[31:0] := SRC2[31:0]
IF (SRC1[63]) DEST[63:32] := SRC2[63:32]
IF (SRC1[95]) DEST[95:64] := SRC2[95:64]
IF (SRC1[127]) DEST[127:96] := SRC2[127:96]
IF (SRC1[159]) DEST[159:128] :=SRC2[159:128]
IF (SRC1[191]) DEST[191:160] := SRC2[191:160]
IF (SRC1[223]) DEST[223:192] := SRC2[223:192]
IF (SRC1[255]) DEST[255:224] := SRC2[255:224]
VMASKMOVPD - 128-bit store
IF (SRC1[63]) DEST[63:0] := SRC2[63:0]
IF (SRC1[127]) DEST[127:64] := SRC2[127:64]
VMASKMOVPD - 256-bit store
IF (SRC1[63]) DEST[63:0] := SRC2[63:0]
IF (SRC1[127]) DEST[127:64] := SRC2[127:64]
IF (SRC1[191]) DEST[191:128] := SRC2[191:128]
IF (SRC1[255]) DEST[255:192] := SRC2[255:192]Intel C/C++ 内在编译器
__m256 _mm256_maskload_ps(float const *a, __m256i mask) void _mm256_maskstore_ps(float *a, __m256i mask, __m256 b) __m256d _mm256_maskload_pd(double *a, __m256i mask);
void _mm256_maskstore_pd(double *a, __m256i mask, __m256d b);
__m128 _mm_maskload_ps(float const *a, __m128i mask) void _mm_maskstore_ps(float *a, __m128i mask, __m128 b) __m128d _mm_maskload_pd(double const *a, __m128i mask);
void _mm_maskstore_pd(double *a, __m128i mask, __m128d b);SIMD 浮点 例外
None.
其他例外
参见表2-23,"第6类例外条件"(没有任何口罩位组合的AC#报告).
Additionally:
#UD If VEX.W = 1.