FMA x86
# FMA x86

FMA x86 ist eine Befehlssatzerweiterung für Mikroprozessoren von Intel und AMD zur Unterstützung der Fused-Multiply-Add-Technik (FMA). Von AMD erfolgte hierzu erstmals eine Umsetzung in den „Bulldozer“-CPUs. Intel setzte dies erst in den Haswell-Prozessoren ein.

Es gibt zwei nicht miteinander kompatible Ausführungen, FMA4 und FMA3:

* FMA4 ist die vollwertige Version, die eine Operation der Form $d=a+b\cdot c$ erlaubt;
* FMA3 erfordert dagegen, dass das Zielregister eines der Operandenregister ist, und dieser dadurch überschrieben wird.

## Neue Eigenschaften

FMA erweitert die Möglichkeiten zu Vektoroperationen und kann als Erweiterung der AVX-Befehle gesehen werden.

## Neue Instruktionen

### CPUs mit FMA4

* Intel hat FMA4 nicht implementiert.
* AMD hatte FMA4 implementiert:
   * AMD-Bulldozer-basierte Prozessoren (AMD FX), Q4/2011
   * Piledriver-basierte Prozessoren (AMD FX, Trinity und Richland APUs), Q2/2012
   * Steamroller-basierte Prozessoren (4. Generation A-Serie-Prozessoren, Kaveri-APUs) Q1/2014
   * ab der Zen-Mikroarchitektur (Q1/2017) ist FMA4 nicht mehr vorhanden

| Mnemonic | Operanden | Operation |
| - | - | - |
| VFMADDPDx | xmm, xmm, xmm/m128, xmm/m128 | a = b∙c + d |
| VFMADDPDy | ymm, ymm, ymm/m256, ymm/m256 | a = b∙c + d |
| VFMADDPSx | xmm, xmm, xmm/m128, xmm/m128 | a = b∙c + d |
| VFMADDPSy | ymm, ymm, ymm/m256, ymm/m256 | a = b∙c + d |
| VFMADDSD | xmm, xmm, xmm/m64, xmm/m64 | a = b∙c + d |
| VFMADDSS | xmm, xmm, xmm/m32, xmm/m32 | a = b∙c + d |

### CPUs mit FMA3

* Intel
   * Alle Intel-Core-i-Prozessoren ab der Haswell-Mikroarchitektur (4. Generation Core i-Prozessoren)
* AMD
   * Piledriver-basierte Prozessoren (2. Generation FX CPUs, Trinity und Richland APUs), Q2/2012
   * Steamroller-basierte Prozessoren (4. Generation A-Serie-Prozessoren, Kaveri-APUs) Q1/2014
   * Alle Ryzen- und Epyc-Prozessoren (ab der 1. Zen-Microarchitektur) Q1/2017

| Mnemonic | Operanden | Operation |
| - | - | - |
| VFMADD132PDy | ymm, ymm, ymm/m256 | a = a∙c + b |
| VFMADD132PSy | ymm, ymm, ymm/m256 | a = a∙c + b |
| VFMADD132PDx | xmm, xmm, xmm/m128 | a = a∙c + b |
| VFMADD132PSx | xmm, xmm, xmm/m128 | a = a∙c + b |
| VFMADD132SD | xmm, xmm, xmm/m64 | a = a∙c + b |
| VFMADD132SS | xmm, xmm, xmm/m32 | a = a∙c + b |
| VFMADD213PDy | ymm, ymm, ymm/m256 | a = b∙a + c |
| VFMADD213PSy | ymm, ymm, ymm/m256 | a = b∙a + c |
| VFMADD213PDx | xmm, xmm, xmm/m128 | a = b∙a + c |
| VFMADD213PSx | xmm, xmm, xmm/m128 | a = b∙a + c |
| VFMADD213SD | xmm, xmm, xmm/m64 | a = b∙a + c |
| VFMADD213SS | xmm, xmm, xmm/m32 | a = b∙a + c |
| VFMADD231PDy | ymm, ymm, ymm/m256 | a = b∙c + a |
| VFMADD231PSy | ymm, ymm, ymm/m256 | a = b∙c + a |
| VFMADD231PDx | xmm, xmm, xmm/m128 | a = b∙c + a |
| VFMADD231PSx | xmm, xmm, xmm/m128 | a = b∙c + a |
| VFMADD231SD | xmm, xmm, xmm/m64 | a = b∙c + a |
| VFMADD231SS | xmm, xmm, xmm/m32 | a = b∙c + a |

## Anwendung

* Nützlich für gleitkommaintensive Berechnung, vor allem im Multimedia-, wissenschaftlichen oder Finanzberechnungen. Ganzzahloperationen sollen später folgen.
* Erhöht Parallelität und Durchsatz von Gleitkomma-SIMD-Berechnungen
* Verringert die Registerlast durch nicht destruktive Vier-Operanden-Form (im Fall von FMA4)

| Betriebsmodi | Real Mode • Protected Mode • Virtual 8086 Mode • System Management Mode • Long Mode • Compatibibility Mode |
| - | - |
| Befehlssatzerweiterungen | x87 ⬝ PAE ⬝ NX ⬝ AMD64/Intel 64 (x64) ⬝ HTT ⬝ VT-x/AMD-V/VIA VT ⬝ 3DNow! ⬝ MMX ⬝ SSE ⬝ SSE2 ⬝ SSE3 ⬝ SSSE3 ⬝ SSE4 ⬝ SSE4a ⬝ SSE5 ⬝ F16C ⬝ AVX ⬝ CLMUL ⬝ AES ⬝ FMA ⬝ TSX ⬝ BMI ⬝ MPX ⬝ SGX |
