我正在开发一个涉及SSE内在函数和XMM寄存器的项目,我想使用所有提供的16个寄存器。我试图明确告诉编译器这样做,但它似乎没有工作。例如,我可能会写一个这样的一行:
register __m128 foo __asm__("xmm12") = _mm_setzero_ps();
foo
将存储在寄存器xmm12
中,并初始化为零(我稍后会添加到foo等)
问题是,当我查看汇编代码时,xmm12
没有在任何地方使用,即使它在代码中实际上是必要的,我告诉编译器使用该寄存器。
我很难搞清楚自己做错了什么。我的语法不正确吗?编译器是否忽略了我所说的内容,如果是这样,为什么?
任何帮助都会非常感激!
答案 0 :(得分:0)
我刚尝试使用gcc 4.2进行实验,看起来你只能用-O0成功指定XMM寄存器。一旦打开优化,gcc就会改变寄存器分配。所以看起来你可以完全控制并手动完成所有优化,只要你真的想要,只要你使用gcc -O0
,否则让gcc为你处理优化和注册分配。
答案 1 :(得分:0)
事实证明,真正的问题不在于'register'关键字。编译器忽略了这一点;这是一个愚蠢的想法。最终我要做的就是将我的'for'循环展开几次,而不是我已经拥有的。最后,这使我的代码更快,恰好使用了更多的寄存器。我错误地认为“使用更多的寄存器会导致更快的代码”,当寄存器使用更多的是副作用时。
感谢您的帮助!