簡體   English   中英

RISC-V RV32I軟浮點型lib在__muldf3中調用MUL和MULHU指令

[英]RISC-V RV32I soft float lib calls MUL and MULHU instructions in __muldf3

我正在使用當前的riscv-toolsPicoRV32內核構建固件映像。 固件需要浮點,所以我使用-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不兼容:它使用MULMULHU指令!

如何獲得普通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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM