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

代入1514131211109876543210op
Rd = n6010n5Rdn4-001c.li
Rd = n18011n17Rdn16-1201c.lui
Rd = Rm1000RdRm10c.mv
※RdはR0以外、R0=0固定
※n18の下位12ビットは0固定
演算1514131211109876543210op
Rd += n6000n5Rdn4-001c.addi
Rd <<= u50000Rdu4-010c.slli
Rd += Rm1001RdRm10c.add
Rd' >>= u5100000Rd'u4-001c.srli
Rd' >>>= u5100001Rd'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-
Rd = MULH(Rm, Rs)Rm0001Rd0110011mulh
0000001RsRm4-1-
Rd = MULHSU(Rm, Rs)Rm0010Rd0110011mulhsu
0000001RsRm4-1-
Rd = MULHU(Rm, Rs)Rm0011Rd0110011mulhu
0000001RsRm4-1-
Rd = DIVU(Rm, Rs)Rm0101Rd0110011divu
0000001RsRm4-1-
Rd = REMU(Rm, Rs)Rm0111Rd0110011remu
0000001RsRm4-1-
※mul/div/remにC命令なし
※MULH:乗算結果の上位, MULHSU:符号付きRm×符号なしRsの上位, MULHU:符号なし乗算結果の上位
※DIVU:符号なし除算, REU:符号なし剰余
メモリアクセス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:1byte単位のオフセット (4の倍数でなければならない)
分岐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 n12001n11n4n9-8n10n6n7n3-1n501c.jal
GOSUB Rs1001Rs0000010c.jalr
RET (=GOTO R1)1000000010000010c.ret?
※n9/n12:飛び先とのハーフワード(2byte)数の差分
スタック1514131211109876543210op
PUSH Rs,u8110u5-2u7-6Rs10c.swsp
POP Rd,u8010u5Rdu4-2u7-610c.lwsp
Rd' = SP + u10000u5-4u9-6u2u3Rd'00c.addi4spn
SP += n10011n900010n4n6n8-7n501c.addi16sp
※PUSH: [SP + 4*u8]L = Rs, POP: Rd = [SP + 4*u8]L (スタックポインタは変化しない)
※u8/u10:4byte単位のオフセット
※SP+=n10: n10は16byte単位
※SP = R2
その他1514131211109876543210op
NOP (=1)0000000000000001c.nop
BKPT1001000000000010c.ebreak
WFI0000000001110011wfi
0001000001010000-
※NOP:なにもしない(no operation) R0+=0
32bit代入1514131211109876543210op
Rd = n32n15-12Rd0110111lui
n31-16-
※n32の下位12ビットは0固定
32bit演算1514131211109876543210op
Rd = PC + n32n15-12Rd0010111auipc
n31-16-
Rd = Rm + n12Rm0000Rd0010011addi
n12Rm4-1-
Rd = Rm + RsRm0000Rd0110011add
0000000RsRm4-1-
Rd = Rm - RsRm0000Rd0110011sub
0100000RsRm4-1-
Rd = Rm << u5Rm0001Rd0010011slli
0000000u5Rm4-1-
Rd = Rm >> u5Rm0101Rd0010011srli
0000000u5Rm4-1-
Rd = Rm >>> u5Rm0101Rd0010011srai
0100000u5Rm4-1-
Rd = Rm << RsRm0001Rd0110011sll
0000000RsRm4-1-
Rd = Rm >> RsRm0101Rd0110011srl
0000000RsRm4-1-
Rd = Rm >>> RsRm0101Rd0110011sra
0100000RsRm4-1-
Rd = Rm ^ n12Rm0100Rd0010011xori
n12Rm4-1-
Rd = Rm | n12Rm0110Rd0010011ori
n12Rm4-1-
Rd = Rm & n12Rm0111Rd0010011andi
n12Rm4-1-
Rd = Rm ^ RsRm0100Rd0110011xor
0000000RsRm4-1-
Rd = Rm | RsRm0110Rd0110011or
0000000RsRm4-1-
Rd = Rm & RsRm0111Rd0110011and
0000000RsRm4-1-
※n32:4096byte単位
※ >> : 符号なし右シフト、>>> : 符号付き右シフト
32bitメモリアクセス1514131211109876543210op
Rd = [Rm + n12]Rm0100Rd0000011lbu
n12Rm4-1-
Rd = [Rm + n12]CRm0000Rd0000011lb
n12Rm4-1-
Rd = [Rm + n12]WRm0101Rd0000011lhu
n12Rm4-1-
Rd = [Rm + n12]SRm0001Rd0000011lh
n12Rm4-1-
Rd = [Rm + n12]LRm0010Rd0000011lw
n12Rm4-1-
[Rm + n12] = RsRm0000n4-00100011sb
n11-5RsRm4-1-
[Rm + n12]W = RsRm0001n4-00100011sh
n11-5RsRm4-1-
[Rm + n12]L = RsRm0010n4-00100011sw
n11-5RsRm4-1-
※[]後の記号でメモリサイズと符号を表す(W:2byte、L:4byte、C:符号付き1byte、S:符号付き2byte)
※オフセットはサイズにかかわらず1byte単位
32bit比較1514131211109876543210op
Rd = Rm < n12Rm0010Rd0010011slti
n12Rm4-1-
Rd = LTU(Rm, n12)Rm0011Rd0010011sltiu
n12Rm4-1-
Rd = Rm < RsRm0010Rd0110011slt
0000000RsRm4-1-
Rd = LTU(Rm, Rs)Rm0011Rd0110011sltu
0000000RsRm4-1-
※Rmの方が小さければ1、そうでなければ0となる
※LTU:符号なし比較
32bit分岐1514131211109876543210op
JAL Rd, n21n15-12Rd1101111jal
n20n10-1n11n19-16-
JALR Rd, Rs + n12Rs0000Rd1100111jalr
n12Rs4-1-
IF Rm = Rs GOTO n13Rm0000n4-1n111100011beq
n12n10-5RsRm4-1-
IF Rm != Rs GOTO n13Rm0001n4-1n111100011bne
n12n10-5RsRm4-1-
IF Rm < Rs GOTO n13Rm0100n4-1n111100011blt
n12n10-5RsRm4-1-
IF Rm >= Rs GOTO n13Rm0101n4-1n111100011bge
n12n10-5RsRm4-1-
IF LTU(Rm, Rs) GOTO n13Rm0110n4-1n111100011bltu
n12n10-5RsRm4-1-
IF GEU(Rm, Rs) GOTO n13Rm0111n4-1n111100011bgeu
n12n10-5RsRm4-1-
※n21,n13(IF系):飛び先とのハーフワード(2byte)数の差分
※n12(JALR):1byte単位
32bit CSR操作1514131211109876543210op
CSRRW Rd, u12, RsRs0001Rd1110011csrrw
u12Rs4-1-
CSRRS Rd, u12, RsRs0010Rd1110011csrrs
u12Rs4-1-
CSRRC Rd, u12, RsRs0011Rd1110011csrrc
u12Rs4-1-
CSRRWI Rd, u12, u5u0101Rd1110011csrrwi
u12u4-1-
CSRRSI Rd, u12, u5u0110Rd1110011csrrsi
u12u4-1-
CSRRCI Rd, u12, u5u0111Rd1110011csrrci
u12u4-1-
CPSID0111000001110011csrrci
0011000000000100-
CPSIE0110000001110011csrrsi
0011000000000100-
※CPSID:割り込み禁止 CSRRCI R0, #300, 8
※CPSIE:割り込み許可 CSRRSI R0, #300, 8
32bitその他1514131211109876543210op
FENCE0000000000001111fence
0000PIPOPRPWSISOSRSW0000-
FENCE.TSO0000000000001111fence.tso
1000001100110000-
ECALL0000000001110011ecall
0000000000000000-
EBREAK0000000001110011ebreak
0000000000010000-
MRET0000000001110011mret
0011000000100000-

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

DATA: Specifications - RISC-V Foundation
Original Text: CC BY ichigojam.net
Modified By みけCAT
Modification: CC BY 4.0 by みけCAT