clang 22.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/* 64-bit unsigned AMO load operations */
65static inline uint64_t amo_ldat_add(uint64_t *ptr, uint64_t val) {
66 return __builtin_amo_ldat(ptr, val, _AMO_LD_ADD);
67}
68
69static inline uint64_t amo_ldat_xor(uint64_t *ptr, uint64_t val) {
70 return __builtin_amo_ldat(ptr, val, _AMO_LD_XOR);
71}
72
73static inline uint64_t amo_ldat_ior(uint64_t *ptr, uint64_t val) {
74 return __builtin_amo_ldat(ptr, val, _AMO_LD_IOR);
75}
76
77static inline uint64_t amo_ldat_and(uint64_t *ptr, uint64_t val) {
78 return __builtin_amo_ldat(ptr, val, _AMO_LD_AND);
79}
80
81static inline uint64_t amo_ldat_umax(uint64_t *ptr, uint64_t val) {
82 return __builtin_amo_ldat(ptr, val, _AMO_LD_UMAX);
83}
84
85static inline uint64_t amo_ldat_umin(uint64_t *ptr, uint64_t val) {
86 return __builtin_amo_ldat(ptr, val, _AMO_LD_UMIN);
87}
88
89static inline uint64_t amo_ldat_swap(uint64_t *ptr, uint64_t val) {
90 return __builtin_amo_ldat(ptr, val, _AMO_LD_SWAP);
91}
92
93#ifdef __cplusplus
94}
95#endif
96
97#endif /* _AMO_H */
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 uint32_t amo_lwat_and(uint32_t *ptr, uint32_t val)
Definition amo.h:48
static uint64_t amo_ldat_umax(uint64_t *ptr, uint64_t val)
Definition amo.h:81
static uint64_t amo_ldat_ior(uint64_t *ptr, uint64_t val)
Definition amo.h:73
static uint64_t amo_ldat_add(uint64_t *ptr, uint64_t val)
Definition amo.h:65
static uint32_t amo_lwat_ior(uint32_t *ptr, uint32_t val)
Definition amo.h:44
static uint64_t amo_ldat_and(uint64_t *ptr, uint64_t val)
Definition amo.h:77
static uint32_t amo_lwat_umax(uint32_t *ptr, uint32_t val)
Definition amo.h:52
static uint32_t amo_lwat_xor(uint32_t *ptr, uint32_t val)
Definition amo.h:40
static uint64_t amo_ldat_umin(uint64_t *ptr, uint64_t val)
Definition amo.h:85
static uint64_t amo_ldat_swap(uint64_t *ptr, uint64_t val)
Definition amo.h:89
@ _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 uint32_t amo_lwat_add(uint32_t *ptr, uint32_t val)
Definition amo.h:36
static uint64_t amo_ldat_xor(uint64_t *ptr, uint64_t val)
Definition amo.h:69