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