13

私は次の状況にあります:

  • SSE命令を許可しないカーネルのコードを書いています
  • 浮動小数点演算を行う必要があります
  • x86_64プラットフォーム用にコンパイルしています

問題を説明するコードサンプルを次に示します。

int
main(int argc, char** argv)
{
    double d = 0.0, dbase;
    uint64_t base_value = 300;

    d = (2200.0 - 1000.0)/(1000.0);
    dbase = d * base_value;
    printf("d = %f, dbase = %f\n", d, dbase);
    base_value = dbase;
    printf("base_value = %llu\n", (long long unsigned)base_value);
    return 0;
}

そして、これがmakefileの関連行です。

CFLAGS +=   -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow \
            -msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer

ビルドを実行すると、次のエラーが発生します。

SSE register return with SSE disabled

(エラーは、dとbase_valueを乗算する行を指します)

これを修正するために私ができることはありますか?-mno-sseを削除することはオプションではありませんが、コンパイラーは乗算を行うために非sseコードを生成できるはずです。

ありがとうネイサン

4

1 に答える 1

9

コンパイラがライブラリ ルーチンへの呼び出しを発行して浮動小数点乗算を (おそらく SSE を使用せずに) 実行しているように見えますが、戻り値が SSE に渡される呼び出しに ABI を使用しようとしています。明らかに、それはうまくいきません。

カーネルで浮動小数点を使用できる場合は、通常の (ユーザーランド) 引数の受け渡しと戻りの規則を使用しないソフトフロート操作を行う特別なランタイム ライブラリが必要です。ただし、私の知る限り、BSD カーネルでは浮動小数点はサポートされていません。数年前までは確かにそうでした。

おそらく、浮動小数点を使用できるかどうかを BSD カーネル開発者メーリング リストに問い合わせてください。SOよりも速く、より決定的な答えが得られると思います。

于 2009-10-12T19:08:39.753 に答える