RISC-Vの命令エンコーディングのなかで、Bit-Manipulationはある程度仕様が固まってきている。 命令フォーマットは以下のドキュメントに記載されている。
これをひたすら自作シミュレータの命令デコードJSONファイルに書き込んでいく。
[ {"name":"andn r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["01000", "00", "XXXXX", "XXXXX", "111", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"orn r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["01000", "00", "XXXXX", "XXXXX", "110", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"xnor r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["01000", "00", "XXXXX", "XXXXX", "100", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"slo r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["00100", "00", "XXXXX", "XXXXX", "001", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"sro r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["00100", "00", "XXXXX", "XXXXX", "101", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"rol r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["01100", "00", "XXXXX", "XXXXX", "001", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"ror r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["01100", "00", "XXXXX", "XXXXX", "101", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, {"name":"sh1add r[11:7],r[24:20],r[19:15]", "length":"32", "dlength":"32", "field": ["00100", "00", "XXXXX", "XXXXX", "010", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]}, ...
100を超える命令を実装してデコーダを吐かせてみるとエラーが検出された。どうもFSRI
命令とSROI
, RORI
のエンコーディングがぶつかっている様子。確かに、確認するとぶつかっていた。なんだこれは?
FSRI
のエンコーディング
SROI
,RORI
のエンコーディング
GitHub Issuesを確認すると、これはSORI
, RORI
のエンコーディングが過剰に予約されているようだ。immは7ビット予約されているのだがRV32の場合は上位の2ビットを0に固定、RV64の場合は上位の1ビットを1に固定する必要があるらしい。RV128の場合はすべての即値フィールドを使うのだが、その場合FSRI
は定義されない。