Compilation RISC-V压缩指令子集(RVC)是否总是汇编成二进制文件中的32位指令?

Compilation RISC-V压缩指令子集(RVC)是否总是汇编成二进制文件中的32位指令?,compilation,riscv,instructions,Compilation,Riscv,Instructions,我很困惑。当我在二进制文件中组装压缩指令子集时,我得到了32位指令,但我认为我会得到16位指令,因为RVC子集是用16位编码的。RVC(compressed)子集的指令在组装后是否总是扩展到32位指令,或者它们应该是16位长? 这写在RISC-V的官方指令集手册中: RVC是在每个RVC指令扩展为一个基指令的约束下设计的 RISC-V指令:RV32I、RV64I或RV128I RVC是在每个RVC指令扩展为一个基本RISC-V指令(RV32I、RV64I或RV128I)的约束下设计的 该声明涉及

我很困惑。当我在二进制文件中组装压缩指令子集时,我得到了32位指令,但我认为我会得到16位指令,因为RVC子集是用16位编码的。RVC(compressed)子集的指令在组装后是否总是扩展到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)


测试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):

。。。
第节的分解。正文:
00000000 :
0:0505 addi a0,a0,1#2字节指令
2:8082 ret#2字节指令
...
test.o(无优化):

。。。
第节的分解。正文:
00000000 :
0:1101附加sp,sp,-32
2:ce22西南s0,28(sp)
4:1000 addi s0,sp,32
6:fea42623 sw a0,-20(s0)#4字节指令
a:fec42783 lw a5,-20(s0)#4字节指令
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
...

谢谢。因此,如果我使用此编译器编译RVC子集中的指令,我应该在二进制文件中获得16位指令?是的,请参阅我的更新。您可以看到它同时使用16位和32位指令。当然,此工具链是为SiFive的HiFive板设置的,因此YMMV将其用于其他设备。问题在于我只尝试了一些跳转指令,我将超出范围的地址传递给它们,因为它们发展成32位指令,而不是16位指令。
...
Disassembly of section .text:

00000000 <foo>:
   0:   0505                    addi    a0,a0,1   # 2 byte instruction
   2:   8082                    ret               # 2 byte instruction
...
...
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
...