我如何关闭RISC-V压缩指令?

6

当我使用riscv64-unknown-elf-gcc时,选项-march=rv64g-march=rv64gc之间几乎没有区别。

-march=64g将尽可能在标准库函数(例如prinft)中使用RVC代码,但不在我的自定义函数中使用。而-march=64gc则在这两种类型的函数中都使用RVC代码。

我不知道这是否是默认设置。但如果我想禁止使用RVC代码,即使在没有RVC代码的标准库函数中,我该怎么做?

2个回答

1
重新编译riscv-gnu-tool,使用选项--with-arch=rv64g --disable-multilib

1
你是不是想说的是 https://github.com/riscv/riscv-gnu-toolchain,而不是 riscv-gnu-tool? - osgx

1

我已经在 RISC-V 硬件上使用以下内容(基于 sifive,u74-mc 的底层 uarch,具有 rv64imafdcisa),并在 gcc(11.3.0)和 clang(17.0.0)上使用未压缩的 RISC-V 指令。

hello.S:

.global main

.data
hello:  .asciz "Hello, world!\n"

.text
main:
  addi sp,sp,-8
  sd   ra,0(sp)

  la   a0,hello
  call printf

  li   a0,0
  ld   ra,0(sp)
  addi sp,sp,8
  ret

gcc -march=rv64g -o hello hello.S 或者 clang -march=rv64g -o hello hello.S。请验证您的代码是否具有未压缩的指令:

objdump -d -M no-aliases hello

...
0000000000000668 <main>:
 668:   ff810113            addi    sp,sp,-8
 66c:   00113023            sd  ra,0(sp)
 670:   00002517            auipc   a0,0x2
 674:   9d053503            ld  a0,-1584(a0) # 2040 <_GLOBAL_OFFSET_TABLE_+0x8>
 678:   f29ff0ef            jal ra,5a0 <printf@plt>
 67c:   00000513            addi    a0,zero,0
 680:   00013083            ld  ra,0(sp)
 684:   00810113            addi    sp,sp,8
 688:   00008067            jalr    zero,0(ra)

需要注意两点:指令的宽度为32位,并且它们没有前缀c.

最后请注意可执行文件链接了标准库,而这些库可能已经编译支持扩展。您可以使用-M no-aliasesobjdump -D来确认并查看类似c.beqz、c.addi等指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接