AVX512 舍入模式如何工作(或者 NDISASM 只是混淆了)?

2023-12-02

我正在尝试了解具体的AVX512F指令vcvtps2udq.

指令的签名是VCVTPS2UDQ zmm1 {k1}{z}, zmm2/m512/m32bcst{er}。手册信息如下。

为了尝试理解新的舍入模式,以下代码片段是用 NASM (2.12.02) 组装的

vcvtps2udq zmm0,zmm1
vcvtps2udq zmm0,zmm1,{rz-sae}
vcvtps2udq xmm0,xmm1

用 NDISASM (2.12.02) 反汇编结果会造成很多混乱,代码如下:

62F17C4879C1      vcvtps2udq zmm0,zmm1
62F17C7879C1      vcvtps2udq xmm0,xmm1
62F17C0879C1      vcvtps2udq xmm0,xmm1

Question:第二行使用 xmm 寄存器而不是 zmm 寄存器进行反汇编(这是我所期望的)。与零舍入模式(rz-sae)有关。或者只是 NDISASM 错误,无法区分操作码 62F17C7879C1 和 62F17C0879C1。

Intel指令集参考手册有如下描述:

将十六个打包单精度浮点值转换为 源操作数为十六个无符号双字整数 目标操作数。

当转换不精确时,返回的值将根据 到 MXCSR 寄存器或嵌入的舍入控制位 舍入控制位。如果转换后的结果无法表示为 目标格式,浮点无效异常是 引发,如果此异常被屏蔽,则整数值 2w – 1 为 返回,其中 w 表示目标中的位数 格式。

源操作数是ZMM/YMM/XMM寄存器,512/256/128位存储器 位置,或从 32 位内存广播的 512/256/128 位向量 地点。目标操作数是 ZMM/YMM/XMM 寄存器 使用 writemask k1 有条件更新。


操作码编码为 0x62 P0 P1 P2 ...请参阅此处第 4.2 节。在这种情况下,P2字节是

P2
48  <- vcvtps2udq zmm0,zmm1
78  <- vcvtps2udq zmm0,zmm1,{rz-sae}
08  <- vcvtps2udq xmm0,xmm1

进一步细分是以下字段

                       zmm  zmm+sae  xmm
EVEX.aaa  = P2[2:0]     0     0       0
EVEXV'    = P2[3]       1     1       1
EVEX.b    = P2[4]       0     1       0  "Broadcast/RC/SAE Context"
EVEX.L'L  = P2[6:5]     2     3       0  "Vector length/RC"
EVEX.z    = P2[7]       0     0       0

所以不同的字段是 EVEX.b 和 EVEX.L'L。根据文档,如果b没有设置,那么L'L是SIMD长度,所以0 = xmm and 2 = zmm. If b被设置后,L'L被重新解释为静态舍入模式,并且长度假定为 zmm(512 位)。

NDISASM 未正确解释 EVEX.B 位,因此EVEX.L'L场要么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVX512 舍入模式如何工作(或者 NDISASM 只是混淆了)? 的相关文章

随机推荐