LLVM 描述 ISA 指令的接口在哪里?

问题描述 投票:0回答:1

我对 LLVM 和编译器开发总体来说是新手,但我已经读完《工程编译器第三版》,并得出结论,编译器对我来说确实可能是一个非常有趣的领域,因为我喜欢钻研低级的东西,并且刚刚有机会加入编译器项目。我正在寻找了解 LLVM 的人,为我提供定义 ISA 指令的文档或 LLVM 源代码文件。我需要使用LLVM的接口来定义项目中的指令,以自动发出ISA的所有指令。我知道特定 ISA 后端子目录中的 .td 文件,例如:

llvm-project/llvm/lib/Target/SystemZ/SystemZInstrInfo.td

及其相应的 .h 和 .cpp 文件与之有关,但这是我第一次听说 TableGen 语言,我不知道它与提供 ISA 的具体定义的 LLVM 接口有多大实际相关性指令集。欢迎任何指点和建议。

compiler-construction llvm instruction-set
1个回答
0
投票

你是对的,

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。
© www.soinside.com 2019 - 2024. All rights reserved.