RISC-Vのレジスタ構成
レジスタサイズ
32bit(RV32)
64bit(RV64)
128bit(RV128)
の3種類定義済み。但し、128bitはワード幅として定義されているのみで詳細は未定義のまま。 レジスタの一般的な利用用途
以下、RegisterName(ABI name)で表記 x0(zero)
常に0を保持している。
x1(ra)
CallerがSave
x2(sp)
CalleeがSave
一般的なRISC-Vソフトウェアでは、下向きにスタックは伸張していき、スタックポインタは常に16バイトにアライメントされる。(In conventional RISC-V software, the stack grows downward with the stack pointer always being 16-byte aligned.) x3(gp)
グローバルなのでSave指定は無し
アプリケーション内でグローバル宣言したデータ (変数) を、レジスタではなく、 メモリに配置されているデータ (変数) を参照 (ロード、ストア)する際、 配置される位置に依存することのない参照 (PID) を実現するために用意されるポインタです。
x4(tp)
Save指定は無し
x5-7(t0-2)
CallerがSave
x8(s0/fp)
saved register/frame pointerとして利用
CalleeがSave
saved registerとはどうもVolatile用途として使っているっぽい
フレームポインタはフレームの中の決まった場所を指していて、例えばリターンアドレスが格納されている位置を指している。
x9(s1)
こちらはsaved registerとしてのみ使う
CalleeがSave
x10-11(a0-11)
関数呼び出しの引数または戻り値のデータストアとして利用
CallerがSave
x12-17(a2-7)
関数呼び出しの引数のデータストア
CallerがSave
x18-27(s2-11)
saved register
CalleeがSave
x28-31(t3-6)
汎用レジスタ
CallerがSave
調べてみた雑感
0クリアは頻用するからx0はありだと思う
スレッドローカルストレージとして利用できるレジスタが用意されてるのはよさげ
関数の戻り値で利用可能なレジスタが複数あるのはうれしいかもしれない
同様に関数の引数として利用可能なレジスタも多めなので効率は良いかと
参考文献