如何编译RV32I的dhrystone基准测试

时间:2014-12-09 12:06:07

标签: gcc riscv

当我试图在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。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

在更多学术性的说明中,我相信amoadd来自于共同的/ util.h"屏障"实现。但是,由于dhrystone没有称为障碍,我不确定为什么汇编程序正在传递amoadd指令。我当然不会在我自己的dhrystone组合中看到它。我也无法在自己的RISCV编译器上重现您的错误。我从2014年8月初开始使用riscv-gcc(https://github.com/ucb-bar/riscv-tools)和在(https://github.com/ucb-bar/riscv-tools/tree/new-abi)找到的更新的gcc4.9,它正在测试中,但很快就会被转移到主人(〜2015年1月) )。