Instrucción SSE MOVSD (extendido: operaciones escalares y vectoriales de punto flotante en x86, x86-64)

De alguna manera estoy confundido por las instrucciones de montaje MOVSD. Escribí un código numérico que computaba la multiplicación de matrices, simplemente usando el código C ordinario sin intrínsecos SSE. Ni siquiera incluyo el archivo de encabezado para intrínsecos SSE2 para compilación. Pero cuando reviso la salida del ensamblador, veo que:

1) se utilizan registros vectoriales de 128 bits XMM; 2) Se invoca la instrucción SSE2 MOVSD.

Entiendo que MOVSD opera esencialmente en coma flotante de doble precisión simple. Solo usa el registro XMM inferior de 64 bits y establece el 0 superior de 64 bits. Pero no entiendo dos cosas:

1) Nunca le doy al compilador ninguna pista para usar SSE2. Además, estoy usando el compilador GCC no intel. Hasta donde yo sé, el compilador de Intel buscará automáticamente oportunidades para la vectorización, pero GCC no. Entonces, ¿cómo sabe GCC usar MOVSD? O, ¿esta instrucción x86 ha existido mucho antes del conjunto de instrucciones SSE, y la intrínseca _mm_load_sd () en SSE2 es solo para proporcionar compatibilidad con versiones anteriores para usar registros XMM para el cálculo escalar?

2) ¿Por qué el compilador no utiliza otros registros de coma flotante, ya sea la pila de coma flotante de 80 bits o los registros de coma flotante de 64 bits? ¿Por qué debe pasar factura usando el registro XMM (configurando el 0 superior de 64 bits y esencialmente desperdiciando ese almacenamiento)? ¿XMM proporciona un acceso más rápido?

Por cierto, tengo otra pregunta con respecto a SSE2. Simplemente no puedo ver la diferencia entre _mm_store_sd () y _mm_storel_sd (). Ambos almacenan el valor inferior de 64 bits en una dirección. ¿Cuál es la diferencia? Diferencia de rendimiento? ¿Diferencia de alineación?

Gracias.

Actualización 1:

OK, obviamente cuando hice esta pregunta por primera vez, carecía de algunos conocimientos básicos sobre cómo una CPU gestiona las operaciones de punto flotante. Entonces los expertos tienden a pensar que mi pregunta no tiene sentido. Como no incluí ni siquiera el código C de muestra más corto, la gente podría pensar que esta pregunta también es vaga. Aquí proporcionaríauna revisión como respuesta, que con suerte será útil para cualquier persona que no tenga claras las operaciones de coma flotante en las CPU modernas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta