インテル® 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 組込み関数が使用されています。