我正在为两个不同的 riscv 处理器开发一些程序。一个是IMC,另一个是IMFC。我想在我的程序中添加一个编译开关,以阻止 IMC 目标的浮点代码,并为 IMFC 目标保留完整的浮点代码。理想情况下,我会得到类似伪代码的东西
#if RISCV_FLOATING_POINT_SUPPORTED // Floating point maths #endif // Non floating point maths
我一直在进行一些挖掘,但在任何在线文档中都找不到此开关。我看到很多有关编译选项的文档(例如 -march),但这并没有真正帮助我(或者如果有的话,我不确定如何在编译时解析它)。我使用的是 GCC 版本 11.2。任何帮助将不胜感激。谢谢!!
编辑:对这篇文章的两个回复已经有很大帮助了。我运行了
echo | gcc -dM -E -march=rv32imfc -
和 rv32imc 并比较了两个输出。我发现了一些增量,应该可以让我做我想做的事。感谢大家的意见!
基本上有两件事需要考虑:ABI 和指令存在。
以下是三种可能的选择:
$ riscv64-linux-gnu-gcc -E -dM -c test.c
#define __riscv_float_abi_double 1
#define __riscv_d 2000000
#define __riscv_f 2000000
...
我的编译器默认为 gc 级别扩展,因此这里我们有 double 和 float 指令集支持,以及硬浮点 ABI。
$ riscv64-linux-gnu-gcc -E -dM -c test.c -mabi=lp64
#define __riscv_float_abi_soft 1
#define __riscv_d 2000000
#define __riscv_f 2000000
...
编译器假定固件支持或模拟指令,并将根据需要使用它们,但使用软浮点 ABI 来传递浮点参数和结果。
#define __riscv_float_abi_soft 1
...
假设处理器不支持 FP 指令; soft-float ABI 和软浮点库支持用于浮点代码。