Floating point (SSE)
| The XMM registers | |
| SSE arithmetic | |
| Printing a double |
The XMM registers
x86-64 floats live in sixteen 128-bit XMM registers. SSE2 is baseline on every x86-64 CPU, so scalar double arithmetic uses the SD (scalar double) forms: movsd, addsd, subsd, mulsd, divsd:
movsd xmm0, [pi]
addsd xmm0, xmm1
mulsd xmm0, [two]
SSE arithmetic
Each instruction takes two operands like the integer ones: destination first, source second, both either XMM registers or one memory operand. Comparisons set the integer flags, so COMISD plus a conditional jump branches on a float comparison:
comisd xmm0, xmm1
ja xmm0_greater
jb xmm0_less
Printing a double
To print a double, pass it in XMM0 to printf with a %f format string, set AL to 1 (one vector register used), and link against libc. Raw sys_write has no float formatting: convert to text yourself, or use printf.
Next: SIMD basics
Article author: Arthur Isaev