RISC-V 有六种不同的指令集,如下图分别为 R-type / I-type / S-type / B-type / U-type / J-type
但是为什么像B-type的指令不将立即数的顺序排成类似于 imm[12:1] 而是要搞成像上图中分开的样子呢?
刚开始学习 RISC-V 的时候也是不求甚解的看了一下,直到我无意中看到了一个 stackoverflow 上面的提问。
有兴趣大家可以去看原文-链接后面补
先说结论,其目的为尽量使得各个stype相同,就可以利用同样的硬件资源进行处理,达到节省硬件资源目的。
为什么12位立即数不是从0开始,而是从1开始?
因为PC都是4字节对齐的,而 4/8/16 等的二进制表达式中最后两位始终为0. 所以即使立即数右移一位也是用不到立即数的第0位。
为什么B-type的立即数的顺利不是按照从大到小或者从小到大排列的?
因为B-type的12位立即数乘以2,也就是左移一位后,为了追求和S-type指令类似的格式。也就是 imm[10:5] imm[4:1]的样子,而最高位通常是符号位,所以 imm[12]就放在了最前面。
而 imm[11]也就放在了因为imm[0]无效而省略的位置了。