2.4 寄存器列表
在RISC-Ⅴ架构中,共有两种类型的寄存器组,分别为通用寄存器和控制与状态寄存器(CSR),此外还有一个独立的程序计数器(PC)。
2.4.1 通用寄存器
RISC-Ⅴ架构的通用寄存器组可以根据所支持的指令集灵活配置,所有的通用寄存器功能描述及其应用程序二进制接口(Application Binary Interface,ABI)见表2-3。
基本的通用整数寄存器共有32个(x0~x31),寄存器的长度可以XLEN根据指令集架构决定。32位架构的寄存器宽度为32比特,64位架构的寄存器宽度为64比特。其中x0寄存器较为特殊,被设置为硬连线的常数0,因为在程序运行过程中常数0的使用频率非常高,因此专门用一个寄存器来存放常数0,不仅没有浪费寄存器数量,而且使编译器工作更加简便,这一点也是RISC-Ⅴ架构优雅性的体现。
对于资源受限的使用环境,RISC-Ⅴ定义了可选的嵌入式架构(RV32E),这时通用整数寄存的数量缩减为16个(x0~x15),但是仍然拥有存放常数0的x0寄存器。由表2-3可以看到,32个通用整数寄存器的ABI并不是连续的,这正是为了满足嵌入式架构的兼容性,在使用嵌入式架构时仅用到前16个寄存器。
表2-3 通用寄存器功能描述及其应用程序二进制接口
续表
对于支持浮点操作相关指令集(F和D扩展)的架构,需要额外增加32个通用浮点寄存器组(f0~f31)。浮点寄存器的宽度由FLEN表示,如果仅支持F扩展指令子集,则每个通用浮点寄存器的宽度为32位;如果支持D扩展指令子集,则每个通用浮点寄存器的宽度为64位。浮点寄存器组中的f0是一个普通的通用浮点寄存器(与其他浮点寄存器相同)。
2.4.2 控制和状态寄存器
RISC-Ⅴ指令集架构中还定义了一类特殊的寄存器,即控制与状态寄存器(CSR)。CSR通过Zicsr指令集来操作,用于配置或者记录处理器的运行状态,一般来说,CSR的功能与RISC-Ⅴ特权级别有着紧密的关联。RISC-Ⅴ架构为CSR配备专有的12位地址编码空间(csr[11:0]),理论上最多支持4096个CSR。其中高四位地址空间用于编码CSR的读写权限及不同特权级别下的访问权限。
由于CSR数量众多,本书仅列出一些常见的CSR及其功能描述,见表2-4,感兴趣的读者可以从官方的RISC-Ⅴ特权架构文档中获取完整的CSR列表。
表2-4 部分RISC-Ⅴ架构的控制与状态寄存器(CSR)
续表
2.4.3 程序计数器
在一部分处理器架构中,当前执行指令的程序计数器(PC)值被反映在某些通用寄存器中,这意味着任何改变通用寄存器的指令都有可能导致分支或者跳转,因此将PC用一个通用寄存器来保存会使硬件分支预测变得复杂,这也意味着可用的通用寄存器少了一个。因此在RISC-Ⅴ架构中,当前执行指令的PC值,并没有被反映在任何通用寄存器中,而是定义了一个独立的程序计数器。程序若想读取PC的值,可以通过某些指令间接获得,如AUIPC指令。