Использование программного обеспечения с плавающей точкой на Linux x86
Можно ли (легко) использовать программную точку с плавающей запятой в i386 linux без затрат на захват ядра при каждом вызове? Я пробовал -msoft-float, но кажется, что обычные (ubuntu) библиотеки C не включают библиотеку FP:
$ gcc -m32 -msoft-float -lm -o test test.c
/tmp/cc8RXn8F.o: In function `main':
test.c:(.text+0x39): undefined reference to `__muldf3'
collect2: ld returned 1 exit status
4 ответа
Если вы не хотите загружать весь свой набор инструментов вручную, вы можете начать с набора инструментов uclibc (я полагаю, версии i386) - soft float (AFAIK) не поддерживается напрямую для "нативной" компиляции в debian и производных, но это может быть используется через "встроенный" подход цепочки инструментов uclibc.
Удивительно, что gcc не поддерживает это изначально, так как код явно доступен в исходном коде в каталоге с именем soft-fp
, Эту библиотеку можно скомпилировать вручную:
$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc
$ cd libgcc/soft-fp/
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c
$ ar -crv libsoft-fp.a *.o
Есть несколько файлов c, которые не компилируются из-за ошибок, но большинство компилирует. После копирования libsoft-fp.a
в каталог с нашими исходными файлами, они теперь прекрасно с -msoft-float
:
$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L.
Быстрая проверка с использованием
$ objdump -D --disassembler-options=intel a.out | less
показывает, что, как и ожидалось, инструкции с плавающей запятой x87 не вызываются, и код также выполняется значительно медленнее, в 8 раз в моем примере, который использует много делений.
Примечание: я бы предпочел скомпилировать библиотеку soft-float с
$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c
но это приводит к множеству сообщений об ошибках, таких как
adddf3.c: In function '__adddf3':
adddf3.c:46: error: unknown register name 'st(1)' in 'asm'
Похоже на i386
версия не в хорошем состоянии, так как st(1)
указывает на один из регистров x87, которые явно недоступны при использовании -msoft-float
, Странно или к счастью, arm
версия компилируется нормально на i386
и, кажется, работает просто отлично.
GCC не поддерживает это без некоторых дополнительных библиотек. Из 386 документации:
-msoft-float Генерировать вывод, содержащий библиотечные вызовы для плавающей запятой. Предупреждение: необходимые библиотеки не являются частью GCC. Обычно используются возможности обычного C-компилятора машины, но этого нельзя сделать непосредственно в кросс-компиляции. Вы должны принять собственные меры для обеспечения подходящих библиотечных функций для кросс-компиляции.
На машинах, где функция возвращает результаты с плавающей запятой в регистровом стеке 80387, некоторые коды операций с плавающей запятой могут генерироваться, даже если используется -msoft-float
Кроме того, вы не можете установить -mfpmath=unit в "none", это должен быть sse, 387 или оба.
Однако, согласно этой вики-странице gnu, есть fp-soft и ieee. Также есть SoftFloat.
(Для ARM есть -mfloat-abi=softfp, но не похоже, что нечто подобное доступно для 386 SX).
Похоже, что tcc также не поддерживает программные числа с плавающей точкой.
Удачи в поиске библиотеки, которая работает для вас.
G'day,
Если вы не ориентируетесь на платформу, в которой нет встроенной поддержки FP, я не могу придумать причину, по которой вы захотите эмулировать поддержку FP.
Разве ваша платформа x386 не поддерживает внешние FPU? Жаль, что это не x486 со встроенным FPU!
По моему опыту, любая мягкая эмуляция должна быть намного медленнее, чем ее аппаратный эквивалент.
Вот почему я закончил писать пакет в Ada, чтобы использовать встроенный 68k FPU вместо того, чтобы использовать мягкую эмуляцию, предоставленную производителем компилятора в то время. На самом деле они закончили упаковывать его в свой компилятор.
Изменить: только что видел ваш комментарий ниже. Хммм, если вам не нужен полный набор поддержки FP, можно ли свернуть свои собственные для нескольких математических функций, которые вам нужны? Вот как начался пакет Ada, о котором я упоминал.
НТН
веселит,