コントロール・レジスターを読み書きするマクロ関数

次のマクロ関数を使用して、コントロール・レジスターの各ビットを読み書きできます。詳細は、「ストリーミング SIMD 拡張命令のレジスターを読み書きする組み込み関数」を参照してください。Itanium(R) ベースのシステム では、これらのマクロではアクセスできない FPSR ビットもあります。詳細については、「IA-64 命令のネイティブ組み込み関数」getfpsr() および setfpsr() 組み込み関数を参照してください。

例外状態マクロ マクロ引数
_MM_SET_EXCEPTION_STATE(x) _MM_EXCEPT_INVALID
_MM_GET_EXCEPTION_STATE() _MM_EXCEPT_DIV_ZERO
  _MM_EXCEPT_DENORM
マクロの定義
コントロール・レジスターの最下位 6 ビットを読み書きします。
_MM_EXCEPT_OVERFLOW
  _MM_EXCEPT_UNDERFLOW
  _MM_EXCEPT_INEXACT

次の例では、ゼロ除算例外が発生したかどうかをテストします。

_MM_EXCEPT_DIV_ZERO マクロによる例外状態の確認

例外マスクマクロ マクロ引数
_MM_SET_EXCEPTION_MASK(x) _MM_MASK_INVALID
_MM_GET_EXCEPTION_MASK () _MM_MASK_DIV_ZERO
  _MM_MASK_DENORM
マクロの定義
コントロール・レジスターのビット 7 〜 ビット 12 を読み書きします。

: 6 つの例外マスクビットのすべてが、常に影響を受けます。
明示的にセットされないビットはクリアされます。
_MM_MASK_OVERFLOW
  _MM_MASK_UNDERFLOW
  _MM_MASK_INEXACT

次の例では、オーバーフロー例外とアンダーフロー例外をマスクし、その他のすべての例外をマスク解除します。

_MM_MASK_OVERFLOW と _MM_MASK_UNDERFLOW による例外マスクの変更
_MM_SET_EXCEPTION_MASK(MM_MASK_OVERFLOW | _MM_MASK_UNDERFLOW)

 

丸めモード マクロ引数
_MM_SET_ROUNDING_MODE(x) _MM_ROUND_NEAREST
_MM_GET_ROUNDING_MODE() _MM_ROUND_DOWN
マクロの定義
コントロール・レジスターのビット 13 とビット 14 を読み書きします。
_MM_ROUND_UP
  _MM_ROUND_TOWARD_ZERO

次の例では、丸めモードがゼロ方向への丸めになっているかどうかをテストします。

_MM_ROUND_TOWARD_ZERO による丸めモードの確認
if (_MM_GET_ROUNDING_MODE() == _MM_ROUND_TOWARD_ZERO) {
/* Rounding mode is round toward zero */

}

 

FTZ (Flush-to-Zero) モード マクロ引数
_MM_SET_FLUSH_ZERO_MODE(x) _MM_FLUSH_ZERO_ON
_MM_GET_FLUSH_ZERO_MODE() _MM_FLUSH_ZERO_OFF
マクロの定義
コントロール・レジスターのビット 15 を読み書きします。
 

次の例では、FTZ モードを無効にします。

_MM_FLUSH_ZERO_OFF による FTZ モードの変更
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF)