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