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 部分木をこの命令へ写す。