← SEARCHABLE ARCHIVE
Assembly · 2026-08-15

Einführung in x86-64-Gleitkomma und SIMD

Von skalaren XMM-Operationen zu packed SSE und AVX, Ausrichtung und Feature-Erkennung

INTERACTIVE READING MODE →

Einführung in x86-64-Gleitkomma und SIMD

Dieser Artikel ist als Lehrmaterial gedacht. Ausgangspunkt ist x86-64-User-Mode mit SSE2. AVX-Familien benötigen CPU-Unterstützung und aktivierten Betriebssystemzustand.

Ein XMM-Register beweist keine Vektorisierung. addss addiert einen niedrigen float, addps vier gepackte floats. Derselbe Registerspeicher wird für skalare und packed Befehle verwendet.

XMM ist kein Typ

packed float32 : 4 × 32-Bit-Lanes
packed float64 : 2 × 64-Bit-Lanes
scalar float32 : niedrige 32 Bit
scalar float64 : niedrige 64 Bit
packed int32   : 4 × 32-Bit-Lanes
addss xmm0, xmm1
addsd xmm0, xmm1
addps xmm0, xmm1
addpd xmm0, xmm1

Der Opcode bestimmt die Interpretation. x87 nutzt ein älteres Stackregistermodell, SSE/SSE2 XMM und überwiegend zwei Operanden, AVX YMM und VEX-Dreioperandenformen, AVX-512 zusätzlich ZMM und Masken.

Lane-Arithmetik und Ausrichtung

movups xmm0, [rcx]
movups xmm1, [rdx]
addps  xmm0, xmm1

Das Ergebnis ist [a0+b0, a1+b1, a2+b2, a3+b3], keine 128-Bit-Ganzzahladdition mit Carry zwischen Lanes.

movaps xmm0, [rcx]    ; aligned
movups xmm0, [rcx]    ; unaligned
movdqa xmm0, [rcx]
movdqu xmm0, [rcx]

Eine aligned Form kann auf einer falschen Adresse faulten. Ausrichtung der Basis garantiert nicht die Ausrichtung jedes Feldoffsets; Cacheline- und Seitengrenzen sind ebenfalls relevant.

FP-Reihenfolge und NaN

IEEE-754-Addition ist nicht assoziativ. Eine Vektorreduktion ändert die Summationsreihenfolge und kann vom skalaren Ergebnis bitweise abweichen. Vertrag und Tests müssen Toleranz, NaN, Infinity, signed zero, Rundung und Fast-Math-Optionen erfassen.

ucomiss xmm0, xmm1
jp unordered_case
ja above_case

NaN erzeugt unordered. ucomiss und comiss unterscheiden sich in Ausnahmedetails; maßgeblich ist der echte flagsetzende Opcode.

Shuffle, Reduction und AVX

shufps xmm0, xmm1, imm8
pshufd xmm0, xmm1, imm8

Die Laneauswahl des Immediate wird mit der Befehlsreferenz dekodiert. Viele Shuffles weisen auf AoS/SoA-Konvertierung, Transpose, Broadcast oder horizontale Reduktion hin.

Vor AVX müssen CPUID, OS-Support für Extended State, XGETBV-Aktivierung von XMM/YMM und die Deployment-Garantie geprüft werden. AVX impliziert nicht AVX2 oder AVX-512. vzeroupper an manchen Grenzen vermeidet auf bestimmten CPUs Legacy-SSE-Transitionskosten.

System V behandelt XMM normalerweise als caller-saved; Microsoft x64 sichert die unteren 128 Bit von xmm6–xmm15. Windows-ASM braucht korrekte Sicherung und Unwind.

Tail und Overread

Nicht durch die Vektorbreite teilbare Längen benötigen skalaren Tail oder Masken. Overread aufgrund vermuteten Paddings verletzt Objekt-, Seiten-, Sanitizer- oder Nebenläufigkeitsverträge, sofern die API ihn nicht ausdrücklich erlaubt.

Auto-Vektorisierung kann an Aliasing, loop-carried Dependencies, Calls, strict FP, Kostenmodell oder ISA-Target scheitern. Erst Reports und Intrinsics prüfen.

Zusammenfassung

XMM ist 128-Bit-Speicher; der Opcode definiert scalar/packed und den Lane-Typ. SIMD verarbeitet mehrere Elemente, bringt aber Alignment-, Tail-, FP-Reassociation-, Feature-Detection- und ABI-Verträge mit. Korrektheit beweisen, dann im realen Workload messen.

Offizielle Quellen