← SEARCHABLE ARCHIVE
Assembly · 2026-08-15

Introducción al punto flotante y SIMD de x86-64

De operaciones escalares XMM a SSE y AVX packed, alineación y detección de funciones

INTERACTIVE READING MODE →

Introducción al punto flotante y SIMD de x86-64

Este artículo se ha creado con fines didácticos. Partimos de x86-64 user mode con SSE2; la familia AVX necesita soporte de CPU y estado habilitado por el SO.

Ver XMM no prueba que el código esté vectorizado. addss suma un float inferior y addps cuatro floats packed. El mismo almacenamiento sirve para operaciones escalares y packed.

XMM no es un tipo

packed float32 : 4 lanes × 32 bits
packed float64 : 2 lanes × 64 bits
scalar float32 : 32 bits inferiores
scalar float64 : 64 bits inferiores
packed int32   : 4 lanes × 32 bits
addss xmm0, xmm1
addsd xmm0, xmm1
addps xmm0, xmm1
addpd xmm0, xmm1

El opcode decide la interpretación. x87 usa un modelo antiguo de stack registers; SSE/SSE2 usa XMM y principalmente dos operandos; AVX añade YMM y tres operandos VEX; AVX-512 añade ZMM y máscaras.

Operaciones por lane y alineación

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

El resultado es [a0+b0, a1+b1, a2+b2, a3+b3], no una suma entera de 128 bits con carry entre lanes.

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

Una forma aligned puede fallar con una dirección incorrecta. La alineación de la asignación base no alinea automáticamente cada offset de campo; también importan cache lines y páginas.

Orden FP y NaN

La suma IEEE 754 no es asociativa. Una reducción vectorial cambia el orden y puede diferir bit a bit del escalar. El contrato debe cubrir tolerancia, NaN, infinito, signed zero, redondeo y opciones fast-math.

ucomiss xmm0, xmm1
jp unordered_case
ja above_case

NaN produce unordered. ucomiss y comiss difieren en excepciones; identifique el opcode real que creó los flags.

Shuffle, reducción y AVX

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

Decodifique el immediate con el manual. Muchos shuffles indican conversión AoS/SoA, transpose, broadcast o reducción horizontal.

Antes de AVX verifique CPUID, soporte del SO para extended state, XGETBV para XMM/YMM y garantía de CPUs desplegadas. AVX no implica AVX2 ni AVX-512. vzeroupper evita en algunos límites penalizaciones legacy-SSE de ciertas CPUs.

System V suele tratar XMM como caller-saved; Microsoft x64 preserva los 128 bits bajos de xmm6–xmm15. ASM Windows requiere save/restore y unwind correctos.

Tail y overread

Longitudes no divisibles por el ancho vectorial necesitan tail escalar o máscara. Leer más allá porque “parece haber padding” viola contratos de objeto, página, sanitizer o concurrencia salvo garantía explícita de la API.

La autovectorización puede fallar por alias, dependencias, calls, strict FP, modelo de costes o ISA objetivo. Revise primero informes e intrinsics.

Resumen

XMM es almacenamiento de 128 bits; el opcode define scalar/packed y tipo de lane. SIMD procesa varios elementos, pero añade contratos de alineación, tail, reasociación FP, detección de funciones y preservación ABI. Demuestre corrección y mida luego la carga real.

Fuentes oficiales