Sca*_*orn 4 c++ llvm llvm-clang
假设我在目标机器中有两个寄存器计算块:I和X.一个可以只对I寄存器应用整数运算,对X寄存器应用整数和浮点运算.还有两种类型的指令:
def ADDIi32 : MyInstruction< ..., (outs I:$Rs), (ins I:$Rm, I:$Rn), [(set i32:$Rs, (add i32:$Rm, i32:$Rn)]>;
...
def ADDXi32 : MyInstruction< ..., (outs X:$Rs), (ins X:$Rm, X:$Rn), [(set i32:$Rs, (add i32:$Rm, i32:$Rn)]>;
def ADDXf32 : MyInstruction< ..., (outs X:$Rs), (ins X:$Rm, X:$Rn), [(set f32:$Rs, (fadd f32:$Rm, f32:$Rn)]>;
...
Run Code Online (Sandbox Code Playgroud)
它们的编码方式不同,并且具有不同的asmstrings.所以llvm可以映射
int a, b;
a = a + b;
Run Code Online (Sandbox Code Playgroud)
到ADDIi32或ADDXi32但是
float a, b;
a = a + b;
Run Code Online (Sandbox Code Playgroud)
仅映射到ADDXf32.
我希望LLVM在可能的情况下使用ADDIi32,但不幸的是我发现没有办法告诉它一个指令(或寄存器)"成本"比另一个更高.Register类中的CostPerUse似乎是候选者,但它定义了组中其他寄存器的成本,而不是所有寄存器中的成本.我看到一些线程声称AddedComplexity(带有歧义描述的Instruction类中的字段)控制选择模式但不做任何事情.
LLVM似乎选择了第一条匹配指令.当我在ADDIi32之前定义ADDXf32和ADDXi32时,它只对任何类型的数据使用X函数.当我在ADDXf32和ADDXi32之前定义ADDIi32时,它使用I指令来表示整数数据但是没有任何内容可以浮动数据(很奇怪).我想我可以在ADDXf32和ADDXi32之间插入ADDIi32,但它们目前处于不同的.td文件中,看起来不像是长期解决方案.
有任何想法吗?
请注意,声明的顺序不会影响指令选择:LLVM只能通过首先匹配更复杂的模式进行排序(这是AddedComplexity所影响的 - 注意增加AddedComplexity会增加匹配模式的机会),通过匹配指令与较小的CodeSize进行绞合,最后决定性的,不确定的.因此,您不能依赖声明的顺序.
编辑:我原来答案的以下部分实际上并不适用于您的问题 - 请参阅http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-September/010828.html.特别是:
在寄存器分配之前,ISel模式与DAG匹配.所以ISel模式不能考虑寄存器类.如果选择了该指令,则模式中的寄存器类是寄存器分配器的选择约束,而不是选择该模式的约束.
除了I和X寄存器类之外,您还应该有一个"IntRegsRegClass"或类似的,在其中添加I和X寄存器.(这是您在其上调用addRegisterClass的reg类.)
在此寄存器类中添加寄存器的顺序决定了首选的分配顺序.