C:尝试将变量存储在特定的XMM寄存器中

时间:2011-03-19 16:39:32

标签: c sse

我正在开发一个涉及SSE内在函数和XMM寄存器的项目,我想使用所有提供的16个寄存器。我试图明确告诉编译器这样做,但它似乎没有工作。例如,我可能会写一个这样的一行:

register __m128 foo __asm__("xmm12") = _mm_setzero_ps();

foo将存储在寄存器xmm12中,并初始化为零(我稍后会添加到foo等)

问题是,当我查看汇编代码时,xmm12没有在任何地方使用,即使它在代码中实际上是必要的,我告诉编译器使用该寄存器。

我很难搞清楚自己做错了什么。我的语法不正确吗?编译器是否忽略了我所说的内容,如果是这样,为什么?

任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

我刚尝试使用gcc 4.2进行实验,看起来你只能用-O0成功指定XMM寄存器。一旦打开优化,gcc就会改变寄存器分配。所以看起来你可以完全控制并手动完成所有优化,只要你真的想要,只要你使用gcc -O0,否则让gcc为你处理优化和注册分配。

答案 1 :(得分:0)

事实证明,真正的问题不在于'register'关键字。编译器忽略了这一点;这是一个愚蠢的想法。最终我要做的就是将我的'for'循环展开几次,而不是我已经拥有的。最后,这使我的代码更快,恰好使用了更多的寄存器。我错误地认为“使用更多的寄存器会导致更快的代码”,当寄存器使用更多的是副作用时。

感谢您的帮助!