gpt4 book ai didi

compilation - RISC-V 压缩指令子集 (RVC) 是否总是在二进制文件中组装成 32 位指令?

转载 作者:行者123 更新时间:2023-12-03 23:04:20 28 4
gpt4 key购买 nike

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

RVC was designed under the constraint that each RVC instruction expands into one of the baseRISC-V instructions: RV32I, RV64I, or RV128I

最佳答案

RVC was designed under the constraint that each RVC instruction expands into one of the base RISC-V instructions: RV32I, RV64I, or 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
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,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
...

关于compilation - RISC-V 压缩指令子集 (RVC) 是否总是在二进制文件中组装成 32 位指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63603355/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com