FMA3
読み:エフエムエイ-スリー
外語:FMA3: three-operand Fused Multiply/Add
オペランドが3つあるFMA(積和演算)命令で、特にx86に搭載されている命令セットの一部をいう。
概要
IntelがIntel AVXの一部として導入した。
元々は4オペランドのFMA4を発表していたが、命令長が長くなること、そして命令デコーダーが肥大化することを懸念し、最終的に3オペランドのFMA3となった。
オペコードは当初発表していたFMA4とは異なるものが割り当てられた。
AMDのBulldozerは、後から発表されたFMA3の搭載が間に合わない代わりにFMA4が搭載され、FMA3はTrinity(Piledriverなど)から対応した。
なお、Microsoft Visual Studioの実装では、FMA3も含めて「FMA4」と呼んでいるようなので、注意が必要である。
特徴
VEX
VEXを使っての符号化でのみ動作する命令である。
VEX.L=1で、ymmおよびm256命令にできる命令が多い。
ss/sdまたはps/pdは、VEX.W=0/1で切り換える。
符号
66 0F 38 xx /r相当の機械語をVEX符号化したものを使う。
命令
3つのオペランドを、それぞれ132/213/231として扱うため3種類の命令がある。
順番が異なるだけで、命令の種類は同じ。分かりにくくなるが、3種類全ての命令を以下に一覧する。
- 132
- $0 = $0×$2 + $1
- vfmadd132pd xmm xmm xmm/m256
- vfmadd132ps xmm xmm xmm/m256
- vfmadd132pd xmm xmm xmm/m128
- vfmadd132ps xmm xmm xmm/m128
- vfmadd132sd xmm xmm xmm/m64
- vfmadd132ss xmm xmm xmm/m32
- $0 = $0×$2 - $1
- vfmsub132pd xmm xmm xmm/m256
- vfmsub132ps xmm xmm xmm/m256
- vfmsub132pd xmm xmm xmm/m128
- vfmsub132ps xmm xmm xmm/m128
- vfmsub132sd xmm xmm xmm/m64
- vfmsub132ss xmm xmm xmm/m32
- $0 = $0×$2 ± $1
- vfmaddsub132pd xmm xmm xmm/m256
- vfmaddsub132ps xmm xmm xmm/m256
- vfmaddsub132pd xmm xmm xmm/m128
- vfmaddsub132ps xmm xmm xmm/m128
- vfmsubadd132pd xmm xmm xmm/m256
- vfmsubadd132ps xmm xmm xmm/m256
- vfmsubadd132pd xmm xmm xmm/m128
- vfmsubadd132ps xmm xmm xmm/m128
- $0 = -($0×$2) + $1
- vfnmadd132pd xmm xmm xmm/m256
- vfnmadd132ps xmm xmm xmm/m256
- vfnmadd132pd xmm xmm xmm/m128
- vfnmadd132ps xmm xmm xmm/m128
- vfnmadd132sd xmm xmm xmm/m64
- vfnmadd132ss xmm xmm xmm/m32
- $0 = -($0×$2) - $1
- vfnmsub132pd xmm xmm xmm/m256
- vfnmsub132ps xmm xmm xmm/m256
- vfnmsub132pd xmm xmm xmm/m128
- vfnmsub132ps xmm xmm xmm/m128
- vfnmsub132sd xmm xmm xmm/m64
- vfnmsub132ss xmm xmm xmm/m32
- 213
- $0 = $1×$0 + $2
- vfmadd213pd xmm xmm xmm/m256
- vfmadd213ps xmm xmm xmm/m256
- vfmadd213pd xmm xmm xmm/m128
- vfmadd213ps xmm xmm xmm/m128
- vfmadd213sd xmm xmm xmm/m64
- vfmadd213ss xmm xmm xmm/m32
- $0 = $1×$0 - $2
- vfmsub213pd xmm xmm xmm/m256
- vfmsub213ps xmm xmm xmm/m256
- vfmsub213pd xmm xmm xmm/m128
- vfmsub213ps xmm xmm xmm/m128
- vfmsub213sd xmm xmm xmm/m64
- vfmsub213ss xmm xmm xmm/m32
- $0 = $1×$0 ± $2
- vfmaddsub213pd xmm xmm xmm/m256
- vfmaddsub213ps xmm xmm xmm/m256
- vfmaddsub213pd xmm xmm xmm/m128
- vfmaddsub213ps xmm xmm xmm/m128
- vfmsubadd213pd xmm xmm xmm/m256
- vfmsubadd213ps xmm xmm xmm/m256
- vfmsubadd213pd xmm xmm xmm/m128
- vfmsubadd213ps xmm xmm xmm/m128
- $0 = -($1×$0) + $2
- vfnmadd213pd xmm xmm xmm/m256
- vfnmadd213ps xmm xmm xmm/m256
- vfnmadd213pd xmm xmm xmm/m128
- vfnmadd213ps xmm xmm xmm/m128
- vfnmadd213sd xmm xmm xmm/m64
- vfnmadd213ss xmm xmm xmm/m32
- $0 = -($1×$0) - $2
- vfnmsub213pd xmm xmm xmm/m256
- vfnmsub213ps xmm xmm xmm/m256
- vfnmsub213pd xmm xmm xmm/m128
- vfnmsub213ps xmm xmm xmm/m128
- vfnmsub213sd xmm xmm xmm/m64
- vfnmsub213ss xmm xmm xmm/m32
- 231
- $0 = $1×$2 + $0
- vfmadd231pd xmm xmm xmm/m256
- vfmadd231ps xmm xmm xmm/m256
- vfmadd231pd xmm xmm xmm/m128
- vfmadd231ps xmm xmm xmm/m128
- vfmadd231sd xmm xmm xmm/m64
- vfmadd231ss xmm xmm xmm/m32
- $0 = $1×$2 - $0
- vfmsub231pd xmm xmm xmm/m256
- vfmsub231ps xmm xmm xmm/m256
- vfmsub231pd xmm xmm xmm/m128
- vfmsub231ps xmm xmm xmm/m128
- vfmsub231sd xmm xmm xmm/m64
- vfmsub231ss xmm xmm xmm/m32
- $0 = $1×$2 ± $0
- vfmaddsub231pd xmm xmm xmm/m256
- vfmaddsub231ps xmm xmm xmm/m256
- vfmaddsub231pd xmm xmm xmm/m128
- vfmaddsub231ps xmm xmm xmm/m128
- vfmsubadd231pd xmm xmm xmm/m256
- vfmsubadd231ps xmm xmm xmm/m256
- vfmsubadd231pd xmm xmm xmm/m128
- vfmsubadd231ps xmm xmm xmm/m128
- $0 = -($1×$2) + $0
- vfnmadd231pd xmm xmm xmm/m256
- vfnmadd231ps xmm xmm xmm/m256
- vfnmadd231pd xmm xmm xmm/m128
- vfnmadd231ps xmm xmm xmm/m128
- vfnmadd231sd xmm xmm xmm/m64
- vfnmadd231ss xmm xmm xmm/m32
- $0 = -($1×$2) - $0
- vfnmsub231pd xmm xmm xmm/m256
- vfnmsub231ps xmm xmm xmm/m256
- vfnmsub231pd xmm xmm xmm/m128
- vfnmsub231ps xmm xmm xmm/m128
- vfnmsub231sd xmm xmm xmm/m64
- vfnmsub231ss xmm xmm xmm/m32
再検索