2012-11-02 9 views
12

私はFPUを持たない組み込みシステム用のソフトウェアを扱っています。より現実的なパフォーマンスの見通しを得るために、デスクトップにソフトウェア浮動小数点ライブラリを使用してこのソフトウェアを構築したいと考えています。どのようにこれを達成するためのアイデアを誰も持っていますか?x86_64のソフトフロート

これまでのところ、gccで-msoft-floatを使用することで大きな進展はありませんでした。私は現在clangを使っています。フラグ-Xclang -msoft-float -Xclang -no-implicit-floatを使用し、ソフトフロートルーチンの実装を持つライブラリを指定することで、私のアプリケーションをコンパイルすることができます。私はそれを実行しようとすると、それは常にsegfaults。このプログラムが依存しているライブラリは、ソフトフロートでコンパイルされていないためです。このアプリは、gtk、sqlite、expat、gcrypt、多数の内部ライブラリ、およびlibcに依存しています。

ソフトフロートサポートを備えた完全なビルド環境を構築する方法を知りたいと思います。私はuclibcのbuildrootを試して、CCCXXをclangのバイナリに設定しましたが、これはgccツールチェーンをコンパイルするための要件(コンパイラのバージョンが間違っていると不平を言うautotoolsのようなもの)のために動作しませんでした。私は新しいビルドルートでコンパイラとしてclangを使用したいので(ソフトフロートをサポートするために)、gccをビルドする必要はありません。 gccなしでこれを行うことは可能ですか?

+0

私は 'x86_64' ABIが存在すると登録xmm''必要があるため、これは、コードを変更することなしには不可能だと思います。とにかく 'gcc'が必要とする' mpfr'ライブラリを使って、 '-Ddouble = mpfr :: real'というトリッキーな作品が動作するかもしれません。 – hirschhornsalz

+0

注記したように、 'clang'は、浮動小数点命令またはレジスタへの参照なしでバイナリをコンパイルすることができました。このようなものを使ってツールチェーン全体を作る方法があるのなら、私の本当の疑問があると思います。 –

+0

提案されたソリューションはOKですか? –

答えて

5

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への呼び出しに注意してください。

いくつかの興味深いアイデアがこの質問で見つけることができます:Using software floating point on x86 linux

+0

これはうまくいきません - ライブラリ呼び出しではこれは問題ありませんが、SSEのないx86_64がないので、 '+ - * /'のような基本的な操作はSSE/xmmになります – hirschhornsalz

+0

SSEについて正しいです。しかし、それは動作します。私の更新された答えを見てください。 –

+1

これをgcc-4.7.2でコンパイルしようとすると、 'error:SSE register return with SSE disabled'というメッセージが表示されます。4.8が必要でしょうか? – hirschhornsalz

関連する問題