FMA4
読み:エフエムエイ-フォー
外語:FMA4: four-operand Fused Multiply/Add
オペランド
が4つあるFMA(
積和演算
)命令で、特に
x86
に搭載されている命令セットの一部をいう。
目次
概要
特徴
VEX
符号
機能の有無判別
命令
概要
元々は、
Intel
が
Intel AVX
で導入を予定していた命令の一部であった。しかし、命令長が長くなること、そして命令デコーダーが肥大化することを懸念し、最終的に不採用として3オペランドFMA(
FMA3
)を実装した。
これに対して
AMD
は、SSE5をキャンセルしてIntel AVXを採用するのにあわせ、このIntelが不採用とした4オペランドFMAをBulldozerマイクロアーキテクチャーから採用することにした(その代わりFMA3の実装は次の製品に持ち越し)。
オペコードはAMDが独自に確保するのではなく、当初予定されていたIntelのそれと完全に同じものを採用した。
しかしIntelが遂にFMA4をサポートしなかったこともあり、殆ど使われていなかったこともあって、その後AMDが発表したZenマイクロアーキテクチャーからは削除された。
特徴
VEX
VEXを使っての符号化でのみ動作する命令である。
VEX.L
=1で、ymmおよびm256命令にできる命令が多い。
またすべての命令について、
VEX.W
フィールドで、オペランド3とオペランド4の機能を入れ替えることができる。
符号
66 0F 3A xx /r /is4相当の
機械語
をVEX符号化したものを使う。
ModR/M
に続いて/is4があるのが特徴で、このバイトの上位4ビットでもう一つの
XMMレジスター
を指定できる。
機能の有無判別
EAX=80000000Hで
CPUID命令
を実行し、返却値EAXの最上位ビットが1となる拡張CPUID対応環境で、かつEAX=80000001HでCPUIDを実行した結果得られたECXレジスターのビット16が1のとき、FMA4に対応している。
Intelでは対応製品がない。AMDは
Bulldozer
以降で対応する。
命令
$0 = $1×$2 + $3
vfmaddps xmm, xmm, xmm/m128, xmm/m128
vfmaddps ymm, ymm, ymm/m256, ymm/m256
vfmaddpd xmm, xmm, xmm/m128, xmm/m128
vfmaddpd ymm, ymm, ymm/m256, ymm/m256
vfmaddss xmm, xmm, xmm/m32, xmm/m32
vfmaddsd xmm, xmm, xmm/m64, xmm/m64
$0 = $1×$2 - $3
vfmsubps xmm, xmm, xmm/m128, xmm/m128
vfmsubps ymm, ymm, ymm/m256, ymm/m256
vfmsubpd xmm, xmm, xmm/m128, xmm/m128
vfmsubpd ymm, ymm, ymm/m256, ymm/m256
vfmsubss xmm, xmm, xmm/m32, xmm/m32
vfmsubsd xmm, xmm, xmm/m64, xmm/m64
$0 = -($1×$2) + $3
vfnmaddps xmm, xmm, xmm/m128, xmm/m128
vfnmaddps ymm, ymm, ymm/m256, ymm/m256
vfnmaddpd xmm, xmm, xmm/m128, xmm/m128
vfnmaddpd ymm, ymm, ymm/m256, ymm/m256
vfnmaddss xmm, xmm, xmm/m32, xmm/m32
vfnmaddsd xmm, xmm, xmm/m64, xmm/m64
$0 = -($1×$2) - $3
vfnmsubps xmm, xmm, xmm/m128, xmm/m128
vfnmsubps ymm, ymm, ymm/m256, ymm/m256
vfnmsubpd xmm, xmm, xmm/m128, xmm/m128
vfnmsubpd ymm, ymm, ymm/m256, ymm/m256
vfnmsubss xmm, xmm, xmm/m32, xmm/m32
vfnmsubsd xmm, xmm, xmm/m64, xmm/m64
再検索