1/* XL compiler Hardware Transactional Memory (HTM) execution intrinsics. 2 Copyright (C) 2013-2020 Free Software Foundation, Inc. 3 Contributed by Peter Bergner <bergner@vnet.ibm.com>. 4 5 This file is free software; you can redistribute it and/or modify it under 6 the terms of the GNU General Public License as published by the Free 7 Software Foundation; either version 3 of the License, or (at your option) 8 any later version. 9 10 This file is distributed in the hope that it will be useful, but WITHOUT 11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 for more details. 14 15 Under Section 7 of GPL version 3, you are granted additional 16 permissions described in the GCC Runtime Library Exception, version 17 3.1, as published by the Free Software Foundation. 18 19 You should have received a copy of the GNU General Public License and 20 a copy of the GCC Runtime Library Exception along with this program; 21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 22 <http://www.gnu.org/licenses/>. */ 23 24#ifndef __HTM__ 25# error "HTM instruction set not enabled" 26#endif /* __HTM__ */ 27 28#ifndef _HTMXLINTRIN_H 29#define _HTMXLINTRIN_H 30 31#include <stdint.h> 32#include <htmintrin.h> 33 34#ifdef __cplusplus 35extern "C" { 36#endif 37 38#define _TEXASR_PTR(TM_BUF) \ 39 ((texasr_t *)((TM_BUF)+0)) 40#define _TEXASRU_PTR(TM_BUF) \ 41 ((texasru_t *)((TM_BUF)+0)) 42#define _TEXASRL_PTR(TM_BUF) \ 43 ((texasrl_t *)((TM_BUF)+4)) 44#define _TFIAR_PTR(TM_BUF) \ 45 ((tfiar_t *)((TM_BUF)+8)) 46 47typedef char TM_buff_type[16]; 48 49/* Compatibility macro with s390. This macro can be used to determine 50 whether a transaction was successfully started from the __TM_begin() 51 and __TM_simple_begin() intrinsic functions below. */ 52#define _HTM_TBEGIN_STARTED 1 53 54extern __inline long 55__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 56__TM_simple_begin (void) 57{ 58 if (__builtin_expect (__builtin_tbegin (0), 1)) 59 return _HTM_TBEGIN_STARTED; 60 return 0; 61} 62 63extern __inline long 64__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 65__TM_begin (void* const TM_buff) 66{ 67 *_TEXASRL_PTR (TM_buff) = 0; 68 if (__builtin_expect (__builtin_tbegin (0), 1)) 69 return _HTM_TBEGIN_STARTED; 70#ifdef __powerpc64__ 71 *_TEXASR_PTR (TM_buff) = __builtin_get_texasr (); 72#else 73 *_TEXASRU_PTR (TM_buff) = __builtin_get_texasru (); 74 *_TEXASRL_PTR (TM_buff) = __builtin_get_texasr (); 75#endif 76 *_TFIAR_PTR (TM_buff) = __builtin_get_tfiar (); 77 return 0; 78} 79 80extern __inline long 81__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 82__TM_end (void) 83{ 84 unsigned char status = _HTM_STATE (__builtin_tend (0)); 85 if (__builtin_expect (status, _HTM_TRANSACTIONAL)) 86 return 1; 87 return 0; 88} 89 90extern __inline void 91__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 92__TM_abort (void) 93{ 94 __builtin_tabort (0); 95} 96 97extern __inline void 98__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 99__TM_named_abort (unsigned char const code) 100{ 101 __builtin_tabort (code); 102} 103 104extern __inline void 105__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 106__TM_resume (void) 107{ 108 __builtin_tresume (); 109} 110 111extern __inline void 112__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 113__TM_suspend (void) 114{ 115 __builtin_tsuspend (); 116} 117 118extern __inline long 119__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 120__TM_is_user_abort (void* const TM_buff) 121{ 122 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 123 return _TEXASRU_ABORT (texasru); 124} 125 126extern __inline long 127__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 128__TM_is_named_user_abort (void* const TM_buff, unsigned char *code) 129{ 130 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 131 132 *code = _TEXASRU_FAILURE_CODE (texasru); 133 return _TEXASRU_ABORT (texasru); 134} 135 136extern __inline long 137__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 138__TM_is_illegal (void* const TM_buff) 139{ 140 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 141 return _TEXASRU_DISALLOWED (texasru); 142} 143 144extern __inline long 145__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 146__TM_is_footprint_exceeded (void* const TM_buff) 147{ 148 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 149 return _TEXASRU_FOOTPRINT_OVERFLOW (texasru); 150} 151 152extern __inline long 153__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 154__TM_nesting_depth (void* const TM_buff) 155{ 156 texasrl_t texasrl; 157 158 if (_HTM_STATE (__builtin_ttest ()) == _HTM_NONTRANSACTIONAL) 159 { 160 texasrl = *_TEXASRL_PTR (TM_buff); 161 if (!_TEXASR_FAILURE_SUMMARY (texasrl)) 162 texasrl = 0; 163 } 164 else 165 texasrl = (texasrl_t) __builtin_get_texasr (); 166 167 return _TEXASR_TRANSACTION_LEVEL (texasrl); 168} 169 170extern __inline long 171__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 172__TM_is_nested_too_deep(void* const TM_buff) 173{ 174 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 175 return _TEXASRU_NESTING_OVERFLOW (texasru); 176} 177 178extern __inline long 179__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 180__TM_is_conflict(void* const TM_buff) 181{ 182 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 183 /* Return TEXASR bits 11 (Self-Induced Conflict) through 184 14 (Translation Invalidation Conflict). */ 185 return (_TEXASRU_EXTRACT_BITS (texasru, 14, 4)) ? 1 : 0; 186} 187 188extern __inline long 189__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 190__TM_is_failure_persistent(void* const TM_buff) 191{ 192 texasru_t texasru = *_TEXASRU_PTR (TM_buff); 193 return _TEXASRU_FAILURE_PERSISTENT (texasru); 194} 195 196extern __inline long 197__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 198__TM_failure_address(void* const TM_buff) 199{ 200 return *_TFIAR_PTR (TM_buff); 201} 202 203extern __inline long long 204__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) 205__TM_failure_code(void* const TM_buff) 206{ 207 return *_TEXASR_PTR (TM_buff); 208} 209 210#ifdef __cplusplus 211} 212#endif 213 214#endif /* _HTMXLINTRIN_H */ 215