RV32C RISC-Vマシン語表 (asm15r、抜粋)

代入1514131211109876543210op
Rd = n6010n5Rdn4-001c.li
Rd = n18011n17Rdn16-1201c.lui
Rd = Rm1000RdRm10c.mv
※RdはR0以外、R0=0固定
演算1514131211109876543210op
Rd += n6000n5Rdn4-001c.addi
Rd <<= u6000u5Rdu4-010c.slli
Rd += Rm1001RdRm10c.add
Rd' >>= u6100u500Rd'u4-001c.srli
Rd' >>>= u6100u501Rd'u4-001c.srai
Rd' &= n6100n510Rd'n4-001c.andi
Rd' -= Rm'100011Rd'00Rm'01c.sub
Rd' ^= Rm'100011Rd'01Rm'01c.xor
Rd' |= Rm'100011Rd'10Rm'01c.or
Rd' &= Rm'100011Rd'11Rm'01c.and
※Rd' = R(d+8) (3bitでR8-R15を指定)
※ >> : 符号なし右シフト、>>> : 符号付き右シフト
M拡張演算1514131211109876543210op
Rd = Rm * RsRm0000Rd0110011mul
0000001RsRm4-1-
Rd = Rm / RsRm0100Rd0110011div
0000001RsRm4-1-
Rd = Rm % RsRm0110Rd0110011rem
0000001RsRm4-1-
※mul/div/remにC命令なし、mulh,mulhsu,mulhu,divu,remuもある
メモリアクセス1514131211109876543210op
Rd' = [Rn' + u7]L010u5-3Rn'u2u6Rd'00c.lw
[Rn' + u7]L = Rd'110u5-3Rn'u2u6Rd'00c.sw
※[]後の記号でメモリサイズと符号を表す(W:2byte、L:4byte、C:符号付き1byte、S:符号付き2byte)
※u7 u1-0は0
分岐1514131211109876543210op
IF !Rs' GOTO n9110n8n4-3Rs'n7-6n2-1n501c.beqz
IF Rs' GOTO n9111n8n4-3Rs'n7-6n2-1n501c.bnez
GOTO n12101n11n4n9-8n10n6n7n3-1n501c.j
GOTO Rs1000Rs0000010c.jr
GOSUB Rs1001Rs0000010c.jalr
RET (=GOTO R1)1000000010000010c.ret?
※n12:飛び先とのバイト数の差分(n11でn12の1/2の値で指定)
スタック1514131211109876543210op
PUSH Rs,u8110u5-2u7-6Rs10c.swsp
POP Rd,u8010u5Rdu4-2u7-610c.lwsp
Rd' = SP + u10000u5-4u9-6u2u3Rd'00c.addi4spn
SP += n10011n900010n4n6n8-7n501c.addi16sp
※n8:4byte単位のオフセット
※SP = R2
その他1514131211109876543210op
NOP (=1)0000000000000001c.nop
BKPT1001000000000010c.ebreak
WFI0000000001110011wfi
0001000001010000-
※NOP:なにもしない(no operation) R0+=0

比べてみよう、RISC-VとArm、RISC-V対応かんたんマシン語「asm15r」
Cortex-M0 Armマシン語表(asm15)

DATA: Specifications - RISC-V Foundation
Text: CC BY ichigojam.net