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

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

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

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

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

附注我认为使用虚拟输出变量可能会达到目的,但我不确定会产生什么样的奇怪的其他效果......

最佳答案

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

4.8 Temporary registers: People also sometimes erroneously use clobbers for temporary registers. The right way is to make up a dummy output, and use “=r” or “=&r” depending on the permitted overlap with the inputs. GCC allocates a register for the dummy value. The difference is that GCC can pick a convenient register, so it has more flexibility.

来自 this 第 20 页pdf.

对于任何对 GCC 内联汇编感兴趣的人 this事实证明该网站非常有启发性。

关于gcc - 在 GCC 中使用内联 ARM 汇编时优化所用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720493/

相关文章:

linux - linux ubuntu 16 32bit 上,DrPaulcarter 汇编语言教程,undefined reference 错误

python - GCC 插件、GCC Melt 或 gcc Python 插件来编写 gcc 扩展

c++ - 使用 boost 映射包含的结构

c++ - 如何让 ld 将多重定义的结构/类视为错误?

c++ - 使用 union (封装在结构中)绕过 neon 数据类型的转换

c++ - 交叉编译和直接在目标上编译时所需的 GCC arm 选项之间的区别?

c - 在汇编/C 中使用 offsetof

c# - MSBUILD 是否在 ARM-CPU 上运行?

c++ - SIGSEGV 使用汇编访问数组元素时

assembly - 如何使用内联汇编访问堆栈基指针(rbp)?