assembly - Intel AVX-512 : how to set the EVEX. z位

标签 assembly x86 machine-code avx512

AVX-512中的EVEX.z位与k个寄存器一起用于控制屏蔽。如果z位为0,则表示合并屏蔽;如果z位为1,则k寄存器中的零元素将在输出中清零。

语法如下所示:

VPSUBQ zmm0{k2}{z},zmm1,zmm2

其中{z}代表z位。

但是,如何设置或测试EVEX.z位?我搜索了所有可以找到的资源,但没有找到答案。

最佳答案

据我了解,它们的意思是VPSUBQ zmm0{k2}{z},zmm1,zmm2VPSUBQ zmm0{k2},zmm1,zmm2是两个不同的指令,它们的编码在单个位(称为“z位”)中有所不同。 (这是该指令的EVEX前缀的一部分。Wikipedia documents所有字段)

因此,您可以通过在汇编源程序中指定{z}来“设置z位”,并告诉汇编器生成带有相应位集的指令。这在很多地方都有记录,例如Intel的vol.2指令集手册,以及在大多数包含内在函数的mask(merge-masking)与maskz(zero-masking)版本的Intel intrinsics guide中)

它不是CPU状态中的物理位(如方向标志之类的东西),它会从一条指令持续到下一条指令。 “测试”它没有意义。

为了说明这一点,以下是我组装两个版本所得到的结果:

00000000  62F1F5CAFBC2      vpsubq zmm0{k2}{z},zmm1,zmm2
00000006  62F1F54AFBC2      vpsubq zmm0{k2},zmm1,zmm2

请注意,编码的区别在于第四个字节的高位。那就是您的“z位”。

也许您认为您可以在运行时“设置”或“清除” z位,从而改变后续指令的屏蔽效果?由于它是每条指令编码的一部分,而不是CPU状态的一部分,因此这种思维方式仅在您即时运行JIT指令或使用自修改代码的情况下才有效。

在“常规”提前代码中,您将必须同时编写两种版本的代码,一次使用{z}指令,一次不使用。使用条件跳转来确定要执行的版本。

关于assembly - Intel AVX-512 : how to set the EVEX. z位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60778385/

相关文章:

c++ - 如何在 x86 程序集中移动两个 float 相乘的结果?

assembly - x86 架构是否支持将 bool 打包为位以并行化逻辑操作?

c - 如何证明或反驳编译的效率?

c - AMD64 指令指针中的奇怪行为

assembly - 通过 USB 驱动器启动的自定义引导加载程序在某些计算机上产生不正确的输出

visual-studio - Visual Studio:不同的DLL用于配置

PHP x86 内存限制

c++ - 将高级语言编译成机器码

assembly - 哪个x86指令的立即数为10字节?

软件可以在裸机上执行吗?