Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Appendix E. RISC-V vs ARM Instruction Comparison

Quick Reference for Porting Between RISC-V and ARM


💡 Usage Guide: This appendix is your “translator” for architecture porting. When you need to port ARM code to RISC-V (or vice versa), check the comparison tables here.


This appendix provides a side-by-side comparison of common instructions between RISC-V and ARM (ARMv8-A AArch64). This reference is designed to help developers porting code between the two architectures.


E.1 Arithmetic and Logical Instructions

Integer Arithmetic

OperationRISC-VARM
Addadd rd, rs1, rs2ADD Xd, Xn, Xm
Add immediateaddi rd, rs1, immADD Xd, Xn, #imm
Subtractsub rd, rs1, rs2SUB Xd, Xn, Xm
Subtract immediateaddi rd, rs1, -immSUB Xd, Xn, #imm
Negatesub rd, x0, rsNEG Xd, Xm
Multiplymul rd, rs1, rs2MUL Xd, Xn, Xm
Multiply high (signed)mulh rd, rs1, rs2SMULH Xd, Xn, Xm
Multiply high (unsigned)mulhu rd, rs1, rs2UMULH Xd, Xn, Xm
Divide (signed)div rd, rs1, rs2SDIV Xd, Xn, Xm
Divide (unsigned)divu rd, rs1, rs2UDIV Xd, Xn, Xm
Remainder (signed)rem rd, rs1, rs2No direct equivalent (use MSUB)
Remainder (unsigned)remu rd, rs1, rs2No direct equivalent (use MSUB)

Note: ARM does not have direct remainder instructions. Use: MSUB Xd, Xn, Xm, Xo (Xd = Xo - Xn * Xm)

Logical Operations

OperationRISC-VARM
ANDand rd, rs1, rs2AND Xd, Xn, Xm
AND immediateandi rd, rs1, immAND Xd, Xn, #imm
ORor rd, rs1, rs2ORR Xd, Xn, Xm
OR immediateori rd, rs1, immORR Xd, Xn, #imm
XORxor rd, rs1, rs2EOR Xd, Xn, Xm
XOR immediatexori rd, rs1, immEOR Xd, Xn, #imm
NOTxori rd, rs, -1MVN Xd, Xm
AND NOTandn rd, rs1, rs2 (Zbb)BIC Xd, Xn, Xm
OR NOTorn rd, rs1, rs2 (Zbb)ORN Xd, Xn, Xm

Shift Operations

OperationRISC-VARM
Shift left logicalsll rd, rs1, rs2LSL Xd, Xn, Xm
Shift left immediateslli rd, rs1, shamtLSL Xd, Xn, #imm
Shift right logicalsrl rd, rs1, rs2LSR Xd, Xn, Xm
Shift right immediatesrli rd, rs1, shamtLSR Xd, Xn, #imm
Shift right arithmeticsra rd, rs1, rs2ASR Xd, Xn, Xm
Shift right arith immsrai rd, rs1, shamtASR Xd, Xn, #imm
Rotate rightror rd, rs1, rs2 (Zbb)ROR Xd, Xn, Xm
Rotate right immediaterori rd, rs1, shamt (Zbb)ROR Xd, Xn, #imm

E.2 Load and Store Instructions

Basic Loads

