特定の 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
質問: 2 行目は、zmm レジスターではなく xmm レジスターで逆アセンブルされています (予想していたはずです)。ゼロ丸めモード (rz-sae) が関係しています。または、NDISASM が間違っているだけで、オペコード 62F17C7879C1 と 62F17C0879C1 を区別できません。
Intel 命令セットのリファレンス マニュアルには、次の説明があります。
ソース オペランドの 16 個のパックド単精度浮動小数点値を、デスティネーション オペランドの 16 個の符号なしダブルワード整数に変換します。
変換が不正確な場合、返される値は、MXCSR レジスタの丸め制御ビットまたは組み込みの丸め制御ビットに従って丸められます。変換された結果を目的の形式で表すことができない場合、浮動小数点の無効な例外が発生し、この例外がマスクされている場合、整数値 2w – 1 が返されます。ここで、w は目的の形式のビット数を表します。
ソース オペランドは、ZMM/YMM/XMM レジスタ、512/256/128 ビットのメモリ ロケーション、または 32 ビットのメモリ ロケーションからブロードキャストされた 512/256/128 ビットのベクトルです。デスティネーション オペランドは、書き込みマスク k1 で条件付きで更新される ZMM/YMM/XMM レジスタです。