'''Advanced Vector Extensions''' kurz '''AVX''' ist eine Erweiterung der x86-Architektur, die Intel im März 2008 vorgeschlagen wurde. == Eigenschaften == AVX ist eine Erweiterung von [[SSE]]. Die Register von AVX sind 256-Bit gross und heissen YMM0 bis YMM15. Prozessoren, die AVX unterstützen führen SSE Befehle auf den unteren 128-Bit der AVX-Register aus. Zusätzlich führt AVX ein Drei-Operanden-SIMD-Befehlsformat ein (c := a + b). Das führt zu einer Optimierung der Abläufe, da das Quellregister nicht mehr überschrieben wird und somit allfällige Kopiervorgänge einspart. Drei-Operanden-SIMD-Befehle können nur mit AVX-Operanden (YMM) verwendet werden. == 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 Drei-Operanden-Form == Unterstützung feststellen == Die Unterstützung von AVX durch die CPU kann durch aufrufen der [[CPUID#Funktion_0x0000_0001|CPUID Funktion 0x0000_0001]] und durch Prüfen des Bit 28 im Register ECX geprüft werden. == Register == Im 32-Bit-Modus stehen nur YMM0 bis YMM7 zur Verfügung. Im 64-Bit-Modus sind alle Register verfügbar. {| {{Prettytable}} ! colspan="32" align="center" | Bytes |- ! width="30pt" | 31 ! width="30pt" | 30 ! width="30pt" | 29 ! width="30pt" | 28 ! width="30pt" | 27 ! width="30pt" | 26 ! width="30pt" | 25 ! width="30pt" | 24 ! width="30pt" | 23 ! width="30pt" | 22 ! width="30pt" | 21 ! width="30pt" | 20 ! width="30pt" | 19 ! width="30pt" | 18 ! width="30pt" | 17 ! width="30pt" | 16 ! width="30pt" | 15 ! width="30pt" | 14 ! width="30pt" | 13 ! width="30pt" | 12 ! width="30pt" | 11 ! width="30pt" | 10 ! width="30pt" | 9 ! width="30pt" | 8 ! width="30pt" | 7 ! width="30pt" | 6 ! width="30pt" | 5 ! width="30pt" | 4 ! width="30pt" | 3 ! width="30pt" | 2 ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="32" align="center" | YMM? |- | colspan="16" style="background:lightgrey" | | colspan="16" align="center" | XMM? |- | colspan="32" style="background:lightgrey" align="center" | ? = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 |} == Befehle == {| {{Prettytable}} |- ! Instruktion ! Beschreibung |- | VBROADCASTSS, VBROADCASTSD, VBROADCASTF128 | Kopiert ein 32-Bit-, 64-Bit- oder 128-Bit-Speicheroperanden in alle Elemente eines XMM- oder YMM-Registers. |- | VINSERTF128 | Ersetzt entweder die obere oder untere Hälfte eines 256-Bit-YMM-Register mit dem Wert aus dem 128-Bit-Operanden. Die andere Hälfte bleibt unverändert. |- | VEXTRACTF128 | Extrahiert entweder die obere oder untere Hälfte eines 256-Bit-YMM-Registers und kopiert den Wert in den 128-Bit-Operanden. |- | VMASKMOVPS, VMASKMOVPD | Liest eine beliebige Anzahl von Vektorelementen bedingt aus einem SIMD-Speicheroperand in ein Zielregister, wobei der verbleibende Platz mit Nullen gefüllt wird. Alternativ schreibt es eine beliebige Anzahl von Vektorelementen bedingt von einem SIMD-Register in ein SIMD-Speicheroperanden, wobei der verbleibende Platz im Speicher nicht verändert wird. |- | VPERMILPS, VPERMILPD | Tauscht 32-Bit- oder 64-Bit-Vektorelemente aus. |- | VPERM2F128 | Mischt die vier 128-Bit-Vektorelemente aus zwei 256-Bit-Ursprungsoperanden in ein 256-Bit-Zieloperanden. |- | VTESTPS, VTESTPD | Setzt die Flag-Bits CF und ZF entsprechend eines Vergleiches aller Vorzeichenbits. |- | VZEROALL | Füllt alle YMM-Register mit Nullen und markiert sie als unbenutzt. Wird beim Umschalten zwischen 128-Bit- und 256-Bit-Modus verwendet. |- | VZEROUPPER | Füllt die obere Hälfte aller YMM-Register mit Nullen. Wird beim Umschalten zwischen 128-Bit- und 256-Bit-Modus verwendet. |} == Links == [[Wikipediaartikel|http://de.wikipedia.org/wiki/Advanced_Vector_Extensions]]