
vfmaddrnd231pdとは何か:SDMに記載されるが実機で#UDとなるFMA命令
著者の検証により、Intel SDMに記載されていたFMA命令vfmaddrnd231pdは、GNUアセンブラで認識されず、最新版では記載が消えており、FMA対応のCPUで実行すると#UDが発生したとされる。
本記事は、purplesyringa's blogが2026年10月12日に公開した記事をもとに、x86命令vfmaddrnd231pdの検証結果を整理したものである。この命令はIntelのSoftware Development Manual(SDM)に丸め制御付きの命令として記載されているが、コンパイラやアセンブラでは扱えないことが確認されている。
命令の概要
SDMでは、vfmaddrnd231pdは「Fused Multiply-Add of Packed Double-Precision Floating-Point Values with rounding control」として記載されている。
「VFMADDRND231PD – Fused Multiply-Add of Packed Double-Precision Floating-Point Values with rounding control」
— Intel Software Development Manual
SDMに掲載されているのはvfmaddrnd231pdのみで、pd/ps/sd/ssの各種や132/213/231の形式は記載されていない。即値バイトのビットフィールドについては、Table 5-3で説明されている。
検証で判明した不整合
著者は以下の点を報告している。
- GNUアセンブラは、vfmaddrnd231pdを認識しない。
- SDMに記載されるIntrinsics _mm_fmaddround_pd および _mm256_fmaddround_pd は、ClangおよびICCに存在しない。
- SDMのopcodeリストから命令を手作業でアセンブルすると、別の問題が生じたという。
- FMA命令セットに対応するHaswell CPUで実行すると、#UDが発生した。
- 2024年版のSDMには記載されているが、2026年版には記載がない。
著者は#UDの発生後に最新版のSDMを入手し、この命令が2026年版では記載されていないことを確認したと述べている。なお、Stack Overflowの回答では、DDSは文書化のためにのみ使われており、後のSDMのバージョンでは削除されたとされる。
筆者の見立て
- ドキュメントには他の命令に似ていない固有の表と擬似コードがあるため、誤記(typo)とは考えにくいと解釈している。
- SDMにDDSのopcode記載が残っている点を不審だと論じている。
- Intelがvfmaddrnd*系を追加したが、直前に問題が見つかりCPUから削除し、SDMの修正が不十分だったと予想している。
- 観察結果によって自身の疑念が裏付けられたと解釈している。
- この命令が存在すれば、丸めに依存するアルゴリズムが大幅に高速化する可能性を示唆している。
- 著者自身が強く混乱していると論じている。
この記事は元記事の事実のみに基づいて自動生成されました。
出典
- 媒体:purplesyringa's blog
- 原題:Who is vfmaddrnd231pd??
- URL:https://purplesyringa.moe/blog/who-is-vfmaddrnd231pd/
- (Intel Software Development Manual、SO answer) の報道による