15

FPUを持たない組み込みシステム向けのソフトウェアを扱っています。パフォーマンスのより現実的なビューを取得するために、デスクトップ上のソフトウェア浮動小数点ライブラリを使用してこのソフトウェアを構築できるようにしたいと考えています。これを達成する方法について誰かアイデアがありますか?

-msoft-floatこれまでのところ、gccの使用に関してはあまり進歩していません。私は現在、clangの使用を検討しています。フラグ-Xclang -msoft-float -Xclang -no-implicit-floatを使用し、soft-float ルーチンの実装を含むライブラリを指定することで、アプリケーションをコンパイルできます。実行しようとすると、常にセグメンテーション違反になります。私が知る限り、これは、このプログラムが依存するライブラリがソフトフロートでコンパイルされていないためです。このアプリは、gtk、sqlite、expat、gcrypt、多数の内部ライブラリ、および libc に依存しています。

soft-float をサポートする完全なビルド環境を構築する方法を見つけたいと思います。私は uclibc の buildroot と設定を試し、CCclangCXXのバイナリに接続しようとしましたが、gcc ツールチェーンをコンパイルするための要件 (コンパイラのバージョンが正しくないと文句を言う autotools など) が原因でうまくいきませんでした。(soft-float をサポートするために) 新しい buildroot のコンパイラとして clang を使用したいので、gcc をビルドする差し迫った必要性はないと思います。gccなしでこれを行うことは可能ですか?

4

1 に答える 1

6

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 でのソフトウェア浮動小数点の使用

于 2012-11-06T16:13:46.073 に答える