Подтвердить что ты не робот

Мягкий поплавок на x86_64

Я работаю над программным обеспечением для встроенной системы, у которой нет FPU. Я хотел бы иметь возможность создавать это программное обеспечение с помощью программной библиотеки с плавающей запятой на моем рабочем столе, чтобы получить более реалистичное представление о производительности. Кто-нибудь есть идеи о том, как достичь этого?

До сих пор я не добился больших успехов при использовании -msoft-float с gcc. В настоящее время я рассматриваю использование clang. Используя флаги -Xclang -msoft-float -Xclang -no-implicit-float и указав библиотеку, которая имеет реализации подпрограмм soft-float, я могу получить свое приложение для компиляции. Когда я пытаюсь запустить его, он всегда срывается. Насколько я могу судить, это потому, что библиотеки, от которых зависит эта программа, не были скомпилированы с помощью soft-float. Приложение зависит от gtk, sqlite, expat, gcrypt, ряда внутренних библиотек и libc.

Я хотел бы попытаться выяснить, как построить полную среду сборки с поддержкой soft-float. Я пробовал uclibc buildroot и установил CC и CXX в clang двоичные файлы, но это не сработало из-за требований к компиляции gcc toolchain (такие вещи, как autotools, жалующиеся на неправильную версию компилятора). Поскольку я хотел бы использовать clang в качестве компилятора в новом buildroot (для поддержки soft-float), я не вижу насущной необходимости в создании gcc. Можно ли это сделать без gcc?

4b9b3361

Ответ 1

GCC не может делать это без каких-либо дополнительных библиотек. В принципе, -msoft-float просто генерирует вызовы для библиотек с плавающей запятой, но требуемые библиотеки не являются частью GCC.

Чтобы связать библиотеки soft-fp, вы можете использовать переключатель -lsoft-fp.

Архитектура

X86_64 содержит расширения SSE, поэтому компилятор попытается создать SSE-код для основных операций, таких как + - */. Мы будем использовать переключатель -mno-sse, чтобы предотвратить это несанкционированное поведение.

Он может выглядеть следующим образом:

gcc -g -msoft-float -mno-sse -m64 -lsoft-fp

Для кода:

int main()
{
    float a = 10;
    float b = 20;

    float c = a * b;

    return 0;
}

Результирующая сборка будет:

    .file   "12.cpp"
    .def    __main; .scl    2;  .type   32; .endef
    .def    __mulsf3;   .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    subq    $48, %rsp
    .seh_stackalloc 48
    .seh_setframe   %rbp, 48
    .seh_endprologue
    call    __main
    movl    .LC0(%rip), %eax
    movl    %eax, -4(%rbp)
    movl    .LC1(%rip), %eax
    movl    %eax, -8(%rbp)
    movl    -8(%rbp), %edx
    movl    -4(%rbp), %ecx
    call    __mulsf3
    movl    %eax, -12(%rbp)
    movl    $0, %eax
    addq    $48, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .section .rdata,"dr"
    .align 4
.LC0:
    .long   1092616192
    .align 4
.LC1:
    .long   1101004800
    .ident  "GCC: (GNU) 4.8.0 20120624 (experimental)"

Никаких инструкций SSE не было создано. Обратите внимание на вызов __mulsf3.

В этом вопросе можно найти несколько интересных идей: Использование плавающей запятой программного обеспечения для x86 linux