首页 > 解决方案 > RISC-V 压缩指令子集 (RVC) 是否总是汇编成二进制文件中的 32 位指令?

问题描述

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

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

标签: compilationriscvinstructions

解决方案


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)


测试.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

测试.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,sp,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,sp,32
  16:   8082                    ret
...

推荐阅读