在GCC中使用内联ARM汇编时优化使用的寄存器

时间:2012-01-04 00:11:48

标签: gcc arm inline-assembly cpu-registers register-allocation

我想在我的C代码中编写一些内联ARM程序集。对于这段代码,我需要使用一个或两个寄存器,而不仅仅是声明为函数输入和输出的寄存器。我知道如何使用clobber列表告诉GCC我将使用一些额外的寄存器来进行计算。

但是,我确信GCC可以自由地调整哪些寄存器用于优化时的内容。也就是说,我觉得使用固定寄存器进行计算是一个坏主意。

在不使用固定寄存器的情况下,使用一些既不是输入也不输出内联汇编的额外寄存器的最佳方法是什么?

P.S。我当时认为使用虚拟输出变量可能会成功,但我不确定会有什么样的奇怪的其他效果...

1 个答案:

答案 0 :(得分:5)

好的,我找到了一个源代码,它支持使用虚拟输出而不是硬寄存器的想法:

  

4.8临时登记册:   人们有时也会错误地使用clobbers来进行临时登记。正确的方法是   组成虚拟输出,并根据允许的重叠使用“= r”或“=& r”   与输入。 GCC为虚拟值分配寄存器。不同之处在于   GCC可以选择一个方便的寄存器,因此它具有更高的灵活性。

来自this pdf。

的第20页

对于任何对GCC this网站的内联汇编感兴趣的人都非常有帮助。