2.3 指令格式
遵循优雅的设计理念,RISC-Ⅴ架构的指令编码和格式相当规整。
2.3.1 指令长度编码
基本的RISC-Ⅴ指令集的固定长度为32位,这些指令自然地在32位边界上对齐。此外,为了支持具有可变长度指令的指令集扩展,RISC-Ⅴ架构定义指令的长度可以是16位的任意倍数,并且这些指令自然地在16位边界上对齐。如RISC-Ⅴ的标准压缩指令集扩展(C)提供压缩的16位长度指令,可用来减小代码大小并提高代码密度。
为了更方便地区分不同长度的指令,RISC-Ⅴ架构将每条指令的低位作为指令长度编码,其中16位和32位的指令编码空间已经冻结,如图2-1所示。通过指令长度编码的设计,能够在指令译码过程中更快速地区分不同长度的指令(仅需要解码指令的低位就可以知道指令长度),这大大简化了流水线的设计,节省了设计里所需要的逻辑资源。
图2-1 RISC-Ⅴ不同长度的指令编码格式
2.3.2 指令格式
除了对指令长度编码,RISC-Ⅴ的指令格式也很规整,对处理器流水线的设计十分友好。在处理器流水线的设计过程中,其目标之一就是希望在流水线中能够尽早且尽快地读取到指令中的通用寄存器组,这样可以提高处理器性能和优化时序。这就要求规整的指令格式和相对固定的寄存器索引(Index)位置。这个看似简单的要求在很多现存的商用指令架构中都难以实现,这是因为经过多年反复修改不断添加新指令后,其指令编码中的寄存器索引位置变得非常凌乱,给译码器造成了负担。
得益于后发优势和多年来对处理器发展经验的总结,RISC-Ⅴ的指令集格式非常规整,指令所需的通用寄存器的索引都被放在固定的位置,因此指令译码器可以非常便捷地译码出寄存器索引然后读取通用寄存器组。如图2-2所示,RISC-Ⅴ架构仅有六种基本指令格式,分别是:用于寄存器-寄存器操作的R类型指令,用于短立即数和访存Load操作的I型指令,用于访存Store操作的S型指令,用于条件跳转操作的B类型指令,用于长立即数的U型指令,用于无条件跳转的J型指令。实际上,由于B类型的分支指令和J类型的跳转指令是在S类型和U类型的基础上将立即数字段进行了旋转,因此实际上可以认为RISC-Ⅴ仅有四种基本指令格式。
图2-2 RISC-Ⅴ基本指令格式