Part VIIIAppendices

ISA Comparison

May 16, 2026·13 min read·intermediate

This appendix collects side-by-side comparison tables for the three reference ISAs of the book: x86-64, AArch64 (ARMv8-A 64-bit), and RISC-V (RV64GC). It serves as a quick lookup for the differences…

This appendix collects side-by-side comparison tables for the three reference ISAs of the book: x86-64, AArch64 (ARMv8-A 64-bit), and RISC-V (RV64GC). It serves as a quick lookup for the differences and similarities. Each ISA is covered in depth in its own Part of the book (Parts VII, VIII, IX); here we focus on direct comparison.

01. High-Level Characteristics

Aspectx86-64AArch64RISC-V
StyleCISC (with µops)RISCRISC
Year introduced2003 (AMD64)20112011 (ratified later)
EncodingVariable (1-15 bytes)Fixed 32-bit16-bit (C ext.) or 32-bit
LicenseProprietary (Intel, AMD, VIA)Proprietary (ARM Holdings)Open / royalty-free
Typical implementationDecode → µops → OoODirect decode (some µop fusion)Direct decode
Address size48-bit virtual, 52-bit physical48-bit (extensible to 52, 56)39/48/57-bit
EndiannessLittleBi (typically little)Bi (typically little)
Memory modelTSO (mostly)Weak (release/acquire)Weak (RVWMO)
Pages typical4 KiB, 2 MiB, 1 GiB4/16/64 KiB, 2 MiB, 1 GiB, 512 GiB4 KiB, 2 MiB, 1 GiB, 512 GiB
VendorsIntel, AMDApple, Qualcomm, ARM, Ampere, AWS, Samsung, MediaTek, NVIDIASiFive, Western Digital, Alibaba (T-Head), Tenstorrent, Andes, ESP32-C, GD32V, many

02. Integer Registers

x86-64AArch64RISC-V
Count (general purpose)1631 (+ ZR)31 (+ x0=zero)
Width64-bit64-bit64-bit (or 32 for RV32)
Hardwired zero(none)xzr/wzrx0
Stack pointerrspspx2 (sp)
Frame pointerrbp (optional)x29 (FP)x8 (s0/fp)
Link/return(on stack)x30 (LR)x1 (ra)

x86-64 Integer Registers

rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8-r15. Each has 32-bit (eax...), 16-bit (ax...), and 8-bit (al, ah...) sub-views; writing the 32-bit half zero-extends to 64-bit.

AArch64 Integer Registers

x0-x30 (64-bit views), w0-w30 (32-bit views, zero-extended on write). Plus xzr/wzr (zero) and sp (stack pointer, used in some addressing modes).

RISC-V Integer Registers

x0-x31. ABI names: zero, ra, sp, gp, tp, t0-t6, s0-s11, a0-a7. x0 is hardwired zero.

03. Floating-Point and Vector Registers

x86-64AArch64RISC-V
FP/SIMD register count16 (xmm0-xmm15) extended to 32 (zmm0-zmm31) with AVX-51232 (v0-v31)32 (f0-f31) for F/D ext.; 32 vector regs for V ext.
Scalar FP width64 (in SSE/AVX), 80 (legacy x87)32 / 6432 (F), 64 (D), 128 (Q)
SIMD width128 (SSE), 256 (AVX), 512 (AVX-512)128 (NEON), 128/256/.../2048 (SVE/SVE2)Vector length is implementation-defined (vlen)
FMAyes (FMA3)yes (FMA from start)yes (F/D include FMADD)
Vector modelFixed-width SIMDFixed (NEON) + variable (SVE)Variable (V extension, "vector-length agnostic")

04. Calling Conventions

Integer Argument Registers

x86-64 (System V)x86-64 (Microsoft)AArch64RISC-V
Arg 1rdircxx0a0
Arg 2rsirdxx1a1
Arg 3rdxr8x2a2
Arg 4rcxr9x3a3
Arg 5r8(stack)x4a4
Arg 6r9(stack)x5a5
Arg 7(stack)(stack)x6a6
Arg 8(stack)(stack)x7a7
Returnraxraxx0a0

