インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
グループ 1 のプロトタイプとマクロ定義を使用するには、次のように immintrin.h ファイルをインクルードします。
#include <immintrin.h>
グループ 1: 関数プロトタイプ
unsigned int _xbegin(void); void _xend(void); void _xabort(const unsigned int imm); unsigned char _xtest(void);
次のマクロ定義は immintrin.h ヘッダーファイルに含まれています。
グループ 1: マクロ定義
#define _XBEGIN_STARTED (~0u) #define _XABORT_EXPLICIT (1 << 0) #define _XABORT_RETRY (1 << 1) #define _XABORT_CONFLICT (1 << 2) #define _XABORT_CAPACITY (1 << 3) #define _XABORT_DEBUG (1 << 4) #define _XABORT_NESTED (1 << 5)
グループ 2: 関数マクロ
次の関数マクロは immintrin.h ヘッダーファイルに含まれていません。使用する場合は、アプリケーションで定義する必要があります。
RTM 対応ハードウェア |
---|
#define __try_transaction(x) if ((x =_xbegin()) == _XBEGIN_STARTED) #define __try_else _xend() } else #define __transaction_abort(c) _xabort(c) |
RTM 非対応ハードウェア |
---|
#define __try_transaction(x) if (0) { #define __try_else } else #define __transaction_abort(c) |
x は符号なし整数型のローカル変数です。RTM トランザクション・アボート・コードにアクセスし、_xbegin() の戻り値を取得できます。c は符号なし整数型のコンパイル時定数値です。_xabort(c) が実行されると x の上位ビットで返されます。
マクロのサンプルコード |
---|
foo() { // ユーザー定義マクロ int status; __try_transaction (status) { ,,, ,,, ,,, transaction code …. } __try_else { if (status & _XABORT_CONFLICT) { … code } } } |
擬似 ASM コード |
---|
foo() { or eax 0xffffffff xbegin L1 L1: mov status, eax cmp eax 0xffffffff jnz L2 transaction code // アボートするとハードウェアは L1 から再開します xend jmp L3 L2: abort handler code L3: ret } |
コンパイラーは、マクロをスペキュレーティブ実行パスの適切な分岐と代替実行パスを含む命令シーケンスに変換します。
上記の例は、マクロのサンプルコードと似ていますが、__try_transaction マクロと __try_else マクロの代わりに RTM 組込み関数が使用されています。