![](/img/trans.png)
[英]Calculate nth Fibonacci number using RISC-V (RV32I) compiler without recursion
[英]RISC-V RV32I soft float lib calls MUL and MULHU instructions in __muldf3
我正在使用當前的riscv-tools為PicoRV32內核構建固件映像。 固件需要浮點,所以我使用-msoft-float
。 這是我正在使用的編譯器/鏈接器選項:
-Os -m32 -march=RV32I -msoft-float -ffreestanding -nostdlib -lgcc
在這個配置中,__ muldf3由(根據鏈接器-Map
輸出)提供:
/opt/riscv/lib/gcc/riscv64-unknown-elf/4.9.2/soft-float/32/libgcc.a(dp-bit.o)
但是這段代碼與RV32I ISA不兼容:它使用MUL
和MULHU
指令!
如何獲得普通RV32I ISA的軟浮動? 我需要編譯自己的libgcc.a版本嗎? 有沒有關於如何做到這一點的說明?
正如您所注意到的,“-march =”標志僅影響當前的轉換單元,而不影響在工具鏈構建時生成的庫。
盡管存在用於構建工具鏈的“disable-atomics”/“disable-float”配置標志,但是沒有用於乘法/除法的multilib選項,因為它們不會影響ABI; 假設執行環境可以模擬這些指令。
到最后一點,最新的Privileged ISA v1.7的設計使你可以運行mul / div代碼然后陷入機器模式來模擬mul / div指令(你甚至可以在運行時陷入M模式M-模式!)。 您必須在M模式下提供自己的mul陷阱處理程序(可能位於您自己的crt0文件中並在編譯時鏈接)。
我建議你嘗試“--with-arch”標志。 最近的補丁支持--with-arch標志,因此可以構建一個默認情況下不會生成乘法/除法的gcc。 這將阻止libgcc包含這些指令。 您可以嘗試將--with-arch = RV32I添加到gcc配置行(為此,您必須在riscv-gnu-toolchain中修改Makefile.in)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.