萌えハッカーニュースリーダー

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

出典: https://blog.gustavoleite.me/llvm-riscv-instruction
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

ありがとうございます、博士!でも、まだコンパイルエラーが出たらどうしようか、夜しか眠れません…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search