Line data Source code
1 : /* Prototypes of memory model helper functions.
2 : Copyright (C) 2011-2026 Free Software Foundation, Inc.
3 :
4 : This file is part of GCC.
5 :
6 : GCC is free software; you can redistribute it and/or modify it under
7 : the terms of the GNU General Public License as published by the Free
8 : Software Foundation; either version 3, or (at your option) any later
9 : version.
10 :
11 : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 : WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with GCC; see the file COPYING3. If not see
18 : <http://www.gnu.org/licenses/>. */
19 :
20 : #ifndef GCC_MEMMODEL_H
21 : #define GCC_MEMMODEL_H
22 :
23 : /* Suppose that higher bits are target dependent. */
24 : #define MEMMODEL_MASK ((1<<16)-1)
25 :
26 : /* Legacy sync operations set this upper flag in the memory model. This allows
27 : targets that need to do something stronger for sync operations to
28 : differentiate with their target patterns and issue a more appropriate insn
29 : sequence. See bugzilla 65697 for background. */
30 : #define MEMMODEL_SYNC (1<<15)
31 :
32 : /* Memory model without SYNC bit for targets/operations that do not care. */
33 : #define MEMMODEL_BASE_MASK (MEMMODEL_SYNC-1)
34 :
35 : /* Memory model types for the __atomic* builtins.
36 : This must match the order in libstdc++-v3/include/bits/atomic_base.h. */
37 : enum memmodel
38 : {
39 : MEMMODEL_RELAXED = 0,
40 : MEMMODEL_CONSUME = 1,
41 : MEMMODEL_ACQUIRE = 2,
42 : MEMMODEL_RELEASE = 3,
43 : MEMMODEL_ACQ_REL = 4,
44 : MEMMODEL_SEQ_CST = 5,
45 : MEMMODEL_LAST = 6,
46 : MEMMODEL_SYNC_ACQUIRE = MEMMODEL_ACQUIRE | MEMMODEL_SYNC,
47 : MEMMODEL_SYNC_RELEASE = MEMMODEL_RELEASE | MEMMODEL_SYNC,
48 : MEMMODEL_SYNC_SEQ_CST = MEMMODEL_SEQ_CST | MEMMODEL_SYNC,
49 : /* Say that all the higher bits are valid target extensions. */
50 : MEMMODEL_MAX = INTTYPE_MAXIMUM (int)
51 : };
52 :
53 : /* Return the memory model from a host integer. */
54 : inline enum memmodel
55 424628 : memmodel_from_int (unsigned HOST_WIDE_INT val)
56 : {
57 424628 : return (enum memmodel) (val & MEMMODEL_MASK);
58 : }
59 :
60 : /* Return the base memory model from a host integer. */
61 : inline enum memmodel
62 727537 : memmodel_base (unsigned HOST_WIDE_INT val)
63 : {
64 727537 : return (enum memmodel) (val & MEMMODEL_BASE_MASK);
65 : }
66 :
67 : /* Return TRUE if the memory model is RELAXED. */
68 : inline bool
69 : is_mm_relaxed (enum memmodel model)
70 : {
71 : return (model & MEMMODEL_BASE_MASK) == MEMMODEL_RELAXED;
72 : }
73 :
74 : /* Return TRUE if the memory model is CONSUME. */
75 : inline bool
76 : is_mm_consume (enum memmodel model)
77 : {
78 : return (model & MEMMODEL_BASE_MASK) == MEMMODEL_CONSUME;
79 : }
80 :
81 : /* Return TRUE if the memory model is ACQUIRE. */
82 : inline bool
83 : is_mm_acquire (enum memmodel model)
84 : {
85 : return (model & MEMMODEL_BASE_MASK) == MEMMODEL_ACQUIRE;
86 : }
87 :
88 : /* Return TRUE if the memory model is RELEASE. */
89 : inline bool
90 : is_mm_release (enum memmodel model)
91 : {
92 : return (model & MEMMODEL_BASE_MASK) == MEMMODEL_RELEASE;
93 : }
94 :
95 : /* Return TRUE if the memory model is ACQ_REL. */
96 : inline bool
97 : is_mm_acq_rel (enum memmodel model)
98 : {
99 : return (model & MEMMODEL_BASE_MASK) == MEMMODEL_ACQ_REL;
100 : }
101 :
102 : /* Return TRUE if the memory model is SEQ_CST. */
103 : inline bool
104 : is_mm_seq_cst (enum memmodel model)
105 : {
106 : return (model & MEMMODEL_BASE_MASK) == MEMMODEL_SEQ_CST;
107 : }
108 :
109 : /* Return TRUE if the memory model is a SYNC variant. */
110 : inline bool
111 : is_mm_sync (enum memmodel model)
112 : {
113 : return (model & MEMMODEL_SYNC);
114 : }
115 :
116 : #endif /* GCC_MEMMODEL_H */
|