RISC-V RV32I библиотека со свободным плаванием вызывает инструкции MUL и MULHU в __muldf3

Я использую текущие инструменты riscv для создания образа прошивки для ядра 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 инструкции!

Как мне получить soft-float для простого RV32I ISA? Нужно ли мне компилировать мою собственную версию libgcc.a? Где-нибудь есть инструкции, как это сделать?

1 ответ

Решение

Как вы заметили, флаг "-march=" влияет только на текущий модуль перевода, а не на библиотеки, которые генерируются во время сборки инструментария.

Несмотря на то, что существуют флаги конфигурации "disable-atomics"/"disable-float" для построения цепочки инструментов, нет опции multilib для умножения / деления, потому что они не влияют на ABI; Предполагается, что среда выполнения может эмулировать эти инструкции.

И, наконец, последняя версия Privileged ISA v1.7 разработана таким образом, что вы можете запускать код mul/div и затем переходить в машинный режим для эмуляции инструкций mul/div (вы даже можете переходить в M-режим во время работы в M-режим!). Вы должны будете предоставить свой собственный обработчик муль-ловушек в M-режиме (возможно, расположенный в вашем собственном файле crt0 и связанный во время компиляции).

Вместо этого я рекомендую попробовать флаг "--with-arch". Недавний патч поддерживает флаг --with-arch, поэтому можно создать gcc, который по умолчанию не будет генерировать умножение / деление. Это не позволит libgcc содержать эти инструкции. Вы можете попробовать добавить --with-arch=RV32I в строку конфигурации gcc (для этого вам нужно будет изменить Makefile.in в riscv-gnu-toolchain).

Другие вопросы по тегам