OperationRISC-VARM
Load byte (signed)lb rd, offset(rs1)LDRSB Xd, [Xn, #offset]
Load byte (unsigned)lbu rd, offset(rs1)LDRB Wd, [Xn, #offset]
Load halfword (signed)lh rd, offset(rs1)LDRSH Xd, [Xn, #offset]
Load halfword (unsigned)lhu rd, offset(rs1)LDRH Wd, [Xn, #offset]
Load word (signed)lw rd, offset(rs1)LDRSW Xd, [Xn, #offset]
Load word (unsigned)lwu rd, offset(rs1)LDR Wd, [Xn, #offset]
Load doublewordld rd, offset(rs1)LDR Xd, [Xn, #offset]

Basic Stores

OperationRISC-VARM
Store bytesb rs2, offset(rs1)STRB Wd, [Xn, #offset]
Store halfwordsh rs2, offset(rs1)STRH Wd, [Xn, #offset]
Store wordsw rs2, offset(rs1)STR Wd, [Xn, #offset]
Store doublewordsd rs2, offset(rs1)STR Xd, [Xn, #offset]

Addressing Modes

RISC-V: Only base+offset

lw t0, 8(sp)      # Load from sp + 8

ARM: Multiple modes

LDR X0, [SP, #8]       # Base + offset
LDR X0, [SP, #8]!      # Pre-indexed (update SP)
LDR X0, [SP], #8       # Post-indexed (update SP after)
LDR X0, [SP, X1]       # Base + register
LDR X0, [SP, X1, LSL #3]  # Base + shifted register

Porting Note: RISC-V requires separate add/sub for pre/post-indexed addressing:

# ARM: LDR X0, [SP], #8
# RISC-V equivalent:
ld t0, 0(sp)
addi sp, sp, 8

E.3 Branch and Jump Instructions

Conditional Branches

OperationRISC-VARM
Branch if equalbeq rs1, rs2, labelCMP Xn, Xm + B.EQ label
Branch if not equalbne rs1, rs2, labelCMP Xn, Xm + B.NE label
Branch if less thanblt rs1, rs2, labelCMP Xn, Xm + B.LT label
Branch if >= (signed)bge rs1, rs2, labelCMP Xn, Xm + B.GE label
Branch if < (unsigned)bltu rs1, rs2, labelCMP Xn, Xm + B.LO label
Branch if >= (unsigned)bgeu rs1, rs2, labelCMP Xn, Xm + B.HS label

Key Difference: RISC-V compares and branches in one instruction. ARM requires separate compare.

Unconditional Jumps

OperationRISC-VARM
Jumpjal x0, label or j labelB label
Jump and linkjal ra, labelBL label
Jump registerjalr x0, 0(rs1) or jr rs1BR Xn
Jump and link registerjalr ra, 0(rs1)BLR Xn
Returnjalr x0, 0(ra) or retRET

E.4 Compare and Set Instructions

Comparisons

OperationRISC-VARM
Set if less thanslt rd, rs1, rs2CMP Xn, Xm + CSET Xd, LT
Set if less (unsigned)sltu rd, rs1, rs2CMP Xn, Xm + CSET Xd, LO
Set if less than immslti rd, rs1, immCMP Xn, #imm + CSET Xd, LT
Set if less imm (uns)sltiu rd, rs1, immCMP Xn, #imm + CSET Xd, LO

ARM Condition Codes:

RISC-VARM Condition
beqB.EQ (equal)
bneB.NE (not equal)
bltB.LT (less than, signed)
bgeB.GE (greater or equal, signed)
bltuB.LO (lower, unsigned)
bgeuB.HS (higher or same, unsigned)

E.5 Atomic Instructions

Load-Reserved / Store-Conditional

OperationRISC-VARM
Load-reserved wordlr.w rd, (rs1)LDXR Wd, [Xn]
Load-reserved dwordlr.d rd, (rs1)LDXR Xd, [Xn]
Store-conditional wordsc.w rd, rs2, (rs1)STXR Ws, Wd, [Xn]
Store-conditional dwordsc.d rd, rs2, (rs1)STXR Ws, Xd, [Xn]

Example: Atomic Increment

RISC-V:

retry:
    lr.w t0, (a0)
    addi t0, t0, 1
    sc.w t1, t0, (a0)
    bnez t1, retry

ARM:

retry:
    LDXR W0, [X1]
    ADD W0, W0, #1
    STXR W2, W0, [X1]
    CBNZ W2, retry

Atomic Memory Operations (AMO)

OperationRISC-VARM
Atomic swapamoswap.w rd, rs2, (rs1)SWP Wd, Wm, [Xn]
Atomic addamoadd.w rd, rs2, (rs1)LDADD Ws, Wt, [Xn]
Atomic ANDamoand.w rd, rs2, (rs1)LDCLR Ws, Wt, [Xn] (inverted)
Atomic ORamoor.w rd, rs2, (rs1)LDSET Ws, Wt, [Xn]
Atomic XORamoxor.w rd, rs2, (rs1)LDEOR Ws, Wt, [Xn]
Atomic max (signed)amomax.w rd, rs2, (rs1)LDSMAX Ws, Wt, [Xn]
Atomic max (unsigned)amomaxu.w rd, rs2, (rs1)LDUMAX Ws, Wt, [Xn]
Atomic min (signed)amomin.w rd, rs2, (rs1)LDSMIN Ws, Wt, [Xn]
Atomic min (unsigned)amominu.w rd, rs2, (rs1)LDUMIN Ws, Wt, [Xn]

Ordering Annotations:

  • RISC-V: .aq (acquire), .rl (release), .aqrl (both)
  • ARM: LDADD vs LDADDA vs LDADDL vs LDADDAL

E.6 Memory Barriers

OperationRISC-VARM
Full fencefence rw, rwDMB SY
Read fencefence r, rDMB LD
Write fencefence w, wDMB ST
Acquire fencefence r, rwDMB LD
Release fencefence rw, wDMB ST
Instruction fencefence.iISB
TLB fencesfence.vmaTLBI + DSB + ISB

RISC-V FENCE Format: fence pred, succ

  • pred: Predecessor operations (r=read, w=write, rw=both)
  • succ: Successor operations (r=read, w=write, rw=both)

ARM Barrier Types:

  • SY: Full system
  • ST: Store only
  • LD: Load only
  • ISH: Inner shareable
  • OSH: Outer shareable

E.7 System Instructions

CSR / System Register Access

OperationRISC-VARM
Read CSR/sysregcsrr rd, csrMRS Xd, sysreg
Write CSR/sysregcsrw csr, rsMSR sysreg, Xn
Read-modify-writecsrrw rd, csr, rsMRS + modify + MSR
Set bitscsrrs rd, csr, rsMRS + ORR + MSR
Clear bitscsrrc rd, csr, rsMRS + BIC + MSR

Exception and Privilege

OperationRISC-VARM
System callecallSVC #imm
BreakpointebreakBRK #imm
Return from exceptionmret / sretERET
Wait for interruptwfiWFI
Supervisor callecall (from U-mode)SVC #imm
Hypervisor callecall (from VS-mode)HVC #imm

E.8 Bit Manipulation (Zbb vs ARM)

OperationRISC-V (Zbb)ARM
Count leading zerosclz rd, rsCLZ Xd, Xn
Count trailing zerosctz rd, rsNo direct (use RBIT + CLZ)
Count populationcpop rd, rsNo direct (use CNT in NEON)
Byte reverserev8 rd, rsREV Xd, Xn
Sign-extend bytesext.b rd, rsSXTB Xd, Wn
Sign-extend halfwordsext.h rd, rsSXTH Xd, Wn
Zero-extend halfwordzext.h rd, rsUXTH Wd, Wn
Min (signed)min rd, rs1, rs2No direct (use CMP + CSEL)
Max (signed)max rd, rs1, rs2No direct (use CMP + CSEL)
Rotate rightror rd, rs1, rs2ROR Xd, Xn, Xm

E.9 Calling Convention (ABI)

Register Usage

PurposeRISC-VARM
Argumentsa0-a7 (x10-x17)X0-X7
Return valuea0-a1 (x10-x11)X0-X1
Saved registerss0-s11 (x8-x9, x18-x27)X19-X28
Temporary registerst0-t6 (x5-x7, x28-x31)X9-X15
Stack pointersp (x2)SP
Frame pointerfp/s0 (x8)X29 (FP)
Return addressra (x1)X30 (LR)
Zero registerx0 (zero)XZR (X31)

Function Prologue/Epilogue

RISC-V:

function:
    addi sp, sp, -16
    sd ra, 8(sp)
    sd s0, 0(sp)
    # ... function body ...
    ld s0, 0(sp)
    ld ra, 8(sp)
    addi sp, sp, 16
    ret

ARM:

function:
    STP X29, X30, [SP, #-16]!
    MOV X29, SP
    # ... function body ...
    LDP X29, X30, [SP], #16
    RET

Key Differences:

  • ARM has STP/LDP (store/load pair) for efficient stack operations
  • RISC-V uses separate sd/ld instructions
  • ARM uses X30 (LR) for return address; RISC-V uses x1 (ra)

E.10 Common Code Patterns

Loop Example

RISC-V:

    li t0, 0          # i = 0
    li t1, 10         # limit = 10
loop:
    # ... loop body ...
    addi t0, t0, 1    # i++
    blt t0, t1, loop  # if (i < 10) goto loop

ARM:

    MOV X0, #0        # i = 0
    MOV X1, #10       # limit = 10
loop:
    # ... loop body ...
    ADD X0, X0, #1    # i++
    CMP X0, X1
    B.LT loop         # if (i < 10) goto loop

Switch Statement

RISC-V:

    # Assume a0 = switch value
    li t0, 3
    bgtu a0, t0, default
    slli t0, a0, 2    # t0 = a0 * 4
    la t1, jump_table
    add t0, t0, t1
    lw t0, 0(t0)
    jr t0

jump_table:
    .word case0
    .word case1
    .word case2
    .word case3

ARM:

    # Assume X0 = switch value
    CMP X0, #3
    B.HI default
    ADR X1, jump_table
    LDR X2, [X1, X0, LSL #3]
    BR X2

jump_table:
    .quad case0
    .quad case1
    .quad case2
    .quad case3

E.11 Porting Checklist

Syntax Differences

AspectRISC-VARM
Register prefixx, f, a, t, sX, W, V, Q
Immediate prefixNone#
Memory syntaxoffset(base)[base, #offset]
Comment#// or ;
Directive prefix..

Common Pitfalls

  1. Zero Register: RISC-V x0 vs ARM XZR (different encoding)
  2. Stack Pointer: RISC-V sp is x2; ARM SP is separate
  3. Return Address: RISC-V stores in ra; ARM uses LR (X30)
  4. Addressing Modes: ARM has more complex modes (pre/post-indexed)
  5. Conditional Execution: ARM has conditional instructions; RISC-V uses branches
  6. Remainder: RISC-V has rem/remu; ARM requires division + multiply-subtract

Performance Considerations

  1. Code Density: ARM Thumb-2 vs RISC-V compressed (C extension)
  2. Instruction Fusion: Both support micro-op fusion (implementation-dependent)
  3. Branch Prediction: Similar capabilities (implementation-dependent)
  4. Memory Ordering: RISC-V RVWMO is weaker than ARM (more reordering allowed)

E.12 References

  • RISC-V ISA Manual: https://riscv.org/technical/specifications/
  • ARM Architecture Reference Manual: ARMv8-A
  • RISC-V ABI Specification: https://github.com/riscv-non-isa/riscv-elf-psabi-doc
  • ARM Procedure Call Standard: AAPCS64