2012-11-02 13 views
12

Pracuję na oprogramowaniu dla systemu wbudowanego, który nie ma jednostki FPU. Chciałbym móc zbudować to oprogramowanie z biblioteką zmiennoprzecinkową na pulpicie, aby uzyskać bardziej realistyczny obraz wydajności. Czy ktoś ma jakieś pomysły na temat tego, jak to osiągnąć?Soft Float na architekturze x86_64

Do tej pory nie zrobiłem dużego postępu w używaniu -msoft-float z gcc. Obecnie patrzę na użycie klang. Używając flag -Xclang -msoft-float -Xclang -no-implicit-float i określając bibliotekę, która ma implementacje procedur miękkiego float, jestem w stanie skompilować moją aplikację. Kiedy próbuję go uruchomić, to zawsze pęka. Jak najlepiej mogę to stwierdzić, dzieje się tak dlatego, że biblioteki, od których zależy ten program, nie zostały skompilowane za pomocą funkcji miękkiego unosu. Aplikacja zależy od gtk, sqlite, expat, gcrypt, wielu wewnętrznych bibliotek i libc.

Chciałbym spróbować dowiedzieć się, jak zbudować kompletne środowisko kompilacji z obsługą miękkiego pływaka. Próbowałem buildroot uclibc i ustawienia CC i CXX na binaria klang, ale to nie działało ze względu na wymagania dotyczące kompilowania łańcucha narzędzi gcc (rzeczy takie jak autotools narzeka na niepoprawną wersję kompilatora). Ponieważ chciałbym użyć clang jako kompilatora w nowym buildroot (aby mieć wsparcie dla soft-float), nie widzę pilnej potrzeby budowania gcc. Czy można to zrobić bez gcc?

+0

myślę, że to jest niemożliwe bez zmiany kodu, ponieważ 'x86_64' ABI wymaga' xmm' rejestruje być obecny. Może niektóre sztuczki '-Ddouble = mpfr :: real' zadziałają, używając biblioteki' mpfr', która jest wymagana przez 'gcc'. – hirschhornsalz

+0

Jak już wspomniano, 'clang' był w stanie skompilować plik binarny bez odwołań do instrukcji lub rejestrów zmiennoprzecinkowych. Przypuszczam, że moim prawdziwym pytaniem jest zatem, czy istnieje sposób na wykonanie całego zestawu narzędzi z wykorzystaniem czegoś takiego. –

+0

Czy proponowane rozwiązanie było w porządku? –

Odpowiedz

5

GCC nie może tego zrobić po uruchomieniu bez dodatkowych bibliotek. Zasadniczo, -msoft-float po prostu generuje wywołania dla bibliotek zmiennoprzecinkowych, ale wymagane biblioteki nie są częścią GCC.

Aby połączyć biblioteki soft-fp, można użyć przełącznika -lsoft-fp.

Architektura X86_64 zawiera rozszerzenia SSE, więc kompilator będzie próbował wygenerować kod SSE dla podstawowych operacji, takich jak + - * /. Użyjemy przełącznika -mno-sse, aby wyłączyć to nieautoryzowane zachowanie.

To może wyglądać następująco:

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

Dla kodu:

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

    float c = a * b; 

    return 0; 
} 

Powstały zespół będzie:

.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)" 

instrukcje SSE nie zostały wygenerowane. Zwróć uwagę na numer __mulsf3.

kilka ciekawych pomysłów można znaleźć w tej kwestii: Using software floating point on x86 linux

+0

Wątpię, czy to zadziała - w przypadku wywołań bibliotecznych to jest w porządku, ale podstawowe operacje, takie jak '+ - * /', nadal będą SSE/xmm, ponieważ nie ma x86_64 bez SSE – hirschhornsalz

+0

Masz rację co do SSE. Ale to zadziała. Zobacz moją zaktualizowaną odpowiedź. –

+1

Jeśli spróbuję skompilować to przy pomocy gcc-4.7.2, otrzymam komunikat "error: SSE register return with SSE disabled", może potrzeba 4.8? – hirschhornsalz

Powiązane problemy