TableGen

LLVM のドメイン特化記述言語およびそのジェネレータ。ターゲット記述ファイル (.td) に書かれたレジスタ・命令・呼び出し規約などの宣言から、C++ のヘルパー (.inc ファイル) を生成する。LLVM バックエンドの「定型的だが膨大な」テーブルを宣言的に一元管理するための仕組み。LLVM RISC-V バックエンド MYRISCVX の実装で使用 (llvm-riscv-backend)。

役割

  • .td (ターゲット記述ファイ): op の定義 / レジスタの定義 / 呼び出し規約 を記述する。
  • TableGen がこれを処理し .inc を生成、C++ 側がインクルードして使う。Web 上の情報が少なく手探りになりやすい領域。

レジスタ定義

  • MYRISCVXReg を継承した各レジスタクラス (MYRISCVXGPRReg 等) を定義。
  • 値型をモードで切替: def XLenVT: ValueTypeByHwMode<[RV32, RV64, DefaultMode], [i32, i64, i32]> でレジスタサイズを抽象化。
  • def GPR で全レジスタをまとめる。RegInfo<レジスタサイズ, ram へ spill out するサイズ, spill 時のアライン> でスピル挙動を規定。

命令定義

DAG パターンと命令を束ねる:

class MYRISCVXInst<dag outs, dag ins, string asmstr, list<dag> pattern> {
  bits<7> opcode;
  asmstr;   // アセンブリ表記
  pattern;  // 命令選択でマッチさせる DAG パターン
  itin;
}

pattern が命令選択 (instruction-selection-register-allocation) のマッチ規則になり、IR の DAG 部分木をこの命令へ写す。

関連