mik*_*307 4 assembly compilation instructions riscv
我很困惑。当我在二进制文件中汇编压缩指令子集时,我得到了 32 位指令,但我认为我会得到 16 位指令,因为 RVC 子集是用 16 位编码的。RVC(压缩)子集中的指令在汇编后是否总是扩展为 32 位指令,或者它们应该是 16 位长?RISC-V的官方指令集手册中是这么写的:
RVC 是在每个 RVC 指令扩展为基本 RISC-V 指令之一的约束下设计的:RV32I、RV64I 或 RV128I
\n\n\n\nRVC 是在每个 RVC 指令扩展为基本 RISC-V 指令之一的约束下设计的:RV32I、RV64I 或 RV128I
\n
该声明是关于芯片 \xe2\x80\x94 的内部实现技术,它允许芯片设计者将压缩指令 1:1 映射到等效的 32 位指令,这意味着压缩指令不会对通过此映射器的硬件,即对解码没有影响(以映射器为模),对寄存器文件没有影响,对执行单元没有影响,流水线旁路和停顿等。 \xc2\xa0 “无影响”适用于单周期实现、简单的流水线实现以及更复杂的乱序实现。
\n(他们在这里解释的一件事是,例如,为什么压缩指令集中没有“保存/恢复多个寄存器”指令,因为这样可以为此提供适当的压缩。\xc2\xa0 但是,它会添加对基本指令集中尚未提供的附加状态的要求。)
\n某些工具链似乎无法正确处理压缩指令。
\n我正在使用 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:
\n int foo(int a) { return a+1; }\nRun Code Online (Sandbox Code Playgroud)\n命令:
\n$ 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\n\n$ riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-objdump -D test.o\nRun Code Online (Sandbox Code Playgroud)\n测试.o(-O3):
\n...\nDisassembly of section .text:\n\n00000000 <foo>:\n 0: 0505 addi a0,a0,1 # 2 byte instruction\n 2: 8082 ret # 2 byte instruction\n...\nRun Code Online (Sandbox Code Playgroud)\ntest.o(未优化):
\n...\nDisassembly of section .text:\n\n00000000 <foo>:\n 0: 1101 addi sp,sp,-32\n 2: ce22 sw s0,28(sp)\n 4: 1000 addi s0,sp,32\n 6: fea42623 sw a0,-20(s0) # 4 byte instruction\n a: fec42783 lw a5,-20(s0) # 4 byte instruction\n e: 0785 addi a5,a5,1\n 10: 853e mv a0,a5\n 12: 4472 lw s0,28(sp)\n 14: 6105 addi sp,sp,32\n 16: 8082 ret\n...\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1564 次 |
| 最近记录: |