【发布时间】:2011-02-15 18:31:58
【问题描述】:
我正在尝试找出一种将编译时间常数浮点数加载到 SSE(2/3) 寄存器中的有效方法。我试过做这样的简单代码,
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
但这会从内存中生成 4 条 movss 指令!
movss xmm0,dword ptr [__real@3f800000 (14048E534h)]
movss xmm1,dword ptr [__real@40000000 (14048E530h)]
movaps xmm6,xmm12
shufps xmm6,xmm12,0C6h
movss dword ptr [rsp],xmm0
movss xmm0,dword ptr [__real@40400000 (14048E52Ch)]
movss dword ptr [rsp+4],xmm1
movss xmm1,dword ptr [__real@40a00000 (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。阅读此内容以了解有关原因的更多信息 - liranuna.com/sse-intrinsics-optimizations-in-popular-compilers