Использование программного обеспечения с плавающей точкой на Linux x86 - PullRequest
9 голосов
/ 19 июня 2009

Можно ли (легко) использовать программную точку с плавающей запятой в 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 ]

8 голосов
/ 22 ноября 2011

Удивительно, что 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 и, кажется, работает просто отлично.

4 голосов
/ 09 июля 2011

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 также поддерживает программные числа с плавающей запятой.

Удачи в поиске библиотеки, которая работает для вас.

4 голосов
/ 19 июня 2009

Если вы не хотите, чтобы загрузили всю цепочку инструментов вручную, вы можете начать с uclibc toolchain (я полагаю, версия i386) - soft float (AFAIK) не напрямую поддерживается для «нативной» компиляции в Debian и производных, но она может быть использована через «встроенный» подход цепочки инструментов uclibc.

0 голосов
/ 19 июня 2009

G'day,

Если вы не ориентируетесь на платформу, в которой нет встроенной поддержки FP, я не могу представить себе причину, по которой вы захотите эмулировать поддержку FP.

Разве ваша платформа x386 не поддерживает внешние FPU? Жаль, что это не x486 со встроенным FPU!

По моему опыту, любая мягкая эмуляция должна быть намного медленнее, чем ее аппаратный эквивалент.

Вот почему я закончил писать пакет в Ada, чтобы использовать встроенный 68k FPU вместо того, чтобы использовать мягкую эмуляцию, предоставленную производителем компилятора в то время. Фактически они закончили упаковывать его в свой компилятор.

Редактировать: Только что видел ваш комментарий ниже. Хммм, если вам не нужен полный набор поддержки FP, можно ли свернуть свои собственные для нескольких математических функций, которые вам нужны? Так начался упомянутый мною пакет Ada.

НТН

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...