インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
RTM 用の関数プロトタイプとマクロ定義
次の関数プロトタイプは immintrin.h ヘッダーファイルに含まれています。
unsigned int _xbegin(void); void _xend(void); void _xabort(const unsigned int imm); unsigned char _xtest(void);
次のマクロ定義は immintrin.h ヘッダーファイルに含まれています。
#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)
次の関数のマクロは 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 組込み関数が使用されています。