在以前的文章中,我分享了RISC-V在设计的初衷,除了可以被通用软件开发使用之外,还有一个目的就是,可以支持更多定制化的设计。也就是说,用户可以在基本指令集上面,进行一个或者多个的指令集扩展操作,但是有一个条件,不能再重新定义基本指令集。也就是说,任何一款基于RISC-V指令集的处理器,都要能够支撑整数基本指令集。可以看出基本指令集的重要性。
基本指令格式
那么今天我们就继续来分享一下,在基本指令集体系机构中(ISA),四种核心指令格式(R/I/S/U)。基本指令格式如下图所示:
图一 RISC-V 基本指令格式
从上图中,我们可以看出这四种核心指令格式有以下三个特点:
- 所有指令的长度固定,都为32位,以4字节边界对齐;
- 源寄存器rs1\rs2,以及目标寄存器rd的位置保持不变;
- 将立即数的符号位放置在最左边,方便进行符号扩展。
如果出现了条件分支或者无条件转移情况,并且地址没有按照4字节对齐时,就产生一个地址不对齐的异常。另外,为了指令译码简单,RISC-V ISA将rs1、rs2和rd寄存器放在相同位置,这导致立即数不同比特被分散开。例如,当需要加载一个32位立即数时,通常由load指令给出高20bits,常规指令给出低12bits,两个共同拼为32bits。
需要说明的是,上面这些扩展都是有符号扩展,如果对无符号数进行扩展,并没有看到很明显的收益,所以对于无符号数而言,没有进行扩展的指令,这也使得整个ISA更加简洁。
立即数编码
立即数处理,除了上面四种之外,还有两种变形(SB/UJ),立即数基本指令格式如下图所示:
图二 立即数基本指令格式
对比图一和图二,我们不难看出,在SB格式中,(imm[10:1])和符号位被放在了固定的位置上面。SB中的最高位(imm[11])被刚在S格式中的最低位(inst[7])。U和UJ格式的区别与S和SB类似,就不再赘述。
在指令集中,立即数的符号扩展操作非常重要,为了立即数操作的高效性,在RISC-V中,将所有立即数的符号位固定在了指令的31位,这使得在指令译码的时候,可以同时进行立即数的符号扩展操作。虽然将立即数放在在指令中的固定位置,对于一些复杂的实现来讲,收益有限(因为会有对应的硬件开销支撑),但是这一做法仍然可以降低硬件电路的开销。
小结
今天我们分享了RISC-V中的基本指令格式,以及立即数编码格式的内容。从上面可以看出,整个RISC-V指令集的设计出发点,都是为了提升指令编译的效率,并且使得整个指令集更加简单。后面,我会继续分享RISC-V的其他指令,包括整数计算指令、控制指令等内容,欢迎大家继续关注。
上述内容由久芯网www.9icnet.com编辑整理发布,请勿转载