1*344a7f5eSAndroid Build Coastguard Worker /*===---- htmxlintrin.h - XL compiler HTM execution intrinsics-------------===*\
2*344a7f5eSAndroid Build Coastguard Worker *
3*344a7f5eSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
4*344a7f5eSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
5*344a7f5eSAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
6*344a7f5eSAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*344a7f5eSAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
8*344a7f5eSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
9*344a7f5eSAndroid Build Coastguard Worker *
10*344a7f5eSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
11*344a7f5eSAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
12*344a7f5eSAndroid Build Coastguard Worker *
13*344a7f5eSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14*344a7f5eSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*344a7f5eSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16*344a7f5eSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17*344a7f5eSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18*344a7f5eSAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19*344a7f5eSAndroid Build Coastguard Worker * THE SOFTWARE.
20*344a7f5eSAndroid Build Coastguard Worker *
21*344a7f5eSAndroid Build Coastguard Worker \*===----------------------------------------------------------------------===*/
22*344a7f5eSAndroid Build Coastguard Worker
23*344a7f5eSAndroid Build Coastguard Worker #ifndef __HTMXLINTRIN_H
24*344a7f5eSAndroid Build Coastguard Worker #define __HTMXLINTRIN_H
25*344a7f5eSAndroid Build Coastguard Worker
26*344a7f5eSAndroid Build Coastguard Worker #ifndef __HTM__
27*344a7f5eSAndroid Build Coastguard Worker #error "HTM instruction set not enabled"
28*344a7f5eSAndroid Build Coastguard Worker #endif
29*344a7f5eSAndroid Build Coastguard Worker
30*344a7f5eSAndroid Build Coastguard Worker #include <htmintrin.h>
31*344a7f5eSAndroid Build Coastguard Worker
32*344a7f5eSAndroid Build Coastguard Worker #ifdef __powerpc__
33*344a7f5eSAndroid Build Coastguard Worker
34*344a7f5eSAndroid Build Coastguard Worker #ifdef __cplusplus
35*344a7f5eSAndroid Build Coastguard Worker extern "C" {
36*344a7f5eSAndroid Build Coastguard Worker #endif
37*344a7f5eSAndroid Build Coastguard Worker
38*344a7f5eSAndroid Build Coastguard Worker #define _TEXASR_PTR(TM_BUF) \
39*344a7f5eSAndroid Build Coastguard Worker ((texasr_t *)((TM_BUF)+0))
40*344a7f5eSAndroid Build Coastguard Worker #define _TEXASRU_PTR(TM_BUF) \
41*344a7f5eSAndroid Build Coastguard Worker ((texasru_t *)((TM_BUF)+0))
42*344a7f5eSAndroid Build Coastguard Worker #define _TEXASRL_PTR(TM_BUF) \
43*344a7f5eSAndroid Build Coastguard Worker ((texasrl_t *)((TM_BUF)+4))
44*344a7f5eSAndroid Build Coastguard Worker #define _TFIAR_PTR(TM_BUF) \
45*344a7f5eSAndroid Build Coastguard Worker ((tfiar_t *)((TM_BUF)+8))
46*344a7f5eSAndroid Build Coastguard Worker
47*344a7f5eSAndroid Build Coastguard Worker typedef char TM_buff_type[16];
48*344a7f5eSAndroid Build Coastguard Worker
49*344a7f5eSAndroid Build Coastguard Worker /* This macro can be used to determine whether a transaction was successfully
50*344a7f5eSAndroid Build Coastguard Worker started from the __TM_begin() and __TM_simple_begin() intrinsic functions
51*344a7f5eSAndroid Build Coastguard Worker below. */
52*344a7f5eSAndroid Build Coastguard Worker #define _HTM_TBEGIN_STARTED 1
53*344a7f5eSAndroid Build Coastguard Worker
54*344a7f5eSAndroid Build Coastguard Worker extern __inline long
55*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_simple_begin(void)56*344a7f5eSAndroid Build Coastguard Worker __TM_simple_begin (void)
57*344a7f5eSAndroid Build Coastguard Worker {
58*344a7f5eSAndroid Build Coastguard Worker if (__builtin_expect (__builtin_tbegin (0), 1))
59*344a7f5eSAndroid Build Coastguard Worker return _HTM_TBEGIN_STARTED;
60*344a7f5eSAndroid Build Coastguard Worker return 0;
61*344a7f5eSAndroid Build Coastguard Worker }
62*344a7f5eSAndroid Build Coastguard Worker
63*344a7f5eSAndroid Build Coastguard Worker extern __inline long
64*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_begin(void * const __TM_buff)65*344a7f5eSAndroid Build Coastguard Worker __TM_begin (void* const __TM_buff)
66*344a7f5eSAndroid Build Coastguard Worker {
67*344a7f5eSAndroid Build Coastguard Worker *_TEXASRL_PTR (__TM_buff) = 0;
68*344a7f5eSAndroid Build Coastguard Worker if (__builtin_expect (__builtin_tbegin (0), 1))
69*344a7f5eSAndroid Build Coastguard Worker return _HTM_TBEGIN_STARTED;
70*344a7f5eSAndroid Build Coastguard Worker #ifdef __powerpc64__
71*344a7f5eSAndroid Build Coastguard Worker *_TEXASR_PTR (__TM_buff) = __builtin_get_texasr ();
72*344a7f5eSAndroid Build Coastguard Worker #else
73*344a7f5eSAndroid Build Coastguard Worker *_TEXASRU_PTR (__TM_buff) = __builtin_get_texasru ();
74*344a7f5eSAndroid Build Coastguard Worker *_TEXASRL_PTR (__TM_buff) = __builtin_get_texasr ();
75*344a7f5eSAndroid Build Coastguard Worker #endif
76*344a7f5eSAndroid Build Coastguard Worker *_TFIAR_PTR (__TM_buff) = __builtin_get_tfiar ();
77*344a7f5eSAndroid Build Coastguard Worker return 0;
78*344a7f5eSAndroid Build Coastguard Worker }
79*344a7f5eSAndroid Build Coastguard Worker
80*344a7f5eSAndroid Build Coastguard Worker extern __inline long
81*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_end(void)82*344a7f5eSAndroid Build Coastguard Worker __TM_end (void)
83*344a7f5eSAndroid Build Coastguard Worker {
84*344a7f5eSAndroid Build Coastguard Worker if (__builtin_expect (__builtin_tend (0), 1))
85*344a7f5eSAndroid Build Coastguard Worker return 1;
86*344a7f5eSAndroid Build Coastguard Worker return 0;
87*344a7f5eSAndroid Build Coastguard Worker }
88*344a7f5eSAndroid Build Coastguard Worker
89*344a7f5eSAndroid Build Coastguard Worker extern __inline void
90*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_abort(void)91*344a7f5eSAndroid Build Coastguard Worker __TM_abort (void)
92*344a7f5eSAndroid Build Coastguard Worker {
93*344a7f5eSAndroid Build Coastguard Worker __builtin_tabort (0);
94*344a7f5eSAndroid Build Coastguard Worker }
95*344a7f5eSAndroid Build Coastguard Worker
96*344a7f5eSAndroid Build Coastguard Worker extern __inline void
97*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_named_abort(unsigned char const __code)98*344a7f5eSAndroid Build Coastguard Worker __TM_named_abort (unsigned char const __code)
99*344a7f5eSAndroid Build Coastguard Worker {
100*344a7f5eSAndroid Build Coastguard Worker __builtin_tabort (__code);
101*344a7f5eSAndroid Build Coastguard Worker }
102*344a7f5eSAndroid Build Coastguard Worker
103*344a7f5eSAndroid Build Coastguard Worker extern __inline void
104*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_resume(void)105*344a7f5eSAndroid Build Coastguard Worker __TM_resume (void)
106*344a7f5eSAndroid Build Coastguard Worker {
107*344a7f5eSAndroid Build Coastguard Worker __builtin_tresume ();
108*344a7f5eSAndroid Build Coastguard Worker }
109*344a7f5eSAndroid Build Coastguard Worker
110*344a7f5eSAndroid Build Coastguard Worker extern __inline void
111*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_suspend(void)112*344a7f5eSAndroid Build Coastguard Worker __TM_suspend (void)
113*344a7f5eSAndroid Build Coastguard Worker {
114*344a7f5eSAndroid Build Coastguard Worker __builtin_tsuspend ();
115*344a7f5eSAndroid Build Coastguard Worker }
116*344a7f5eSAndroid Build Coastguard Worker
117*344a7f5eSAndroid Build Coastguard Worker extern __inline long
118*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_user_abort(void * const __TM_buff)119*344a7f5eSAndroid Build Coastguard Worker __TM_is_user_abort (void* const __TM_buff)
120*344a7f5eSAndroid Build Coastguard Worker {
121*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (__TM_buff);
122*344a7f5eSAndroid Build Coastguard Worker return _TEXASRU_ABORT (texasru);
123*344a7f5eSAndroid Build Coastguard Worker }
124*344a7f5eSAndroid Build Coastguard Worker
125*344a7f5eSAndroid Build Coastguard Worker extern __inline long
126*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_named_user_abort(void * const __TM_buff,unsigned char * __code)127*344a7f5eSAndroid Build Coastguard Worker __TM_is_named_user_abort (void* const __TM_buff, unsigned char *__code)
128*344a7f5eSAndroid Build Coastguard Worker {
129*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (__TM_buff);
130*344a7f5eSAndroid Build Coastguard Worker
131*344a7f5eSAndroid Build Coastguard Worker *__code = _TEXASRU_FAILURE_CODE (texasru);
132*344a7f5eSAndroid Build Coastguard Worker return _TEXASRU_ABORT (texasru);
133*344a7f5eSAndroid Build Coastguard Worker }
134*344a7f5eSAndroid Build Coastguard Worker
135*344a7f5eSAndroid Build Coastguard Worker extern __inline long
136*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_illegal(void * const __TM_buff)137*344a7f5eSAndroid Build Coastguard Worker __TM_is_illegal (void* const __TM_buff)
138*344a7f5eSAndroid Build Coastguard Worker {
139*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (__TM_buff);
140*344a7f5eSAndroid Build Coastguard Worker return _TEXASRU_DISALLOWED (texasru);
141*344a7f5eSAndroid Build Coastguard Worker }
142*344a7f5eSAndroid Build Coastguard Worker
143*344a7f5eSAndroid Build Coastguard Worker extern __inline long
144*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_footprint_exceeded(void * const __TM_buff)145*344a7f5eSAndroid Build Coastguard Worker __TM_is_footprint_exceeded (void* const __TM_buff)
146*344a7f5eSAndroid Build Coastguard Worker {
147*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (__TM_buff);
148*344a7f5eSAndroid Build Coastguard Worker return _TEXASRU_FOOTPRINT_OVERFLOW (texasru);
149*344a7f5eSAndroid Build Coastguard Worker }
150*344a7f5eSAndroid Build Coastguard Worker
151*344a7f5eSAndroid Build Coastguard Worker extern __inline long
152*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_nesting_depth(void * const __TM_buff)153*344a7f5eSAndroid Build Coastguard Worker __TM_nesting_depth (void* const __TM_buff)
154*344a7f5eSAndroid Build Coastguard Worker {
155*344a7f5eSAndroid Build Coastguard Worker texasrl_t texasrl;
156*344a7f5eSAndroid Build Coastguard Worker
157*344a7f5eSAndroid Build Coastguard Worker if (_HTM_STATE (__builtin_ttest ()) == _HTM_NONTRANSACTIONAL)
158*344a7f5eSAndroid Build Coastguard Worker {
159*344a7f5eSAndroid Build Coastguard Worker texasrl = *_TEXASRL_PTR (__TM_buff);
160*344a7f5eSAndroid Build Coastguard Worker if (!_TEXASR_FAILURE_SUMMARY (texasrl))
161*344a7f5eSAndroid Build Coastguard Worker texasrl = 0;
162*344a7f5eSAndroid Build Coastguard Worker }
163*344a7f5eSAndroid Build Coastguard Worker else
164*344a7f5eSAndroid Build Coastguard Worker texasrl = (texasrl_t) __builtin_get_texasr ();
165*344a7f5eSAndroid Build Coastguard Worker
166*344a7f5eSAndroid Build Coastguard Worker return _TEXASR_TRANSACTION_LEVEL (texasrl);
167*344a7f5eSAndroid Build Coastguard Worker }
168*344a7f5eSAndroid Build Coastguard Worker
169*344a7f5eSAndroid Build Coastguard Worker extern __inline long
170*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_nested_too_deep(void * const __TM_buff)171*344a7f5eSAndroid Build Coastguard Worker __TM_is_nested_too_deep(void* const __TM_buff)
172*344a7f5eSAndroid Build Coastguard Worker {
173*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (__TM_buff);
174*344a7f5eSAndroid Build Coastguard Worker return _TEXASRU_NESTING_OVERFLOW (texasru);
175*344a7f5eSAndroid Build Coastguard Worker }
176*344a7f5eSAndroid Build Coastguard Worker
177*344a7f5eSAndroid Build Coastguard Worker extern __inline long
178*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_conflict(void * const __TM_buff)179*344a7f5eSAndroid Build Coastguard Worker __TM_is_conflict(void* const __TM_buff)
180*344a7f5eSAndroid Build Coastguard Worker {
181*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (TM_buff);
182*344a7f5eSAndroid Build Coastguard Worker /* Return TEXASR bits 11 (Self-Induced Conflict) through
183*344a7f5eSAndroid Build Coastguard Worker 14 (Translation Invalidation Conflict). */
184*344a7f5eSAndroid Build Coastguard Worker return (_TEXASRU_EXTRACT_BITS (texasru, 14, 4)) ? 1 : 0;
185*344a7f5eSAndroid Build Coastguard Worker }
186*344a7f5eSAndroid Build Coastguard Worker
187*344a7f5eSAndroid Build Coastguard Worker extern __inline long
188*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_is_failure_persistent(void * const __TM_buff)189*344a7f5eSAndroid Build Coastguard Worker __TM_is_failure_persistent(void* const __TM_buff)
190*344a7f5eSAndroid Build Coastguard Worker {
191*344a7f5eSAndroid Build Coastguard Worker texasru_t texasru = *_TEXASRU_PTR (__TM_buff);
192*344a7f5eSAndroid Build Coastguard Worker return _TEXASRU_FAILURE_PERSISTENT (texasru);
193*344a7f5eSAndroid Build Coastguard Worker }
194*344a7f5eSAndroid Build Coastguard Worker
195*344a7f5eSAndroid Build Coastguard Worker extern __inline long
196*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_failure_address(void * const __TM_buff)197*344a7f5eSAndroid Build Coastguard Worker __TM_failure_address(void* const __TM_buff)
198*344a7f5eSAndroid Build Coastguard Worker {
199*344a7f5eSAndroid Build Coastguard Worker return *_TFIAR_PTR (__TM_buff);
200*344a7f5eSAndroid Build Coastguard Worker }
201*344a7f5eSAndroid Build Coastguard Worker
202*344a7f5eSAndroid Build Coastguard Worker extern __inline long long
203*344a7f5eSAndroid Build Coastguard Worker __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_failure_code(void * const __TM_buff)204*344a7f5eSAndroid Build Coastguard Worker __TM_failure_code(void* const __TM_buff)
205*344a7f5eSAndroid Build Coastguard Worker {
206*344a7f5eSAndroid Build Coastguard Worker return *_TEXASR_PTR (__TM_buff);
207*344a7f5eSAndroid Build Coastguard Worker }
208*344a7f5eSAndroid Build Coastguard Worker
209*344a7f5eSAndroid Build Coastguard Worker #ifdef __cplusplus
210*344a7f5eSAndroid Build Coastguard Worker }
211*344a7f5eSAndroid Build Coastguard Worker #endif
212*344a7f5eSAndroid Build Coastguard Worker
213*344a7f5eSAndroid Build Coastguard Worker #endif /* __powerpc__ */
214*344a7f5eSAndroid Build Coastguard Worker
215*344a7f5eSAndroid Build Coastguard Worker #ifdef __s390__
216*344a7f5eSAndroid Build Coastguard Worker
217*344a7f5eSAndroid Build Coastguard Worker #include <stdint.h>
218*344a7f5eSAndroid Build Coastguard Worker
219*344a7f5eSAndroid Build Coastguard Worker /* These intrinsics are being made available for compatibility with
220*344a7f5eSAndroid Build Coastguard Worker the IBM XL compiler. For documentation please see the "z/OS XL
221*344a7f5eSAndroid Build Coastguard Worker C/C++ Programming Guide" publically available on the web. */
222*344a7f5eSAndroid Build Coastguard Worker
223*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_simple_begin()224*344a7f5eSAndroid Build Coastguard Worker __TM_simple_begin ()
225*344a7f5eSAndroid Build Coastguard Worker {
226*344a7f5eSAndroid Build Coastguard Worker return __builtin_tbegin_nofloat (0);
227*344a7f5eSAndroid Build Coastguard Worker }
228*344a7f5eSAndroid Build Coastguard Worker
229*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_begin(void * const __tdb)230*344a7f5eSAndroid Build Coastguard Worker __TM_begin (void* const __tdb)
231*344a7f5eSAndroid Build Coastguard Worker {
232*344a7f5eSAndroid Build Coastguard Worker return __builtin_tbegin_nofloat (__tdb);
233*344a7f5eSAndroid Build Coastguard Worker }
234*344a7f5eSAndroid Build Coastguard Worker
235*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_end()236*344a7f5eSAndroid Build Coastguard Worker __TM_end ()
237*344a7f5eSAndroid Build Coastguard Worker {
238*344a7f5eSAndroid Build Coastguard Worker return __builtin_tend ();
239*344a7f5eSAndroid Build Coastguard Worker }
240*344a7f5eSAndroid Build Coastguard Worker
241*344a7f5eSAndroid Build Coastguard Worker static __inline void __attribute__((__always_inline__))
__TM_abort()242*344a7f5eSAndroid Build Coastguard Worker __TM_abort ()
243*344a7f5eSAndroid Build Coastguard Worker {
244*344a7f5eSAndroid Build Coastguard Worker return __builtin_tabort (_HTM_FIRST_USER_ABORT_CODE);
245*344a7f5eSAndroid Build Coastguard Worker }
246*344a7f5eSAndroid Build Coastguard Worker
247*344a7f5eSAndroid Build Coastguard Worker static __inline void __attribute__((__always_inline__, __nodebug__))
__TM_named_abort(unsigned char const __code)248*344a7f5eSAndroid Build Coastguard Worker __TM_named_abort (unsigned char const __code)
249*344a7f5eSAndroid Build Coastguard Worker {
250*344a7f5eSAndroid Build Coastguard Worker return __builtin_tabort ((int)_HTM_FIRST_USER_ABORT_CODE + __code);
251*344a7f5eSAndroid Build Coastguard Worker }
252*344a7f5eSAndroid Build Coastguard Worker
253*344a7f5eSAndroid Build Coastguard Worker static __inline void __attribute__((__always_inline__, __nodebug__))
__TM_non_transactional_store(void * const __addr,long long const __value)254*344a7f5eSAndroid Build Coastguard Worker __TM_non_transactional_store (void* const __addr, long long const __value)
255*344a7f5eSAndroid Build Coastguard Worker {
256*344a7f5eSAndroid Build Coastguard Worker __builtin_non_tx_store ((uint64_t*)__addr, (uint64_t)__value);
257*344a7f5eSAndroid Build Coastguard Worker }
258*344a7f5eSAndroid Build Coastguard Worker
259*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_nesting_depth(void * const __tdb_ptr)260*344a7f5eSAndroid Build Coastguard Worker __TM_nesting_depth (void* const __tdb_ptr)
261*344a7f5eSAndroid Build Coastguard Worker {
262*344a7f5eSAndroid Build Coastguard Worker int depth = __builtin_tx_nesting_depth ();
263*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
264*344a7f5eSAndroid Build Coastguard Worker
265*344a7f5eSAndroid Build Coastguard Worker if (depth != 0)
266*344a7f5eSAndroid Build Coastguard Worker return depth;
267*344a7f5eSAndroid Build Coastguard Worker
268*344a7f5eSAndroid Build Coastguard Worker if (tdb->format != 1)
269*344a7f5eSAndroid Build Coastguard Worker return 0;
270*344a7f5eSAndroid Build Coastguard Worker return tdb->nesting_depth;
271*344a7f5eSAndroid Build Coastguard Worker }
272*344a7f5eSAndroid Build Coastguard Worker
273*344a7f5eSAndroid Build Coastguard Worker /* Transaction failure diagnostics */
274*344a7f5eSAndroid Build Coastguard Worker
275*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_user_abort(void * const __tdb_ptr)276*344a7f5eSAndroid Build Coastguard Worker __TM_is_user_abort (void* const __tdb_ptr)
277*344a7f5eSAndroid Build Coastguard Worker {
278*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
279*344a7f5eSAndroid Build Coastguard Worker
280*344a7f5eSAndroid Build Coastguard Worker if (tdb->format != 1)
281*344a7f5eSAndroid Build Coastguard Worker return 0;
282*344a7f5eSAndroid Build Coastguard Worker
283*344a7f5eSAndroid Build Coastguard Worker return !!(tdb->abort_code >= _HTM_FIRST_USER_ABORT_CODE);
284*344a7f5eSAndroid Build Coastguard Worker }
285*344a7f5eSAndroid Build Coastguard Worker
286*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_named_user_abort(void * const __tdb_ptr,unsigned char * __code)287*344a7f5eSAndroid Build Coastguard Worker __TM_is_named_user_abort (void* const __tdb_ptr, unsigned char* __code)
288*344a7f5eSAndroid Build Coastguard Worker {
289*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
290*344a7f5eSAndroid Build Coastguard Worker
291*344a7f5eSAndroid Build Coastguard Worker if (tdb->format != 1)
292*344a7f5eSAndroid Build Coastguard Worker return 0;
293*344a7f5eSAndroid Build Coastguard Worker
294*344a7f5eSAndroid Build Coastguard Worker if (tdb->abort_code >= _HTM_FIRST_USER_ABORT_CODE)
295*344a7f5eSAndroid Build Coastguard Worker {
296*344a7f5eSAndroid Build Coastguard Worker *__code = tdb->abort_code - _HTM_FIRST_USER_ABORT_CODE;
297*344a7f5eSAndroid Build Coastguard Worker return 1;
298*344a7f5eSAndroid Build Coastguard Worker }
299*344a7f5eSAndroid Build Coastguard Worker return 0;
300*344a7f5eSAndroid Build Coastguard Worker }
301*344a7f5eSAndroid Build Coastguard Worker
302*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_illegal(void * const __tdb_ptr)303*344a7f5eSAndroid Build Coastguard Worker __TM_is_illegal (void* const __tdb_ptr)
304*344a7f5eSAndroid Build Coastguard Worker {
305*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
306*344a7f5eSAndroid Build Coastguard Worker
307*344a7f5eSAndroid Build Coastguard Worker return (tdb->format == 1
308*344a7f5eSAndroid Build Coastguard Worker && (tdb->abort_code == 4 /* unfiltered program interruption */
309*344a7f5eSAndroid Build Coastguard Worker || tdb->abort_code == 11 /* restricted instruction */));
310*344a7f5eSAndroid Build Coastguard Worker }
311*344a7f5eSAndroid Build Coastguard Worker
312*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_footprint_exceeded(void * const __tdb_ptr)313*344a7f5eSAndroid Build Coastguard Worker __TM_is_footprint_exceeded (void* const __tdb_ptr)
314*344a7f5eSAndroid Build Coastguard Worker {
315*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
316*344a7f5eSAndroid Build Coastguard Worker
317*344a7f5eSAndroid Build Coastguard Worker return (tdb->format == 1
318*344a7f5eSAndroid Build Coastguard Worker && (tdb->abort_code == 7 /* fetch overflow */
319*344a7f5eSAndroid Build Coastguard Worker || tdb->abort_code == 8 /* store overflow */));
320*344a7f5eSAndroid Build Coastguard Worker }
321*344a7f5eSAndroid Build Coastguard Worker
322*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_nested_too_deep(void * const __tdb_ptr)323*344a7f5eSAndroid Build Coastguard Worker __TM_is_nested_too_deep (void* const __tdb_ptr)
324*344a7f5eSAndroid Build Coastguard Worker {
325*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
326*344a7f5eSAndroid Build Coastguard Worker
327*344a7f5eSAndroid Build Coastguard Worker return tdb->format == 1 && tdb->abort_code == 13; /* depth exceeded */
328*344a7f5eSAndroid Build Coastguard Worker }
329*344a7f5eSAndroid Build Coastguard Worker
330*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_conflict(void * const __tdb_ptr)331*344a7f5eSAndroid Build Coastguard Worker __TM_is_conflict (void* const __tdb_ptr)
332*344a7f5eSAndroid Build Coastguard Worker {
333*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
334*344a7f5eSAndroid Build Coastguard Worker
335*344a7f5eSAndroid Build Coastguard Worker return (tdb->format == 1
336*344a7f5eSAndroid Build Coastguard Worker && (tdb->abort_code == 9 /* fetch conflict */
337*344a7f5eSAndroid Build Coastguard Worker || tdb->abort_code == 10 /* store conflict */));
338*344a7f5eSAndroid Build Coastguard Worker }
339*344a7f5eSAndroid Build Coastguard Worker
340*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_is_failure_persistent(long const __result)341*344a7f5eSAndroid Build Coastguard Worker __TM_is_failure_persistent (long const __result)
342*344a7f5eSAndroid Build Coastguard Worker {
343*344a7f5eSAndroid Build Coastguard Worker return __result == _HTM_TBEGIN_PERSISTENT;
344*344a7f5eSAndroid Build Coastguard Worker }
345*344a7f5eSAndroid Build Coastguard Worker
346*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_failure_address(void * const __tdb_ptr)347*344a7f5eSAndroid Build Coastguard Worker __TM_failure_address (void* const __tdb_ptr)
348*344a7f5eSAndroid Build Coastguard Worker {
349*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
350*344a7f5eSAndroid Build Coastguard Worker return tdb->atia;
351*344a7f5eSAndroid Build Coastguard Worker }
352*344a7f5eSAndroid Build Coastguard Worker
353*344a7f5eSAndroid Build Coastguard Worker static __inline long __attribute__((__always_inline__, __nodebug__))
__TM_failure_code(void * const __tdb_ptr)354*344a7f5eSAndroid Build Coastguard Worker __TM_failure_code (void* const __tdb_ptr)
355*344a7f5eSAndroid Build Coastguard Worker {
356*344a7f5eSAndroid Build Coastguard Worker struct __htm_tdb *tdb = (struct __htm_tdb*)__tdb_ptr;
357*344a7f5eSAndroid Build Coastguard Worker
358*344a7f5eSAndroid Build Coastguard Worker return tdb->abort_code;
359*344a7f5eSAndroid Build Coastguard Worker }
360*344a7f5eSAndroid Build Coastguard Worker
361*344a7f5eSAndroid Build Coastguard Worker #endif /* __s390__ */
362*344a7f5eSAndroid Build Coastguard Worker
363*344a7f5eSAndroid Build Coastguard Worker #endif /* __HTMXLINTRIN_H */
364