2

当我尝试在 riscv-sodor 中为 -march RV32I 编译 dhrystone 基准测试时,无法识别的操作码“amoadd”错误退出编译。

riscv-gcc -m32 -Wa,-march=RV32I -std=gnu99 -O2 -nostdlib -nostartfiles  -DPREALLOCATE=1 -DHOST_DEBUG=0 \
                 -c -I../env -I./common -I./dhrystone ./dhrystone/dhrystone_main.c -o dhrystone_main.o
In file included from ./dhrystone/dhrystone_main.c:12:0:
./common/util.h:11:0: warning: "rdcycle" redefined [enabled by default]
./dhrystone/dhrystone.h:385:0: note: this is the location of the previous definition
/tmp/ccDLKK6P.s: Assembler messages:
/tmp/ccDLKK6P.s:16: Error: unrecognized opcode `amoadd'
make: *** [dhrystone_main.o] Error 1

有没有办法为 RV32I 的裸机硬件编译 dhrystone。

4

1 回答 1

2

删除-Wa,-march=RV32I标志。

-Wa,-march=RV32I告诉汇编器只接受有效的 RV32I 指令。它找到了一条amoadd指令,所以它正确地出错了。汇编器无法将无效指令更改为有效指令,这是编译器的工作。

不幸的是,截至 2014 年 12 月,riscv-toolchain 的 gcc 端口还不支持-march=RV32I.

相反,程序员个人应该避免编写会发出乘法、AMO、浮点等的代码。事实上,提供的 dhrystone 代码包括浮点指令(我只相信初始化代码),这也会导致-Wa,-march=RV32I失败也是。在这种情况下,dhrystone 的程序员会检查处理器是否支持浮点指令,并根据需要围绕它们进行分支。

从更学术的角度来看,我相信amoadd来自 common/util.h 的“屏障”实现。但是,由于 dhrystone 不调用屏障,我不确定为什么要向汇编程序传递amoadd指令。我当然没有在我自己的 dhrystone 分解中看到它。我也无法在我自己的 RISCV 编译器上重现您的错误。我从 2014 年 8 月上旬开始使用 riscv-gcc ( https://github.com/ucb-bar/riscv-tools ) 和在 ( https://github.com/ucb-bar/riscv找到的更新的 gcc4.9 -tools/tree/new-abi),正在测试中,但很快就会转移到 master (~2015 年 1 月)。

于 2014-12-09T21:10:01.707 回答