我想找出一个有效的方法来加载编译时间常量浮点到SSE(2/3)寄存器。我试过这样简单的代码,加载常量浮点到SSE寄存器
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
但是,它会从内存中产生4条movss指令!
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)]
其装入标量和流出的记忆......(?!?!)
这样做虽然..
float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
产生。
movaps xmm5,xmmword ptr [::myarray4 (140512050h)]
理想的情况下,这将是很好,如果我有常数他们将是一个办法不连碰内存,只是立即样式指令做(例如编入指令本身的常量)。
由于
对于高性能的SSE/2代码,我强烈建议使用GCC/ICC。阅读此更多信息为什么 - http://www.liranuna.com/sse-intrinsics-optimizations-in-popular-compilers/ – LiraNuna 2011-03-07 21:43:54