Estoy tratando de encontrar una forma eficiente de cargar los flotantes de tiempo constante de compilación en los registros SSE (2/3). He intentado hacer un código simple como este,Cargar flotantes constantes en los registros SSE
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
pero eso genera 4 instrucciones movss de la memoria!
movss xmm0,dword ptr [[email protected] (14048E534h)]
movss xmm1,dword ptr [[email protected] (14048E530h)]
movaps xmm6,xmm12
shufps xmm6,xmm12,0C6h
movss dword ptr [rsp],xmm0
movss xmm0,dword ptr [[email protected] (14048E52Ch)]
movss dword ptr [rsp+4],xmm1
movss xmm1,dword ptr [[email protected] (14048E528h)]
que cargan los escalares dentro y fuera de la memoria ... (?!?!)
Al hacer esto, aunque ..
float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
genera.
movaps xmm5,xmmword ptr [::myarray4 (140512050h)]
Idealmente, sería bueno si tengo constantes de sus sería una manera que ni siquiera la memoria táctil y simplemente lo hacen con las instrucciones de estilo inmediatos (por ejemplo, las constantes compilados en la propia instrucción).
Gracias
constantes
Para código SSE/2 de alto rendimiento, recomiendo usar GCC/ICC. Lee esto para obtener más información sobre por qué: http://www.liranuna.com/sse-intrinsics-optimizations-in-popular-compilers/ – LiraNuna