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

时间:2019-02-07 16:20:12

标签: c++ visual-c++ x86 x86-64 clang++

我正在开发一个需要在Linux和Windows上都可以运行的项目。
 但是,由于clangmsvc下的寄存器不同,部分代码在Linux上不起作用。

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

https://godbolt.org/z/DO9pQN

感谢您的帮助。

每个评论

EDIT
这是用于仿真器的,因此某些寄存器用于某些任务。 主要的事情之一是,我们对某个变量使用RSI,然后clang在函数调用中使用RSI。 MSVC编译不会遇到相同的问题。

每个评论

编辑2
适用于xbox 360仿真器Xenia。
我们目前正在尝试完成Linux方面的工作。但是,使用用于存储称为上下文的相同寄存器进行函数调用的clang时,我们遇到了麻烦。
我们的想法是只要求clang不使用该特定寄存器,但是我无法找到一种方法,而不仅仅是在Assembly中编写它。该解决方案的另一个问题是gcc在不同的寄存器上也可能有相同的问题。具体来说,我们正在研究ppc测试。上面的链接是clang与msvc相比的输出。

以下是相关代码:

1 个答案:

答案 0 :(得分:3)

n_points**2不能在Linux上用于您自己的目的,因为它在函数调用约定psABI-x86_64

中使用

但是,如果您可以使用其他寄存器作为通过Gcc编译的DECLARE @Month INT = 2, @Year INT = 2019 ;WITH MonthDays_CTE(DayNum) AS ( SELECT DATEFROMPARTS(@Year, @Month, 1) AS DayNum UNION ALL SELECT DATEADD(DAY, 1, DayNum) FROM MonthDays_CTE WHERE DayNum < EOMONTH(DATEFROMPARTS(@Year, @Month, 1)) ) SELECT * FROM MonthDays_CTE 代码,并且选项rsi将不使用r10demo)。