🧩 一、RV64 概述

项目 RV32 RV64
寄存器宽度(XLEN) 32 位 64 位
指针大小 4 字节 8 字节
寻址空间 4GB 16EB(2⁶⁴ 字节)
整数寄存器 x0–x31(64 位) 同上(但更宽)
程序计数器(PC) 32 位 64 位
ABI 名称 ILP32 LP64

RV64 并非重新定义 ISA,而是 RV32 的超集, 在原有基础上增加了64 位扩展(I 扩展 + 64 位指令变体)


⚙️ 二、RV64 新增或修改的关键指令类别

类别 说明 示例
加载 Load 从内存读取 8/16/32/64 位数据 LB, LH, LW, LD
存储 Store 向内存写入 8/16/32/64 位数据 SB, SH, SW, SD
有符号扩展加载 RV64 新增的 32 位加载指令 LWU(Load Word Unsigned)
立即数扩展指令 立即数左移 12 位高位加载 LUI, AUIPC
符号扩展指令 将 32 位寄存器符号扩展到 64 位 ADDW, SUBW, SLLW, SRLW, SRAW
跳转与分支 地址是 64 位,但偏移仍是 32 位立即数 JAL, JALR, BEQ, BNE, BLT, BGE, ...

🧮 三、RV64 中的地址访问指令详解

指令 含义 操作 备注
LB rd, offset(rs1) Load Byte 读取 8 位并符号扩展到 64 位
LBU rd, offset(rs1) Load Byte Unsigned 读取 8 位并零扩展到 64 位
LH rd, offset(rs1) Load Halfword 读取 16 位并符号扩展
LHU rd, offset(rs1) Load Halfword Unsigned 读取 16 位并零扩展
LW rd, offset(rs1) Load Word 读取 32 位并符号扩展 RV64 中仍有效
LWU rd, offset(rs1) Load Word Unsigned RV64 新增,不符号扩展 ✅ RV64 独有
LD rd, offset(rs1) Load Doubleword 读取 64 位 ✅ RV64 独有
SB rs2, offset(rs1) Store Byte 存储 8 位
SH rs2, offset(rs1) Store Halfword 存储 16 位
SW rs2, offset(rs1) Store Word 存储 32 位
SD rs2, offset(rs1) Store Doubleword 存储 64 位 ✅ RV64 独有

🧱 四、RV64 新的 64 位算术指令(.W 后缀)

RV64 保留了所有 RV32 的算术指令(ADD, SUB, MUL 等), 同时新增一组 “32 位算术并符号扩展为 64 位” 的指令:

指令 含义 操作 说明
ADDW rd, rs1, rs2 32 位加法并符号扩展 rd = sext((rs1 + rs2)[31:0]) ✅ RV64 新增
SUBW rd, rs1, rs2 32 位减法并符号扩展 rd = sext((rs1 - rs2)[31:0]) ✅ RV64 新增
SLLW rd, rs1, rs2 逻辑左移(32 位) 只保留低 32 位再扩展
SRLW rd, rs1, rs2 逻辑右移(32 位) 零扩展再符号扩展
SRAW rd, rs1, rs2 算术右移(32 位) 保留符号位

这些 .W 指令主要用于兼容 32 位数据运算(如 int 变量), 结果再扩展为 64 位保存到寄存器。


📍 五、64 位地址加载示例

✅ 示例 1:加载全地址常量(64 位)

在 RV64 中,地址或常量可能大于 32 位,需用两步加载:

asm
# 加载 64 位地址到寄存器 a0
lui   a0, %hi(symbol)       # 加载高 20 位
addi  a0, a0, %lo(symbol)   # 加载低 12 位

若编译器支持,可用伪指令:

asm
la a0, symbol    # 自动拆分成 LUI + ADDI

✅ 示例 2:加载与存储 64 位数据

asm
ld   t0, 0(a1)       # 从内存加载 64 位到寄存器 t0
sd   t0, 8(a2)       # 存储 64 位到目标地址

✅ 示例 3:32 位兼容访问

asm
lw   t0, 0(a1)       # 加载 32 位(符号扩展)
lwu  t0, 0(a1)       # 加载 32 位(零扩展)
addw t1, t0, t2      # 32 位加法 + 符号扩展

🧠 六、RV64 地址计算与立即数

RV64 地址空间是 64 位,但指令立即数仍然保持 12 位(I/S/B 型)或 20 位(U/J 型)。 因此,在操作 64 位地址时,常见用法是:

用法 示例 说明
PC 相对寻址 auipc t0, 0x1; addi t0, t0, offset 高低位拼接形成 64 位地址
符号扩展立即数 addi x5, x0, -1 立即数符号扩展为 64 位
大地址加载 lui + addi 加载任意 64 位符号地址

🧩 七、RV64 与 RV32 在地址操作上的区别总结

特性 RV32 RV64
寄存器宽度 32 位 64 位
指针大小 4 字节 8 字节
地址空间 4GB 16EB
加载指令 LB/LH/LW LB/LH/LW/LWU/LD
存储指令 SB/SH/SW SB/SH/SW/SD
算术指令 ADD/SUB ADD/SUB/ADDW/SUBW
立即数 12 位 相同(符号扩展)
扩展指令 .W 后缀与 64 位加载/存储

💡 八、小结

项目 RV64 的关键增强
64 位寄存器和地址空间 支持大内存与高性能运算
64 位加载/存储(LD/SD) 支持直接操作 64 位数据
兼容 32 位运算(.W 指令) 保留 int 兼容性
新增 LWU(Load Word Unsigned) 32 → 64 无符号扩展
立即数机制保持不变 向后兼容 RV32 汇编格式