我想找出一個有效的方法來加載編譯時間常量浮點到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