这里我们只说RISCV32I指令集,这里按照我的理解给RISCV32I的指令做一个简单的分类:
首先是可以由编译器生成的指令和编译器通常不会生成的指令(这里排除了C语言里面内联汇编的情况)。
编译器不会生成的指令如下几条:
FENCE,FENCE.I,ECALL,EBREAK,CSRRW,CSRRS,CSRRC,CSRRWI,CSRRSI.CSRRCI,以及AUIPC。
其中FENCE和FENCE.I跟存储相关。
ECALL,EBREAK是跟系统有关。
CSR*** 这些跟状态和控制器有关。
这里AUIPC的意思是讲当前PC加上一个偏移量后保存到指定的寄存器里,这条指令不产生转跳。
剩下的就是C语言编译器可以产生的指令。
这些C语言可以产生的指令系统我们再继续分类。
根据我的理解分成以下四类:
1,R op R => R 从寄存器组里取两个数进行运行最后存入寄存器组。
2,R op IMM => R 从寄存器取一个数,与立即数IMM 进行操作后存入寄存器组。
3. 影响PC的指令,包含条件转移和无条件转移。如果指令顺序执行,下一条指令的指令地址是PC+4,而运行了这些影响PC的指令,就可能打破这个执行顺序(无条件转跳指令肯定影响PC)。因为无条件转移指令太少了只有两条(jal和jalr)所以不单独分类出来。
4,读写存储器的指令。这里就有保存字(32位: word),半字(16位:half word ),字节(8位:byte)指令。以及加载字,半字,字节指令。其中我们可以将半字和字节当做有符号数以及无符号数据,加载半字就有了lh 和lhu的区别,以及字节就有了lb和lbu的区别。另外在riscv64里面还有double word,两个word,每个字是32BIT,自然就是64位了。在64位指令系统还有了lw和lwu的区别。
官方将RV32I划分层了5种类型,这个分类是根据指令的机构进行分类的。
参考
1,riscv-spec-v2.2 from www.riscv.org
2,RISC-V-Reader-Chinese-v2p1 from QQ group :29304866