FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LLVM

オリジナルLLVM Backendを追加しよう (20. 算術演算命令の追加)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 資料としては Tutorial: Creating an LLVM Backend for the Cpu0 Architecture を使用している。やっとChapter-4だ。 今回からは…

オリジナルLLVM Backendを追加しよう (19. 大きな値の生成)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 Cpu0チュートリアルの、ch3_largeframe.bcをうまくアセンブリ生成することができない。 大きな値を作成するために、MYRISCVXAnal…

オリジナルLLVM Backendを追加しよう (17. 命令フォーマット増強)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 関数コールに対応するためには、EmitPrologueおよびEmitEpilogueを実装しなければならない。 このためには、ロードストア命令・…

オリジナルLLVM Backendを追加しよう (17. フレーム処理)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 関数呼び出しの際のフレームを生成する。これはCpu0 BackendのChapter3_5に相当するところだ。 これがうまくいくと、main()関数…

オリジナルLLVM Backendを追加しよう (16. SelDAGtoDAGの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 SelectionDAGを追加している。きつねさんLLVM本曰く、SelDAGtoDAGというのは、 LLVM IR から SelectionDAG を経由して MI Layer…

オリジナルLLVM Backendを追加しよう (15. RISC-Vオリジナルターゲットの作り直し)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 Chapter-3のサイズの大きなスタックフレームの処理に関して、どうにも解決できずに悩んでいる。 とりあえず最初から全体的に見直…

オリジナルLLVM Backendを追加しよう (14. RISC-V命令フィールド登録の見直し)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 Chapter-3のサイズの大きなスタックフレームの処理に関して、どうにも解決できずに悩んでいる。 とりあえず最初から全体的に見直…

RISC-V 64-bit LLVM Backendを試す (13. Return文生成の解析)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで、簡単なReturn命令は生成されるようになったが、まだ-O2オプションを付加しないとエラーが発生する。 EmitPrologueと…

RISC-V 64-bit LLVM Backendを試す (12. EmitPrologueとEmitEpilogueを実装したい)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで、簡単なReturn命令は生成されるようになったが、まだ-O2オプションを付加しないとエラーが発生する。 次はCpu0 Backe…

RISC-V 64-bit LLVM Backendを試す (11. 簡単なReturn命令を生成する)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 簡単なReturn IRが変換できるように実装を進めていこう。 実装するのに見ている関数群は以下のようなものだが、まず関数の意味が…

RISC-V 64-bit LLVM Backendを試す (10. サブターゲットのエラーを解析する)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 少しずつ進んでいるが、まだターゲットのプログラムを正しくバイナリに変換することができない。 SubtargetFeature.cppを確認し…

RISC-V 64-bit LLVM Backendを試す (9. IDAGtoDAGの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで独自アーキテクチャのオプション(MYRISCVX)をllcに表示できるようになった。 実行してみると、アサーションで落ちる問…

RISC-V 64-bit LLVM Backendを試す (7. AsmPrinterの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで独自アーキテクチャのオプション(MYRISCVX)をllcに表示できるようになった。 しかしまだいろいろ追加していないので、…

RISC-V 64-bit LLVM Backendを試す (6. Subtargetの確認とllcの動作確認)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 まだ現時点ではビルドにすら成功していないが、徐々に修正しながら必要なものを追加してビルドしている。 前回までのビルドした…

RISC-V 64-bit LLVM Backendを試す (5. 基本的なファイルの追加とビルド)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 まだ現時点ではビルドにすら成功していないが、徐々に修正しながら必要なものを追加してビルドしている。 ビルドを通すためには…

RISC-V 64-bit LLVM Backendを試す (4. SubtargetとProcessor Model)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 まだ現時点ではビルドにすら成功していないが、徐々に修正しながら必要なものを追加してビルドしている。 まず、ターゲットアー…

RISC-V 64-bit LLVM Backendを試す (3. TargetMachineとTargetInfoを追加する)

LLVMについて理解するために、RISC-Vをネタにしていろいろ勉強してみたい。 Release 7.0では一応RISC-Vの32-bitと64-bit版がサポートされているようなので、ビルドに追加して様子を見てみる。 次はRISCV_msyksphinzのターゲットアーキテクチャについて定義し…

RISC-V 64-bit LLVM Backendを試す (2. 独自RISC-V実装を追加する。アーキテクチャの追加とレジスタ)

LLVMについて理解するために、RISC-Vをネタにしていろいろ勉強してみたい。 Release 7.0では一応RISC-Vの32-bitと64-bit版がサポートされているようなので、ビルドに追加して様子を見てみる。 ここで追加するのは、新しい"RISCV_msyksphinz"というアーキテク…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(15. 関数コール2)

Cpu0のバックエンドをLLVMに追加するプロジェクト、9章の後半では、関数コールの様々な方法についてみてみる。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が…

RISC-V 64-bit LLVM Backendを試す

LLVMについて理解するために、RISC-Vをネタにしていろいろ勉強してみたい。 Release 7.0では一応RISC-Vの32-bitと64-bit版がサポートされているようなので、ビルドに追加して様子を見てみる。 $ cmake -G Ninja -DCMAKE_BUILD_TYPE="Debug" -DLLVM_TARGETS_T…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(14. 関数コール)

Cpu0のバックエンドをLLVMに追加するプロジェクト、9章では、さまざまな形の関数コールをサポートする。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多く、…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(13. 制御文のサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、8章では、if文などの制御文をサポートする。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多く、ソースコ…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(12. Int型以外のサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、7章では、これまでint型だけであった型のサポートを拡張する。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(11. グローバル変数のサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、6章では、グローバル変数のアクセスをサポートする。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多く、…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(10. Objectファイルのサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、第5章に入った。オブジェクトファイルのサポートを行う。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(9. 算術演算命令の追加)

Cpu0のバックエンドをLLVMに追加するプロジェクト、今回からは4章に入って、算術論理演算命令を追加する。まずは算術演算から。 算術演算において、特殊な演算ケースの場合は演算を最適化できる場合がある。この方式についても見ていく。 実装は以下。cpu0_c…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(8. BackEnd追加のまとめ2.)

Cpu0のバックエンドをLLVMに追加するチュートリアル、第3章(?)のBackendの追加の章をやり終えた。 やり終えたといっても、ひたすら写経して、ビルドして、テストパタンを動かして終わりである。 これではさすがにもったいないので、もう少しまとめておきた…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(8. BackEnd追加のまとめ1.)

Cpu0のバックエンドをLLVMに追加するチュートリアル、第3章(?)のBackendの追加の章をやり終えた。 やり終えたといっても、ひたすら写経して、ビルドして、テストパタンを動かして終わりである。 これではさすがにもったいないので、もう少しまとめておきた…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(7. Cpu0 Architecture and LLVM Structure 続き)

LLVMにCpu0アーキテクチャを追加するチュートリアル。ちょっと飛ばしすぎたので一度立ち戻って、LLVMのアーキテクチャについてもう一度勉強し直す。 LLVMにバックエンドを追加するチュートリアル の Cpu0 architecture and LLVM structure をもう一度読み直…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(6. Cpu0 Architecture and LLVM Structure 続き)

LLVMにCpu0アーキテクチャを追加するチュートリアル。ちょっと飛ばしすぎたので一度立ち戻って、LLVMのアーキテクチャについてもう一度勉強し直す。 LLVMにバックエンドを追加するチュートリアル の Cpu0 architecture and LLVM structure をもう一度読み直…