1

私はlibsoxr(Audacityチームによってライブラリから派生したlibsox)ライブラリをコンパイルしようとしています。osx 32、osx 64、および win32 をコンパイルできます。それらはインライン asm を使用し、Windows x64 プラットフォームはインライン asm をサポートしていません。問題のあるコードは次のとおりです。

#if HAVE_FENV_H
  #include <fenv.h>
#elif defined _MSC_VER
  #define FE_INVALID    1
  #define FE_DIVBYZERO  4
  #define FE_OVERFLOW   8
  #define FE_UNDERFLOW  16
  #define FE_INEXACT    32
  #define FE_ALL_EXCEPT (FE_INEXACT|FE_DIVBYZERO|FE_UNDERFLOW|FE_OVERFLOW|FE_INVALID)
  static __inline int fetestexcept(int excepts)
  {
    short status_word;
    __asm fnstsw status_word
    return status_word & excepts & FE_ALL_EXCEPT;
  }

  static __inline int feclearexcept(int excepts)
  {
    int16_t status[14];
    __asm fnstenv status
    status[2] &= ~(excepts & FE_ALL_EXCEPT);
    __asm fldenv status
    return 0;
  }
#endif

私は何fnstenvをするかわからfldenvない。x64と互換性を持たせるために誰かが私を案内してもらえますか?

4

2 に答える 2

2

これらの2つの関数はC標準の一部であるため、誰かがMSVCにこれらを要求したのはこれが初めてではないかと思います。他のプロジェクトが何を行ったかを確認してください。何も起こらず、迅速で簡単な解決策が必要な場合は、さらに資格を得ることができるはずです。

#elif定義_MSC_VER

コンパイラ(_M_X64)がこれらのインラインアセンブリバージョンを使用しないようにこのコードをラップするディレクティブ—デフォルト(遅い)コードが有効になります。

于 2012-12-28T20:06:08.030 に答える
2

Microsoft コンパイラでコンパイルすると仮定すると、インライン アセンブリの代わりに RTL 関数を使用できます。

特定の浮動小数点ステータス フラグをテストするには、 を呼び出します_statusfp。浮動小数点ステータス フラグをクリアするには、 を呼び出します_clearfp

使用_statusfpするには、生の 8087 フラグから で使用される抽象フラグに変換する必要があります_statusfp

アップデート

fenv.h問題のコードは、C99 の一部である小さな部分の実装です。C89のみを実装しているため、MSコンパイラに必要です。私の見解では、実際の C99 コンパイラを使用する方がはるかに優れています。それには の実装が伴いfenv.hます。

于 2012-12-28T14:32:17.450 に答える