Gcc RISC-V压缩指令:可以强制编译器在32位边界上对齐32位指令吗?

Gcc RISC-V压缩指令:可以强制编译器在32位边界上对齐32位指令吗?,gcc,riscv,Gcc,Riscv,我们正在实现一个定制的RISC-V CPU。我们以火箭核心为基础,进行了大量修改 我们的第一个版本基于2016火箭芯片,它没有压缩指令。我们现在正在移植到2017年,而2017年确实如此。我们最近发现2017版允许32位指令在16位边界上对齐——这意味着一条指令可以跨两条缓存线分割 对于我们的实现来说,这会带来很多问题 只要32位指令不跨缓存线拆分,一切都很好 是否可以强制GCC在32位边界上对齐所有32位指令?目前工具链中不支持此功能。我们的GCC端口实际上无法做到这一点,因为对齐是在链接时处

我们正在实现一个定制的RISC-V CPU。我们以火箭核心为基础,进行了大量修改

我们的第一个版本基于2016火箭芯片,它没有压缩指令。我们现在正在移植到2017年,而2017年确实如此。我们最近发现2017版允许32位指令在16位边界上对齐——这意味着一条指令可以跨两条缓存线分割

对于我们的实现来说,这会带来很多问题

只要32位指令不跨缓存线拆分,一切都很好


是否可以强制GCC在32位边界上对齐所有32位指令?

目前工具链中不支持此功能。我们的GCC端口实际上无法做到这一点,因为对齐是在链接时处理的(这里有一个博客:)。虽然您可以在工具链中添加对此的支持,但这会使C扩展实际上毫无用处,因此您最好将其视为不支持RVC的核心。

谢谢Palmer。我很感激抽出时间来回答。不幸的是,对我们来说,这最终可能比表面上看起来更严酷。我们每个内核有16个hart,这意味着我们必须围绕指令处理做一些特殊的事情。将一条指令跨缓存线拆分会给这一问题带来严重的麻烦:-)有没有研究过从32位指令的16位对齐中获得多少好处?如果忽略C扩展,那么指令被定义为32位对齐,所以这可能就是解决方法。我不认为有明确的研究来决定32位指令的16位对齐方式,但IIRC有一个快速的基准测试运行,它消耗了C扩展25%到50%的好处——尽管需要做更多的工具链工作才能得到一个真实的数字。