まず簡単のため、4bitの符号なし2進数の加算を考え、結果を4bitの領域に格納することを考えたい。この時、加算する2つの数が1111と1111であれば、その結果は11110となり5bitとなるため、4bitの領域に格納することができず、1bitの桁あふれが発生してしまう。これをオーバーフローと呼ぶ。RISC-Vのadd命令でこのようなオーバーフローが起こった時は最上位のbitが無視され、上記の例で言えば1110が目的の領域に格納される。
ここからは、一般の符号付き2進数の加算について、演算によってオーバーフローを起こしたかどうかを判定することを考える。一部のアーキテクチャではキャリービットと呼ばれるビットがレジスタの一部に用意されており、専用の命令を用いることでオーバーフローを起こしたかどうかがキャリービットに記録される仕組みになっている。しかしながらRISC-Vではキャリービットは用意されておらず、オーバーフローを起こしたかどうかについてはプログラムで判定する必要がある。たとえば、加算によってオーバーフローが起こったかどうかについては、次のようにして判定することができる。
add a0, a1, a2 #この加算でOverflowが起きたかを判定したい
slti a3, a2, 0 #a2が0より小さければa3に1を、そうでなければ0を入れる
slt a4, a0, a1 #a0がa1より小さければa4に1を、そうでなければ0を入れる
bne a3, a4, overflow
slti及びsltは符号付き整数としての比較命令となる。符号なし整数として比較を行いたい場合には、sltu及びsltiu命令を利用することができる。
浮動小数点数の計算は、これまで用いてきた整数レジスタであるa0~a7とは別のレジスタで行う。 このうち、fa0~fa7は 64bitの浮動小数点レジスタで、関数の引数を受け取るのに使われる。(使われる順番はこの順番である。)また、a0~a7と同様に揮発性レジスタである)。これらは汎用レジスタと同様、64bitである。他のレジスタとして、ft0~ft11は揮発性レジスタ、fs0~fs11は非揮発性レジスタとなっている。関数の返り値はfa0に入れて返す。
これまでに利用してきた整数レジスタ用の命令は、浮動小数点数の計算には転用できない。例えば、a0の指す先から浮動小数点レジスタf0にデータをロードしようとして
ld fa0, 0(a0)
と書くのは誤りであり、浮動小数点レジスタ用の命令を用いる必要がある。主な浮動小数点レジスタ用の命令は下記の通りである。
# fa1+fa2を計算し、fa0に入れる。
fadd.d fa0,fa1,fa2
# fa1-fa2を計算し、fa0に入れる。
fsub.d fa0,fa1,fa2
# fa1*fa2を計算し、fa0に入れる。
fmul.d fa0,fa1,fa2
# fa1/fa2を計算し、fa0に入れる。
fdiv.d fa0,fa1,fa2
# fa1の中身をfa0にコピーする。
fmv.d fa0,fa1
# fa0とfa1が等しければa0に1を、そうでなければa0に0を入れる。
feq.d a0,fa0,fa1
# fa0がfa1より小さければa0に1を、そうでなければa0に0を入れる。
flt.d a0,fa0,fa1
# メモリの0+a1(=a1)番地から8バイト分を、fa0にロードする。
fld fa0, 0(a1)
# fa0の中身8バイトを、メモリの8+a1番地にストアする。
fsd fa0, 8(a1)
命令の末尾についている.dは、これらの命令が倍精度浮動小数点用の命令であることを意味している。これを単精度浮動小数点用の命令に変更したい場合には.dから.sにすれば良い。これら以外の命令についてはマニュアルを参照のこと。