13ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar/*===---- htmxlintrin.h - XL compiler HTM execution intrinsics-------------===*\ 23ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * 33ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * Permission is hereby granted, free of charge, to any person obtaining a copy 43ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * of this software and associated documentation files (the "Software"), to deal 53ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * in the Software without restriction, including without limitation the rights 63ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 73ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * copies of the Software, and to permit persons to whom the Software is 83ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * furnished to do so, subject to the following conditions: 93ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * 103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * The above copyright notice and this permission notice shall be included in 113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * all copies or substantial portions of the Software. 123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * 133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * THE SOFTWARE. 203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar * 213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar\*===----------------------------------------------------------------------===*/ 223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#ifndef __HTMXLINTRIN_H 243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#define __HTMXLINTRIN_H 253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#ifndef __HTM__ 273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#error "HTM instruction set not enabled" 283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif 293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#include <htmintrin.h> 313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#ifdef __powerpc__ 333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#ifdef __cplusplus 353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern "C" { 363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif 373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#define _TEXASR_PTR(TM_BUF) \ 393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ((texasr_t *)((TM_BUF)+0)) 403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#define _TEXASRU_PTR(TM_BUF) \ 413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ((texasru_t *)((TM_BUF)+0)) 423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#define _TEXASRL_PTR(TM_BUF) \ 433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ((texasrl_t *)((TM_BUF)+4)) 443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#define _TFIAR_PTR(TM_BUF) \ 453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ((tfiar_t *)((TM_BUF)+8)) 463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainartypedef char TM_buff_type[16]; 483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/* This macro can be used to determine whether a transaction was successfully 503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar started from the __TM_begin() and __TM_simple_begin() intrinsic functions 513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar below. */ 523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#define _HTM_TBEGIN_STARTED 1 533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_simple_begin (void) 573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (__builtin_expect (__builtin_tbegin (0), 1)) 593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _HTM_TBEGIN_STARTED; 603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return 0; 613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_begin (void* const __TM_buff) 663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *_TEXASRL_PTR (__TM_buff) = 0; 683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (__builtin_expect (__builtin_tbegin (0), 1)) 693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _HTM_TBEGIN_STARTED; 703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#ifdef __powerpc64__ 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *_TEXASR_PTR (__TM_buff) = __builtin_get_texasr (); 723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#else 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *_TEXASRU_PTR (__TM_buff) = __builtin_get_texasru (); 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *_TEXASRL_PTR (__TM_buff) = __builtin_get_texasr (); 753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *_TFIAR_PTR (__TM_buff) = __builtin_get_tfiar (); 773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return 0; 783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_end (void) 833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (__builtin_expect (__builtin_tend (0), 1)) 853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return 1; 863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return 0; 873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline void 903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_abort (void) 923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar __builtin_tabort (0); 943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline void 973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_named_abort (unsigned char const __code) 993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar __builtin_tabort (__code); 1013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline void 1043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_resume (void) 1063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar __builtin_tresume (); 1083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline void 1113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_suspend (void) 1133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar __builtin_tsuspend (); 1153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_user_abort (void* const __TM_buff) 1203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (__TM_buff); 1223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASRU_ABORT (texasru); 1233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_named_user_abort (void* const __TM_buff, unsigned char *__code) 1283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (__TM_buff); 1303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *__code = _TEXASRU_FAILURE_CODE (texasru); 1323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASRU_ABORT (texasru); 1333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_illegal (void* const __TM_buff) 1383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (__TM_buff); 1403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASRU_DISALLOWED (texasru); 1413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_footprint_exceeded (void* const __TM_buff) 1463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (__TM_buff); 1483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASRU_FOOTPRINT_OVERFLOW (texasru); 1493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_nesting_depth (void* const __TM_buff) 1543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar texasrl_t texasrl; 1563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (_HTM_STATE (__builtin_ttest ()) == _HTM_NONTRANSACTIONAL) 1583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar { 1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasrl = *_TEXASRL_PTR (__TM_buff); 1603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!_TEXASR_FAILURE_SUMMARY (texasrl)) 1613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar texasrl = 0; 1623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 1633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar else 1643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar texasrl = (texasrl_t) __builtin_get_texasr (); 1653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASR_TRANSACTION_LEVEL (texasrl); 1673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_nested_too_deep(void* const __TM_buff) 1723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (__TM_buff); 1743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASRU_NESTING_OVERFLOW (texasru); 1753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_conflict(void* const __TM_buff) 1803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (TM_buff); 1823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar /* Return TEXASR bits 11 (Self-Induced Conflict) through 1833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 14 (Translation Invalidation Conflict). */ 1843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return (_TEXASRU_EXTRACT_BITS (texasru, 14, 4)) ? 1 : 0; 1853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_failure_persistent(void* const __TM_buff) 1903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (__TM_buff); 1923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return _TEXASRU_FAILURE_PERSISTENT (texasru); 1933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 1943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long 1963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_failure_address(void* const __TM_buff) 1983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return *_TFIAR_PTR (__TM_buff); 2003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 2013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 2023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarextern __inline long long 2033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_failure_code(void* const __TM_buff) 2053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return *_TEXASR_PTR (__TM_buff); 2073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 2083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 2093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#ifdef __cplusplus 2103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 2113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif 2123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 2133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif /* __powerpc__ */ 2143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 21558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#ifdef __s390__ 21658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 21758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#include <stdint.h> 21858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 21958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar/* These intrinsics are being made available for compatibility with 22058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar the IBM XL compiler. For documentation please see the "z/OS XL 22158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar C/C++ Programming Guide" publically available on the web. */ 22258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 22358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 22458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar__TM_simple_begin () 22558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 22658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return __builtin_tbegin_nofloat (0); 22758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 22858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 22958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_begin (void* const __tdb) 23158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return __builtin_tbegin_nofloat (__tdb); 23358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 23458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 23558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 23658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar__TM_end () 23758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 23858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return __builtin_tend (); 23958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 24058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 24158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline void __attribute__((__always_inline__)) 24258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar__TM_abort () 24358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 24458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return __builtin_tabort (_HTM_FIRST_USER_ABORT_CODE); 24558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 24658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 24758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline void __attribute__((__always_inline__, __nodebug__)) 2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_named_abort (unsigned char const __code) 24958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return __builtin_tabort ((int)_HTM_FIRST_USER_ABORT_CODE + __code); 25158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 25258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 25358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline void __attribute__((__always_inline__, __nodebug__)) 2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_non_transactional_store (void* const __addr, long long const __value) 25558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar __builtin_non_tx_store ((uint64_t*)__addr, (uint64_t)__value); 25758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 25858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 25958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_nesting_depth (void* const __tdb_ptr) 26158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 26258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar int depth = __builtin_tx_nesting_depth (); 2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 26458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 26558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (depth != 0) 26658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return depth; 26758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 26858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (tdb->format != 1) 26958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return 0; 27058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return tdb->nesting_depth; 27158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 27258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 27358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar/* Transaction failure diagnostics */ 27458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 27558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_user_abort (void* const __tdb_ptr) 27758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 27958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 28058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (tdb->format != 1) 28158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return 0; 28258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 28358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return !!(tdb->abort_code >= _HTM_FIRST_USER_ABORT_CODE); 28458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 28558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 28658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_named_user_abort (void* const __tdb_ptr, unsigned char* __code) 28858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 29058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 29158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (tdb->format != 1) 29258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return 0; 29358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 29458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (tdb->abort_code >= _HTM_FIRST_USER_ABORT_CODE) 29558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar { 2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar *__code = tdb->abort_code - _HTM_FIRST_USER_ABORT_CODE; 29758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return 1; 29858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 29958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return 0; 30058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 30158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 30258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_illegal (void* const __tdb_ptr) 30458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 30658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 30758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return (tdb->format == 1 30858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar && (tdb->abort_code == 4 /* unfiltered program interruption */ 30958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar || tdb->abort_code == 11 /* restricted instruction */)); 31058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 31158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 31258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_footprint_exceeded (void* const __tdb_ptr) 31458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 31658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 31758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return (tdb->format == 1 31858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar && (tdb->abort_code == 7 /* fetch overflow */ 31958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar || tdb->abort_code == 8 /* store overflow */)); 32058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 32158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 32258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_nested_too_deep (void* const __tdb_ptr) 32458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 32658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 32758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return tdb->format == 1 && tdb->abort_code == 13; /* depth exceeded */ 32858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 32958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 33058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_conflict (void* const __tdb_ptr) 33258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 33458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 33558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return (tdb->format == 1 33658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar && (tdb->abort_code == 9 /* fetch conflict */ 33758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar || tdb->abort_code == 10 /* store conflict */)); 33858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 33958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 34058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_is_failure_persistent (long const __result) 34258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return __result == _HTM_TBEGIN_PERSISTENT; 34458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 34558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 34658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_failure_address (void* const __tdb_ptr) 34858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 35058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return tdb->atia; 35158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 35258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 35358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__TM_failure_code (void* const __tdb_ptr) 35558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar{ 3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr; 35758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 35858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return tdb->abort_code; 35958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 36058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 36158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#endif /* __s390__ */ 36258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 3633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif /* __HTMXLINTRIN_H */ 364