000000 01101 01110 01010 00000 100010
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
<!-- page: 132 -->
指令系统
$sp来访问栈帧是可以实现的,所以,MIPS中的30号寄存器$30可以作为帧指针$fp,也
可以在不想利用它来访问栈帧时把它作为保留寄存器$s8使用。
*4.4指令系统实例:RISC-V架构
历史上曾出现过许多指令系统,如Intel x86、AMD Am29000、Digital Alpha、Digital
VAX、HP PA-RISC、Inteli860、Intel i960,Motorola 88000 及 Zilog Z8000 等,但绝大多数都
因为不适应新的要求而被弃用。目前Intel x86架构在PC/服务器市场一直保持较大份额,
而 ARM架构则在个人移动设备和嵌入式系统中占有绝对优势。
包括Intelx86和ARM在内的传统指令集架构都诞生于20世纪70到80年代,都属于
增量型ISA,为保证软件的兼容,新处理器采用的指令集中一定要包含老的指令,而新技术、
新功能的出现又需要不断地增加新的指令,因而导致ISA中的指令数量越来越多。例如,
Intelx86指令集在1978年诞生时仅有80条指令,到2015年达到了1338条指令,实际上应
该更多。很多新指令已经涵盖了一些老指令的功能,还有一些老指令在实际程序中已很少
使用,早已失效,但它们却占用着宝贵的操作码编码空间。显然,这种增量ISA随着时间的
推移,其复杂度越来越高,导致处理器及其运行的各类系统软件的设计与开发越来越困难,
成本也越来越高。
由美国加州大学伯克利分校在2011年推出的具有典型RISC特征的RISC-V(RISC
five)是一个最新提出的、开放的指令集架构。它与以前的增量ISA不同,它遵循“大道至
简”的设计哲学,采用模块化设计方法,既保持基础指令集的稳定,也保证扩展指令集的灵活
配置,因此,RISC-V指令集具有模块化特点和非常好的稳定性和可扩展性,在简洁性、实现
成本、功耗、性能和程序代码量等各方面都有较显著的优势。本节将RISC-V架构作为指令
系统实例,详细介绍指令系统所涵盖的各个方面。
*4.4.1RISC-V 指令系统概述
RISC-V的设计者以史为鉴,针对传统增量ISA存在的各种问题,采用模块化设计思
想,着重在芯片制造成本、指令集的简洁性和扩展性、程序性能、指令集架构与其实现之间的
独立性、程序代码量,以及易于编程/编译/链接等方面进行权衡,提出了一种全新的指令集
体系结构。
1.RISC-V的设计目标
RISC-V设计者深入分析了40年间推出的各种指令集的优缺点,期望通过“取其精华、
去其糟粕”,设计出一个全新的通用指令集体系结构。
RISC-V的设计目标是,它能适应从最袖珍的嵌入式控制器,到最快的高性能计算机的
实现;能兼容目前各种流行软件栈和各种编程语言;适用于所有实现技术,包括现场可编程
门阵列(FPGA)、专用集成电路(ASIC)、全定制芯片,甚至是未来的实现技术;适合于各类
微架构技术,如微码和硬连线控制器、单发射和超标量流水线、顺序和乱序执行等;支持广泛
的异构处理架构,成为定制加速器的基础。此外,它还应该具有稳定的基础指令集架构,能
够保证在扩展新功能时不影响基础部分,这样就可避免像以前那些传统指令集架构那样,一
旦不适应新的要求就只能被弃用。
第4章
115
<!-- page: 133 -->
计算机组成与系统结构(第3版)
116
2.RISC-V的开源理念和设计原则
RISC-V设计者本着“指令集应自由”(instruction set want to be free)的理念,将 RISC-
V完全公开,希望在全世界范围内得到广泛的支持,任何公司、大学、研究机构和个人都可
以开发兼容RISC-V指令集的处理器芯片,都可以融入基于RISC-V构建的软硬件生态系
统中,而无须为指令集付一分钱。
RISC-V是一个开放指令集架构。它由一个开放的、非营利性质的基金会管理,因而它
的未来不受任何单一公司的浮沉或一时兴起的影响。RISC-V基金会创立于2015年,基金
会致力于为RISC-V ISA的未来发展提供指导意见,积极推动RISC-V ISA的应用,RISC-V
基金会成员参与制定并可使用RISC-V ISA规范,并参与相关软/硬件生态系统的开发。基
金会的目标之一就是保持RISC-V的稳定性,并力图让它之于硬件就像 Linux之于操作系
统一样受欢迎。
3.RISC-V的模块化结构
RISC-V采用模块化设计思想,将整个指令集分成稳定不变的基础指令集和可选的标
准扩展指令集。它的核心是基础的32位整数指令集RV321,在其之上可以运行一个完整的
软件栈。RV321是一个简洁、完备的固定指令集,永远不会发生变化。不同的系统可以根
据应用的需要,在基础指令集RV32I之外,添加相应的扩展指令集模块,例如,可以添加整
数乘除(RV32M)、单精度浮点(RV32F)、双精度浮点(RV32D)3个指令集模块,以形成
RV32IMFD指令集。
RISC-V还包含一个原子操作扩展指令集(RV32A),它和指令集 RV32MFD合在一
起,成为32位RISC-V标准扩展集,添加到基础指令集RV32I后,形成通用32位指令集
RV32G。因此,RV32G 代表RV32IMAFD指令集。
为了缩短程序的二进制代码的长度,RISC-V提供了RV32G 对应的压缩指令集
RV32C,它是指令集 RV32G的16位版本,RV32G中每条指令都是32位,而RV32C中每
条指令都压缩为16位。
对于字长为64位的处理器架构,通用寄存器和定点运算器的位数都是64位。因为上
述指令集 RV32G和RV32C无法实现64位运算,因而,需要对相应的32位指令集的行为
进行调整,将处理的数据从32位调整为64位,并重新添加少量的32位处理指令,以形成对
应的 RV64G(即RV64IMAFD);对于RV32C,则是对部分指令进行了替换和调整,从而形
成RV64C。
为了支持数据级并行,RISC-V提供了扩展的向量计算指令集RV32V和RV64V。此
外,为了进一步减少芯片面积,RISC-V架构还提供了一种“嵌入式”架构 RV32E,它是
RV321的子集,仅支持16个32位通用寄存器。该架构主要用于追求极少面积和极低功耗
的深嵌入式场景。基于RISC-V架构规定的各种指令集模块,芯片设计者可以选择不同的
组合来满足不同的应用场景。例如,嵌入式应用场景下可以采用RV32EC架构,高性能服
务器场景下可以采用RV64G 架构。
·4.4.2 RISC-V 指令参考卡
RISC-V的一个主要特点是模块化和简洁性,因此,所有指令用两张指令参考卡就可以
概述。图4.10为指令参考卡1。其中,给出了 RISC-V基础整数指令集(Base Integer
<!-- page: 134 -->
指令系统
Instructions)RV32I和RV641、RV特权指令集(RV Privileged Instructions)、可选的压缩指
令扩展(Optional Compressed Instruction Extension)RV32C和 RV64C中的指令列表以及
RV伪指令举例(Examples of the 60 RV Pseudoinstructions)。
Base Integer Instructions; RV32I and RV64I
RV Privileged Instructions
Category
Name Fmt
RV32I Base
+RV64/
Category
Name Fmt
RV mnemonic
Shift Left Logical R SLL rd,rs1,rs2
SLLW rd,rs1,rs2
Trap Machine-mode trap return R
MRET
Shift Left Logical Imm. I SLLI rd,rs1,shamt
SLLIW rd,rsl,shamt
Supervisor-mode trap return R
SRET
Shift Right Logical R SRL rd,rs1,rs2
SRLW rd,rs1,rs2
Interrupt Wait for Interrupt R
WFI
Shit Right tog. Imm.
SRLI rd,rsl,shamt
MMU Vrtal Memory FBNCE R
sRLIW rd,rsl,shamt
SrENCE.MA rsl,rs2
Shift Right Arithmete R sRA rd,rsl,rs2
SRAM rd,rsl,rs2
Examples of the 60 RV Pseudoinstructions
SNft Right Arith Imm. 1 SRAI rd,rsl,shamt SRAIM rd,rsl,shamt
Branch=0(E? ts,x0,lan) B BB0? rs,im
Arithmetic
ADD R ADO rd,rsl,rs2
ADOW rd,rs1,rs2
Jump(uses JAL x0,imm) )
J ima
ADD Immediate 1 AD0I rd,rsl,im
ADDIW rd,rs1,im
MoVe (uses ABct rd,:s.0) R MV rd,rs
SUBtract R SUB rd,rsl,rs2
suBW rd,rsl,rs2
RETum(uses JALR xo,9,ra)
1
RET
Load Upper Imm u wt rd,irm
Optional Compressed (16-bit) Instruction Extension: RV32C
Add Uooer Imm to RC U AUIPC rd,inn
Category Name
Fmt
RVC
RISC-V eguivalent
logical
xoR R xOR rd,rsl,rs2
Loads load wond a c.LN
rd',rsl',imn LN rd',rsl',im*4
XOR Immediate 1 xoRI rd,rs],im
toad Word SP cl C.LMSP
rd,im
LW rd,sp,imm*4
OR R OR
rd,rs1,rs2
Float Load Ward SP a C.FLR
rd',rs1',ima
FLN rd',rsl',im*8
OR Immesate 1 ORI rd,rsl,im
Fbat Load Word al C.FLRSP rd,im
rd,sp,imm*8
FLN
AND R ARD rd,rsl,rs2
Foat Load Doule a c.PLD
rd',rsl',im
FLD rd',rsl',im*16
AND Immedlute 1 ARDI rd,rsl,im
Hout loed Doubie SP al c.FLDSP
rd,sp,imm*16
rd,im
FLD
Compare
Set< R SLT
rd,ral,ra2
Stores Sore Wand
CS c.SW
ral',rs2',iam sW
rsl',rs2',imm*4
Set< Immedute
1R1
sLrI rd,rs1,im
Store Ward SP
CSS
|c.SWSP
rs2,imm
sw rs2,sp,imm*4
Set <Unsgned
sLr0 rd,rsl,ra2
Roat Store Word CS c.FSW
rsl',rs2',im FSW rsl',rs2',imm*8
Set< Imm unsgred
sLtiy rd.rsl,im
Foat Store Word SP
CSS c.FSWSP rs2,tma
FsW rs2,sp,imm*8
Branches
Branch 8 BBO
rsl,rs2, im
Float Store Doutle
CS c.FSD
rsl',rs2',im FSD rsl',rs2',inm*16
8⋯⋯me
Branch
BB rsl,rs2,im
Foat Store Double 5P CSS C.7SDSP
rs2,imm
PSD
rs2,8P,ian*16
Branch<
BLP rs1,rs2,inm
Arithmetic ADD CR c.ADD
rd,rsl
ADD
rd,rd,ral
Branch 2
Bc2 rsl,rs2,im
ADD Immedate cl c.ADDI
rd,ime
ADDI rd,rd,im
Branch <Unsgned
BLTU rsl,rs2,im
ADD SPImm*16 ct C.ADOT16SP x0,im
ADDI ap,sp,1m*16
Branch z Unsgned
BC2U ral,ra2,ine
ADDSPImm*4 CIW C.ADOI4SPN rd',im
ADDI rd',即,im*4
Jump & Link J8L )1
JAL rd,imm
SuB CR c.SuB
rd,rsl
suB rd,rd,rsl
Jmp 8 Unk Register
ALR rd,rs1,im
AND CR C.AND
rd,ral
ANDrd,rd,rs1
Synch Synch thread
PENCE
AND Immediate
C.ANDI
ANDI rd,rd,im
Cl
rd,img
,Synch Instr a Dta
FDICE.I
OR CR c.OR
rd,rsl
OR
rd,rd,rsl
Environment
CAU
ECALL
eXdusive OR CR c,xoR
rd,rsl
ANDrd,rd,rsl
BREAK
EBREAR
MoVe
CR c.NV
rd,rsl
ADDrd,rsl,x0
Load Immediate g
c.LI
rd,ime
ADDT rd,x0,imm
Control Status Register (CSR)
Load upper 1mm
|c,Lut
rd,imn
LuI rd,im
Shifts shit left Imm
Read/Wnte
|CSRRM rd,csr,rsl
di c,sLLI
rd,imn
SLLI rd,rd, ima
Read & Set Bit
csRRS rd,csr,rsl
Shft Right Ari.Imm. a C.SRAI
rd,imm
SRAI rd,rd,im
Read & Cear Bt
csRRC rd,csr,rsl
Shit Right log. Imm. a C.SRLI
rd,imn
SRLI rd,rd,imn
Read/Wnte Imm
CSRRMI rd,csr,inm
Rranches BranhaC CB C.BEQZ
rsl',imn
BBQ
rsl',x0,im
Read & Set Blt Imm
CSRRSI rd.car.inm
Branch≠0 CB C.BNEZ
rs1im
BNZ
rs1*,x0,imm
Read & Oear Bit Imm
CSRRCI rd,csr,inm
Jump
ump
C] c.J
imn
JAL x0,im
Jump Regster CR c.JR
rd,rs1
1A18x0.T81.0
JumpUnk CJ c,JAL
imn
JAL Fa,im
Loads
Load Byte
LB
rd,rsl,imm
Jump & Uhk Regster CR C.JALR
rsl
JALRTA.T*1.0
toad Halfword
System Env. BREAK
LB
rd,rsl,inm
cl C,EBREAX
EBREAK
Load Byte Unstgned
L即
rd,rsl,inm
+RV64/
Optional Compressed Extention: RV64C
load Half Unsigned
LRU
rd,rsl,inn
LwU rd,rs1,im
AI RV32C(except c.JhL, 4 word ioads, 4 word strores) pius:
Load word
LN
rd,rsl,imm
LD
rd,ral,imn
ADD Word (C.ADCW)
Load Doubleword (c.Lp)
Stores
Store Byte
sss
SB
rsl,rs2,im
ADD Imm.Word (c.AteIw) toad Doubeword 5P(c.iar)
Store Halfword
SB
rsl,rs2,imm
SUBtract Word(c.Sw)
Store Doubleword (c.st)
Store Word
sw
rsl,rs2,imm sD
rsl,rs2,imm
Store Doubleword SP(c.SLsr)
图4.10 RISC-V 指令参考卡1
RV32I基础指令集中,包含移位(Shifts)、算术运算(Arithmetic)、逻辑运算(Logical)、比较
(Compare)、分支(Branch)、跳转链接(Jump &.Link)、同步(Synch)、环境(Environment)、
控制状态寄存器(Control Status Register)、取数(Load)、存数(Store)等类别。
第4章
117
<!-- page: 135 -->
计算机组成与系统结构(第 3版)
118
RISC-V在基础指令集 RV321和RV64I的基础上,提供了一组可选扩展指令集,如
图4.11给出的 RISC-V指令参考卡2中所示,可选扩展指令集包括乘除指令扩展(Multiply
Divide Instruction Extension)RVM、原子指令扩展(Atomic Instruction Extension)RVA、
浮点指令扩展(Floating-Point Instruction Extension)RVF和 RVD、向量指令扩展(Vector
Extension)RVV。此外,图4.11中还给出了32个定点通用寄存器x0~x31和32个浮点寄
存器f0~f31的过程调用约定(Calling Convention)。
Optional Multiply-Divide Instruction Extension: RVN
Optiona! Vector Extension: RVV
Categorr
Nome fmi!
RVM Muitly Divide
+RVGN
NameFmy
RVJZV/RGAV
Muitiply
MUltpw R NL
rd,rsl,rs2
MuL
rd,tsl,rs2 SET Vector Len. RSBNL .tsl
MUttoy ighR KULB
rd,rsl,rs2
MUUnply High R wu
rd,ral,rs2
REMainder R
Mubply High Sige/UnsR
KOLBSU
rd,tsl,rs?
VRDN
rd,rsl,rs2
MULrply Hgh Ums
Shit let Log
R MULBU
rd,rsl,rs2
R vsuu
rd,ral,rn2
Divide
DNde R
DIV
rd,rsl,rm2
DTW
rd,ts1,ts2 Shift Right Log R VSRL
rd,rsl,rs2
DMide Unsgned R DIVU
rd,rsl,rs2
Shit R Arith R VsRA
rd,tal,rs2
Remainder REMainder R REN
rd,rsl,rs2
REMW
rd,tsl,rs2
LoaD 1 vLD
rd,rsl,imm
REMasinder Unsigned R RPNU
rd,rsl,ts2
LoaD Stnded R
RRNUW
rd,rml,ra2
VLDS
rd,ral,rs2
R
LoaD indeXed
vLnx
rd,rsl,rm2
Optional Atomic Instruction Extension; RVA
Category
Namefmt
RV32A(Atomnc)
+RV6-A
STore sR
Vs?
rd,tal,imm
Load
toad Reserved R R.W
L.D
rd,ml
STore Stnded
rd,ral
vsrs
rd,rsl,rs2
Store
Store Conditonsl R x.M
rd,rsl,rs2
sc.D
rd.rsl,rs?
STore IndeXed R vsm
rd,ral,rs2
Swap
SWAP R AROSWAP.W
rd,rel,rs?
AAOSWNP.D
rd,ml,ra?
AMO SWAP R AHOENAPtd,rsl,ts2
Add
A00 R MOADD,
rd,rel,rs2
AHOAEO,D
rd,rs1,rs2
AMO ADD R AHOADD rd,rsl,rs2
Logical
x0R
R ANOXOR,M
rd,rsl,te2
ANONOR.D
rd,rsl,re2
AMO XOR R AHOXOR
rd,ts1,ts2
ANO R NOAHD,M
rd,ral,ra2
AHOAD,D
rd,rs1,ts2
AMO AND R AROAND rd,rsl,rs2
OR R
AMO OR R
ANOOR.M
rd,rsl,rs?
ANOOR.D
rd,cal,rs2
AMCOR
td,rsl,ts2
Min/Max
MiNmum R
AHOHIB,
rd,ral,re2
AHONN.D
rd,rml,ts2 AHO MINimum R AHORIN rd,tsl,rs2
MANmum
R ANONAX,M
rd,tsl,rs?
AHDRAX,D
rd,rs1,rs2 AMO MAXimum R AHOAX
MINmum Unsigned R
AHOHINU.W
rd,rsl,rs2
ANONINU,D
rd,rs1,rs2
Pred cate m R VP四
rd,rsl,rm2
MAXmum unsgned R *OWAXU.W
rd,rsl,ts2
AHORAXU,D
rd.csl.ts2
Predicate R VP@
rd,rsl,ts2
Two Optional Floating-Point Instruction Extensions: RVFB RVD
Predicate
VPLF
< R
rd,tsl,rs2
Category
Aame/fme
RVj2(FIO)SeDPFI A工
+RV64:F|D)
Predicate R vP2
rd,rsl,rs2
Move
NV.N
rd,tel
Move from nteger R
FMV,D.x
rd,rst
Predicate AND R VFMID
rd,ral,rs2
Wone to lnteger R rmv.X.M
rd,rsl
rnv.x.D
rd,tsl
Pred. AND NOT R VPABDH rd,rsl,rs2
rcvr.(S|D}.L rd,rsl
Redcate OR
Convert ConVerT from Int R
cvt,(s|D),M rd,ral
R VPOR
rd,ta1,rm2
ConVerT from Int UmsignedR rcVT.(5|D},WU rd,rsl
rcvr.《S|D},W rd,ml
Predicate XOR R VPxOR
d,rslx
ConverT to int R cVT,M.(S|D) rd,rsl
rcvt,L.《S|D) rd,s1
Predicate NOr R VPHO7
rd,rsl
ConVerT to Int Unsigned
rcvr.wu.(s|D) rd,ral
rcvr.L0.(S|D) rd,m!
Pred.5WAP
R
R VPA rd,ral
Load
td,ral
Load
L(W,D)
rd,rsl,imn
Calling Convention
MOVe
R VNW
Store
Store S
rs(W,D)
rsl,rs2,ime
Regster
A8I Name Saver
ConVerT R vcvr
d,rs!
Arithmetic
A0DR
FADD.(S|D)
rd,rsl,rs?
er0
*
ADO R VACC
rd,rsl,rs?
SUBract R
rsun.(8[D)
rd,rsl,rs2
SUBtract
1a
Caller
R vsun
rd,rsl,rs2
MULtply R
muL.《s|D}
rd,rs1,rs2
sp
Callee
MULnply
RRR m
rd,rsl,re2
DiVise R
rbtV.(8|D}
rd,rsl,rs2
9p
DIVide
VDIV
rd,rsl,rs2
5Qure Root R
Fs0R7.(S|D)
SQuare RooT
rd,rsl
x4
tp
*
Vs0R7
rd,ral,tm2
Nul-Add
Nuitply-A0O R
NADD.(S|D) rd,ts1,rs2,rs
x5-1
t0-2
Caller
Mutiply AD0 R VrxoD
rd,rsl,rs2,rs]
Multiply·SUBract
Multply-SUB
R
rusun.(s|0)
RRR
td,rsl,rs2,rs3
xg
Callee
s0/fp
VPNSUB
rd,ral,ra2,te]
Negatve Multiply-SUBractR
mnsue.(S|D) rd,rsl,rs2,rm
x9
s1
Callee Neg.Mut.Stn
VPnNSDB rd,tsl,ts2,ts3
Negative Muttpt-ADD R
niMADD.($|D) rd,rs1,rs2,rs
x10-11
a0-1
Caller Neg Mul-ADD
VrYKADDrd,rsl,rs2,rs]
Sign Inject SiGN source R
rsGMJ.(S|D)rd,rsl,rs2
x12-17
a2-1
Caller
SGN inled R vsanJ
rd,rsl,ra2
Negauve SiGN soureR FSGMJN,(S|D) rd,rs1,rs2
x18-27
82-11
CalleeNeg SiGN inlem R vsaI.N td,rsl,rs2
Xor SiGN source R
FscMJX.(S|
x29-31
t3-t6
Caller Xor SiGM imlect R vsa3X r,rnl,rm2
D) td,rsl,ts2
Nin/Max
MNmum R
mIN.{S|D)
rd,rel,rs2
to-7
tt0-7
Caller
NINimum R vwB
rd,ts1,ra2
MAXimum R
nAg.(S|D)
rd,rsl,rs2
{8-9
fa0-1
Callee
MAXimum
R vnAT
rd,ral,ra2
Compare compare Fiost =R
re0.(S:D)
rd,rs1,rs2
(10-11
(a0-1
Callier
XOR R
VXO*
rd,rsl,rs2
compare Faat x.R
rLt.{S(D)
rd,rsl,rs2
t12-17
fa2-7 Caller
OR R voR
rd,rsl,rs2
comgare FbatsR
n2.{S|D)
rd,rel,ts2
(18-27
1s2-11 Callee
AND R vnsD
rd,rsl,ts2
Categornize CLASSily trpeR cLss.{3|D)
428-31
fts-1 Caller
CASS R
rd,rsl
vcss rd,ral
Configure Reod Suatus R FmcsR
rd
zero
Hardwired zero SET Dsta Cont R vszrpcrG rd,rsl
Resd Roundng Mose R FRRH
rd
ta
Retum address
EXTRACT R VEXTRACT rd,rsl,ra2
Read Flag R rRrLAGS
rd
Stadk pointe
MERGE R wGR rd,rsl,re2
sp
Swap Salus Reg R FSCSR
Gobal pointer
SELECT R
rd,rsl
9P
vsmgc? xd,rsl,rs2
Swap Roundng MoseR rsRH
rd,rsl
tp
Thread polnter
Swap Ras R rsrLAs
td,rsl
t0-0.ft0-7 Temporanes
Smap Rounding Mode Imm 1
FSRHI
rd,im
0-11.fn0-11 Saved registers
1
swap Fas lmm
rsrLGst
rd,im
a0-7.fa0-7 Functon are
图4.11 RISC-V指令参考卡2
<!-- page: 136 -->
指令系统
RISC-V采用32位定长指令字格式。如图4.12所示,共有6种指令格式:R-型为寄存
器操作数指令;I-型为短立即数操作或装入(Load)指令;S-型为存储(Store)指令;B-型为条
件跳转指令;U-型为长立即数操作指令;J-型为无条件跳转指令。
31