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