RISC-V压缩指令子集RVC是否始终以二进制文件的形式组装成32位指令?

问题描述

我很困惑。当我在二进制文件中汇编压缩指令子集时,我得到了32位指令,但是我认为我会得到16位指令,因为RVC子集是用16位编码的。来自RVC(压缩)子集的指令在组装后是否总是扩展为32位指令,还是应该为16位长? 这写在RISC-V的官方指令集手册中:

RVC是在每个RVC指令扩展为基数之一的约束下设计的 RISC-V指令:RV32I,RV64I或RV128I

解决方法

RVC是在每个RVC指令扩展为基本RISC-V指令之一的约束下设计的:RV32I,RV64I或RV128I

该陈述是关于芯片的内部实现技术的-它允许芯片设计人员将压缩指令进行1:1映射到等效的32位指令,这意味着压缩指令对硬件没有其他影响。超过此映射器,即不影响解码(以映射器为模),不影响寄存器文件,不影响执行单元,流水线绕过和停顿等.``不涉及''适用于单周期实现,简单流水线实现,以及更复杂的乱序实现。

(他们在这里解释的一件事就是为什么,例如,在压缩指令集中没有“保存/恢复多个寄存器”指令,因此可以为此提供体面的压缩。但是,它将添加一个基本指令集中尚未提供对其他状态的要求。)

某些工具链似乎不适用于压缩指令。

我使用的是SiFive的rv64elf-gcc,它通过-mabi=ilp32 -march=rv32imac选项可以很好地工作。 (供参考:riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14 / bin / riscv64-unknown-elf-gcc)


test.c:

    int foo(int a) { return a+1; }

命令:

$ riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc test.c -o test.o -mabi=ilp32 -march=rv32imac -c -O3

$ riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-objdump -D test.o

test.o(-O3):

...
Disassembly of section .text:

00000000 <foo>:
   0:   0505                    addi    a0,a0,1   # 2 byte instruction
   2:   8082                    ret               # 2 byte instruction
...

test.o(无优化):

...
Disassembly of section .text:

00000000 <foo>:
   0:   1101                    addi    sp,sp,-32
   2:   ce22                    sw      s0,28(sp)
   4:   1000                    addi    s0,32
   6:   fea42623                sw      a0,-20(s0)   # 4 byte instruction
   a:   fec42783                lw      a5,-20(s0)   # 4 byte instruction
   e:   0785                    addi    a5,a5,1
  10:   853e                    mv      a0,a5
  12:   4472                    lw      s0,28(sp)
  14:   6105                    addi    sp,32
  16:   8082                    ret
...

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...