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 493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_begin (void* const TM_buff) 663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__ 713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar *_TEXASR_PTR (TM_buff) = __builtin_get_texasr (); 723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#else 733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar *_TEXASRU_PTR (TM_buff) = __builtin_get_texasru (); 743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar *_TEXASRL_PTR (TM_buff) = __builtin_get_texasr (); 753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif 763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_named_abort (unsigned char const code) 993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_is_user_abort (void* const TM_buff) 1203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_is_named_user_abort (void* const TM_buff, unsigned char *code) 1283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar texasru_t texasru = *_TEXASRU_PTR (TM_buff); 1303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_is_illegal (void* const TM_buff) 1383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_is_footprint_exceeded (void* const TM_buff) 1463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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 { 1593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_is_nested_too_deep(void* const TM_buff) 1723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_is_failure_persistent(void* const TM_buff) 1903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 1973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_failure_address(void* const TM_buff) 1983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 1993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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__)) 2043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar__TM_failure_code(void* const TM_buff) 2053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar{ 2063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama 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 21533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#ifdef __s390__ 21633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 21733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#include <stdint.h> 21833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 21933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar/* These intrinsics are being made available for compatibility with 22033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar the IBM XL compiler. For documentation please see the "z/OS XL 22133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar C/C++ Programming Guide" publically available on the web. */ 22233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 22333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 22433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_simple_begin () 22533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 22633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return __builtin_tbegin_nofloat (0); 22733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 22833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 22933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 23033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_begin (void* const tdb) 23133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 23233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return __builtin_tbegin_nofloat (tdb); 23333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 23433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 23533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 23633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_end () 23733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 23833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return __builtin_tend (); 23933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 24033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 24133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline void __attribute__((__always_inline__)) 24233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_abort () 24333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 24433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return __builtin_tabort (_HTM_FIRST_USER_ABORT_CODE); 24533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 24633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 24733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline void __attribute__((__always_inline__, __nodebug__)) 24833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_named_abort (unsigned char const code) 24933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 25033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return __builtin_tabort ((int)_HTM_FIRST_USER_ABORT_CODE + code); 25133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 25233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 25333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline void __attribute__((__always_inline__, __nodebug__)) 25433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_non_transactional_store (void* const addr, long long const value) 25533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 25633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar __builtin_non_tx_store ((uint64_t*)addr, (uint64_t)value); 25733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 25833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 25933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 26033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_nesting_depth (void* const tdb_ptr) 26133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 26233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar int depth = __builtin_tx_nesting_depth (); 26333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 26433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 26533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar if (depth != 0) 26633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return depth; 26733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 26833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar if (tdb->format != 1) 26933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return 0; 27033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return tdb->nesting_depth; 27133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 27233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 27333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar/* Transaction failure diagnostics */ 27433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 27533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 27633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_user_abort (void* const tdb_ptr) 27733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 27833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 27933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 28033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar if (tdb->format != 1) 28133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return 0; 28233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 28333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return !!(tdb->abort_code >= _HTM_FIRST_USER_ABORT_CODE); 28433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 28533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 28633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 28733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_named_user_abort (void* const tdb_ptr, unsigned char* code) 28833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 28933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 29033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 29133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar if (tdb->format != 1) 29233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return 0; 29333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 29433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar if (tdb->abort_code >= _HTM_FIRST_USER_ABORT_CODE) 29533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar { 29633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar *code = tdb->abort_code - _HTM_FIRST_USER_ABORT_CODE; 29733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return 1; 29833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar } 29933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return 0; 30033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 30133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 30233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 30333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_illegal (void* const tdb_ptr) 30433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 30533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 30633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 30733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return (tdb->format == 1 30833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar && (tdb->abort_code == 4 /* unfiltered program interruption */ 30933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar || tdb->abort_code == 11 /* restricted instruction */)); 31033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 31133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 31233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 31333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_footprint_exceeded (void* const tdb_ptr) 31433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 31533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 31633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 31733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return (tdb->format == 1 31833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar && (tdb->abort_code == 7 /* fetch overflow */ 31933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar || tdb->abort_code == 8 /* store overflow */)); 32033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 32133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 32233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 32333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_nested_too_deep (void* const tdb_ptr) 32433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 32533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 32633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 32733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return tdb->format == 1 && tdb->abort_code == 13; /* depth exceeded */ 32833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 32933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 33033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 33133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_conflict (void* const tdb_ptr) 33233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 33333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 33433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 33533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return (tdb->format == 1 33633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar && (tdb->abort_code == 9 /* fetch conflict */ 33733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar || tdb->abort_code == 10 /* store conflict */)); 33833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 33933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 34033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 34133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_is_failure_persistent (long const result) 34233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 34333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return result == _HTM_TBEGIN_PERSISTENT; 34433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 34533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 34633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 34733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_failure_address (void* const tdb_ptr) 34833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 34933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 35033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return tdb->atia; 35133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 35233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 35333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstatic __inline long __attribute__((__always_inline__, __nodebug__)) 35433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar__TM_failure_code (void* const tdb_ptr) 35533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar{ 35633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct __htm_tdb *tdb = (struct __htm_tdb*)tdb_ptr; 35733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 35833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return tdb->abort_code; 35933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 36033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 36133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#endif /* __s390__ */ 36233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 3633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#endif /* __HTMXLINTRIN_H */ 364