Compilation RISC-V压缩指令子集(RVC)是否总是汇编成二进制文件中的32位指令?
我很困惑。当我在二进制文件中组装压缩指令子集时,我得到了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,它运行良好,带有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)的约束下设计的 该声明涉及
-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
...