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

问题描述 投票:0回答:2

当我使用 riscv64-unknown-elf-gcc 时,选项

-march=rv64g
-march=rv64gc
之间几乎没有区别。

-march=64g
会尽量在标准库函数中使用RVC代码,例如prinft,但不会在我自己的函数中使用。而
-march=64gc
,在两种类型的功能中使用RVC代码。

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

cross-compiling riscv
2个回答
2
投票

使用选项重新编译 riscv-gnu-tool

--with-arch=rv64g --disable-multilib


1
投票

我在 RISC-V 硬件上使用了以下

gcc
(11.3.0)和
clang
(17.0.0)(
uarch
的底层
sifive,u74-mc
isa
rv64imafdc
)来使用未压缩的 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.

最后请注意,可执行文件与标准库链接,这些库可能是在支持

c
扩展的情况下编译的。您可以使用
-M no-aliases
objdump -D
以及看起来像
c.beqz
c.addi
等的说明来确认这一点

© www.soinside.com 2019 - 2024. All rights reserved.