1*bed243d3SAndroid Build Coastguard Worker /*===----------------------- raointintrin.h - RAOINT ------------------------===
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 __X86GPRINTRIN_H
11*bed243d3SAndroid Build Coastguard Worker #error "Never use <raointintrin.h> directly; include <x86gprintrin.h> instead."
12*bed243d3SAndroid Build Coastguard Worker #endif // __X86GPRINTRIN_H
13*bed243d3SAndroid Build Coastguard Worker
14*bed243d3SAndroid Build Coastguard Worker #ifndef __RAOINTINTRIN_H
15*bed243d3SAndroid Build Coastguard Worker #define __RAOINTINTRIN_H
16*bed243d3SAndroid Build Coastguard Worker
17*bed243d3SAndroid Build Coastguard Worker #define __DEFAULT_FN_ATTRS \
18*bed243d3SAndroid Build Coastguard Worker __attribute__((__always_inline__, __nodebug__, __target__("raoint")))
19*bed243d3SAndroid Build Coastguard Worker
20*bed243d3SAndroid Build Coastguard Worker /// Atomically add a 32-bit value at memory operand \a __A and a 32-bit \a __B,
21*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
22*bed243d3SAndroid Build Coastguard Worker ///
23*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
24*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
25*bed243d3SAndroid Build Coastguard Worker ///
26*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
27*bed243d3SAndroid Build Coastguard Worker ///
28*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AADD instruction.
29*bed243d3SAndroid Build Coastguard Worker ///
30*bed243d3SAndroid Build Coastguard Worker /// \param __A
31*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 32-bit memory location.
32*bed243d3SAndroid Build Coastguard Worker /// \param __B
33*bed243d3SAndroid Build Coastguard Worker /// A 32-bit integer value.
34*bed243d3SAndroid Build Coastguard Worker ///
35*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
36*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+31:__A] := MEM[__A+31:__A] + __B[31:0]
37*bed243d3SAndroid Build Coastguard Worker /// \endcode
_aadd_i32(int * __A,int __B)38*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _aadd_i32(int *__A, int __B) {
39*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_aadd32((int *)__A, __B);
40*bed243d3SAndroid Build Coastguard Worker }
41*bed243d3SAndroid Build Coastguard Worker
42*bed243d3SAndroid Build Coastguard Worker /// Atomically and a 32-bit value at memory operand \a __A and a 32-bit \a __B,
43*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
44*bed243d3SAndroid Build Coastguard Worker ///
45*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
46*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
47*bed243d3SAndroid Build Coastguard Worker ///
48*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
49*bed243d3SAndroid Build Coastguard Worker ///
50*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AAND instruction.
51*bed243d3SAndroid Build Coastguard Worker ///
52*bed243d3SAndroid Build Coastguard Worker /// \param __A
53*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 32-bit memory location.
54*bed243d3SAndroid Build Coastguard Worker /// \param __B
55*bed243d3SAndroid Build Coastguard Worker /// A 32-bit integer value.
56*bed243d3SAndroid Build Coastguard Worker ///
57*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
58*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+31:__A] := MEM[__A+31:__A] AND __B[31:0]
59*bed243d3SAndroid Build Coastguard Worker /// \endcode
_aand_i32(int * __A,int __B)60*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _aand_i32(int *__A, int __B) {
61*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_aand32((int *)__A, __B);
62*bed243d3SAndroid Build Coastguard Worker }
63*bed243d3SAndroid Build Coastguard Worker
64*bed243d3SAndroid Build Coastguard Worker /// Atomically or a 32-bit value at memory operand \a __A and a 32-bit \a __B,
65*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
66*bed243d3SAndroid Build Coastguard Worker ///
67*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
68*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
69*bed243d3SAndroid Build Coastguard Worker ///
70*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
71*bed243d3SAndroid Build Coastguard Worker ///
72*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AOR instruction.
73*bed243d3SAndroid Build Coastguard Worker ///
74*bed243d3SAndroid Build Coastguard Worker /// \param __A
75*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 32-bit memory location.
76*bed243d3SAndroid Build Coastguard Worker /// \param __B
77*bed243d3SAndroid Build Coastguard Worker /// A 32-bit integer value.
78*bed243d3SAndroid Build Coastguard Worker ///
79*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
80*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+31:__A] := MEM[__A+31:__A] OR __B[31:0]
81*bed243d3SAndroid Build Coastguard Worker /// \endcode
_aor_i32(int * __A,int __B)82*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _aor_i32(int *__A, int __B) {
83*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_aor32((int *)__A, __B);
84*bed243d3SAndroid Build Coastguard Worker }
85*bed243d3SAndroid Build Coastguard Worker
86*bed243d3SAndroid Build Coastguard Worker /// Atomically xor a 32-bit value at memory operand \a __A and a 32-bit \a __B,
87*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
88*bed243d3SAndroid Build Coastguard Worker ///
89*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
90*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
91*bed243d3SAndroid Build Coastguard Worker ///
92*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
93*bed243d3SAndroid Build Coastguard Worker ///
94*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AXOR instruction.
95*bed243d3SAndroid Build Coastguard Worker ///
96*bed243d3SAndroid Build Coastguard Worker /// \param __A
97*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 32-bit memory location.
98*bed243d3SAndroid Build Coastguard Worker /// \param __B
99*bed243d3SAndroid Build Coastguard Worker /// A 32-bit integer value.
100*bed243d3SAndroid Build Coastguard Worker ///
101*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
102*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+31:__A] := MEM[__A+31:__A] XOR __B[31:0]
103*bed243d3SAndroid Build Coastguard Worker /// \endcode
_axor_i32(int * __A,int __B)104*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _axor_i32(int *__A, int __B) {
105*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_axor32((int *)__A, __B);
106*bed243d3SAndroid Build Coastguard Worker }
107*bed243d3SAndroid Build Coastguard Worker
108*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__
109*bed243d3SAndroid Build Coastguard Worker /// Atomically add a 64-bit value at memory operand \a __A and a 64-bit \a __B,
110*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
111*bed243d3SAndroid Build Coastguard Worker ///
112*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
113*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
114*bed243d3SAndroid Build Coastguard Worker ///
115*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
116*bed243d3SAndroid Build Coastguard Worker ///
117*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AADD instruction.
118*bed243d3SAndroid Build Coastguard Worker ///
119*bed243d3SAndroid Build Coastguard Worker /// \param __A
120*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 64-bit memory location.
121*bed243d3SAndroid Build Coastguard Worker /// \param __B
122*bed243d3SAndroid Build Coastguard Worker /// A 64-bit integer value.
123*bed243d3SAndroid Build Coastguard Worker ///
124*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
125*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+63:__A] := MEM[__A+63:__A] + __B[63:0]
126*bed243d3SAndroid Build Coastguard Worker /// \endcode
_aadd_i64(long long * __A,long long __B)127*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _aadd_i64(long long *__A,
128*bed243d3SAndroid Build Coastguard Worker long long __B) {
129*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_aadd64((long long *)__A, __B);
130*bed243d3SAndroid Build Coastguard Worker }
131*bed243d3SAndroid Build Coastguard Worker
132*bed243d3SAndroid Build Coastguard Worker /// Atomically and a 64-bit value at memory operand \a __A and a 64-bit \a __B,
133*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
134*bed243d3SAndroid Build Coastguard Worker ///
135*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
136*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
137*bed243d3SAndroid Build Coastguard Worker ///
138*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
139*bed243d3SAndroid Build Coastguard Worker ///
140*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AAND instruction.
141*bed243d3SAndroid Build Coastguard Worker ///
142*bed243d3SAndroid Build Coastguard Worker /// \param __A
143*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 64-bit memory location.
144*bed243d3SAndroid Build Coastguard Worker /// \param __B
145*bed243d3SAndroid Build Coastguard Worker /// A 64-bit integer value.
146*bed243d3SAndroid Build Coastguard Worker ///
147*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
148*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+63:__A] := MEM[__A+63:__A] AND __B[63:0]
149*bed243d3SAndroid Build Coastguard Worker /// \endcode
_aand_i64(long long * __A,long long __B)150*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _aand_i64(long long *__A,
151*bed243d3SAndroid Build Coastguard Worker long long __B) {
152*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_aand64((long long *)__A, __B);
153*bed243d3SAndroid Build Coastguard Worker }
154*bed243d3SAndroid Build Coastguard Worker
155*bed243d3SAndroid Build Coastguard Worker /// Atomically or a 64-bit value at memory operand \a __A and a 64-bit \a __B,
156*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
157*bed243d3SAndroid Build Coastguard Worker ///
158*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
159*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
160*bed243d3SAndroid Build Coastguard Worker ///
161*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
162*bed243d3SAndroid Build Coastguard Worker ///
163*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AOR instruction.
164*bed243d3SAndroid Build Coastguard Worker ///
165*bed243d3SAndroid Build Coastguard Worker /// \param __A
166*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 64-bit memory location.
167*bed243d3SAndroid Build Coastguard Worker /// \param __B
168*bed243d3SAndroid Build Coastguard Worker /// A 64-bit integer value.
169*bed243d3SAndroid Build Coastguard Worker ///
170*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
171*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+63:__A] := MEM[__A+63:__A] OR __B[63:0]
172*bed243d3SAndroid Build Coastguard Worker /// \endcode
_aor_i64(long long * __A,long long __B)173*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _aor_i64(long long *__A,
174*bed243d3SAndroid Build Coastguard Worker long long __B) {
175*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_aor64((long long *)__A, __B);
176*bed243d3SAndroid Build Coastguard Worker }
177*bed243d3SAndroid Build Coastguard Worker
178*bed243d3SAndroid Build Coastguard Worker /// Atomically xor a 64-bit value at memory operand \a __A and a 64-bit \a __B,
179*bed243d3SAndroid Build Coastguard Worker /// and store the result to the same memory location.
180*bed243d3SAndroid Build Coastguard Worker ///
181*bed243d3SAndroid Build Coastguard Worker /// This intrinsic should be used for contention or weak ordering. It may
182*bed243d3SAndroid Build Coastguard Worker /// result in bad performance for hot data used by single thread only.
183*bed243d3SAndroid Build Coastguard Worker ///
184*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
185*bed243d3SAndroid Build Coastguard Worker ///
186*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c AXOR instruction.
187*bed243d3SAndroid Build Coastguard Worker ///
188*bed243d3SAndroid Build Coastguard Worker /// \param __A
189*bed243d3SAndroid Build Coastguard Worker /// A pointer to a 64-bit memory location.
190*bed243d3SAndroid Build Coastguard Worker /// \param __B
191*bed243d3SAndroid Build Coastguard Worker /// A 64-bit integer value.
192*bed243d3SAndroid Build Coastguard Worker ///
193*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
194*bed243d3SAndroid Build Coastguard Worker /// MEM[__A+63:__A] := MEM[__A+63:__A] XOR __B[63:0]
195*bed243d3SAndroid Build Coastguard Worker /// \endcode
_axor_i64(long long * __A,long long __B)196*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS _axor_i64(long long *__A,
197*bed243d3SAndroid Build Coastguard Worker long long __B) {
198*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_axor64((long long *)__A, __B);
199*bed243d3SAndroid Build Coastguard Worker }
200*bed243d3SAndroid Build Coastguard Worker #endif // __x86_64__
201*bed243d3SAndroid Build Coastguard Worker
202*bed243d3SAndroid Build Coastguard Worker #undef __DEFAULT_FN_ATTRS
203*bed243d3SAndroid Build Coastguard Worker #endif // __RAOINTINTRIN_H
204