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