xref: /aosp_15_r20/prebuilts/clang-tools/linux-x86/clang-headers/immintrin.h (revision bed243d3d9cd544cfb038bfa7be843dedc6e6bf7)
1*bed243d3SAndroid Build Coastguard Worker /*===---- immintrin.h - Intel intrinsics -----------------------------------===
2*bed243d3SAndroid Build Coastguard Worker  *
3*bed243d3SAndroid Build Coastguard Worker  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker  * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker  *
7*bed243d3SAndroid Build Coastguard Worker  *===-----------------------------------------------------------------------===
8*bed243d3SAndroid Build Coastguard Worker  */
9*bed243d3SAndroid Build Coastguard Worker 
10*bed243d3SAndroid Build Coastguard Worker #ifndef __IMMINTRIN_H
11*bed243d3SAndroid Build Coastguard Worker #define __IMMINTRIN_H
12*bed243d3SAndroid Build Coastguard Worker 
13*bed243d3SAndroid Build Coastguard Worker #if !defined(__i386__) && !defined(__x86_64__)
14*bed243d3SAndroid Build Coastguard Worker #error "This header is only meant to be used on x86 and x64 architecture"
15*bed243d3SAndroid Build Coastguard Worker #endif
16*bed243d3SAndroid Build Coastguard Worker 
17*bed243d3SAndroid Build Coastguard Worker #include <x86gprintrin.h>
18*bed243d3SAndroid Build Coastguard Worker 
19*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
20*bed243d3SAndroid Build Coastguard Worker     defined(__MMX__)
21*bed243d3SAndroid Build Coastguard Worker #include <mmintrin.h>
22*bed243d3SAndroid Build Coastguard Worker #endif
23*bed243d3SAndroid Build Coastguard Worker 
24*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
25*bed243d3SAndroid Build Coastguard Worker     defined(__SSE__)
26*bed243d3SAndroid Build Coastguard Worker #include <xmmintrin.h>
27*bed243d3SAndroid Build Coastguard Worker #endif
28*bed243d3SAndroid Build Coastguard Worker 
29*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
30*bed243d3SAndroid Build Coastguard Worker     defined(__SSE2__)
31*bed243d3SAndroid Build Coastguard Worker #include <emmintrin.h>
32*bed243d3SAndroid Build Coastguard Worker #endif
33*bed243d3SAndroid Build Coastguard Worker 
34*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
35*bed243d3SAndroid Build Coastguard Worker     defined(__SSE3__)
36*bed243d3SAndroid Build Coastguard Worker #include <pmmintrin.h>
37*bed243d3SAndroid Build Coastguard Worker #endif
38*bed243d3SAndroid Build Coastguard Worker 
39*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
40*bed243d3SAndroid Build Coastguard Worker     defined(__SSSE3__)
41*bed243d3SAndroid Build Coastguard Worker #include <tmmintrin.h>
42*bed243d3SAndroid Build Coastguard Worker #endif
43*bed243d3SAndroid Build Coastguard Worker 
44*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
45*bed243d3SAndroid Build Coastguard Worker     (defined(__SSE4_2__) || defined(__SSE4_1__))
46*bed243d3SAndroid Build Coastguard Worker #include <smmintrin.h>
47*bed243d3SAndroid Build Coastguard Worker #endif
48*bed243d3SAndroid Build Coastguard Worker 
49*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
50*bed243d3SAndroid Build Coastguard Worker     (defined(__AES__) || defined(__PCLMUL__))
51*bed243d3SAndroid Build Coastguard Worker #include <wmmintrin.h>
52*bed243d3SAndroid Build Coastguard Worker #endif
53*bed243d3SAndroid Build Coastguard Worker 
54*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
55*bed243d3SAndroid Build Coastguard Worker     defined(__CLFLUSHOPT__)
56*bed243d3SAndroid Build Coastguard Worker #include <clflushoptintrin.h>
57*bed243d3SAndroid Build Coastguard Worker #endif
58*bed243d3SAndroid Build Coastguard Worker 
59*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
60*bed243d3SAndroid Build Coastguard Worker     defined(__CLWB__)
61*bed243d3SAndroid Build Coastguard Worker #include <clwbintrin.h>
62*bed243d3SAndroid Build Coastguard Worker #endif
63*bed243d3SAndroid Build Coastguard Worker 
64*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
65*bed243d3SAndroid Build Coastguard Worker     defined(__AVX__)
66*bed243d3SAndroid Build Coastguard Worker #include <avxintrin.h>
67*bed243d3SAndroid Build Coastguard Worker #endif
68*bed243d3SAndroid Build Coastguard Worker 
69*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
70*bed243d3SAndroid Build Coastguard Worker     defined(__AVX2__)
71*bed243d3SAndroid Build Coastguard Worker #include <avx2intrin.h>
72*bed243d3SAndroid Build Coastguard Worker #endif
73*bed243d3SAndroid Build Coastguard Worker 
74*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
75*bed243d3SAndroid Build Coastguard Worker     defined(__F16C__)
76*bed243d3SAndroid Build Coastguard Worker #include <f16cintrin.h>
77*bed243d3SAndroid Build Coastguard Worker #endif
78*bed243d3SAndroid Build Coastguard Worker 
79*bed243d3SAndroid Build Coastguard Worker /* No feature check desired due to internal checks */
80*bed243d3SAndroid Build Coastguard Worker #include <bmiintrin.h>
81*bed243d3SAndroid Build Coastguard Worker 
82*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
83*bed243d3SAndroid Build Coastguard Worker     defined(__BMI2__)
84*bed243d3SAndroid Build Coastguard Worker #include <bmi2intrin.h>
85*bed243d3SAndroid Build Coastguard Worker #endif
86*bed243d3SAndroid Build Coastguard Worker 
87*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
88*bed243d3SAndroid Build Coastguard Worker     defined(__LZCNT__)
89*bed243d3SAndroid Build Coastguard Worker #include <lzcntintrin.h>
90*bed243d3SAndroid Build Coastguard Worker #endif
91*bed243d3SAndroid Build Coastguard Worker 
92*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
93*bed243d3SAndroid Build Coastguard Worker     defined(__POPCNT__)
94*bed243d3SAndroid Build Coastguard Worker #include <popcntintrin.h>
95*bed243d3SAndroid Build Coastguard Worker #endif
96*bed243d3SAndroid Build Coastguard Worker 
97*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
98*bed243d3SAndroid Build Coastguard Worker     defined(__FMA__)
99*bed243d3SAndroid Build Coastguard Worker #include <fmaintrin.h>
100*bed243d3SAndroid Build Coastguard Worker #endif
101*bed243d3SAndroid Build Coastguard Worker 
102*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
103*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512F__)
104*bed243d3SAndroid Build Coastguard Worker #include <avx512fintrin.h>
105*bed243d3SAndroid Build Coastguard Worker #endif
106*bed243d3SAndroid Build Coastguard Worker 
107*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
108*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512VL__)
109*bed243d3SAndroid Build Coastguard Worker #include <avx512vlintrin.h>
110*bed243d3SAndroid Build Coastguard Worker #endif
111*bed243d3SAndroid Build Coastguard Worker 
112*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
113*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512BW__)
114*bed243d3SAndroid Build Coastguard Worker #include <avx512bwintrin.h>
115*bed243d3SAndroid Build Coastguard Worker #endif
116*bed243d3SAndroid Build Coastguard Worker 
117*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
118*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512BITALG__)
119*bed243d3SAndroid Build Coastguard Worker #include <avx512bitalgintrin.h>
120*bed243d3SAndroid Build Coastguard Worker #endif
121*bed243d3SAndroid Build Coastguard Worker 
122*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
123*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512CD__)
124*bed243d3SAndroid Build Coastguard Worker #include <avx512cdintrin.h>
125*bed243d3SAndroid Build Coastguard Worker #endif
126*bed243d3SAndroid Build Coastguard Worker 
127*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
128*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512VPOPCNTDQ__)
129*bed243d3SAndroid Build Coastguard Worker #include <avx512vpopcntdqintrin.h>
130*bed243d3SAndroid Build Coastguard Worker #endif
131*bed243d3SAndroid Build Coastguard Worker 
132*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
133*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512VPOPCNTDQ__))
134*bed243d3SAndroid Build Coastguard Worker #include <avx512vpopcntdqvlintrin.h>
135*bed243d3SAndroid Build Coastguard Worker #endif
136*bed243d3SAndroid Build Coastguard Worker 
137*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
138*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512VNNI__)
139*bed243d3SAndroid Build Coastguard Worker #include <avx512vnniintrin.h>
140*bed243d3SAndroid Build Coastguard Worker #endif
141*bed243d3SAndroid Build Coastguard Worker 
142*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
143*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512VNNI__))
144*bed243d3SAndroid Build Coastguard Worker #include <avx512vlvnniintrin.h>
145*bed243d3SAndroid Build Coastguard Worker #endif
146*bed243d3SAndroid Build Coastguard Worker 
147*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
148*bed243d3SAndroid Build Coastguard Worker     defined(__AVXVNNI__)
149*bed243d3SAndroid Build Coastguard Worker #include <avxvnniintrin.h>
150*bed243d3SAndroid Build Coastguard Worker #endif
151*bed243d3SAndroid Build Coastguard Worker 
152*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
153*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512DQ__)
154*bed243d3SAndroid Build Coastguard Worker #include <avx512dqintrin.h>
155*bed243d3SAndroid Build Coastguard Worker #endif
156*bed243d3SAndroid Build Coastguard Worker 
157*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
158*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512BITALG__))
159*bed243d3SAndroid Build Coastguard Worker #include <avx512vlbitalgintrin.h>
160*bed243d3SAndroid Build Coastguard Worker #endif
161*bed243d3SAndroid Build Coastguard Worker 
162*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
163*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512BW__))
164*bed243d3SAndroid Build Coastguard Worker #include <avx512vlbwintrin.h>
165*bed243d3SAndroid Build Coastguard Worker #endif
166*bed243d3SAndroid Build Coastguard Worker 
167*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
168*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512CD__))
169*bed243d3SAndroid Build Coastguard Worker #include <avx512vlcdintrin.h>
170*bed243d3SAndroid Build Coastguard Worker #endif
171*bed243d3SAndroid Build Coastguard Worker 
172*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
173*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512DQ__))
174*bed243d3SAndroid Build Coastguard Worker #include <avx512vldqintrin.h>
175*bed243d3SAndroid Build Coastguard Worker #endif
176*bed243d3SAndroid Build Coastguard Worker 
177*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
178*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512ER__)
179*bed243d3SAndroid Build Coastguard Worker #include <avx512erintrin.h>
180*bed243d3SAndroid Build Coastguard Worker #endif
181*bed243d3SAndroid Build Coastguard Worker 
182*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
183*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512IFMA__)
184*bed243d3SAndroid Build Coastguard Worker #include <avx512ifmaintrin.h>
185*bed243d3SAndroid Build Coastguard Worker #endif
186*bed243d3SAndroid Build Coastguard Worker 
187*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
188*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512IFMA__) && defined(__AVX512VL__))
189*bed243d3SAndroid Build Coastguard Worker #include <avx512ifmavlintrin.h>
190*bed243d3SAndroid Build Coastguard Worker #endif
191*bed243d3SAndroid Build Coastguard Worker 
192*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
193*bed243d3SAndroid Build Coastguard Worker     defined(__AVXIFMA__)
194*bed243d3SAndroid Build Coastguard Worker #include <avxifmaintrin.h>
195*bed243d3SAndroid Build Coastguard Worker #endif
196*bed243d3SAndroid Build Coastguard Worker 
197*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
198*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512VBMI__)
199*bed243d3SAndroid Build Coastguard Worker #include <avx512vbmiintrin.h>
200*bed243d3SAndroid Build Coastguard Worker #endif
201*bed243d3SAndroid Build Coastguard Worker 
202*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
203*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VBMI__) && defined(__AVX512VL__))
204*bed243d3SAndroid Build Coastguard Worker #include <avx512vbmivlintrin.h>
205*bed243d3SAndroid Build Coastguard Worker #endif
206*bed243d3SAndroid Build Coastguard Worker 
207*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
208*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512VBMI2__)
209*bed243d3SAndroid Build Coastguard Worker #include <avx512vbmi2intrin.h>
210*bed243d3SAndroid Build Coastguard Worker #endif
211*bed243d3SAndroid Build Coastguard Worker 
212*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
213*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VBMI2__) && defined(__AVX512VL__))
214*bed243d3SAndroid Build Coastguard Worker #include <avx512vlvbmi2intrin.h>
215*bed243d3SAndroid Build Coastguard Worker #endif
216*bed243d3SAndroid Build Coastguard Worker 
217*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
218*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512PF__)
219*bed243d3SAndroid Build Coastguard Worker #include <avx512pfintrin.h>
220*bed243d3SAndroid Build Coastguard Worker #endif
221*bed243d3SAndroid Build Coastguard Worker 
222*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
223*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512FP16__)
224*bed243d3SAndroid Build Coastguard Worker #include <avx512fp16intrin.h>
225*bed243d3SAndroid Build Coastguard Worker #endif
226*bed243d3SAndroid Build Coastguard Worker 
227*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
228*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512FP16__))
229*bed243d3SAndroid Build Coastguard Worker #include <avx512vlfp16intrin.h>
230*bed243d3SAndroid Build Coastguard Worker #endif
231*bed243d3SAndroid Build Coastguard Worker 
232*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
233*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512BF16__)
234*bed243d3SAndroid Build Coastguard Worker #include <avx512bf16intrin.h>
235*bed243d3SAndroid Build Coastguard Worker #endif
236*bed243d3SAndroid Build Coastguard Worker 
237*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
238*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512BF16__))
239*bed243d3SAndroid Build Coastguard Worker #include <avx512vlbf16intrin.h>
240*bed243d3SAndroid Build Coastguard Worker #endif
241*bed243d3SAndroid Build Coastguard Worker 
242*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
243*bed243d3SAndroid Build Coastguard Worker     defined(__PKU__)
244*bed243d3SAndroid Build Coastguard Worker #include <pkuintrin.h>
245*bed243d3SAndroid Build Coastguard Worker #endif
246*bed243d3SAndroid Build Coastguard Worker 
247*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
248*bed243d3SAndroid Build Coastguard Worker     defined(__VPCLMULQDQ__)
249*bed243d3SAndroid Build Coastguard Worker #include <vpclmulqdqintrin.h>
250*bed243d3SAndroid Build Coastguard Worker #endif
251*bed243d3SAndroid Build Coastguard Worker 
252*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
253*bed243d3SAndroid Build Coastguard Worker     defined(__VAES__)
254*bed243d3SAndroid Build Coastguard Worker #include <vaesintrin.h>
255*bed243d3SAndroid Build Coastguard Worker #endif
256*bed243d3SAndroid Build Coastguard Worker 
257*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
258*bed243d3SAndroid Build Coastguard Worker     defined(__GFNI__)
259*bed243d3SAndroid Build Coastguard Worker #include <gfniintrin.h>
260*bed243d3SAndroid Build Coastguard Worker #endif
261*bed243d3SAndroid Build Coastguard Worker 
262*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
263*bed243d3SAndroid Build Coastguard Worker     defined(__AVXVNNIINT8__)
264*bed243d3SAndroid Build Coastguard Worker #include <avxvnniint8intrin.h>
265*bed243d3SAndroid Build Coastguard Worker #endif
266*bed243d3SAndroid Build Coastguard Worker 
267*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
268*bed243d3SAndroid Build Coastguard Worker     defined(__AVXNECONVERT__)
269*bed243d3SAndroid Build Coastguard Worker #include <avxneconvertintrin.h>
270*bed243d3SAndroid Build Coastguard Worker #endif
271*bed243d3SAndroid Build Coastguard Worker 
272*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
273*bed243d3SAndroid Build Coastguard Worker     defined(__SHA512__)
274*bed243d3SAndroid Build Coastguard Worker #include <sha512intrin.h>
275*bed243d3SAndroid Build Coastguard Worker #endif
276*bed243d3SAndroid Build Coastguard Worker 
277*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
278*bed243d3SAndroid Build Coastguard Worker     defined(__SM3__)
279*bed243d3SAndroid Build Coastguard Worker #include <sm3intrin.h>
280*bed243d3SAndroid Build Coastguard Worker #endif
281*bed243d3SAndroid Build Coastguard Worker 
282*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
283*bed243d3SAndroid Build Coastguard Worker     defined(__SM4__)
284*bed243d3SAndroid Build Coastguard Worker #include <sm4intrin.h>
285*bed243d3SAndroid Build Coastguard Worker #endif
286*bed243d3SAndroid Build Coastguard Worker 
287*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
288*bed243d3SAndroid Build Coastguard Worker     defined(__AVXVNNIINT16__)
289*bed243d3SAndroid Build Coastguard Worker #include <avxvnniint16intrin.h>
290*bed243d3SAndroid Build Coastguard Worker #endif
291*bed243d3SAndroid Build Coastguard Worker 
292*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
293*bed243d3SAndroid Build Coastguard Worker     defined(__RDPID__)
294*bed243d3SAndroid Build Coastguard Worker /// Reads the value of the IA32_TSC_AUX MSR (0xc0000103).
295*bed243d3SAndroid Build Coastguard Worker ///
296*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
297*bed243d3SAndroid Build Coastguard Worker ///
298*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDPID </c> instruction.
299*bed243d3SAndroid Build Coastguard Worker ///
300*bed243d3SAndroid Build Coastguard Worker /// \returns The 32-bit contents of the MSR.
301*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid")))
_rdpid_u32(void)302*bed243d3SAndroid Build Coastguard Worker _rdpid_u32(void) {
303*bed243d3SAndroid Build Coastguard Worker   return __builtin_ia32_rdpid();
304*bed243d3SAndroid Build Coastguard Worker }
305*bed243d3SAndroid Build Coastguard Worker #endif // __RDPID__
306*bed243d3SAndroid Build Coastguard Worker 
307*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
308*bed243d3SAndroid Build Coastguard Worker     defined(__RDRND__)
309*bed243d3SAndroid Build Coastguard Worker /// Returns a 16-bit hardware-generated random value.
310*bed243d3SAndroid Build Coastguard Worker ///
311*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
312*bed243d3SAndroid Build Coastguard Worker ///
313*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDRAND </c> instruction.
314*bed243d3SAndroid Build Coastguard Worker ///
315*bed243d3SAndroid Build Coastguard Worker /// \param __p
316*bed243d3SAndroid Build Coastguard Worker ///    A pointer to a 16-bit memory location to place the random value.
317*bed243d3SAndroid Build Coastguard Worker /// \returns 1 if the value was successfully generated, 0 otherwise.
318*bed243d3SAndroid Build Coastguard Worker static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
_rdrand16_step(unsigned short * __p)319*bed243d3SAndroid Build Coastguard Worker _rdrand16_step(unsigned short *__p)
320*bed243d3SAndroid Build Coastguard Worker {
321*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_ia32_rdrand16_step(__p);
322*bed243d3SAndroid Build Coastguard Worker }
323*bed243d3SAndroid Build Coastguard Worker 
324*bed243d3SAndroid Build Coastguard Worker /// Returns a 32-bit hardware-generated random value.
325*bed243d3SAndroid Build Coastguard Worker ///
326*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
327*bed243d3SAndroid Build Coastguard Worker ///
328*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDRAND </c> instruction.
329*bed243d3SAndroid Build Coastguard Worker ///
330*bed243d3SAndroid Build Coastguard Worker /// \param __p
331*bed243d3SAndroid Build Coastguard Worker ///    A pointer to a 32-bit memory location to place the random value.
332*bed243d3SAndroid Build Coastguard Worker /// \returns 1 if the value was successfully generated, 0 otherwise.
333*bed243d3SAndroid Build Coastguard Worker static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
_rdrand32_step(unsigned int * __p)334*bed243d3SAndroid Build Coastguard Worker _rdrand32_step(unsigned int *__p)
335*bed243d3SAndroid Build Coastguard Worker {
336*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_ia32_rdrand32_step(__p);
337*bed243d3SAndroid Build Coastguard Worker }
338*bed243d3SAndroid Build Coastguard Worker 
339*bed243d3SAndroid Build Coastguard Worker /// Returns a 64-bit hardware-generated random value.
340*bed243d3SAndroid Build Coastguard Worker ///
341*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
342*bed243d3SAndroid Build Coastguard Worker ///
343*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDRAND </c> instruction.
344*bed243d3SAndroid Build Coastguard Worker ///
345*bed243d3SAndroid Build Coastguard Worker /// \param __p
346*bed243d3SAndroid Build Coastguard Worker ///    A pointer to a 64-bit memory location to place the random value.
347*bed243d3SAndroid Build Coastguard Worker /// \returns 1 if the value was successfully generated, 0 otherwise.
348*bed243d3SAndroid Build Coastguard Worker static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
_rdrand64_step(unsigned long long * __p)349*bed243d3SAndroid Build Coastguard Worker _rdrand64_step(unsigned long long *__p)
350*bed243d3SAndroid Build Coastguard Worker {
351*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__
352*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_ia32_rdrand64_step(__p);
353*bed243d3SAndroid Build Coastguard Worker #else
354*bed243d3SAndroid Build Coastguard Worker   // We need to emulate the functionality of 64-bit rdrand with 2 32-bit
355*bed243d3SAndroid Build Coastguard Worker   // rdrand instructions.
356*bed243d3SAndroid Build Coastguard Worker   unsigned int __lo, __hi;
357*bed243d3SAndroid Build Coastguard Worker   unsigned int __res_lo = __builtin_ia32_rdrand32_step(&__lo);
358*bed243d3SAndroid Build Coastguard Worker   unsigned int __res_hi = __builtin_ia32_rdrand32_step(&__hi);
359*bed243d3SAndroid Build Coastguard Worker   if (__res_lo && __res_hi) {
360*bed243d3SAndroid Build Coastguard Worker     *__p = ((unsigned long long)__hi << 32) | (unsigned long long)__lo;
361*bed243d3SAndroid Build Coastguard Worker     return 1;
362*bed243d3SAndroid Build Coastguard Worker   } else {
363*bed243d3SAndroid Build Coastguard Worker     *__p = 0;
364*bed243d3SAndroid Build Coastguard Worker     return 0;
365*bed243d3SAndroid Build Coastguard Worker   }
366*bed243d3SAndroid Build Coastguard Worker #endif
367*bed243d3SAndroid Build Coastguard Worker }
368*bed243d3SAndroid Build Coastguard Worker #endif /* __RDRND__ */
369*bed243d3SAndroid Build Coastguard Worker 
370*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
371*bed243d3SAndroid Build Coastguard Worker     defined(__FSGSBASE__)
372*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__
373*bed243d3SAndroid Build Coastguard Worker /// Reads the FS base register.
374*bed243d3SAndroid Build Coastguard Worker ///
375*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
376*bed243d3SAndroid Build Coastguard Worker ///
377*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDFSBASE </c> instruction.
378*bed243d3SAndroid Build Coastguard Worker ///
379*bed243d3SAndroid Build Coastguard Worker /// \returns The lower 32 bits of the FS base register.
380*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_readfsbase_u32(void)381*bed243d3SAndroid Build Coastguard Worker _readfsbase_u32(void)
382*bed243d3SAndroid Build Coastguard Worker {
383*bed243d3SAndroid Build Coastguard Worker   return __builtin_ia32_rdfsbase32();
384*bed243d3SAndroid Build Coastguard Worker }
385*bed243d3SAndroid Build Coastguard Worker 
386*bed243d3SAndroid Build Coastguard Worker /// Reads the FS base register.
387*bed243d3SAndroid Build Coastguard Worker ///
388*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
389*bed243d3SAndroid Build Coastguard Worker ///
390*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDFSBASE </c> instruction.
391*bed243d3SAndroid Build Coastguard Worker ///
392*bed243d3SAndroid Build Coastguard Worker /// \returns The contents of the FS base register.
393*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_readfsbase_u64(void)394*bed243d3SAndroid Build Coastguard Worker _readfsbase_u64(void)
395*bed243d3SAndroid Build Coastguard Worker {
396*bed243d3SAndroid Build Coastguard Worker   return __builtin_ia32_rdfsbase64();
397*bed243d3SAndroid Build Coastguard Worker }
398*bed243d3SAndroid Build Coastguard Worker 
399*bed243d3SAndroid Build Coastguard Worker /// Reads the GS base register.
400*bed243d3SAndroid Build Coastguard Worker ///
401*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
402*bed243d3SAndroid Build Coastguard Worker ///
403*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDGSBASE </c> instruction.
404*bed243d3SAndroid Build Coastguard Worker ///
405*bed243d3SAndroid Build Coastguard Worker /// \returns The lower 32 bits of the GS base register.
406*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_readgsbase_u32(void)407*bed243d3SAndroid Build Coastguard Worker _readgsbase_u32(void)
408*bed243d3SAndroid Build Coastguard Worker {
409*bed243d3SAndroid Build Coastguard Worker   return __builtin_ia32_rdgsbase32();
410*bed243d3SAndroid Build Coastguard Worker }
411*bed243d3SAndroid Build Coastguard Worker 
412*bed243d3SAndroid Build Coastguard Worker /// Reads the GS base register.
413*bed243d3SAndroid Build Coastguard Worker ///
414*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
415*bed243d3SAndroid Build Coastguard Worker ///
416*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> RDGSBASE </c> instruction.
417*bed243d3SAndroid Build Coastguard Worker ///
418*bed243d3SAndroid Build Coastguard Worker /// \returns The contents of the GS base register.
419*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_readgsbase_u64(void)420*bed243d3SAndroid Build Coastguard Worker _readgsbase_u64(void)
421*bed243d3SAndroid Build Coastguard Worker {
422*bed243d3SAndroid Build Coastguard Worker   return __builtin_ia32_rdgsbase64();
423*bed243d3SAndroid Build Coastguard Worker }
424*bed243d3SAndroid Build Coastguard Worker 
425*bed243d3SAndroid Build Coastguard Worker /// Modifies the FS base register.
426*bed243d3SAndroid Build Coastguard Worker ///
427*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
428*bed243d3SAndroid Build Coastguard Worker ///
429*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> WRFSBASE </c> instruction.
430*bed243d3SAndroid Build Coastguard Worker ///
431*bed243d3SAndroid Build Coastguard Worker /// \param __V
432*bed243d3SAndroid Build Coastguard Worker ///    Value to use for the lower 32 bits of the FS base register.
433*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_writefsbase_u32(unsigned int __V)434*bed243d3SAndroid Build Coastguard Worker _writefsbase_u32(unsigned int __V)
435*bed243d3SAndroid Build Coastguard Worker {
436*bed243d3SAndroid Build Coastguard Worker   __builtin_ia32_wrfsbase32(__V);
437*bed243d3SAndroid Build Coastguard Worker }
438*bed243d3SAndroid Build Coastguard Worker 
439*bed243d3SAndroid Build Coastguard Worker /// Modifies the FS base register.
440*bed243d3SAndroid Build Coastguard Worker ///
441*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
442*bed243d3SAndroid Build Coastguard Worker ///
443*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> WRFSBASE </c> instruction.
444*bed243d3SAndroid Build Coastguard Worker ///
445*bed243d3SAndroid Build Coastguard Worker /// \param __V
446*bed243d3SAndroid Build Coastguard Worker ///    Value to use for the FS base register.
447*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_writefsbase_u64(unsigned long long __V)448*bed243d3SAndroid Build Coastguard Worker _writefsbase_u64(unsigned long long __V)
449*bed243d3SAndroid Build Coastguard Worker {
450*bed243d3SAndroid Build Coastguard Worker   __builtin_ia32_wrfsbase64(__V);
451*bed243d3SAndroid Build Coastguard Worker }
452*bed243d3SAndroid Build Coastguard Worker 
453*bed243d3SAndroid Build Coastguard Worker /// Modifies the GS base register.
454*bed243d3SAndroid Build Coastguard Worker ///
455*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
456*bed243d3SAndroid Build Coastguard Worker ///
457*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> WRGSBASE </c> instruction.
458*bed243d3SAndroid Build Coastguard Worker ///
459*bed243d3SAndroid Build Coastguard Worker /// \param __V
460*bed243d3SAndroid Build Coastguard Worker ///    Value to use for the lower 32 bits of the GS base register.
461*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_writegsbase_u32(unsigned int __V)462*bed243d3SAndroid Build Coastguard Worker _writegsbase_u32(unsigned int __V)
463*bed243d3SAndroid Build Coastguard Worker {
464*bed243d3SAndroid Build Coastguard Worker   __builtin_ia32_wrgsbase32(__V);
465*bed243d3SAndroid Build Coastguard Worker }
466*bed243d3SAndroid Build Coastguard Worker 
467*bed243d3SAndroid Build Coastguard Worker /// Modifies the GS base register.
468*bed243d3SAndroid Build Coastguard Worker ///
469*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
470*bed243d3SAndroid Build Coastguard Worker ///
471*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> WRFSBASE </c> instruction.
472*bed243d3SAndroid Build Coastguard Worker ///
473*bed243d3SAndroid Build Coastguard Worker /// \param __V
474*bed243d3SAndroid Build Coastguard Worker ///    Value to use for GS base register.
475*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
_writegsbase_u64(unsigned long long __V)476*bed243d3SAndroid Build Coastguard Worker _writegsbase_u64(unsigned long long __V)
477*bed243d3SAndroid Build Coastguard Worker {
478*bed243d3SAndroid Build Coastguard Worker   __builtin_ia32_wrgsbase64(__V);
479*bed243d3SAndroid Build Coastguard Worker }
480*bed243d3SAndroid Build Coastguard Worker 
481*bed243d3SAndroid Build Coastguard Worker #endif
482*bed243d3SAndroid Build Coastguard Worker #endif /* __FSGSBASE__ */
483*bed243d3SAndroid Build Coastguard Worker 
484*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
485*bed243d3SAndroid Build Coastguard Worker     defined(__MOVBE__)
486*bed243d3SAndroid Build Coastguard Worker 
487*bed243d3SAndroid Build Coastguard Worker /* The structs used below are to force the load/store to be unaligned. This
488*bed243d3SAndroid Build Coastguard Worker  * is accomplished with the __packed__ attribute. The __may_alias__ prevents
489*bed243d3SAndroid Build Coastguard Worker  * tbaa metadata from being generated based on the struct and the type of the
490*bed243d3SAndroid Build Coastguard Worker  * field inside of it.
491*bed243d3SAndroid Build Coastguard Worker  */
492*bed243d3SAndroid Build Coastguard Worker 
493*bed243d3SAndroid Build Coastguard Worker /// Load a 16-bit value from memory and swap its bytes.
494*bed243d3SAndroid Build Coastguard Worker ///
495*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
496*bed243d3SAndroid Build Coastguard Worker ///
497*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the MOVBE instruction.
498*bed243d3SAndroid Build Coastguard Worker ///
499*bed243d3SAndroid Build Coastguard Worker /// \param __P
500*bed243d3SAndroid Build Coastguard Worker ///    A pointer to the 16-bit value to load.
501*bed243d3SAndroid Build Coastguard Worker /// \returns The byte-swapped value.
502*bed243d3SAndroid Build Coastguard Worker static __inline__ short __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
_loadbe_i16(void const * __P)503*bed243d3SAndroid Build Coastguard Worker _loadbe_i16(void const * __P) {
504*bed243d3SAndroid Build Coastguard Worker   struct __loadu_i16 {
505*bed243d3SAndroid Build Coastguard Worker     unsigned short __v;
506*bed243d3SAndroid Build Coastguard Worker   } __attribute__((__packed__, __may_alias__));
507*bed243d3SAndroid Build Coastguard Worker   return (short)__builtin_bswap16(((const struct __loadu_i16*)__P)->__v);
508*bed243d3SAndroid Build Coastguard Worker }
509*bed243d3SAndroid Build Coastguard Worker 
510*bed243d3SAndroid Build Coastguard Worker /// Swap the bytes of a 16-bit value and store it to memory.
511*bed243d3SAndroid Build Coastguard Worker ///
512*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
513*bed243d3SAndroid Build Coastguard Worker ///
514*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the MOVBE instruction.
515*bed243d3SAndroid Build Coastguard Worker ///
516*bed243d3SAndroid Build Coastguard Worker /// \param __P
517*bed243d3SAndroid Build Coastguard Worker ///    A pointer to the memory for storing the swapped value.
518*bed243d3SAndroid Build Coastguard Worker /// \param __D
519*bed243d3SAndroid Build Coastguard Worker ///    The 16-bit value to be byte-swapped.
520*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
_storebe_i16(void * __P,short __D)521*bed243d3SAndroid Build Coastguard Worker _storebe_i16(void * __P, short __D) {
522*bed243d3SAndroid Build Coastguard Worker   struct __storeu_i16 {
523*bed243d3SAndroid Build Coastguard Worker     unsigned short __v;
524*bed243d3SAndroid Build Coastguard Worker   } __attribute__((__packed__, __may_alias__));
525*bed243d3SAndroid Build Coastguard Worker   ((struct __storeu_i16*)__P)->__v = __builtin_bswap16((unsigned short)__D);
526*bed243d3SAndroid Build Coastguard Worker }
527*bed243d3SAndroid Build Coastguard Worker 
528*bed243d3SAndroid Build Coastguard Worker /// Load a 32-bit value from memory and swap its bytes.
529*bed243d3SAndroid Build Coastguard Worker ///
530*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
531*bed243d3SAndroid Build Coastguard Worker ///
532*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the MOVBE instruction.
533*bed243d3SAndroid Build Coastguard Worker ///
534*bed243d3SAndroid Build Coastguard Worker /// \param __P
535*bed243d3SAndroid Build Coastguard Worker ///    A pointer to the 32-bit value to load.
536*bed243d3SAndroid Build Coastguard Worker /// \returns The byte-swapped value.
537*bed243d3SAndroid Build Coastguard Worker static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
_loadbe_i32(void const * __P)538*bed243d3SAndroid Build Coastguard Worker _loadbe_i32(void const * __P) {
539*bed243d3SAndroid Build Coastguard Worker   struct __loadu_i32 {
540*bed243d3SAndroid Build Coastguard Worker     unsigned int __v;
541*bed243d3SAndroid Build Coastguard Worker   } __attribute__((__packed__, __may_alias__));
542*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_bswap32(((const struct __loadu_i32*)__P)->__v);
543*bed243d3SAndroid Build Coastguard Worker }
544*bed243d3SAndroid Build Coastguard Worker 
545*bed243d3SAndroid Build Coastguard Worker /// Swap the bytes of a 32-bit value and store it to memory.
546*bed243d3SAndroid Build Coastguard Worker ///
547*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
548*bed243d3SAndroid Build Coastguard Worker ///
549*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the MOVBE instruction.
550*bed243d3SAndroid Build Coastguard Worker ///
551*bed243d3SAndroid Build Coastguard Worker /// \param __P
552*bed243d3SAndroid Build Coastguard Worker ///    A pointer to the memory for storing the swapped value.
553*bed243d3SAndroid Build Coastguard Worker /// \param __D
554*bed243d3SAndroid Build Coastguard Worker ///    The 32-bit value to be byte-swapped.
555*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
_storebe_i32(void * __P,int __D)556*bed243d3SAndroid Build Coastguard Worker _storebe_i32(void * __P, int __D) {
557*bed243d3SAndroid Build Coastguard Worker   struct __storeu_i32 {
558*bed243d3SAndroid Build Coastguard Worker     unsigned int __v;
559*bed243d3SAndroid Build Coastguard Worker   } __attribute__((__packed__, __may_alias__));
560*bed243d3SAndroid Build Coastguard Worker   ((struct __storeu_i32*)__P)->__v = __builtin_bswap32((unsigned int)__D);
561*bed243d3SAndroid Build Coastguard Worker }
562*bed243d3SAndroid Build Coastguard Worker 
563*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__
564*bed243d3SAndroid Build Coastguard Worker /// Load a 64-bit value from memory and swap its bytes.
565*bed243d3SAndroid Build Coastguard Worker ///
566*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
567*bed243d3SAndroid Build Coastguard Worker ///
568*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the MOVBE instruction.
569*bed243d3SAndroid Build Coastguard Worker ///
570*bed243d3SAndroid Build Coastguard Worker /// \param __P
571*bed243d3SAndroid Build Coastguard Worker ///    A pointer to the 64-bit value to load.
572*bed243d3SAndroid Build Coastguard Worker /// \returns The byte-swapped value.
573*bed243d3SAndroid Build Coastguard Worker static __inline__ long long __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
_loadbe_i64(void const * __P)574*bed243d3SAndroid Build Coastguard Worker _loadbe_i64(void const * __P) {
575*bed243d3SAndroid Build Coastguard Worker   struct __loadu_i64 {
576*bed243d3SAndroid Build Coastguard Worker     unsigned long long __v;
577*bed243d3SAndroid Build Coastguard Worker   } __attribute__((__packed__, __may_alias__));
578*bed243d3SAndroid Build Coastguard Worker   return (long long)__builtin_bswap64(((const struct __loadu_i64*)__P)->__v);
579*bed243d3SAndroid Build Coastguard Worker }
580*bed243d3SAndroid Build Coastguard Worker 
581*bed243d3SAndroid Build Coastguard Worker /// Swap the bytes of a 64-bit value and store it to memory.
582*bed243d3SAndroid Build Coastguard Worker ///
583*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
584*bed243d3SAndroid Build Coastguard Worker ///
585*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the MOVBE instruction.
586*bed243d3SAndroid Build Coastguard Worker ///
587*bed243d3SAndroid Build Coastguard Worker /// \param __P
588*bed243d3SAndroid Build Coastguard Worker ///    A pointer to the memory for storing the swapped value.
589*bed243d3SAndroid Build Coastguard Worker /// \param __D
590*bed243d3SAndroid Build Coastguard Worker ///    The 64-bit value to be byte-swapped.
591*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
_storebe_i64(void * __P,long long __D)592*bed243d3SAndroid Build Coastguard Worker _storebe_i64(void * __P, long long __D) {
593*bed243d3SAndroid Build Coastguard Worker   struct __storeu_i64 {
594*bed243d3SAndroid Build Coastguard Worker     unsigned long long __v;
595*bed243d3SAndroid Build Coastguard Worker   } __attribute__((__packed__, __may_alias__));
596*bed243d3SAndroid Build Coastguard Worker   ((struct __storeu_i64*)__P)->__v = __builtin_bswap64((unsigned long long)__D);
597*bed243d3SAndroid Build Coastguard Worker }
598*bed243d3SAndroid Build Coastguard Worker #endif
599*bed243d3SAndroid Build Coastguard Worker #endif /* __MOVBE */
600*bed243d3SAndroid Build Coastguard Worker 
601*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
602*bed243d3SAndroid Build Coastguard Worker     defined(__RTM__)
603*bed243d3SAndroid Build Coastguard Worker #include <rtmintrin.h>
604*bed243d3SAndroid Build Coastguard Worker #include <xtestintrin.h>
605*bed243d3SAndroid Build Coastguard Worker #endif
606*bed243d3SAndroid Build Coastguard Worker 
607*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
608*bed243d3SAndroid Build Coastguard Worker     defined(__SHA__)
609*bed243d3SAndroid Build Coastguard Worker #include <shaintrin.h>
610*bed243d3SAndroid Build Coastguard Worker #endif
611*bed243d3SAndroid Build Coastguard Worker 
612*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
613*bed243d3SAndroid Build Coastguard Worker     defined(__FXSR__)
614*bed243d3SAndroid Build Coastguard Worker #include <fxsrintrin.h>
615*bed243d3SAndroid Build Coastguard Worker #endif
616*bed243d3SAndroid Build Coastguard Worker 
617*bed243d3SAndroid Build Coastguard Worker /* No feature check desired due to internal MSC_VER checks */
618*bed243d3SAndroid Build Coastguard Worker #include <xsaveintrin.h>
619*bed243d3SAndroid Build Coastguard Worker 
620*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
621*bed243d3SAndroid Build Coastguard Worker     defined(__XSAVEOPT__)
622*bed243d3SAndroid Build Coastguard Worker #include <xsaveoptintrin.h>
623*bed243d3SAndroid Build Coastguard Worker #endif
624*bed243d3SAndroid Build Coastguard Worker 
625*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
626*bed243d3SAndroid Build Coastguard Worker     defined(__XSAVEC__)
627*bed243d3SAndroid Build Coastguard Worker #include <xsavecintrin.h>
628*bed243d3SAndroid Build Coastguard Worker #endif
629*bed243d3SAndroid Build Coastguard Worker 
630*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
631*bed243d3SAndroid Build Coastguard Worker     defined(__XSAVES__)
632*bed243d3SAndroid Build Coastguard Worker #include <xsavesintrin.h>
633*bed243d3SAndroid Build Coastguard Worker #endif
634*bed243d3SAndroid Build Coastguard Worker 
635*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
636*bed243d3SAndroid Build Coastguard Worker     defined(__SHSTK__)
637*bed243d3SAndroid Build Coastguard Worker #include <cetintrin.h>
638*bed243d3SAndroid Build Coastguard Worker #endif
639*bed243d3SAndroid Build Coastguard Worker 
640*bed243d3SAndroid Build Coastguard Worker /* Intrinsics inside adcintrin.h are available at all times. */
641*bed243d3SAndroid Build Coastguard Worker #include <adcintrin.h>
642*bed243d3SAndroid Build Coastguard Worker 
643*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
644*bed243d3SAndroid Build Coastguard Worker     defined(__ADX__)
645*bed243d3SAndroid Build Coastguard Worker #include <adxintrin.h>
646*bed243d3SAndroid Build Coastguard Worker #endif
647*bed243d3SAndroid Build Coastguard Worker 
648*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
649*bed243d3SAndroid Build Coastguard Worker     defined(__RDSEED__)
650*bed243d3SAndroid Build Coastguard Worker #include <rdseedintrin.h>
651*bed243d3SAndroid Build Coastguard Worker #endif
652*bed243d3SAndroid Build Coastguard Worker 
653*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
654*bed243d3SAndroid Build Coastguard Worker     defined(__WBNOINVD__)
655*bed243d3SAndroid Build Coastguard Worker #include <wbnoinvdintrin.h>
656*bed243d3SAndroid Build Coastguard Worker #endif
657*bed243d3SAndroid Build Coastguard Worker 
658*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
659*bed243d3SAndroid Build Coastguard Worker     defined(__CLDEMOTE__)
660*bed243d3SAndroid Build Coastguard Worker #include <cldemoteintrin.h>
661*bed243d3SAndroid Build Coastguard Worker #endif
662*bed243d3SAndroid Build Coastguard Worker 
663*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
664*bed243d3SAndroid Build Coastguard Worker     defined(__WAITPKG__)
665*bed243d3SAndroid Build Coastguard Worker #include <waitpkgintrin.h>
666*bed243d3SAndroid Build Coastguard Worker #endif
667*bed243d3SAndroid Build Coastguard Worker 
668*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
669*bed243d3SAndroid Build Coastguard Worker     defined(__MOVDIRI__) || defined(__MOVDIR64B__)
670*bed243d3SAndroid Build Coastguard Worker #include <movdirintrin.h>
671*bed243d3SAndroid Build Coastguard Worker #endif
672*bed243d3SAndroid Build Coastguard Worker 
673*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
674*bed243d3SAndroid Build Coastguard Worker     defined(__PCONFIG__)
675*bed243d3SAndroid Build Coastguard Worker #include <pconfigintrin.h>
676*bed243d3SAndroid Build Coastguard Worker #endif
677*bed243d3SAndroid Build Coastguard Worker 
678*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
679*bed243d3SAndroid Build Coastguard Worker     defined(__SGX__)
680*bed243d3SAndroid Build Coastguard Worker #include <sgxintrin.h>
681*bed243d3SAndroid Build Coastguard Worker #endif
682*bed243d3SAndroid Build Coastguard Worker 
683*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
684*bed243d3SAndroid Build Coastguard Worker     defined(__PTWRITE__)
685*bed243d3SAndroid Build Coastguard Worker #include <ptwriteintrin.h>
686*bed243d3SAndroid Build Coastguard Worker #endif
687*bed243d3SAndroid Build Coastguard Worker 
688*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
689*bed243d3SAndroid Build Coastguard Worker     defined(__INVPCID__)
690*bed243d3SAndroid Build Coastguard Worker #include <invpcidintrin.h>
691*bed243d3SAndroid Build Coastguard Worker #endif
692*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
693*bed243d3SAndroid Build Coastguard Worker     defined(__AMX_FP16__)
694*bed243d3SAndroid Build Coastguard Worker #include <amxfp16intrin.h>
695*bed243d3SAndroid Build Coastguard Worker #endif
696*bed243d3SAndroid Build Coastguard Worker 
697*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
698*bed243d3SAndroid Build Coastguard Worker     defined(__KL__) || defined(__WIDEKL__)
699*bed243d3SAndroid Build Coastguard Worker #include <keylockerintrin.h>
700*bed243d3SAndroid Build Coastguard Worker #endif
701*bed243d3SAndroid Build Coastguard Worker 
702*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
703*bed243d3SAndroid Build Coastguard Worker     defined(__AMX_TILE__) || defined(__AMX_INT8__) || defined(__AMX_BF16__)
704*bed243d3SAndroid Build Coastguard Worker #include <amxintrin.h>
705*bed243d3SAndroid Build Coastguard Worker #endif
706*bed243d3SAndroid Build Coastguard Worker 
707*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
708*bed243d3SAndroid Build Coastguard Worker     defined(__AMX_COMPLEX__)
709*bed243d3SAndroid Build Coastguard Worker #include <amxcomplexintrin.h>
710*bed243d3SAndroid Build Coastguard Worker #endif
711*bed243d3SAndroid Build Coastguard Worker 
712*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
713*bed243d3SAndroid Build Coastguard Worker     defined(__AVX512VP2INTERSECT__)
714*bed243d3SAndroid Build Coastguard Worker #include <avx512vp2intersectintrin.h>
715*bed243d3SAndroid Build Coastguard Worker #endif
716*bed243d3SAndroid Build Coastguard Worker 
717*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
718*bed243d3SAndroid Build Coastguard Worker     (defined(__AVX512VL__) && defined(__AVX512VP2INTERSECT__))
719*bed243d3SAndroid Build Coastguard Worker #include <avx512vlvp2intersectintrin.h>
720*bed243d3SAndroid Build Coastguard Worker #endif
721*bed243d3SAndroid Build Coastguard Worker 
722*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
723*bed243d3SAndroid Build Coastguard Worker     defined(__ENQCMD__)
724*bed243d3SAndroid Build Coastguard Worker #include <enqcmdintrin.h>
725*bed243d3SAndroid Build Coastguard Worker #endif
726*bed243d3SAndroid Build Coastguard Worker 
727*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
728*bed243d3SAndroid Build Coastguard Worker     defined(__SERIALIZE__)
729*bed243d3SAndroid Build Coastguard Worker #include <serializeintrin.h>
730*bed243d3SAndroid Build Coastguard Worker #endif
731*bed243d3SAndroid Build Coastguard Worker 
732*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
733*bed243d3SAndroid Build Coastguard Worker     defined(__TSXLDTRK__)
734*bed243d3SAndroid Build Coastguard Worker #include <tsxldtrkintrin.h>
735*bed243d3SAndroid Build Coastguard Worker #endif
736*bed243d3SAndroid Build Coastguard Worker 
737*bed243d3SAndroid Build Coastguard Worker #if defined(_MSC_VER) && __has_extension(gnu_asm)
738*bed243d3SAndroid Build Coastguard Worker /* Define the default attributes for these intrinsics */
739*bed243d3SAndroid Build Coastguard Worker #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
740*bed243d3SAndroid Build Coastguard Worker #ifdef __cplusplus
741*bed243d3SAndroid Build Coastguard Worker extern "C" {
742*bed243d3SAndroid Build Coastguard Worker #endif
743*bed243d3SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------*\
744*bed243d3SAndroid Build Coastguard Worker |* Interlocked Exchange HLE
745*bed243d3SAndroid Build Coastguard Worker \*----------------------------------------------------------------------------*/
746*bed243d3SAndroid Build Coastguard Worker #if defined(__i386__) || defined(__x86_64__)
747*bed243d3SAndroid Build Coastguard Worker static __inline__ long __DEFAULT_FN_ATTRS
_InterlockedExchange_HLEAcquire(long volatile * _Target,long _Value)748*bed243d3SAndroid Build Coastguard Worker _InterlockedExchange_HLEAcquire(long volatile *_Target, long _Value) {
749*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf2 ; lock ; xchg {%0, %1|%1, %0}"
750*bed243d3SAndroid Build Coastguard Worker                        : "+r" (_Value), "+m" (*_Target) :: "memory");
751*bed243d3SAndroid Build Coastguard Worker   return _Value;
752*bed243d3SAndroid Build Coastguard Worker }
753*bed243d3SAndroid Build Coastguard Worker static __inline__ long __DEFAULT_FN_ATTRS
_InterlockedExchange_HLERelease(long volatile * _Target,long _Value)754*bed243d3SAndroid Build Coastguard Worker _InterlockedExchange_HLERelease(long volatile *_Target, long _Value) {
755*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf3 ; lock ; xchg {%0, %1|%1, %0}"
756*bed243d3SAndroid Build Coastguard Worker                        : "+r" (_Value), "+m" (*_Target) :: "memory");
757*bed243d3SAndroid Build Coastguard Worker   return _Value;
758*bed243d3SAndroid Build Coastguard Worker }
759*bed243d3SAndroid Build Coastguard Worker #endif
760*bed243d3SAndroid Build Coastguard Worker #if defined(__x86_64__)
761*bed243d3SAndroid Build Coastguard Worker static __inline__ __int64 __DEFAULT_FN_ATTRS
_InterlockedExchange64_HLEAcquire(__int64 volatile * _Target,__int64 _Value)762*bed243d3SAndroid Build Coastguard Worker _InterlockedExchange64_HLEAcquire(__int64 volatile *_Target, __int64 _Value) {
763*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf2 ; lock ; xchg {%0, %1|%1, %0}"
764*bed243d3SAndroid Build Coastguard Worker                        : "+r" (_Value), "+m" (*_Target) :: "memory");
765*bed243d3SAndroid Build Coastguard Worker   return _Value;
766*bed243d3SAndroid Build Coastguard Worker }
767*bed243d3SAndroid Build Coastguard Worker static __inline__ __int64 __DEFAULT_FN_ATTRS
_InterlockedExchange64_HLERelease(__int64 volatile * _Target,__int64 _Value)768*bed243d3SAndroid Build Coastguard Worker _InterlockedExchange64_HLERelease(__int64 volatile *_Target, __int64 _Value) {
769*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf3 ; lock ; xchg {%0, %1|%1, %0}"
770*bed243d3SAndroid Build Coastguard Worker                        : "+r" (_Value), "+m" (*_Target) :: "memory");
771*bed243d3SAndroid Build Coastguard Worker   return _Value;
772*bed243d3SAndroid Build Coastguard Worker }
773*bed243d3SAndroid Build Coastguard Worker #endif
774*bed243d3SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------*\
775*bed243d3SAndroid Build Coastguard Worker |* Interlocked Compare Exchange HLE
776*bed243d3SAndroid Build Coastguard Worker \*----------------------------------------------------------------------------*/
777*bed243d3SAndroid Build Coastguard Worker #if defined(__i386__) || defined(__x86_64__)
778*bed243d3SAndroid Build Coastguard Worker static __inline__ long __DEFAULT_FN_ATTRS
_InterlockedCompareExchange_HLEAcquire(long volatile * _Destination,long _Exchange,long _Comparand)779*bed243d3SAndroid Build Coastguard Worker _InterlockedCompareExchange_HLEAcquire(long volatile *_Destination,
780*bed243d3SAndroid Build Coastguard Worker                               long _Exchange, long _Comparand) {
781*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg {%2, %1|%1, %2}"
782*bed243d3SAndroid Build Coastguard Worker                        : "+a" (_Comparand), "+m" (*_Destination)
783*bed243d3SAndroid Build Coastguard Worker                        : "r" (_Exchange) : "memory");
784*bed243d3SAndroid Build Coastguard Worker   return _Comparand;
785*bed243d3SAndroid Build Coastguard Worker }
786*bed243d3SAndroid Build Coastguard Worker static __inline__ long __DEFAULT_FN_ATTRS
_InterlockedCompareExchange_HLERelease(long volatile * _Destination,long _Exchange,long _Comparand)787*bed243d3SAndroid Build Coastguard Worker _InterlockedCompareExchange_HLERelease(long volatile *_Destination,
788*bed243d3SAndroid Build Coastguard Worker                               long _Exchange, long _Comparand) {
789*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg {%2, %1|%1, %2}"
790*bed243d3SAndroid Build Coastguard Worker                        : "+a" (_Comparand), "+m" (*_Destination)
791*bed243d3SAndroid Build Coastguard Worker                        : "r" (_Exchange) : "memory");
792*bed243d3SAndroid Build Coastguard Worker   return _Comparand;
793*bed243d3SAndroid Build Coastguard Worker }
794*bed243d3SAndroid Build Coastguard Worker #endif
795*bed243d3SAndroid Build Coastguard Worker #if defined(__x86_64__)
796*bed243d3SAndroid Build Coastguard Worker static __inline__ __int64 __DEFAULT_FN_ATTRS
_InterlockedCompareExchange64_HLEAcquire(__int64 volatile * _Destination,__int64 _Exchange,__int64 _Comparand)797*bed243d3SAndroid Build Coastguard Worker _InterlockedCompareExchange64_HLEAcquire(__int64 volatile *_Destination,
798*bed243d3SAndroid Build Coastguard Worker                               __int64 _Exchange, __int64 _Comparand) {
799*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg {%2, %1|%1, %2}"
800*bed243d3SAndroid Build Coastguard Worker                        : "+a" (_Comparand), "+m" (*_Destination)
801*bed243d3SAndroid Build Coastguard Worker                        : "r" (_Exchange) : "memory");
802*bed243d3SAndroid Build Coastguard Worker   return _Comparand;
803*bed243d3SAndroid Build Coastguard Worker }
804*bed243d3SAndroid Build Coastguard Worker static __inline__ __int64 __DEFAULT_FN_ATTRS
_InterlockedCompareExchange64_HLERelease(__int64 volatile * _Destination,__int64 _Exchange,__int64 _Comparand)805*bed243d3SAndroid Build Coastguard Worker _InterlockedCompareExchange64_HLERelease(__int64 volatile *_Destination,
806*bed243d3SAndroid Build Coastguard Worker                               __int64 _Exchange, __int64 _Comparand) {
807*bed243d3SAndroid Build Coastguard Worker   __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg {%2, %1|%1, %2}"
808*bed243d3SAndroid Build Coastguard Worker                        : "+a" (_Comparand), "+m" (*_Destination)
809*bed243d3SAndroid Build Coastguard Worker                        : "r" (_Exchange) : "memory");
810*bed243d3SAndroid Build Coastguard Worker   return _Comparand;
811*bed243d3SAndroid Build Coastguard Worker }
812*bed243d3SAndroid Build Coastguard Worker #endif
813*bed243d3SAndroid Build Coastguard Worker #ifdef __cplusplus
814*bed243d3SAndroid Build Coastguard Worker }
815*bed243d3SAndroid Build Coastguard Worker #endif
816*bed243d3SAndroid Build Coastguard Worker 
817*bed243d3SAndroid Build Coastguard Worker #undef __DEFAULT_FN_ATTRS
818*bed243d3SAndroid Build Coastguard Worker 
819*bed243d3SAndroid Build Coastguard Worker #endif /* defined(_MSC_VER) && __has_extension(gnu_asm) */
820*bed243d3SAndroid Build Coastguard Worker 
821*bed243d3SAndroid Build Coastguard Worker #endif /* __IMMINTRIN_H */
822