在GCC中使用内嵌ARM程序集时优化已用寄存器

在GCC中使用内嵌ARM程序集时优化已用寄存器,gcc,arm,inline-assembly,cpu-registers,register-allocation,Gcc,Arm,Inline Assembly,Cpu Registers,Register Allocation,我想在我的C代码中编写一些内联ARM程序集。对于这段代码,我需要使用一个或两个寄存器,而不仅仅是声明为函数输入和输出的寄存器。我知道如何使用clobber列表告诉GCC我将使用一些额外的寄存器来进行计算 然而,我确信GCC在优化时可以自由地调整寄存器的用途。也就是说,我觉得使用固定寄存器进行计算是个坏主意 在不使用固定寄存器的情况下,使用既不是内联程序集的输入也不是输出的额外寄存器的最佳方法是什么 另外,我认为使用虚拟输出变量可能会达到目的,但我不确定会有什么奇怪的其他效果…好的,我找到了一个支

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

然而,我确信GCC在优化时可以自由地调整寄存器的用途。也就是说,我觉得使用固定寄存器进行计算是个坏主意

在不使用固定寄存器的情况下,使用既不是内联程序集的输入也不是输出的额外寄存器的最佳方法是什么


另外,我认为使用虚拟输出变量可能会达到目的,但我不确定会有什么奇怪的其他效果…

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

4.8临时登记册: 人们有时也会错误地将clobber用于临时注册。正确的方法是 组成虚拟输出,并根据允许的重叠使用“=r”或“=&r” 有了输入。GCC为伪值分配一个寄存器。区别在于 GCC可以选择一个方便的寄存器,因此它具有更大的灵活性

摘自pdf第20页


对于那些对GCC网站内联汇编的更多信息感兴趣的人来说,这是非常有启发性的。

我敢打赌这是完全可能的,但我将让一位C大师来回答这个问题。:-)我知道您可以使用寄存器别名,让编译器选择要使用的寄存器,但不记得其语法。或者你可以咬紧牙关,只需编写一个.s文件,然后将其单独组装,以获得更大的灵活性。@MichaelDorgan谢谢你的输入。我知道输入和输出寄存器是这样工作的,但我还没有看到它用于临时寄存器。。您的第二个解决方案与我需要的正好相反,它删除了更多的优化选项(输入和输出寄存器的指定)…如果您编写自己的.s文件,您就可以处理自己的优化。你控制推和弹出以及在哪里使用什么,只需要确保遵循ARM规则来保存寄存器。你是说如果我在汇编中编写整个程序?呵呵,那肯定是万不得已了;DOn AArch64上周,我发现gcc在硬编码(比如实际编写的
AddW2、%[input1]、%[input2]
)临时变量时生成了更好的代码覆盖和跟踪程序集,并对它们进行了重击,而不是执行您提到的技巧(比如
add%[fakeoutputastemp]、%[input1]、%[input2]
)。当然。我的情况:。如果您知道调用约定,您可以选择不会导致arg被推送,也不会太高的temp reg。