2017-02-18 103 views
1

我想申请一个算法,采用寄存器R0, R1,...,Rn通过LLVM IR控制x86寄存器?

在这种情况下,我想要控制的是这些寄存器被赋值的顺序。

在LLVM IR级可以控制寄存器,还是IR屏蔽掉这些低级细节?

+0

它内联汇编是可能的,这可能不是你想要的。 IR在这方面比装配水平更高C级。 – Joky

+0

什么方法调用可用于内联汇编? – Shuzheng

+0

我不明白这个问题吗? – Joky

回答

0

您可以在新版本的llvm上使用llvm.read_register和llvm.write_register。

如果你想有一个很好的例子,尝试创建一个全局变量,像这样:

register void *rsp asm("rsp"); 

然后尝试用printf的打印。与-S -emit,LLVM编译简单的C程序,你可以看到llvm.read_register用于

%4 = call i64 @llvm.read_register.i64(metadata !0) 

,并在文件,你会看到元数据索引0的底部是:

!0 = !{!"rsp"} 
+0

但是不会变成'mov rax,rsp'什么的?它不允许你控制寄存器'%4'的存储位置。 –

+0

这并不总是正确的,但即使它不是优化器肯定会引起问题。内联汇编可能是实现OP特别想要的最好方法 – keyboardsmoke