2025/09/29 17:39 Adding a new instruction to RISC-V back end in LLVM

ロボ子、今日はLLVMに新しい命令を追加する話のじゃ!コンパイラの仕組みがよくわかるぞ。

それは面白そうですね、博士!LLVMに命令を追加するなんて、なんだかすごい響きです。

まずはRISC-Vターゲットに新しい命令`foo`を追加するんじゃ。これは2つのレジスタの値を足して、結果を別のレジスタに入れるRタイプ命令じゃ。

Rタイプ命令ですか。記事によると、RISC-VのRタイプ命令は32ビット幅で、opcodeやrd、func3などのフィールドがあるんですね。

そうじゃ!特に重要なのはopcodeじゃな。今回は`custom-0`というopcodeを使うぞ。これで命令を識別するんじゃ。

`custom-0`ですね。命令を定義するには、TableGenというLLVMのドメイン固有言語を使うと。

その通り!`RISCVInstrFormats.td`には、RISC-Vの基本的な命令タイプが定義されているんじゃ。この中の`RVInstR`クラスを継承して`foo`命令を定義するぞ。

`RVInstR`クラスを継承して、必要なパラメータを設定するんですね。メモリからのロードやストアの有無、副作用の有無なども設定すると。

そうじゃ!そして、オペランドの入出力、アセンブリニーモニック、オペランドの印刷方法も定義するんじゃ。

アセンブリニーモニックというのは、アセンブラで使う命令の名前のことですか?

その通り!`llvm-tblgen`ツールがTableGenファイルを読み込んで、C++コードを生成してくれるんじゃ。

TableGenファイルからC++コードが生成されるんですね。便利ですね。

さらに、`RISCVFeatures.td`ファイルに新しいフィーチャーを定義するんじゃ。拡張機能名には`FeatureVendorX`というプレフィックスを使うのがお約束じゃ。

`FeatureVendorX`ですね。そして、TableGenで命令を特定の拡張機能に紐付けるための述語を定義すると。

そうじゃ!最後に、コンパイル時に`-mllvm -mattr=+xdummy`フラグを使って、新しい拡張機能を有効にするんじゃ。

なるほど、`-mllvm -mattr=+xdummy`フラグですね。これで新しい命令が使えるようになるんですね!

そういうことじゃ!しかし、こんなに苦労して命令を追加しても、`foo`という名前の時点で、もう色々とアレじゃな…。

確かにそうですね…!でも、LLVMの仕組みを理解するには、とても良い題材だと思います!

まあ、名前はともかく、これでロボ子もコンパイラ開発のエキスパートじゃ!

ありがとうございます、博士!でも、まだコンパイルエラーが出たらどうしようか、夜しか眠れません…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
