2012-11-02 6 views
12

Ich arbeite an Software für ein Embedded-System, das keine FPU hat. Ich würde gerne in der Lage sein, diese Software mit einer Software-Fließkomma-Bibliothek auf meinem Desktop zu bauen, um eine realistischere Sicht der Leistung zu erhalten. Hat jemand irgendwelche Ideen, wie man das erreicht?Soft Float auf x86_64

Bisher habe ich mit der Verwendung von -msoft-float mit gcc nicht viel Fortschritte gemacht. Momentan suche ich nach Klängen. Durch Verwendung der Flags -Xclang -msoft-float -Xclang -no-implicit-float und Angabe einer Bibliothek, die Implementierungen von Soft-Float-Routinen enthält, kann ich meine Anwendung kompilieren. Wenn ich versuche, es auszuführen, segmentiert es immer. Ich kann das am besten sagen, weil die Bibliotheken, von denen dieses Programm abhängt, nicht mit Soft-Float kompiliert wurden. Die App ist abhängig von gtk, sqlite, expat, gcrypt, einigen internen Bibliotheken und libc.

Ich möchte versuchen, herauszufinden, wie man eine komplette Build-Umgebung mit Soft-Float-Unterstützung bauen. Ich habe versucht, uclibc buildroot und CC und CXX zu Clarg binaries, aber das hat nicht funktioniert aufgrund der Anforderungen für das Übersetzen der gcc toolchain (Dinge wie autotools beschweren sich über die Compiler-Version ist inkorrekt). Da ich im neuen Buildroot clang als Compiler verwenden möchte (um Soft-Float-Unterstützung zu haben), sehe ich keinen dringenden Bedarf, gcc zu erstellen. Ist es möglich, dies ohne gcc zu tun?

+0

Ich denke, das ist unmöglich, ohne den Code zu ändern, weil das 'x86_64' ABI erfordert' xmm' anwesend sein Register:

einige interessanten Ideen können in dieser Frage zu finden. Vielleicht funktioniert ein '-Ddouble = mpfr :: real'-Trick mit der 'mpfr'-Bibliothek, die sowieso von' gcc' benötigt wird. – hirschhornsalz

+0

Wie bereits erwähnt, war 'clang' in der Lage, eine Binärdatei ohne Verweise auf die Gleitkommaanweisungen oder -register zu kompilieren. Ich nehme an, meine eigentliche Frage ist, ob es eine Möglichkeit gibt, eine ganze Toolchain mit so etwas zu erstellen. –

+0

War die vorgeschlagene Lösung in Ordnung? –

Antwort

5

GCC kann es ohne einige zusätzliche Bibliotheken nicht out-of-box tun. Im Wesentlichen generieren -msoft-float nur Aufrufe für Fließkomma-Bibliotheken, aber die erforderlichen Bibliotheken sind nicht Teil von GCC.

Um die soft-fp Bibliotheken zu verknüpfen, können Sie den Schalter -lsoft-fp verwenden.

Die X86_64-Architektur enthält SSE-Erweiterungen, daher versucht der Compiler, SSE-Code für grundlegende Operationen wie + - */zu generieren. Wir werden -mno-sse verwenden, um dieses unzulässige Verhalten zu unterdrücken.

Es kann wie folgt aussehen:

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

Für den Code:

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

    float c = a * b; 

    return 0; 
} 

Die resultierende Anordnung wird:

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

Keine SSE-Befehle generiert wurden. Beachten Sie den Anruf an __mulsf3. Using software floating point on x86 linux

+0

Ich bezweifle, dass dies funktioniert - für Bibliotheksaufrufe ist das ok, aber die grundlegenden Operationen wie '+ - * /' werden immer noch SSE/xmm sein, weil es keine x86_64 ohne SSE gibt. – hirschhornsalz

+0

Sie haben Recht mit SSE. Aber es wird funktionieren. Bitte, siehe meine aktualisierte Antwort. –

+1

Wenn ich versuche, dies mit gcc-4.7.2 zu kompilieren, bekomme ich einen 'Fehler: SSE register return with SSE disabled', vielleicht ist 4.8 erforderlich? – hirschhornsalz