RISC-V 指令集手册
卷 1:用户级指令集体系结构(User-Level ISA)
2.1 版
(翻译:要你命 3000@EETOP 翻译版本 1.0)
Andrew Waterman, Yunsup Lee, David Patterson, Krste Asanović
CS Division, EECS Department, University of California, Berkeley
{waterman|yunsup|pattrsn|krste}@eecs.berkeley.edu
2016 年 5 月 31 日
该文档同时也是 UCB/EECS-2016-118 技术报告
序言
这是描述 RISC-V 用户级体系结构文档的 2.1 版。注意已经冻结的基本用户级 ISA 和 2.0
版的 IMAFDQ 扩展从该文档的上一个版本[30]以来并没有发生变化,但是填充了一些规范的
“空洞”以及改善了文档。对软件约定做了一些改变。
对注释部分做了大量地添加和改进。
每一章有单独的版本号。
修改了>64 位的长指令编码,以避免在非常长的指令格式里移动 rd 区分符。
现在使用基本整数格式来描述 CSR 指令,引入了计数器寄存器,不同于(以前版本)
仅在后面的浮点部分(和特权体系结构手册中)引入。
SCALL 指令和 SBREAK 指令被分别重命名为 ECALL 指令和 EBREAK 指令。它们的编码
和功能并没有改变。
澄清了浮点 NaN 的处理,以及一个新的规定的 NaN 值。
澄清了浮点到整数转换溢出时的返回值。
澄清了 LR/SC 允许的成功和要求的失败,包括在序列中使用压缩指令。
一个新的 RV32E 基本 ISA 提案,可减少整数寄存器数量。
修订了调用约定。
放松了软浮点调用约定的栈对齐,描述了 RV32E 调用约定。
一个修订的 C 压缩扩展提案,版本 1.9。
2.0 版的序言
用户指令集体系结构规范的第二个发布版本,我们试图保持这个基本的用户 ISA 加上通
用扩展(就是 IMAFD),在未来版本中保持固定不变。从这个 ISA 的 1.0 版本[29]以来,有如
下变化:
ISA 被划分为一个整数基本内核和几个标准扩展。
重新组织了指令格式,使得立即数编码更加高效。
基本的 ISA 被定义为拥有一个小端(little-endian)的存储器系统,而大端、双端作
为非标准的变种。
Load-Reserved/Store-Conditional(LR/SC)指令被添加进原子指令集扩展。
AMO 和 LR/SC 指令可以支持释放一致性模型(release consistency model)。
加入了 fetch-and-XOR 的 AMO(AMOXOR),对 AMOSWAP 的编码进行了修改,以便
FENCE 指令提供了细粒度的存储器和 I/O 序列化(orderings)。
留出空间。
将 20 位立即数加到 PC 上的 AUIPC 指令,替换了 RDNPC 指令,AUIPC 指令只读取
当前的 PC 值。这导致对位置无关代码(position-independent code)的大量简化。
JAL 指令现在被移动到 U 类型格式,具有一个显示的(explicit)目标寄存器,而 J
指令被 rd=x0 的 JAL 指令所代替。这个改变,消除了唯一一条需要隐式(implicit)
目标寄存器的指令,并且从标准 ISA 中去掉了 J 类型指令格式。这虽然是 JAL 指令
的一个附加效果,但是却极大地减少了基本 ISA 的复杂性。
去掉了 JALR 指令的静态提示(static hints)。对于使用标准调用约定编译的代码来
说,这些提示和 rd、rs1 寄存器是冗余的。
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
ii
JALR 指令现在清除了计算出来的目标地址的最低位,以简化硬件并允许在函数指
针中存储附加信息。
MFTX.S、MFTX.D 指令被分别命名为 FMV.X.S、FMV.X.D 指令,MXTF.S、MXTF.D 指令
被分别命名为 FMV.S.X、FMV.D.X 指令。
MFFSR、MTFSR 指令被分别命名为 FRCSR、FSCSR 指令,新增了 FRRM、FSRM、
FRFLAGS 和 FSFLAGS 指令,用于独立地访问 fcsr 寄存器的舍入模式和异常标志。
FMV.X.S、FMV.X.D 指令现在使用 rs1 作为源操作数,而不是 rs2。这样可以简化数
据通路设计。
新增了 FCLASS.S、FCLASS.D 浮点指令。
采用了一种更简单的 NaN 生成和传播模式。
对于 RV32I,系统性能计数器被扩展成 64 位宽度,可以单独读取高 32 位和低 32
位。
定义了规定的(Canonical)NOP 和 MV 指令编码。
对于 48 位、64 位和大于 64 位指令,定义了标准指令长度编码。
新增了一个 128 位地址空间变种 RV128 的描述。
32 位基本指令格式中的大部分操作码分配给用户自定义的定制扩展。
一个印刷错误被纠正:store 的源操作数来源于 rd,其实应该来源于 rs2。
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
iii
目录
2.5
2.6
2.7
2.8
第 1 章
1.1
1.2
1.3
第 2 章
2.1
2.2
2.3
2.4
介绍 ........................................................................................................................... 1
RISC-V ISA 概述 ......................................................................................................... 3
指令长度编码 ........................................................................................................... 5
异常、自陷和中断 ................................................................................................... 6
RV32I 基本整数指令集,2.0 版 .............................................................................. 8
基本整数子集的程序员模型 ................................................................................... 8
基本指令格式 ........................................................................................................... 9
立即数编码变种 ..................................................................................................... 10
整数计算指令 ......................................................................................................... 11
整数寄存器-立即数指令................................................................................................ 12
整数寄存器-寄存器操作................................................................................................ 13
NOP 指令 ........................................................................................................................ 14
控制转移指令 ......................................................................................................... 14
无条件跳转 ..................................................................................................................... 14
条件分支 ......................................................................................................................... 15
Load 和 store 指令 .................................................................................................. 17
存储器模型 ............................................................................................................. 18
控制和状态寄存器指令 ......................................................................................... 20
CSR 指令 ......................................................................................................................... 20
定时器和计数器 ............................................................................................................. 22
环境调用和断点 ............................................................................................................. 23
RV32E 基本整数指令集,版本 1.9 ....................................................................... 24
RV32E 程序员模型 ................................................................................................. 24
RV32E 指令集 ......................................................................................................... 24
RV32E 扩展 ............................................................................................................. 25
RV64I 基本整数指令集,版本 2.0 ........................................................................ 26
寄存器状态 ............................................................................................................. 26
整数计算指令 ......................................................................................................... 26
整数寄存器-立即数指令................................................................................................ 26
整数寄存器-寄存器操作................................................................................................ 28
Load 和 Store 指令 ................................................................................................. 28
4.3
系统指令 ................................................................................................................. 29
4.4
第 5 章
整数乘法除法的“M”标准扩展,版本 2.0 ....................................................... 30
乘法操作 ................................................................................................................. 30
5.1
除法操作 ................................................................................................................. 30
5.2
第 6 章
原子性指令的“A”标准扩展,版本 2.0 ............................................................. 32
原子性操作的指定顺序 ......................................................................................... 32
6.1
Load-reserved/store-conditional 指令 .................................................................... 33
6.2
原子性存储器操作 ................................................................................................. 36
6.3
第 7 章
单精度浮点的“F”标准扩展,版本 2.0 ............................................................. 38
F 寄存器状态 .......................................................................................................... 38
7.1
浮点控制和状态寄存器 ......................................................................................... 39
7.2
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
第 3 章
3.1
3.2
3.3
第 4 章
4.1
4.2
iv
7.3
7.4
7.5
7.6
7.7
7.8
7.9
第 8 章
8.1
8.2
8.3
8.4
8.5
8.6
第 9 章
第 10 章
NaN 生成和传递 ..................................................................................................... 40
非规格化数算术 ..................................................................................................... 41
单精度 load 和 store 指令...................................................................................... 41
单精度浮点计算指令 ............................................................................................. 41
单精度浮点转换和传输指令 ................................................................................. 42
单精度浮点比较指令 ............................................................................................. 44
单精度浮点分类指令 ............................................................................................. 44
双精度浮点的“D”标准扩展,版本 2.0 ............................................................ 46
D 寄存器状态 ......................................................................................................... 46
双精度 load 和 store 指令...................................................................................... 46
双精度浮点计算指令 ............................................................................................. 47
双精度浮点转换和传输指令 ................................................................................. 47
双精度浮点比较指令 ............................................................................................. 49
双精度浮点分类指令 ............................................................................................. 49
RV32/64G 指令集列表 ........................................................................................... 50
扩展 RISC-V ............................................................................................................. 55
10.1 扩展术语 ................................................................................................................. 55
标准 vs. 非标准扩展 .................................................................................................... 55
指令编码空间和前缀 ..................................................................................................... 55
绿地扩展 vs. 棕地扩展 ................................................................................................ 56
标准兼容的全局编码 ..................................................................................................... 57
保证的非标准编码空间 ................................................................................................. 57
RISC-V 扩展设计理念 ............................................................................................. 57
10.2
10.3 在固定 32 位指令格式内的扩展 ........................................................................... 58
可用的 30 位指令编码空间 ........................................................................................... 58
可用的 25 位指令编码空间 ........................................................................................... 58
可用的 22 位指令编码空间 ........................................................................................... 58
其他空间 ......................................................................................................................... 58
10.4 增加对齐的 64 位指令扩展 ................................................................................... 59
10.5 支持 VLIW 编码 ...................................................................................................... 59
定长指令组 ..................................................................................................................... 59
编码长度指令组 ............................................................................................................. 59
固定大小指令束 ............................................................................................................. 59
前缀中“组结束位” ..................................................................................................... 60
ISA 子集命名约定 ................................................................................................... 61
11.1 大小写敏感 ............................................................................................................. 61
11.2 基本整数 ISA ........................................................................................................... 61
11.3 指令扩展名字 ......................................................................................................... 61
11.4 版本号 ..................................................................................................................... 61
11.5 非标准扩展命名 ..................................................................................................... 62
11.6 管理员级指令子集 ................................................................................................. 62
11.7 管理员级扩展 ......................................................................................................... 62
11.8 子集命名约定 ......................................................................................................... 62
四精度浮点的“Q”标准扩展,版本 2.0 ............................................................ 64
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
第 11 章
第 12 章
v
第 14 章
第 13 章
12.1 四精度 load 和 store 指令...................................................................................... 64
12.2 四精度计算指令 ..................................................................................................... 64
12.3 四精度转换和传输指令 ......................................................................................... 65
12.4 四精度浮点比较指令 ............................................................................................. 66
12.5 四精度浮点分类指令 ............................................................................................. 67
十进制浮点的“L”标准扩展,版本 0.0 ............................................................. 68
13.1 十进制浮点寄存器 ................................................................................................. 68
压缩指令的“C”标准扩展,版本 1.9 ................................................................. 69
14.1 概述 ......................................................................................................................... 69
14.2 压缩指令格式 ......................................................................................................... 71
Load 和 store 指令 .................................................................................................. 72
14.3
基于栈指针的 load 和 store .......................................................................................... 73
基于寄存器的 Load 和 store .......................................................................................... 74
14.4 控制转移指令 ......................................................................................................... 75
14.5 整数计算指令 ......................................................................................................... 76
整数常数-生成指令 ....................................................................................................... 76
整数寄存器-立即数指令................................................................................................ 77
整数寄存器-寄存器指令................................................................................................ 79
预定义非法指令 ............................................................................................................. 80
NOP 指令 ........................................................................................................................ 80
断点指令 ......................................................................................................................... 81
14.6 在 LR/SC 序列中使用 C 指令 ................................................................................. 81
RVC 指令集列表 ..................................................................................................... 81
14.7
14.8 指令压缩统计 ......................................................................................................... 85
14.9 优化寄存器保存/恢复代码大小 ........................................................................... 88
向量操作的“V”标准扩展,版本 0.0 ................................................................. 90
第 15 章
位操作的“B”标准扩展,版本 0.0 ....................................................................... 91
第 16 章
事务存储器的“T”标准扩展,版本 0.0 ............................................................. 92
第 17 章
打包 SIMD 指令的“P”标准扩展,版本 0.1 ...................................................... 93
第 18 章
RV128I 基本整数指令集,版本 1.7 ...................................................................... 95
第 19 章
调用约定 ................................................................................................................. 96
第 20 章
C 数据类型和对齐 .................................................................................................. 96
20.1
RVG 调用约定 ......................................................................................................... 96
20.2
20.3 软浮点调用约定 ..................................................................................................... 99
RV32E 调用约定 ..................................................................................................... 99
20.4
第 21 章
RISC-V 汇编程序员手册 ....................................................................................... 100
历史和致谢 ........................................................................................................... 102
第 22 章
22.1 到 ISA 手册 1.0 版本以前的历史 ......................................................................... 102
22.2 从 ISA 手册 2.0 版本以来的历史 ......................................................................... 102
致谢 ............................................................................................................................... 104
22.3 版本 2.1 的历史 .................................................................................................... 104
致谢 ............................................................................................................................... 104
22.4 资助 ....................................................................................................................... 104
参考文献....................................................................................................................................... 106
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
vi
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
vii
第1章 介绍
RISC-V(读音“risk-five”)是一个新的指令集体系结构(ISA),它最初用于支持计算机
体系结构研究和教学,但现在我们希望它也成为一个对于工业实现来说标准、免费、开放的
体系结构。我们定义 RISC-V 的目的包括:
一个完全开放的ISA,能够自由地提供给学术界和工业界使用。
一个真正的ISA,能够适合直接在硬件上实现,而不仅仅是适用于模拟或者二进制
翻译。
一个避免对某一种微体系结构风格(例如微编码、按序、去耦合、乱序等)或者实
现技术(例如全定制、ASIC、FPGA)“过度体系结构化(over-architecting)”的 ISA,
但是也能够非常高效地利用任何一种技术实现。
包含一个小的基本整数 ISA(可以作为一个定制的加速器的基础或者作为教学用途)
和多个可选的标准扩展的 ISA,可以支持通用的软件开发。
ISA 支持丰富的用户级 ISA 扩展和各种特殊的变种。
支持修订的 2008 IEEE-754 浮点标准[10]。
对应用程序、操作系统内核、硬件实现的 32 位、64 位地址空间变种。
可选的变长指令,以支持扩展可用的指令编码空间、支持一个可选的密集指令编码,
ISA 支持高度并行的多核、众核实现,包括异构多处理器等。
以提高性能、静态代码大小和能耗效率。
一个可完全虚拟化的 ISA,以简化虚拟机监督管理器(Hypervisor)的开发。
ISA 支持新的管理员级(supervisor-level)和虚拟机监督管理级(hypervisor-level)
ISA 设计。
我们的设计考虑,将出现在类似的文本段落内,如果读者只关心规范,则
可以跳过这些段落。
RISC-V 这个名字,代表了UC Berkeley 大学设计的第五代主要的RISC ISA(前
四个是RISC-I[18]、RISC-II[11]、SOAR[27]和SPUR[14])。罗马数字“V”也暗示
了“变种(Variations)”和“向量(Vectors)”,以支持各种体系结构研究,包
括各种数据并行加速器,也是这个ISA 设计的明确目标。
我们研发 RISC-V 以满足我们自己的科研和教学需求,我们对如何在真实
硬件上实现一些研究思想特别感兴趣(自从这个规范的第一个版本发布之后,
我们已经完成了11 块不同的RISC-V 硅片的制造),在课堂上提供给学生真实
的实现(在Berkeley,RISC-V 处理器的RTL 设计代码已经用于多个本科生、研
究生的课程)。在我们当前的研究中,由于传统晶体管不断变小带来的能耗约
束,我们对特殊、异构的加速器特别感兴趣。我们需要一个高度灵活、高度可
扩展的基本ISA,在此基础上可以构建我们自己的研究。
我们总被问及这样一个问题“为什么要开发一个新的ISA?”。使用一个已
有的商业化的ISA,其显而易见最大的优势在于其已经具备了丰富和广泛支持
Copyright ©2010-2016, The Regents of the University of California. All rights reserved.
1