前天写了一篇文章《阿里平头哥玄铁910对RSIC-V扩展50条指令集,什么是指令集扩展?》,初衷是想解释一下,什么是指令集扩展。但是在网友的评论里面,有一条是说"发明人费尽心机,为了省一个指令,把立即数减法干掉了,用负数加法代替,这一下子给加了50个指令。"那是不是平头哥的步子迈的有点大呢?不好评价。但是倒是可以聊一聊,曾经大家为了减小代码长度,所作出的努力。 压缩指令集发展历史 早期因为应用场景多为面向服务器工作站,所以在性能优先的背景下,自上世纪80年代以来的RISC 指令集,都重视指令的性能,而不重视指令集代码的长短。随着嵌入式系统的快速发展,RSIC指令集为了瞒住嵌入式系统的需求,开始考虑更短的指令集。所以AMR和MIPS开始在后面的指令集里面,在标准32位指令集基础上,增加了16位指令集。 经过测算,这样经过压缩的指令集,大约减少了30%左右的代码大小,但是代码密度却优于采用CISC指令集的80x86,这个比对结果,让很多业内人士大吃一惊,因为他们认为CSIC指令集的效率应该更高才是。 自此以后,人们开始对压缩RSIC指令集长度,产生了浓厚的兴趣。但是因为最初开发RSIC 指令集的时候,并没有压缩指令长度的打算,所以也就没有预留操作码空间,所以虽然说只是压缩指令长度,但是实际上是相当于一个全新的指令集开发,也就是编译器要支持独立的压缩指令集。 走出第一步的是ARM Thumb和MIPS16,我们称之为第一代,它们使用固定16位的指令长度,极大程度上减小了静态代码的大小,但是与此同时,使得动态指令急剧增加。所以,ARM Thumb和MIPS16在一定程度上并不是很成功,性能较32位定长指令集,下降了很多。 因为ARM Thumb和MIPS16的问题,大家开始继续研发下一代压缩指令集,例如microMIPS、ARM Thumb2、PowerPC VLE。因为前车之鉴,这次指令集为32和16位混合的RISC指令集,这样在保持性能和32位指令集对齐的情况下,代码的大小有了大幅的减少。 但是因为两代指令集之间的兼容性问题, 使得在应用层面变得十分复杂。 现在常用的64位指令集中,microMIPS和PowerPC依然支持压缩指令,而目前移动端主流的ARM v8指令集,却并不再支持压缩指令,这多少让人有点匪夷所思。 看过了前人踩过的坑之后,RSIC-V在设计之初,就预留了操作码空间,所以可以很方便在基本指令集上面进行压缩指令扩展,这样就可以同时满足嵌入式系统和其他大型应用程序的不同需求。 小结 任何技术的发展,都是一步一步摸索、总结、再摸索而来,所以我们在使用、扩展指令集的同时,应该对那些前人的努力,心存感激。