Float Argument Registers

x86-64 SysVAArch64RISC-V
First N float argsxmm0-xmm7v0-v7fa0-fa7

Caller-saved (volatile) vs. Callee-saved (non-volatile)

ISACallee-saved integerCallee-saved float
x86-64 SysVrbx, rbp, r12-r15(all xmm caller-saved)
x86-64 Winrbx, rbp, rdi, rsi, r12-r15xmm6-xmm15
AArch64x19-x29v8-v15 (low 64 bits only)
RISC-Vs0-s11 (x8-x9, x18-x27)fs0-fs11

Stack Alignment

ISAAlignment at callDirection
x86-6416 bytesGrows down
AArch6416 bytesGrows down
RISC-V16 bytesGrows down

05. Addressing Modes

x86-64

The most flexible: [base + index*scale + displacement] with scale ∈ , plus PC-relative [rip + disp].

Examples:

  • mov rax, [rbx]
  • mov rax, [rbx + 8]
  • mov rax, [rbx + rcx]
  • mov rax, [rbx + rcx*4 + 16]
  • mov rax, [rip + symbol] (PC-relative)

AArch64

Several modes; richer than RISC-V but more uniform than x86-64:

  • Immediate: [xn, #imm]
  • Register: [xn, xm], optionally with shift/extend ([xn, wm, sxtw #2])
  • Pre-indexed: [xn, #imm]! (writeback of new address into xn)
  • Post-indexed: [xn], #imm (use xn, then xn += imm)
  • PC-relative: [label] or adrp + add for symbols

RISC-V

Only [base + 12-bit signed offset] for loads/stores. Larger offsets and indexing must be computed explicitly with arithmetic instructions.

For PC-relative: auipc + addi (or other) builds an address; pseudo-instructions like la rd, symbol expand to this.

06. System Call Mechanism

x86-64 LinuxAArch64 LinuxRISC-V Linux
Instructionsyscallsvc #0ecall
Syscall numberraxx8a7
Argsrdi, rsi, rdx, r10, r8, r9x0-x5a0-a5
Returnraxx0a0
Errno stylenegative raxnegative x0negative a0

(Note: Linux on x86-64 uses r10 for arg 4, not rcx, because syscall clobbers rcx.)

07. System Architecture

Privilege Levels

x86-64AArch64RISC-V
UserRing 3EL0U-mode
KernelRing 0EL1S-mode
HypervisorVMX root / SVMEL2HS-mode (H ext.)
Firmware/SecureSMMEL3 (TrustZone)M-mode
Levels4 + SMM + VMX4 (EL0-EL3)3 (M, S, U) + virtualized variants

Page Tables

x86-64AArch64RISC-V
Levels (4 KiB pages)4 (PML4) or 5 (LA57)4Sv39 (3), Sv48 (4), Sv57 (5)
Page sizes4K, 2M, 1G4K, 16K, 64K (granule); plus block sizes4K, 2M, 1G, ...
TLB invalidateINVLPG, INVPCIDTLBISFENCE.VMA
Process tagPCIDASIDASID

Interrupts

x86-64AArch64RISC-V
ControllerLAPIC, IO-APIC, MSI/MSI-XGIC (v3, v4)PLIC, CLINT, AIA (newer)
IRQ entryIDT (256 vectors)Vector base reg (VBAR)mtvec/stvec
Disable IRQcli, stimsr daifset/daifclrcsrrw mstatus.MIE

08. Exception/Interrupt Vectors

x86-64: 256 vectors at offsets in IDT. AArch64: 16-entry table at VBAR; 4 categories × 4 sources. RISC-V: 1 base + 4 cause categories (or vectored mode with 1 entry per cause).

09. Memory Consistency Quick Reference

x86-64AArch64RISC-V
Default modelTSORCsc / RCpc (release-consistency)RVWMO (weak)
Atomic load-storemov (aligned ≤ 64 bits is atomic)ldr/str (with proper alignment)lw/sw (aligned)
Acquire loadmov (TSO)ldarlr / ld + fence rw,rw or load + fence r,rw
Release storemov (TSO)stlrsd + fence rw,w
RMW atomiclock-prefixed (lock add, lock cmpxchg, xadd)LL/SC (ldxr/stxr) or LSE (ldadd, etc.)LR/SC (lr.w/sc.w) or AMO (amoadd.w, etc.)
Full barriermfencedmb syfence rw,rw
Compiler barrier(asm volatile)(asm volatile)(asm volatile)

10. Atomic Instructions

x86-64

Code
lock cmpxchg [mem], reg ; CAS
lock xadd [mem], reg ; fetch-and-add
lock or/and/xor [mem], reg ; atomic Boolean
xchg [mem], reg ; (always atomic, no lock prefix needed)

AArch64

Code
ldxr / stxr ; load-exclusive / store-exclusive (LL/SC)
ldaxr / stlxr ; with acquire/release ordering
ldadd / ldset / ldclr / ldeor / swp / cas (LSE extension; v8.1+)

RISC-V

Code
lr.w / sc.w ; load-reserved / store-conditional
amoadd.w/d, amoswap.w/d, amoand.w/d, amoor.w/d, amoxor.w/d, amomax.w/d, amomin.w/d (with .aq/.rl variants)

11. Branch / Comparison

Operationx86-64AArch64RISC-V
Compare and branchcmp + jcccmp + b.cc, or cbz/cbnz, or tbz/tbnzbeq/bne/blt/bge/bltu/bgeu
Conditional movecmovcsel, cset(with Zicond ext.)
Function callcallbljal / call (pseudo)
Returnretret (= br x30)jr ra (= ret pseudo)

x86-64 has flag-based branching: arithmetic instructions set flags; branches read flags. AArch64 also has flags (NZCV) but adds compare-and-branch (cbz/cbnz) and test-and-branch (tbz/tbnz) that don't depend on flags. RISC-V has no flags; branches compare two registers directly.

12. Instruction Categories

Bit Manipulation

Operationx86-64AArch64RISC-V
Population countpopcnt (SSE4.2)cnt (NEON), cnt (Armv9)cpop (Zbb)
Leading zero countlzcnt (BMI1, AMD ABM)clzclz (Zbb)
Trailing zero counttzcnt (BMI1)(rbit + clz)ctz (Zbb)
Bit reverse(no native; movbe is byte)rbit(Zbkb)
Byte swapbswaprevrev8 (Zbb)
Bit field extractbextr (BMI2)ubfx, sbfx(Zbb varies)
Bit field insert(no direct)bfi(varies)

Vector / SIMD

ISAVector instruction setWidthPredication
x86-64SSE/SSE2/SSE3/SSSE3/SSE4 → AVX/AVX2 → AVX-512 → AVX-10128 / 256 / 512Mask registers (k0-k7) on AVX-512
AArch64NEON (advanced SIMD)128Lane operations
AArch64SVE / SVE2128 to 2048Predicate registers (p0-p15)
RISC-VVector ext. (V)implementation-defined (vlen)mask register (v0)

13. Code Density and Encoding

x86-64AArch64RISC-V
Min instr length1 byte4 bytes2 bytes (C ext.)
Max instr length15 bytes4 bytes4 bytes
Decode complexityHighModerateLow
Average code densityHighestLower than x86Highest with C ext.
Code-section sizeSmallest~10-20% largerComparable to x86 with C

14. Crypto Extensions

All three ISAs have AES, SHA, and CRC instructions:

x86-64AArch64RISC-V
AESAES-NICrypto ext.Zk* extensions
SHASHA-NICrypto ext.Zk* extensions
CRCcrc32 (SSE4.2)crc32(Zbc)

15. Virtualization Support

x86-64AArch64RISC-V
Hardware-assistedIntel VT-x, AMD-VEL2 (host hypervisor mode)H extension (HS-mode)
Nested page tablesEPT (Intel), NPT (AMD)Stage-2 translationTwo-stage translation
Interrupt virt.APICv (Intel), AVIC (AMD)GIC virtualizationAIA virtualization
IOMMUVT-d (Intel), AMD-ViSMMU (v2, v3)IOMMU spec (newer)

16. Security Features

x86-64AArch64RISC-V
W^X (NX bit)yesyesyes
ASLRyesyesyes
Stack canariesyes (compiler)yes (compiler)yes (compiler)
Pointer authentication(no native)PAC (Armv8.3+)(under proposal: Zicfilp + others)
Branch target identificationCET (IBT)BTI (Armv8.5+)Zicfilp (CFI)
Shadow stackCET (Shadow Stack)(under specification)Zicfiss
Memory tagging(no native)MTE (Armv8.5+)(under proposal)
Trusted executionSGX (deprecated), TDXTrustZone, CCA (Realm Management)(vendor-specific)
Encrypted memorySME, SEV(vendor)(vendor)

17. Performance Monitoring

x86-64AArch64RISC-V
Counter accessRDPMC (priv-controlled)mrs from PMU registershpmcounter CSRs
SamplingPEBS (Intel), IBS (AMD)SPE (Statistical Profiling Extension)(under proposal)
Event counthundreds of eventsdozens to hundreds (impl-specific)hundreds (impl-specific)
Top-down countersyes (Intel TMA)yes (Topdown methodology, recent)(under development)

18. Toolchain Support

x86-64AArch64RISC-V
GCCmature (since 2003)mature (since v4.8)mature (RV64GC since v8)
LLVMmaturematuremature
Linuxfirst-classfirst-classfirst-class
Windowsfirst-classfirst-class (since 2017)(Windows on RISC-V experimental)
macOS(legacy; Intel Macs)first-class (Apple Silicon)(no)
Androidyesfirst-classexperimental
Embedded(rare in MCUs)(Cortex-M is not AArch64)extensive (ESP32-C, GD32V, etc.)

19. When to Choose Each

x86-64: When you need to run existing Windows / Linux / macOS-Intel software unchanged; for PC-class workloads with the broadest software ecosystem; for high-end servers.

AArch64: When you want power efficiency at smartphone or laptop scale (Apple Silicon, Snapdragon, MediaTek); for cloud servers (Graviton, Ampere); for embedded systems requiring more compute than Cortex-M offers; for Apple, Android, and increasingly Windows ARM.

RISC-V: When you want freedom from licensing fees and proprietary control; when you want to customize the ISA (add domain-specific extensions); for academic and research work; for emerging applications where the cost / openness matters more than ecosystem maturity (small embedded systems, AI accelerators with embedded RISC-V management cores).

The boundaries blur. AArch64 dominates mobile, has a strong server presence, and is gaining laptop share. x86-64 dominates desktop, owns most laptops, and remains entrenched in the server market. RISC-V leads in embedded AI/microcontroller spaces and is rapidly growing into adjacent territory.

20. Summary

This appendix has provided side-by-side comparisons across registers, calling conventions, addressing modes, system architecture, memory models, atomics, vector extensions, code density, security features, and ecosystem maturity. Each ISA has a coherent design philosophy:

  • x86-64: backward compatibility, code density, rich addressing, TSO simplicity, with the cost of complex decoders.
  • AArch64: a clean RISC redesign with strong vector and security extensions, a balance of code density and decode simplicity.
  • RISC-V: minimal base + composable extensions, openness, and the ability to customize.

Choose by the constraints of your workload, ecosystem, and customization needs.

Book mode
computer-architectureappendixreference
Was this helpful?