🧩 一、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 位,需用两步加载:
# 加载 64 位地址到寄存器 a0
lui a0, %hi(symbol) # 加载高 20 位
addi a0, a0, %lo(symbol) # 加载低 12 位
若编译器支持,可用伪指令:
la a0, symbol # 自动拆分成 LUI + ADDI
✅ 示例 2:加载与存储 64 位数据
ld t0, 0(a1) # 从内存加载 64 位到寄存器 t0
sd t0, 8(a2) # 存储 64 位到目标地址
✅ 示例 3:32 位兼容访问
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 汇编格式 |