RISC-V の ISA

\[ \newcommand{dn}[3]{\frac{\mathrm{d}^{#3} #1}{\mathrm{d} #2^{#3}}} \newcommand{\d}[2]{\frac{\mathrm{d} #1}{\mathrm{d} #2}} \newcommand{\dd}[2]{\frac{\mathrm{d}^2 #1}{\mathrm{d} {#2}^2}} \newcommand{\ddd}[2]{\frac{\mathrm{d}^3 #1}{\mathrm{d} {#2}^3}} \newcommand{\pdn}[3]{\frac{\partial^{#3} #1}{\partial {#2}^{#3}}} \newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}} \newcommand{\pdd}[2]{\frac{\partial^2 #1}{\partial {#2}^2}} \newcommand{\pddd}[2]{\frac{\partial^3 #1}{\partial {#2}^3}} \newcommand{\p}{\partial} \newcommand{\D}[2]{\frac{\mathrm{D} #1}{\mathrm{D} #2}} \newcommand{\Re}{\mathrm{Re}} \newcommand{\Im}{\mathrm{Im}} \newcommand{\bra}[1]{\left\langle #1 \right|} \newcommand{\ket}[1]{\left|#1 \right\rangle} \newcommand{\braket}[2]{\left\langle #1 \middle|#2 \right\rangle} \newcommand{\inner}[2]{\left\langle #1 ,#2 \right\rangle} \newcommand{\l}{\left} \newcommand{\m}{\middle} \newcommand{\r}{\right} \newcommand{\f}[2]{\frac{#1}{#2}} \newcommand{\eps}{\varepsilon} \newcommand{\ra}{\rightarrow} \newcommand{\F}{\mathcal{F}} \newcommand{\L}{\mathcal{L}} \newcommand{\t}{\quad} \newcommand{\intinf}{\int_{-\infty}^{+\infty}} \newcommand{\R}{\mathcal{R}} \newcommand{\C}{\mathcal{C}} \newcommand{\Z}{\mathcal{Z}} \newcommand{\bm}[1]{\boldsymbol{#1}} \]

RV32I

レジスタ一覧

id name
x0 zero 値はゼロで固定
x1 ra 戻りアドレス
x2 sp スタックポインタ
x3 gp グローバルポインタ
x4 tp スレッドポインタ
x5~x7 t0~t3 一時レジスタ(関数呼び出し前後で保持されない)
x8 fp フレームポインタ
x8~x9 s0~s1 保存レジスタ(関数呼び出し前後で保持される)
x10~x11 a0~a1 関数の引数/返値
x12~x17 a2~a7 関数の引数
x18~x27 s2~s11 保存レジスタ
x28~x31 t3~t6 一時レジスタ
pc プログラムカウンタはレジスタとしてアクセスできない

命令フォーマット

ロード

x[rd] = sext?( M[x[rs1] + sext(imm)] [7?15?31? : 0] )

b(byte)/h(halfword)/w(word)で,メモリから読み出す長さを決めます.

()signed/(u)unsigned で,メモリから持ってきた値を符号拡張するかを決めます.

ストア

M[ x[rs1] + sext(imm) ] = x[rs2] [7?15?31?:0]

b(byte)/h(halfword)/w(word)で,メモリに書き込む長さを決めます.

RV32C

命令長を 16bit にした圧縮命令セット。