定位:硬件辅助的伪指令(16位)
作用:最终得到的可执行文件(机器语言程序)比大部分情况下更小
特点:每条短指令都必须对应一条标准的32位RISC-V指令;16位指令仅对汇编器和链接器可见,并由它们决定是否将标准指令替换为短指令
动机:1.访问a0-a5, s0-s1, sp, ra这十个寄存器的频率远高于其他x寄存器;2.很多指令会覆写其中一个源操作数;3.立即数往往很小,有些指令往往和特定立即数搭配使用
动机->设计:1.C扩展只能访问上述被访问频率高的寄存器;2.指令隐式地覆写其中一个源操作数;3.立即数长度缩减,访存指令的偏移量仅支持访存数据位宽的整数倍
实现:在机器执行指令前,通过一个译码器,将所有16位指令翻译成相应的32位指令
问题:1.超标量处理器在一个时钟周期内取多条指令,此时指令译码可能成为瓶颈;2.宏融合,指令译码器把多条RISC-V指令组合成功能更复杂的指令来执行;3.16位RV32C指令和32位RV32I指令混合出现,将令译码情况变得复杂,从而使高性能处理器更难在一个时钟周期内完成译码
RV32C的汇编和机器码的对应图(bits[1:0]=00, bits[1:0]=01, bits[1:0]=10)
注:对于立即数字段,移位指令和c.addi4spn采用零扩展,其他采用符号扩展;rd’, rs1’, rs2’表示10个常用寄存器a0-a5, s0-s1, sp, ra;