我试图找出一种有效的方法将编译时常量浮点数加载到SSE(2/3)寄存器中.我试过做这样简单的代码,
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
Run Code Online (Sandbox Code Playgroud)
但是这会从内存中生成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)]
Run Code Online (Sandbox Code Playgroud)
它将标量加载到内存中......(?!?!)
这样做虽然..
float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
Run Code Online (Sandbox Code Playgroud)
产生.
movaps xmm5,xmmword ptr [::myarray4 (140512050h)]
Run Code Online (Sandbox Code Playgroud)
理想情况下,如果我有常量它们将是一种不甚至触摸内存的方式并且只是使用直接样式指令(例如编译到指令本身的常量).
谢谢
我已经将我的大部分SIMD代码转换为GCC的向量扩展.但是,我没有找到一个很好的广播解决方案,如下所示
__m256 areg0 = _mm256_broadcast_ss(&a[i]);
Run Code Online (Sandbox Code Playgroud)
我想要做
__m256 argeg0 = a[i];
Run Code Online (Sandbox Code Playgroud)
如果你通过使用SSE常数看到我在Mutiplying向量的答案,我设法让广播与另一个SIMD寄存器一起工作.以下作品:
__m256 x,y;
y = x + 3.14159f; // broadcast x + 3.14159
y = 3.14159f*x; // broadcast 3.14159*x
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
__m256 x;
x = 3.14159f; //should broadcast 3.14159 but does not work
Run Code Online (Sandbox Code Playgroud)
我怎样才能用GCC做到这一点?