diff --git a/main.asciidoc b/main.asciidoc new file mode 100644 index 0000000..b0b4dfd --- /dev/null +++ b/main.asciidoc @@ -0,0 +1,85 @@ += 自作ISAのためのLLVMバックエンドを書く薄い本(予定) +艮 鮟鱇 +:toc: left + +== LLVMバックエンド概略 + +FIXME: 人がLLVMバックエンドを書きたくなるような文章をここに書く。 + +== 参考にすべき文献 + +== ISAの仕様を決める + +=== CAHPv3アーキテクチャ仕様 + +== アセンブラを作る + +=== LLVMをビルドする +=== スケルトンバックエンドを追加する +=== 簡易的なアセンブラを実装する +=== `CAHPInstPrinter` を実装する +=== テストを書く +=== メモリ演算を追加する +=== 属性を指定する +=== ディスアセンブラを実装する +=== relocationとfixupに対応する +=== `%hi` と `%lo` に対応する +=== `li a0, foo` をエラーにする +=== llvm-objdump の調査 +=== `hlt` 疑似命令を追加する + +== コード生成部を作る + +=== コンパイラのスケルトンを作成する +=== 基本的な演算に対応する +=== 定数の実体化に対応する +=== メモリ演算に対応する +=== relocationに対応する +=== 条件分岐に対応する +=== 関数呼び出しに対応する +=== 関数プロローグ・エピローグを実装する +=== frame pointer eliminationを実装する +=== `select` に対応する +=== `FrameIndex` をlowerする。 +=== 大きなスタックフレームに対応する +=== `SETCC` に対応する +=== `ExternalSymbol` に対応する +=== jump tableを無効化する +=== インラインアセンブリに対応する +=== fastccに対応する + +== Cコンパイラに仕立てる + +=== LLDにCAHPバックエンドを追加する +=== ClangをCAHPに対応させる +=== `crt0.o` と `cahp.lds` の導入 +=== `--nmagic` の有効化 +=== libcの有効化 + +== まともなコードを生成する + +=== 分岐解析に対応する +=== branch relaxationに対応する +=== 16bit命令を活用する +=== `jal` を活用する +=== 命令スケジューリングを設定する +=== 末尾再帰に対応する + +== 落ち穂拾い + +=== スタックを利用した引数渡し +=== `byval` の対応 +=== 動的なスタック領域確保に対応する +=== emergency spillに対応する +=== 可変長引数関数に対応する +=== 単体の `sext/zext/trunc` に対応する +=== 乗算に対応する +=== 除算・剰余に対応する +=== `frameaddr/returnaddr` に対応する +=== `ROTL/ROTR/BSWAP/CTTZ/CTLZ/CTPOP` に対応する +=== 32bitのシフトに対応する +=== 間接ジャンプに対応する +=== `BlockAddress` のlowerに対応する + +[bibliography] +== 参考文献