RISC-Vの命令セットは、riscv.orgに掲載されているRISC-V User-Level ISA Manual V2.2 を見ればほとんどを把握することができる。
また、RISC-V Reader(日本語版 RISC-V 原典) にも命令セット一覧表が掲載されており、これを見ればRISC-Vの命令セットの概要を把握することができ、しかもRISC-Vの命令数は比較的少ないとあってかなり分かりやすい。
しかし、いちいち命令のエンコーディングや命令フォーマットを検索するのに(特に最近はLLVMにハマっていてRISC-Vのエンコーディングを調べる機会が多いのだ)、いちいちpdfを検索するのはAdobe Readerの検索性が低いので面倒だし、RISC-V Readerも紙媒体なので目で検索するのに時間がかかる。
だったら自分でWebで参照できるページを作ればいいじゃないということで、自作でRISC-Vの命令セット一覧表のWebページを作ることにした。
私の把握しているRISC-Vの命令セットはほとんど抑えたはずだ。これからはこちらのページを研鑽していって、なるべくPDFを開かなように努力していきたい。
このページはどうやって作ったかというと、自分で手動で作るのは手間がかかるので、自作RISC-V ISSの命令デコーダの力を借りることにした。
以下のように、json形式でRISC-Vの命令エンコーディングをすべて格納している。実際にRISC-V命令セットシミュレータでは、これをスクリプトで処理して命令デコーダを自動生成するようにしている。 これを活用するわけだ。
[ { "name":"lui r[11:7],h[31:12]", "length":"32", "dlength":"32", "field": ["XXXXX", "XX", "XXXXX", "XXXXX", "XXX", "XXXXX", "01101", "11"], "category":"ALU", "func_suffix":"", "impl":[""], "inst_ctrl":["RD_R3", "OP_SIGN_ADD", "IMM_U"] }, { "name":"auipc r[11:7],h[31:12]", "length":"32", "dlength":"32", "field": ["XXXXX", "XX", "XXXXX", "XXXXX", "XXX", "XXXXX", "00101", "11"], "category":"ALU", "func_suffix":"", "impl":[""], "inst_ctrl":["R1_PC", "RD_R3", "OP_SIGN_ADD", "IMM_U"] }, ...
という訳で、命令のビットフィールド一覧表は上記のjsonを使って(ほぼ)自動的に吐き出した。もちろん、一部おかしいところがあるのでそれは修正したけれども。
次に、命令の説明については、RISC-V User-Level ISA Manualの英文からそれらしいものをひたすら引き抜いていった。 ここは自動生成ではないのでかなり時間がかかる。もっといい方法、というかまとめページがあればよかったのだが、なかったので手動で頑張った(まあ無かったのでこういうページを作ろうと思ったのだけれど)。
さらに、命令の動作について形式的な記法で一覧しているページがない。こういうやつ。
なので、この部分はRISC-V Readerの命令セット一覧表から拝借した。RISC-V Readerは、英語版と日本語版は有料配布だけれども、中国語版、スペイン語版、ポルトガル語版は無料で配布されている。 なんという太っ腹。 というかなぜそんななか日本語版は有料なのだ。。。
さらに面倒なのはC系列の命令だ。16ビットでデコードするような形式でISSに格納していなかったので、ほとんど手動で修正した。これが一番時間がかかった。
とりあえず、Restructured Textで作ったので、ローカルで確認する分にはリポジトリをダウンロードしてmake
するだけで参照できる。
git clone https://github.com/msyksphinz/riscv-isa-pages.git cd riscv-isa-pages make html # build/html にHTMLページが作られる。
これをとりあえずriscv-isadoc
リポジトリにコピーした。ちょっとやり方がダサいのだが、ほかに良い方法があったら教えてほしい。
cp -r $(Restructured Textのリポジトリ)/build/html/* $(GitHub Pagesのリポジトリ)/
これで上記のリンク先のウェブサイトが表示されるようになっている。どうにかして2つのリポジトリをマージする方法はないものか。エンコーディングの間違いなどの指摘やPull Requestは大歓迎なのだが、リポジトリが2つに分かれれているとPull Requestもどちらに送ればよいのかわかりにくいし格好悪い。
あと、追記したい情報もたくさんある。CSRの情報やABIの情報なども一括で管理しておきたい。このあたりは拡張していくつもり。