2009-06-19 20 views
8

i386 linuxでソフトウェア浮動小数点を使用することは可能ですか?各呼び出しでカーネルにトラップすることはありませんか?あなたは、可能性がx86上でソフトウェア浮動小数点を使用するlinux

$ gcc -m32 -msoft-float -lm -o test test.c 
/tmp/cc8RXn8F.o: In function `main': 
test.c:(.text+0x39): undefined reference to `__muldf3' 
collect2: ld returned 1 exit status 

答えて

4

をあなたはは手であなたの全体のツールチェーンをブートストラップしたいない限り:私は-msoft-floatを試してみたが、それは(Ubuntuの)Cライブラリは、FPライブラリが含まれていない通常のようですuclibc toolchainで始まります(私の想像するi386バージョン) - soft floatは(debianと派生語の "ネイティブ"の)コンパイルでは直接サポートされていませんが、uclibcツールチェーンの "組み込み"アプローチで使用できます。

+0

お返事ありがとうございます。私はbuildrootを使用してuclibcをブートストラップしようとしましたが、.configファイルを無視しているようですが、少なくともUCLIBC_HAS_FPUオプションのためにBR2_UCLIBC_CONFIGの下で提供しました。/ – bdonlan

+0

@Alex uclibcツールチェーンのリンクが壊れています。 http://uclibc.org/toolchains.htmlは適切なはずですか? – zengr

0

やあ、

あなたは作り付けのFPをサポートしていないプラットフォームをターゲットしている場合を除き、私はあなたがFPのサポートをエミュレートしたいと思い理由を考えることはできません。

x386プラットフォームに外部FPUがサポートされていませんか?残念ながらFPUが組み込まれたx486ではありません!

私の経験では、ソフトエミュレーションはハードウェア同等のものよりもはるかに遅くなることがあります。

コンパイラメーカーが提供するソフトエミュレーションを使用する代わりに、Adaでパッケージを作成してオンボードの68k FPUをタグセットしたのです。彼らは実際にコンパイラでバンドルを終えました。

編集:あなたのコメントを下に表示しました。うーん、FPサポートの完全なスイートが必要ないなら、あなたが必要とする少数の数学関数のために自分自身をロールすることが可能ですか?私が言及したAdaパッケージがどのように始まったのか。 GCCは、いくつかの余分なライブラリなしでこれをサポートしていません

+3

私たちは組み込みx86 CPUに製品を移植することを検討していますが、それらの多くにはFPUがありません。私たちは現在、FPUのないプラットフォームで動作していますが、カーネルにトラップするためのペナルティは課されません:) – bdonlan

4

HTH

歓声、。 the 386 documentationから:

-msoft-float型 浮動小数点演算のためのライブラリ呼び出しを含む出力を生成します。 警告:必要なライブラリ はGCCの一部ではありません。 通常、 マシンの通常のCコンパイラの機能が使用されますが、これは クロスコンパイルでは直接実行できません。 クロスコンパイルのための適切な ライブラリ関数を提供するための自分の手配を行う必要があります。 - 機能は 浮動小数点結果が80387 レジスタ・スタック、いくつかの浮動小数点 オペコードが -msoftフロートも

を使用しても、ユーザーが設定することができない放出され得る返すマシンで

mfpmath = unitを "none"にするには、sse、387または両方でなければなりません。

しかし、this gnu wiki pageによれば、fp-softとieeeがあります。 SoftFloatもあります。

(ARM用には-mfloat-abi = softfpがありますが、386 SXでは同様のものはありません)

tccは、ソフトウェア浮動小数点数もサポートしています。

あなたに適したライブラリが見つかりました。

6

gccはコードがsoft-fpというディレクトリ内のソースではっきりと利用できるので、これをネイティブにサポートしていないのは驚きです。これは、手動でそのライブラリをコンパイルすることが可能です:

$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc 
$ cd libgcc/soft-fp/ 
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c 
$ ar -crv libsoft-fp.a *.o 

エラーによるコンパイルされませんが、大半はコンパイルんいくつかのCファイルがあります。私たちのソースファイルとディレクトリにlibsoft-fp.aをコピーした後、彼らは今、-msoft-floatで罰金コンパイル:

$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L. 

$ objdump -D --disassembler-options=intel a.out | less 

を使用して迅速な検査予想通り何のx87が浮動小数点命令が呼び出されていないことを示しており、コードの実行を多くの除算を使用している私の例では8倍もかなり遅くなっています。

注:私は

$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c 

とソフトフロートライブラリをコンパイルするのが好ましいただろうが、

adddf3.c: In function '__adddf3': 
adddf3.c:46: error: unknown register name 'st(1)' in 'asm' 

のようなエラーメッセージの負荷の結果はi386バージョンのように思えることがありますst(1)は、-msoft-floatを使用しているときには明らかに利用できないx87レジスタの1つを指しています。 i386で、奇妙なことに幸運なことにarmのバージョンが正しくコンパイルされていて、うまく動作しているようです。

関連する問題