我想强制LLVM生成CMPx
- ,TEST
- 并且x86-64上的相似指令仅限于8位宽度,例如强制执行32bit-int比较为四个独立的cmp +分支对。这显然需要一些位掩码和增加的指令数。
我可以通过简单地“禁用”x86-64的某些指令来实现这一点,以便LLVM自动生成所需的胶水代码吗?我是否必须自己写一张通行证并在IR上工作?
答案 0 :(得分:1)
不,没有办法从LLVM的vanilla构建中禁用这样的某些指令。您要做的任何事情都需要修改LLVM。
您可以使用多种方法修改LLVM:
您可以将特定于x86的传递添加到LLVM 后端(在IR上不起作用),直接将cmp
和test
指令扩展为子寄存器上的指令链。在指令选择之后,您必须执行此操作以阻止某些与目标无关的传递撤消转换。这在LLVM用语中称为“MI”传递。例如,您可以查看X86FixupSetCC.cpp
(mirror here)。这有一个巨大的优势,你可以把它放在一个标志后面,否则一旦你添加核心功能就会控制它。
您可以在X86 .td files中修改LLVM的LLVM指令表,仅为8位寄存器定义这些指令,然后将def Pat<...>;
模式添加到允许程序的.td文件中通过更广泛的比较仍然可以选择他们的指令(就像上面科林所建议的那样)。这样做的缺点是你不仅修改了你的LLVM,而且还不能轻易地在某些标志后面打开和关闭这些修改。
你不能对LLVM的IR做任何事情,因为代码生成器只会将事物优化回你试图避免的指令模式。
希望这有帮助!
答案 1 :(得分:0)
您可能要做的是重新定义x86 .td文件中的降低模式。这些代码看起来像&#34; def Pat&lt; ...&gt ;;&#34;它定义了从一个指令图到另一个指令图的转换。从IR比较指令到x86 32位比较指令应该有一种模式。您将要编辑此模式,而是输出您的比较序列。