Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/rs6000/htmxlintrin.h @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* XL compiler Hardware Transactional Memory (HTM) execution intrinsics. | |
2 Copyright (C) 2013-2017 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 | |
35 extern "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 | |
47 typedef 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 | |
54 extern __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 | |
63 extern __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 | |
80 extern __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 | |
90 extern __inline void | |
91 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) | |
92 __TM_abort (void) | |
93 { | |
94 __builtin_tabort (0); | |
95 } | |
96 | |
97 extern __inline void | |
98 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) | |
99 __TM_named_abort (unsigned char const code) | |
100 { | |
101 __builtin_tabort (code); | |
102 } | |
103 | |
104 extern __inline void | |
105 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) | |
106 __TM_resume (void) | |
107 { | |
108 __builtin_tresume (); | |
109 } | |
110 | |
111 extern __inline void | |
112 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) | |
113 __TM_suspend (void) | |
114 { | |
115 __builtin_tsuspend (); | |
116 } | |
117 | |
118 extern __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 | |
126 extern __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 | |
136 extern __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 | |
144 extern __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 | |
152 extern __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 | |
170 extern __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 | |
178 extern __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 | |
188 extern __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 | |
196 extern __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 | |
203 extern __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 */ |