clang 23.0.0git
amo.h
Go to the documentation of this file.
1/*===---- amo.h - PowerPC Atomic Memory Operations ------------------------===*\
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/* This header provides compatibility for GCC's AMO functions.
10 * The functions here call Clang's underlying AMO builtins.
11 */
12
13#ifndef _AMO_H
14#define _AMO_H
15
16#include <stdint.h>
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22/* AMO Load Operation Codes (FC values) */
23enum {
24 _AMO_LD_ADD = 0x00, /* Fetch and Add */
25 _AMO_LD_XOR = 0x01, /* Fetch and XOR */
26 _AMO_LD_IOR = 0x02, /* Fetch and OR */
27 _AMO_LD_AND = 0x03, /* Fetch and AND */
28 _AMO_LD_UMAX = 0x04, /* Fetch and Maximum Unsigned */
29 _AMO_LD_SMAX = 0x05, /* Fetch and Maximum Signed */
30 _AMO_LD_UMIN = 0x06, /* Fetch and Minimum Unsigned */
31 _AMO_LD_SMIN = 0x07, /* Fetch and Minimum Signed */
32 _AMO_LD_SWAP = 0x08 /* Swap */
33};
34
35/* 32-bit unsigned AMO load operations */
36static inline uint32_t amo_lwat_add(uint32_t *ptr, uint32_t val) {
37 return __builtin_amo_lwat(ptr, val, _AMO_LD_ADD);
38}
39
40static inline uint32_t amo_lwat_xor(uint32_t *ptr, uint32_t val) {
41 return __builtin_amo_lwat(ptr, val, _AMO_LD_XOR);
42}
43
44static inline uint32_t amo_lwat_ior(uint32_t *ptr, uint32_t val) {
45 return __builtin_amo_lwat(ptr, val, _AMO_LD_IOR);
46}
47
48static inline uint32_t amo_lwat_and(uint32_t *ptr, uint32_t val) {
49 return __builtin_amo_lwat(ptr, val, _AMO_LD_AND);
50}
51
52static inline uint32_t amo_lwat_umax(uint32_t *ptr, uint32_t val) {
53 return __builtin_amo_lwat(ptr, val, _AMO_LD_UMAX);
54}
55
56static inline uint32_t amo_lwat_umin(uint32_t *ptr, uint32_t val) {
57 return __builtin_amo_lwat(ptr, val, _AMO_LD_UMIN);
58}
59
60static inline uint32_t amo_lwat_swap(uint32_t *ptr, uint32_t val) {
61 return __builtin_amo_lwat(ptr, val, _AMO_LD_SWAP);
62}
63
64/* 32-bit signed AMO load operations */
65static inline int32_t amo_lwat_sadd(int32_t *ptr, int32_t val) {
66 return __builtin_amo_lwat_s(ptr, val, _AMO_LD_ADD);
67}
68
69static inline int32_t amo_lwat_smax(int32_t *ptr, int32_t val) {
70 return __builtin_amo_lwat_s(ptr, val, _AMO_LD_SMAX);
71}
72
73static inline int32_t amo_lwat_smin(int32_t *ptr, int32_t val) {
74 return __builtin_amo_lwat_s(ptr, val, _AMO_LD_SMIN);
75}
76
77static inline int32_t amo_lwat_sswap(int32_t *ptr, int32_t val) {
78 return __builtin_amo_lwat_s(ptr, val, _AMO_LD_SWAP);
79}
80
81/* 64-bit unsigned AMO load operations */
82static inline uint64_t amo_ldat_add(uint64_t *ptr, uint64_t val) {
83 return __builtin_amo_ldat(ptr, val, _AMO_LD_ADD);
84}
85
86static inline uint64_t amo_ldat_xor(uint64_t *ptr, uint64_t val) {
87 return __builtin_amo_ldat(ptr, val, _AMO_LD_XOR);
88}
89
90static inline uint64_t amo_ldat_ior(uint64_t *ptr, uint64_t val) {
91 return __builtin_amo_ldat(ptr, val, _AMO_LD_IOR);
92}
93
94static inline uint64_t amo_ldat_and(uint64_t *ptr, uint64_t val) {
95 return __builtin_amo_ldat(ptr, val, _AMO_LD_AND);
96}
97
98static inline uint64_t amo_ldat_umax(uint64_t *ptr, uint64_t val) {
99 return __builtin_amo_ldat(ptr, val, _AMO_LD_UMAX);
100}
101
102static inline uint64_t amo_ldat_umin(uint64_t *ptr, uint64_t val) {
103 return __builtin_amo_ldat(ptr, val, _AMO_LD_UMIN);
104}
105
106static inline uint64_t amo_ldat_swap(uint64_t *ptr, uint64_t val) {
107 return __builtin_amo_ldat(ptr, val, _AMO_LD_SWAP);
108}
109
110/* 64-bit signed AMO load operations */
111static inline int64_t amo_ldat_sadd(int64_t *ptr, int64_t val) {
112 return __builtin_amo_ldat_s(ptr, val, _AMO_LD_ADD);
113}
114
115static inline int64_t amo_ldat_smax(int64_t *ptr, int64_t val) {
116 return __builtin_amo_ldat_s(ptr, val, _AMO_LD_SMAX);
117}
118
119static inline int64_t amo_ldat_smin(int64_t *ptr, int64_t val) {
120 return __builtin_amo_ldat_s(ptr, val, _AMO_LD_SMIN);
121}
122
123static inline int64_t amo_ldat_sswap(int64_t *ptr, int64_t val) {
124 return __builtin_amo_ldat_s(ptr, val, _AMO_LD_SWAP);
125}
126
127/* AMO Store Operation Codes (FC values) */
129 _AMO_ST_ADD = 0x00, /* Store Add */
130 _AMO_ST_XOR = 0x01, /* Store Xor */
131 _AMO_ST_IOR = 0x02, /* Store Ior */
132 _AMO_ST_AND = 0x03, /* Store And */
133 _AMO_ST_UMAX = 0x04, /* Store Unsigned Maximum */
134 _AMO_ST_SMAX = 0x05, /* Store Signed Maximum */
135 _AMO_ST_UMIN = 0x06, /* Store Unsigned Minimum */
136 _AMO_ST_SMIN = 0x07, /* Store Signed Minimum */
137 _AMO_ST_TWIN = 0x18 /* Store Twin */
138};
139
140/* 32-bit unsigned AMO store operations */
141static inline void amo_stwat_add(uint32_t *ptr, uint32_t val) {
142 __builtin_amo_stwat(ptr, val, _AMO_ST_ADD);
143}
144
145static inline void amo_stwat_xor(uint32_t *ptr, uint32_t val) {
146 __builtin_amo_stwat(ptr, val, _AMO_ST_XOR);
147}
148
149static inline void amo_stwat_ior(uint32_t *ptr, uint32_t val) {
150 __builtin_amo_stwat(ptr, val, _AMO_ST_IOR);
151}
152
153static inline void amo_stwat_and(uint32_t *ptr, uint32_t val) {
154 __builtin_amo_stwat(ptr, val, _AMO_ST_AND);
155}
156
157static inline void amo_stwat_umax(uint32_t *ptr, uint32_t val) {
158 __builtin_amo_stwat(ptr, val, _AMO_ST_UMAX);
159}
160
161static inline void amo_stwat_umin(uint32_t *ptr, uint32_t val) {
162 __builtin_amo_stwat(ptr, val, _AMO_ST_UMIN);
163}
164
165/* 32-bit signed AMO store operations */
166static inline void amo_stwat_sadd(int32_t *ptr, int32_t val) {
167 __builtin_amo_stwat_s(ptr, val, _AMO_ST_ADD);
168}
169
170static inline void amo_stwat_smax(int32_t *ptr, int32_t val) {
171 __builtin_amo_stwat_s(ptr, val, _AMO_ST_SMAX);
172}
173
174static inline void amo_stwat_smin(int32_t *ptr, int32_t val) {
175 __builtin_amo_stwat_s(ptr, val, _AMO_ST_SMIN);
176}
177
178/* 64-bit unsigned AMO store operations */
179static inline void amo_stdat_add(uint64_t *ptr, uint64_t val) {
180 __builtin_amo_stdat(ptr, val, _AMO_ST_ADD);
181}
182
183static inline void amo_stdat_xor(uint64_t *ptr, uint64_t val) {
184 __builtin_amo_stdat(ptr, val, _AMO_ST_XOR);
185}
186
187static inline void amo_stdat_ior(uint64_t *ptr, uint64_t val) {
188 __builtin_amo_stdat(ptr, val, _AMO_ST_IOR);
189}
190
191static inline void amo_stdat_and(uint64_t *ptr, uint64_t val) {
192 __builtin_amo_stdat(ptr, val, _AMO_ST_AND);
193}
194
195static inline void amo_stdat_umax(uint64_t *ptr, uint64_t val) {
196 __builtin_amo_stdat(ptr, val, _AMO_ST_UMAX);
197}
198
199static inline void amo_stdat_umin(uint64_t *ptr, uint64_t val) {
200 __builtin_amo_stdat(ptr, val, _AMO_ST_UMIN);
201}
202
203/* 64-bit signed AMO store operations */
204static inline void amo_stdat_sadd(int64_t *ptr, int64_t val) {
205 __builtin_amo_stdat_s(ptr, val, _AMO_ST_ADD);
206}
207
208static inline void amo_stdat_smax(int64_t *ptr, int64_t val) {
209 __builtin_amo_stdat_s(ptr, val, _AMO_ST_SMAX);
210}
211
212static inline void amo_stdat_smin(int64_t *ptr, int64_t val) {
213 __builtin_amo_stdat_s(ptr, val, _AMO_ST_SMIN);
214}
215
216#ifdef __cplusplus
217}
218#endif
219
220#endif /* _AMO_H */
static void amo_stdat_umax(uint64_t *ptr, uint64_t val)
Definition amo.h:195
static uint32_t amo_lwat_umin(uint32_t *ptr, uint32_t val)
Definition amo.h:56
static uint32_t amo_lwat_swap(uint32_t *ptr, uint32_t val)
Definition amo.h:60
static void amo_stwat_umin(uint32_t *ptr, uint32_t val)
Definition amo.h:161
static int64_t amo_ldat_sadd(int64_t *ptr, int64_t val)
Definition amo.h:111
static void amo_stwat_umax(uint32_t *ptr, uint32_t val)
Definition amo.h:157
static void amo_stdat_smax(int64_t *ptr, int64_t val)
Definition amo.h:208
static void amo_stdat_ior(uint64_t *ptr, uint64_t val)
Definition amo.h:187
static void amo_stwat_add(uint32_t *ptr, uint32_t val)
Definition amo.h:141
static uint32_t amo_lwat_and(uint32_t *ptr, uint32_t val)
Definition amo.h:48
static void amo_stwat_ior(uint32_t *ptr, uint32_t val)
Definition amo.h:149
static void amo_stdat_and(uint64_t *ptr, uint64_t val)
Definition amo.h:191
static void amo_stwat_sadd(int32_t *ptr, int32_t val)
Definition amo.h:166
_AMO_ST
Definition amo.h:128
@ _AMO_ST_UMIN
Definition amo.h:135
@ _AMO_ST_SMIN
Definition amo.h:136
@ _AMO_ST_AND
Definition amo.h:132
@ _AMO_ST_ADD
Definition amo.h:129
@ _AMO_ST_TWIN
Definition amo.h:137
@ _AMO_ST_UMAX
Definition amo.h:133
@ _AMO_ST_IOR
Definition amo.h:131
@ _AMO_ST_SMAX
Definition amo.h:134
@ _AMO_ST_XOR
Definition amo.h:130
static void amo_stwat_and(uint32_t *ptr, uint32_t val)
Definition amo.h:153
static void amo_stdat_xor(uint64_t *ptr, uint64_t val)
Definition amo.h:183
static int32_t amo_lwat_sswap(int32_t *ptr, int32_t val)
Definition amo.h:77
static uint64_t amo_ldat_umax(uint64_t *ptr, uint64_t val)
Definition amo.h:98
static uint64_t amo_ldat_ior(uint64_t *ptr, uint64_t val)
Definition amo.h:90
static int64_t amo_ldat_sswap(int64_t *ptr, int64_t val)
Definition amo.h:123
static uint64_t amo_ldat_add(uint64_t *ptr, uint64_t val)
Definition amo.h:82
static void amo_stdat_sadd(int64_t *ptr, int64_t val)
Definition amo.h:204
static int64_t amo_ldat_smin(int64_t *ptr, int64_t val)
Definition amo.h:119
static uint32_t amo_lwat_ior(uint32_t *ptr, uint32_t val)
Definition amo.h:44
static void amo_stwat_smin(int32_t *ptr, int32_t val)
Definition amo.h:174
static void amo_stdat_umin(uint64_t *ptr, uint64_t val)
Definition amo.h:199
static uint64_t amo_ldat_and(uint64_t *ptr, uint64_t val)
Definition amo.h:94
static uint32_t amo_lwat_umax(uint32_t *ptr, uint32_t val)
Definition amo.h:52
static int32_t amo_lwat_smax(int32_t *ptr, int32_t val)
Definition amo.h:69
static uint32_t amo_lwat_xor(uint32_t *ptr, uint32_t val)
Definition amo.h:40
static void amo_stwat_smax(int32_t *ptr, int32_t val)
Definition amo.h:170
static int64_t amo_ldat_smax(int64_t *ptr, int64_t val)
Definition amo.h:115
static void amo_stdat_add(uint64_t *ptr, uint64_t val)
Definition amo.h:179
static uint64_t amo_ldat_umin(uint64_t *ptr, uint64_t val)
Definition amo.h:102
static void amo_stdat_smin(int64_t *ptr, int64_t val)
Definition amo.h:212
static uint64_t amo_ldat_swap(uint64_t *ptr, uint64_t val)
Definition amo.h:106
static void amo_stwat_xor(uint32_t *ptr, uint32_t val)
Definition amo.h:145
@ _AMO_LD_UMIN
Definition amo.h:30
@ _AMO_LD_IOR
Definition amo.h:26
@ _AMO_LD_UMAX
Definition amo.h:28
@ _AMO_LD_AND
Definition amo.h:27
@ _AMO_LD_ADD
Definition amo.h:24
@ _AMO_LD_XOR
Definition amo.h:25
@ _AMO_LD_SMAX
Definition amo.h:29
@ _AMO_LD_SWAP
Definition amo.h:32
@ _AMO_LD_SMIN
Definition amo.h:31
static int32_t amo_lwat_smin(int32_t *ptr, int32_t val)
Definition amo.h:73
static uint32_t amo_lwat_add(uint32_t *ptr, uint32_t val)
Definition amo.h:36
static int32_t amo_lwat_sadd(int32_t *ptr, int32_t val)
Definition amo.h:65
static uint64_t amo_ldat_xor(uint64_t *ptr, uint64_t val)
Definition amo.h:86