是否可以在不使用汇编的情况下告诉clang哪些寄存器用于代码的某些部分

Is it possible to tell clang which registers to use for certain parts of the code without using assembly

本文关键字:clang 寄存器 用于 些部 代码 情况下 汇编 是否      更新时间:2023-10-16

我正在进行一个项目,该项目要求它同时在Linux和Windows上运行
但是,由于clangmsvc下的寄存器不同,有些代码在Linux上不起作用。

是否有方法使寄存器使用一致或请求clang在操作期间使用特定寄存器?我想找到一个不涉及重写程序集中部分的解决方案。以下是我所说的不同输出代码。

https://godbolt.org/z/DO9pQN

感谢您的帮助。

编辑每条注释:
这是用于模拟器的,因此某些寄存器用于某些任务。其中一件主要的事情是,我们对某个变量使用RSI,然后clang在函数调用中使用RSI。编译的MSVC不会遇到同样的问题。

编辑2每条评论:
这是针对xbox360模拟器Xenia的
我们目前正在努力完成Linux方面的工作。然而,clang在函数调用中使用与存储上下文相同的寄存器时遇到了问题
我们的想法是要求clang不要使用那个特定的寄存器,但如果不在Assembly中写下来,我就找不到方法。该解决方案的另一个问题是gcc在不同的寄存器上可能也有相同的问题。具体来说,我们正在研究ppc测试。上面的链接是clang与msvc相比的输出。

以下是相关代码:

  • https://github.com/xenia-project/xenia/blob/e79e18bb271212b13bcb65a610d957b6058f34db/src/xenia/cpu/backend/x64/x64_backend.cc

  • https://github.com/xenia-project/xenia/blob/master/src/xenia/cpu/ppc/testing/ppc_testing_main.cc

rsi不能在linux上用于您自己的目的,因为它在函数调用约定psABI-x86_64 中使用

但是,如果您可以使用其他寄存器作为用Gcc编译的r10代码,并且选项-ffixed-r10将不使用r10(演示)。