docs: Document that __builtin_assoc_barrier also can be used for FMAs [PR115023]
[official-gcc.git] / gcc / config / rs6000 / htmxlintrin.h
blob4c4b3eec63ac3c79f68f6e1626190f48c65b05b4
1 /* XL compiler Hardware Transactional Memory (HTM) execution intrinsics.
2 Copyright (C) 2013-2024 Free Software Foundation, Inc.
3 Contributed by Peter Bergner <bergner@vnet.ibm.com>.
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.
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.
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.
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/>. */
24 #ifndef __HTM__
25 # error "HTM instruction set not enabled"
26 #endif /* __HTM__ */
28 #ifndef _HTMXLINTRIN_H
29 #define _HTMXLINTRIN_H
31 #include <stdint.h>
32 #include <htmintrin.h>
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
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))
47 typedef char TM_buff_type[16];
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
54 extern __inline long
55 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
56 __TM_simple_begin (void)
58 if (__builtin_expect (__builtin_tbegin (0), 1))
59 return _HTM_TBEGIN_STARTED;
60 return 0;
63 extern __inline long
64 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
65 __TM_begin (void* const TM_buff)
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;
80 extern __inline long
81 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
82 __TM_end (void)
84 unsigned char status = _HTM_STATE (__builtin_tend (0));
85 if (__builtin_expect (status, _HTM_TRANSACTIONAL))
86 return 1;
87 return 0;
90 extern __inline void
91 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
92 __TM_abort (void)
94 __builtin_tabort (0);
97 extern __inline void
98 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
99 __TM_named_abort (unsigned char const code)
101 __builtin_tabort (code);
104 extern __inline void
105 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
106 __TM_resume (void)
108 __builtin_tresume ();
111 extern __inline void
112 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
113 __TM_suspend (void)
115 __builtin_tsuspend ();
118 extern __inline long
119 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
120 __TM_is_user_abort (void* const TM_buff)
122 texasru_t texasru = *_TEXASRU_PTR (TM_buff);
123 return _TEXASRU_ABORT (texasru);
126 extern __inline long
127 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
128 __TM_is_named_user_abort (void* const TM_buff, unsigned char *code)
130 texasru_t texasru = *_TEXASRU_PTR (TM_buff);
132 *code = _TEXASRU_FAILURE_CODE (texasru);
133 return _TEXASRU_ABORT (texasru);
136 extern __inline long
137 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
138 __TM_is_illegal (void* const TM_buff)
140 texasru_t texasru = *_TEXASRU_PTR (TM_buff);
141 return _TEXASRU_DISALLOWED (texasru);
144 extern __inline long
145 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
146 __TM_is_footprint_exceeded (void* const TM_buff)
148 texasru_t texasru = *_TEXASRU_PTR (TM_buff);
149 return _TEXASRU_FOOTPRINT_OVERFLOW (texasru);
152 extern __inline long
153 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
154 __TM_nesting_depth (void* const TM_buff)
156 texasrl_t texasrl;
158 if (_HTM_STATE (__builtin_ttest ()) == _HTM_NONTRANSACTIONAL)
160 texasrl = *_TEXASRL_PTR (TM_buff);
161 if (!_TEXASR_FAILURE_SUMMARY (texasrl))
162 texasrl = 0;
164 else
165 texasrl = (texasrl_t) __builtin_get_texasr ();
167 return _TEXASR_TRANSACTION_LEVEL (texasrl);
170 extern __inline long
171 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
172 __TM_is_nested_too_deep(void* const TM_buff)
174 texasru_t texasru = *_TEXASRU_PTR (TM_buff);
175 return _TEXASRU_NESTING_OVERFLOW (texasru);
178 extern __inline long
179 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
180 __TM_is_conflict(void* const TM_buff)
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;
188 extern __inline long
189 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
190 __TM_is_failure_persistent(void* const TM_buff)
192 texasru_t texasru = *_TEXASRU_PTR (TM_buff);
193 return _TEXASRU_FAILURE_PERSISTENT (texasru);
196 extern __inline long
197 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
198 __TM_failure_address(void* const TM_buff)
200 return *_TFIAR_PTR (TM_buff);
203 extern __inline long long
204 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
205 __TM_failure_code(void* const TM_buff)
207 return *_TEXASR_PTR (TM_buff);
210 #ifdef __cplusplus
212 #endif
214 #endif /* _HTMXLINTRIN_H */