我对 LLVM 和编译器开发总体来说是新手,但我已经读完《工程编译器第三版》,并得出结论,编译器对我来说确实可能是一个非常有趣的领域,因为我喜欢钻研低级的东西,并且刚刚有机会加入编译器项目。我正在寻找了解 LLVM 的人,为我提供定义 ISA 指令的文档或 LLVM 源代码文件。我需要使用LLVM的接口来定义项目中的指令,以自动发出ISA的所有指令。我知道特定 ISA 后端子目录中的 .td 文件,例如:
llvm-project/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
及其相应的 .h 和 .cpp 文件与之有关,但这是我第一次听说 TableGen 语言,我不知道它与提供 ISA 的具体定义的 LLVM 接口有多大实际相关性指令集。欢迎任何指点和建议。
你是对的,
llvm-project/llvm/lib/Target/<Arch>/<Arch>InstrInfo.td
文件通常保存ISA的定义。具体来说,该文件包含 ISA 中所有指令的定义。
然而,
SystemZ
文件是手写的,由于结构不规则,有点难以理解。
查看相应的Hexagon
文件。
上面链接的文件中的第一条指令是:
def A2_abs : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = abs($Rs32)",
tc_d61dfdc3, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000100;
let Inst{31-21} = 0b10001100100;
let hasNewValue = 1;
let opNewValue = 0;
let prefersSlot3 = 1;
}
A2_abs
是llvm内的指令名称HInst
tblgen 类,包含所有 Hexagon
指令,它在 here 定义。outs
- 输出参数ins
- 输入参数IntRegs
- 寄存器类(允许在此处使用的所有寄存器的集合),定义于here。$Rd32
和 $Rs32
- 参数名称。"$Rd32 = abs($Rs32)"
- 汇编字符串,用于汇编打印。tc_d61dfdc3
- 指令行程类,包含所有调度约束,相关代码位于llvm-project/llvm/lib/Target/Hexagon/HexagonSchedule*.td
。TypeS_2op
- 指令子类,特定于 Hexagon。