xref: /aosp_15_r20/external/clang/lib/Headers/htmintrin.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li /*===---- htmintrin.h - Standard header for PowerPC HTM ---------------===*\
2*67e74705SXin Li  *
3*67e74705SXin Li  * Permission is hereby granted, free of charge, to any person obtaining a copy
4*67e74705SXin Li  * of this software and associated documentation files (the "Software"), to deal
5*67e74705SXin Li  * in the Software without restriction, including without limitation the rights
6*67e74705SXin Li  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*67e74705SXin Li  * copies of the Software, and to permit persons to whom the Software is
8*67e74705SXin Li  * furnished to do so, subject to the following conditions:
9*67e74705SXin Li  *
10*67e74705SXin Li  * The above copyright notice and this permission notice shall be included in
11*67e74705SXin Li  * all copies or substantial portions of the Software.
12*67e74705SXin Li  *
13*67e74705SXin Li  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14*67e74705SXin Li  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*67e74705SXin Li  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16*67e74705SXin Li  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17*67e74705SXin Li  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18*67e74705SXin Li  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19*67e74705SXin Li  * THE SOFTWARE.
20*67e74705SXin Li  *
21*67e74705SXin Li \*===----------------------------------------------------------------------===*/
22*67e74705SXin Li 
23*67e74705SXin Li #ifndef __HTMINTRIN_H
24*67e74705SXin Li #define __HTMINTRIN_H
25*67e74705SXin Li 
26*67e74705SXin Li #ifndef __HTM__
27*67e74705SXin Li #error "HTM instruction set not enabled"
28*67e74705SXin Li #endif
29*67e74705SXin Li 
30*67e74705SXin Li #ifdef __powerpc__
31*67e74705SXin Li 
32*67e74705SXin Li #include <stdint.h>
33*67e74705SXin Li 
34*67e74705SXin Li typedef uint64_t texasr_t;
35*67e74705SXin Li typedef uint32_t texasru_t;
36*67e74705SXin Li typedef uint32_t texasrl_t;
37*67e74705SXin Li typedef uintptr_t tfiar_t;
38*67e74705SXin Li typedef uintptr_t tfhar_t;
39*67e74705SXin Li 
40*67e74705SXin Li #define _HTM_STATE(CR0) ((CR0 >> 1) & 0x3)
41*67e74705SXin Li #define _HTM_NONTRANSACTIONAL 0x0
42*67e74705SXin Li #define _HTM_SUSPENDED        0x1
43*67e74705SXin Li #define _HTM_TRANSACTIONAL    0x2
44*67e74705SXin Li 
45*67e74705SXin Li #define _TEXASR_EXTRACT_BITS(TEXASR,BITNUM,SIZE) \
46*67e74705SXin Li   (((TEXASR) >> (63-(BITNUM))) & ((1<<(SIZE))-1))
47*67e74705SXin Li #define _TEXASRU_EXTRACT_BITS(TEXASR,BITNUM,SIZE) \
48*67e74705SXin Li   (((TEXASR) >> (31-(BITNUM))) & ((1<<(SIZE))-1))
49*67e74705SXin Li 
50*67e74705SXin Li #define _TEXASR_FAILURE_CODE(TEXASR) \
51*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 7, 8)
52*67e74705SXin Li #define _TEXASRU_FAILURE_CODE(TEXASRU) \
53*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 7, 8)
54*67e74705SXin Li 
55*67e74705SXin Li #define _TEXASR_FAILURE_PERSISTENT(TEXASR) \
56*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 7, 1)
57*67e74705SXin Li #define _TEXASRU_FAILURE_PERSISTENT(TEXASRU) \
58*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 7, 1)
59*67e74705SXin Li 
60*67e74705SXin Li #define _TEXASR_DISALLOWED(TEXASR) \
61*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 8, 1)
62*67e74705SXin Li #define _TEXASRU_DISALLOWED(TEXASRU) \
63*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 8, 1)
64*67e74705SXin Li 
65*67e74705SXin Li #define _TEXASR_NESTING_OVERFLOW(TEXASR) \
66*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 9, 1)
67*67e74705SXin Li #define _TEXASRU_NESTING_OVERFLOW(TEXASRU) \
68*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 9, 1)
69*67e74705SXin Li 
70*67e74705SXin Li #define _TEXASR_FOOTPRINT_OVERFLOW(TEXASR) \
71*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 10, 1)
72*67e74705SXin Li #define _TEXASRU_FOOTPRINT_OVERFLOW(TEXASRU) \
73*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 10, 1)
74*67e74705SXin Li 
75*67e74705SXin Li #define _TEXASR_SELF_INDUCED_CONFLICT(TEXASR) \
76*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 11, 1)
77*67e74705SXin Li #define _TEXASRU_SELF_INDUCED_CONFLICT(TEXASRU) \
78*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 11, 1)
79*67e74705SXin Li 
80*67e74705SXin Li #define _TEXASR_NON_TRANSACTIONAL_CONFLICT(TEXASR) \
81*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 12, 1)
82*67e74705SXin Li #define _TEXASRU_NON_TRANSACTIONAL_CONFLICT(TEXASRU) \
83*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 12, 1)
84*67e74705SXin Li 
85*67e74705SXin Li #define _TEXASR_TRANSACTION_CONFLICT(TEXASR) \
86*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 13, 1)
87*67e74705SXin Li #define _TEXASRU_TRANSACTION_CONFLICT(TEXASRU) \
88*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 13, 1)
89*67e74705SXin Li 
90*67e74705SXin Li #define _TEXASR_TRANSLATION_INVALIDATION_CONFLICT(TEXASR) \
91*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 14, 1)
92*67e74705SXin Li #define _TEXASRU_TRANSLATION_INVALIDATION_CONFLICT(TEXASRU) \
93*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 14, 1)
94*67e74705SXin Li 
95*67e74705SXin Li #define _TEXASR_IMPLEMENTAION_SPECIFIC(TEXASR) \
96*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 15, 1)
97*67e74705SXin Li #define _TEXASRU_IMPLEMENTAION_SPECIFIC(TEXASRU) \
98*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 15, 1)
99*67e74705SXin Li 
100*67e74705SXin Li #define _TEXASR_INSTRUCTION_FETCH_CONFLICT(TEXASR) \
101*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 16, 1)
102*67e74705SXin Li #define _TEXASRU_INSTRUCTION_FETCH_CONFLICT(TEXASRU) \
103*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 16, 1)
104*67e74705SXin Li 
105*67e74705SXin Li #define _TEXASR_ABORT(TEXASR) \
106*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 31, 1)
107*67e74705SXin Li #define _TEXASRU_ABORT(TEXASRU) \
108*67e74705SXin Li   _TEXASRU_EXTRACT_BITS(TEXASRU, 31, 1)
109*67e74705SXin Li 
110*67e74705SXin Li 
111*67e74705SXin Li #define _TEXASR_SUSPENDED(TEXASR) \
112*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 32, 1)
113*67e74705SXin Li 
114*67e74705SXin Li #define _TEXASR_PRIVILEGE(TEXASR) \
115*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 35, 2)
116*67e74705SXin Li 
117*67e74705SXin Li #define _TEXASR_FAILURE_SUMMARY(TEXASR) \
118*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 36, 1)
119*67e74705SXin Li 
120*67e74705SXin Li #define _TEXASR_TFIAR_EXACT(TEXASR) \
121*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 37, 1)
122*67e74705SXin Li 
123*67e74705SXin Li #define _TEXASR_ROT(TEXASR) \
124*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 38, 1)
125*67e74705SXin Li 
126*67e74705SXin Li #define _TEXASR_TRANSACTION_LEVEL(TEXASR) \
127*67e74705SXin Li   _TEXASR_EXTRACT_BITS(TEXASR, 63, 12)
128*67e74705SXin Li 
129*67e74705SXin Li #endif /* __powerpc */
130*67e74705SXin Li 
131*67e74705SXin Li #ifdef __s390__
132*67e74705SXin Li 
133*67e74705SXin Li /* Condition codes generated by tbegin  */
134*67e74705SXin Li #define _HTM_TBEGIN_STARTED       0
135*67e74705SXin Li #define _HTM_TBEGIN_INDETERMINATE 1
136*67e74705SXin Li #define _HTM_TBEGIN_TRANSIENT     2
137*67e74705SXin Li #define _HTM_TBEGIN_PERSISTENT    3
138*67e74705SXin Li 
139*67e74705SXin Li /* The abort codes below this threshold are reserved for machine use.  */
140*67e74705SXin Li #define _HTM_FIRST_USER_ABORT_CODE 256
141*67e74705SXin Li 
142*67e74705SXin Li /* The transaction diagnostic block is it is defined in the Principles
143*67e74705SXin Li    of Operation chapter 5-91.  */
144*67e74705SXin Li 
145*67e74705SXin Li struct __htm_tdb {
146*67e74705SXin Li   unsigned char format;                /*   0 */
147*67e74705SXin Li   unsigned char flags;
148*67e74705SXin Li   unsigned char reserved1[4];
149*67e74705SXin Li   unsigned short nesting_depth;
150*67e74705SXin Li   unsigned long long abort_code;       /*   8 */
151*67e74705SXin Li   unsigned long long conflict_token;   /*  16 */
152*67e74705SXin Li   unsigned long long atia;             /*  24 */
153*67e74705SXin Li   unsigned char eaid;                  /*  32 */
154*67e74705SXin Li   unsigned char dxc;
155*67e74705SXin Li   unsigned char reserved2[2];
156*67e74705SXin Li   unsigned int program_int_id;
157*67e74705SXin Li   unsigned long long exception_id;     /*  40 */
158*67e74705SXin Li   unsigned long long bea;              /*  48 */
159*67e74705SXin Li   unsigned char reserved3[72];         /*  56 */
160*67e74705SXin Li   unsigned long long gprs[16];         /* 128 */
161*67e74705SXin Li } __attribute__((__packed__, __aligned__ (8)));
162*67e74705SXin Li 
163*67e74705SXin Li 
164*67e74705SXin Li /* Helper intrinsics to retry tbegin in case of transient failure.  */
165*67e74705SXin Li 
166*67e74705SXin Li static __inline int __attribute__((__always_inline__, __nodebug__))
__builtin_tbegin_retry_null(int __retry)167*67e74705SXin Li __builtin_tbegin_retry_null (int __retry)
168*67e74705SXin Li {
169*67e74705SXin Li   int cc, i = 0;
170*67e74705SXin Li 
171*67e74705SXin Li   while ((cc = __builtin_tbegin(0)) == _HTM_TBEGIN_TRANSIENT
172*67e74705SXin Li          && i++ < __retry)
173*67e74705SXin Li     __builtin_tx_assist(i);
174*67e74705SXin Li 
175*67e74705SXin Li   return cc;
176*67e74705SXin Li }
177*67e74705SXin Li 
178*67e74705SXin Li static __inline int __attribute__((__always_inline__, __nodebug__))
__builtin_tbegin_retry_tdb(void * __tdb,int __retry)179*67e74705SXin Li __builtin_tbegin_retry_tdb (void *__tdb, int __retry)
180*67e74705SXin Li {
181*67e74705SXin Li   int cc, i = 0;
182*67e74705SXin Li 
183*67e74705SXin Li   while ((cc = __builtin_tbegin(__tdb)) == _HTM_TBEGIN_TRANSIENT
184*67e74705SXin Li          && i++ < __retry)
185*67e74705SXin Li     __builtin_tx_assist(i);
186*67e74705SXin Li 
187*67e74705SXin Li   return cc;
188*67e74705SXin Li }
189*67e74705SXin Li 
190*67e74705SXin Li #define __builtin_tbegin_retry(tdb, retry) \
191*67e74705SXin Li   (__builtin_constant_p(tdb == 0) && tdb == 0 ? \
192*67e74705SXin Li    __builtin_tbegin_retry_null(retry) : \
193*67e74705SXin Li    __builtin_tbegin_retry_tdb(tdb, retry))
194*67e74705SXin Li 
195*67e74705SXin Li static __inline int __attribute__((__always_inline__, __nodebug__))
__builtin_tbegin_retry_nofloat_null(int __retry)196*67e74705SXin Li __builtin_tbegin_retry_nofloat_null (int __retry)
197*67e74705SXin Li {
198*67e74705SXin Li   int cc, i = 0;
199*67e74705SXin Li 
200*67e74705SXin Li   while ((cc = __builtin_tbegin_nofloat(0)) == _HTM_TBEGIN_TRANSIENT
201*67e74705SXin Li          && i++ < __retry)
202*67e74705SXin Li     __builtin_tx_assist(i);
203*67e74705SXin Li 
204*67e74705SXin Li   return cc;
205*67e74705SXin Li }
206*67e74705SXin Li 
207*67e74705SXin Li static __inline int __attribute__((__always_inline__, __nodebug__))
__builtin_tbegin_retry_nofloat_tdb(void * __tdb,int __retry)208*67e74705SXin Li __builtin_tbegin_retry_nofloat_tdb (void *__tdb, int __retry)
209*67e74705SXin Li {
210*67e74705SXin Li   int cc, i = 0;
211*67e74705SXin Li 
212*67e74705SXin Li   while ((cc = __builtin_tbegin_nofloat(__tdb)) == _HTM_TBEGIN_TRANSIENT
213*67e74705SXin Li          && i++ < __retry)
214*67e74705SXin Li     __builtin_tx_assist(i);
215*67e74705SXin Li 
216*67e74705SXin Li   return cc;
217*67e74705SXin Li }
218*67e74705SXin Li 
219*67e74705SXin Li #define __builtin_tbegin_retry_nofloat(tdb, retry) \
220*67e74705SXin Li   (__builtin_constant_p(tdb == 0) && tdb == 0 ? \
221*67e74705SXin Li    __builtin_tbegin_retry_nofloat_null(retry) : \
222*67e74705SXin Li    __builtin_tbegin_retry_nofloat_tdb(tdb, retry))
223*67e74705SXin Li 
224*67e74705SXin Li #endif /* __s390__ */
225*67e74705SXin Li 
226*67e74705SXin Li #endif /* __HTMINTRIN_H */
227