IA-32 アーキテクチャー・ベース・システムの FPU (浮動小数点演算ユニット) には、システムが数値計算を行ったり、ステータスワードとコントロール・ワード、およびエラーポインターを格納するために使用する 8 個の浮動小数点レジスターが含まれています。通常、配慮する必要があるのはステータスワードとコントロール・ワードのみで、それも浮動小数点環境をカスタマイズするときに限られます。
FPU のステータスワードとコントロール・ワードは、FPU の状態を示す値を保持するビットまたは FPU の動作を制御するビットを含む 16 ビットのレジスターに対応しています。インテル® Fortran は、ステータスワードとコントロール・ワードに適切なビットを設定するためのシンボリック定数を定義しています。
コントロール・レジスターおよびステータスレジスターの読み書きに使用されるシンボリック定数とライブラリー・ルーチンは、x87 コントロール・レジスターとステータスレジスターのみに影響します。これらのルーチンは、MXCSR レジスター (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。
これらのルーチンは、MXCSR (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。次に例を示します。
USE IFPORT
INTEGER(2) status, control, controlo, mask_all_traps
CALL GETCONTROLFPQQ(control)
WRITE (*, 9000) 'Control word: ', control
! Save old control word
controlo = control
! Clear the rounding control flags
control = IAND(control,NOT(FPCW$MCW_RC))
! Set new control to round up
control = IOR(control,FPCW$UP)
CALL SETCONTROLFPQQ(control)
CALL GETCONTROLFPQQ(control)
WRITE (*, 9000) 'Control word: ', control
! Demonstrate setting and clearing exception mask flags
mask_all_traps = FPCW$INVALID + FPCW$DENORMAL + &
FPCW$ZERODIVIDE + FPCW$OVERFLOW + &
FPCW$UNDERFLOW + FPCW$INEXACT
! Clear the exception mask flags
control = IAND(control,NOT(FPCW$MCW_EM))
! Set new exception mask to disallow overflow
! (i.e., enable overflow traps)
! but allow (i.e., mask) all other exception conditions.
control = IOR(control,IEOR(mask_all_traps,FPCW$OVERFLOW))
CALL SETCONTROLFPQQ(control)
CALL GETCONTROLFPQQ(control)
WRITE (*, 9000) 'Control word: ', control
9000 FORMAT (1X, A, Z4)
END
ステータス・シンボリック定数とコントロール・シンボリック定数 (上の例では FPCW$OVERFLOW や FPCW$CHOP など) は、...\INCLUDE フォルダー内の IFORT.F90 モジュールに INTEGER(2) パラメーターとして定義されています。ステータスワードとコントロール・ワードは、異なる FPU オプションのパラメーターを (.AND. などを使用して) 論理的に組み合わせたものから構成されています。
シンボリック定数名は、name$option という一般的な形式を持ちます。name プリフィックスには次のいずれかが使用されます。
option サフィックスは、その name プリフィックスに対して用意されるオプションのいずれかになります。name$option パラメーターは、ステータスオプションまたはコントロール・オプションに対応しているか (例えば、FPSW$ZERODIVIDE は、ゼロ除算例外が発生したかどうかを示すステータスワード・パラメーターです)、name の全オプションのシンボリック定数を 1 に設定するマスクに対応しています。マスクは論理関数 (IAND、IOR、および NOT など) で使用することができ、指定された name の全オプションを設定またはクリアするために使用することができます。以下のセクションでは、option の定義と、その使用方法の例を示します。
IA-32 アーキテクチャー・ベース・システムでは、浮動小数点プロセッサー・オプションを制御し、ランタイム・ライブラリー・ルーチンの GETSTATUSFPQQ (IA-32 アーキテクチャーのみ)、GETCONTROLFPQQ (IA-32 アーキテクチャーのみ)、および SETCONTROLFPQQ (IA-32 アーキテクチャーのみ) を使用してそのステータスを調べることができます。これらのルーチンの使用例も以下のセクションで示します。