当我试图在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。
答案 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月) )。