3.2.8 C99 インタフェースの ARM 浮動小数点コンパイラ拡張

ARM® C ライブラリでは、 ARM 浮動小数点環境で実現可能なすべての機能を ARM インタフェースで実行できるように、C99 インタフェースが拡張されています。拡張機能には、個々の例外の型のトラップの設定と解除、ユーザ定義のトラップハンドラのインストールなども含まれます。

ARM コンパイラ ツールチェーンでは、AArch64 ターゲット用の浮動小数点の例外のトラップはサポートされません。

これらの機能では、例外をサポートする浮動小数点モデルが必要です。 ARM コンパイラ コンパイラ 6 では、これはデフォルトで有効になっています。-ffast-math などの armclang コマンドラインオプションによって無効になります。
fenv_t 型と fexcept_t 型は、C99 では特に定義されていません。 ARM では、これら 2 つの型が同じ構造体型として定義されています。
AArch32 状態では、fenv_tfexcept_t の構造は次のようになります。
typedef struct{
    unsigned __statusword;
    __ieee_handler_t __invalid_handler;
    __ieee_handler_t __divbyzero_handler;
    __ieee_handler_t __overflow_handler;
    __ieee_handler_t __underflow_handler;
    __ieee_handler_t __inexact_handler;
} fenv_t, fexcept_t;
上記の構造体のメンバは以下のとおりです。
  • __statusword は、__ieee_status() 関数で使用されるステータス変数と同じであり、同じ形式で配置されます。
  • 各例外のトラップハンドラのアドレスを指す 5 つの関数ポインタ。デフォルトでは、どのポインタも NULL です。つまり、例外がトラップされると、そのデフォルトの例外トラップの動作が発生します。デフォルトでは、SIGFPE シグナルが生成されます。
AArch64 状態では、fenv_tfexcept_t の構造は次のようになります。
typedef struct{
    unsigned __statusword;
} fenv_t, fexcept_t;
関連する概念
3.2 ARM 浮動小数点環境の制御
3.2.9 ユーザ定義の例外トラップハンドラの記述
3.2.10 ユーザ定義の例外ハンドラの例
3.2.11 シグナルによる例外トラップ処理
3.5.7 IEEE 754 浮動小数点演算で発生する例外
関連する参考文書
3.2.2 ARM 浮動小数点環境を制御するための C99 互換関数
5.5 __ieee_status()
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.