1/* This file contains the definitions and documentation for the
2   synchronization builtins used in the GNU compiler.
3   Copyright (C) 2005 Free Software Foundation, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING.  If not, write to the Free
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA.  */
21
22/* Before including this file, you should define a macro:
23
24     DEF_SYNC_BUILTIN (ENUM, NAME, TYPE, ATTRS)
25
26   See builtins.def for details.  */
27
28/* Synchronization Primitives.  The "_N" version is the one that the user
29   is supposed to be using.  It's overloaded, and is resolved to one of the
30   "_1" through "_16" versions, plus some extra casts.  */
31
32DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_ADD_N, "__sync_fetch_and_add",
33		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
34DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_ADD_1, "__sync_fetch_and_add_1",
35		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
36DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_ADD_2, "__sync_fetch_and_add_2",
37		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
38DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_ADD_4, "__sync_fetch_and_add_4",
39		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
40DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_ADD_8, "__sync_fetch_and_add_8",
41		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
42DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_ADD_16, "__sync_fetch_and_add_16",
43		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
44
45DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_SUB_N, "__sync_fetch_and_sub",
46		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
47DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_SUB_1, "__sync_fetch_and_sub_1",
48		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
49DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_SUB_2, "__sync_fetch_and_sub_2",
50		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
51DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_SUB_4, "__sync_fetch_and_sub_4",
52		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
53DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_SUB_8, "__sync_fetch_and_sub_8",
54		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
55DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_SUB_16, "__sync_fetch_and_sub_16",
56		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
57
58DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_OR_N, "__sync_fetch_and_or",
59		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
60DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_OR_1, "__sync_fetch_and_or_1",
61		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
62DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_OR_2, "__sync_fetch_and_or_2",
63		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
64DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_OR_4, "__sync_fetch_and_or_4",
65		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
66DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_OR_8, "__sync_fetch_and_or_8",
67		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
68DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_OR_16, "__sync_fetch_and_or_16",
69		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
70
71DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_AND_N, "__sync_fetch_and_and",
72		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
73DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_AND_1, "__sync_fetch_and_and_1",
74		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
75DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_AND_2, "__sync_fetch_and_and_2",
76		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
77DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_AND_4, "__sync_fetch_and_and_4",
78		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
79DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_AND_8, "__sync_fetch_and_and_8",
80		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
81DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_AND_16, "__sync_fetch_and_and_16",
82		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
83
84DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_XOR_N, "__sync_fetch_and_xor",
85		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
86DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_XOR_1, "__sync_fetch_and_xor_1",
87		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
88DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_XOR_2, "__sync_fetch_and_xor_2",
89		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
90DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_XOR_4, "__sync_fetch_and_xor_4",
91		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
92DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_XOR_8, "__sync_fetch_and_xor_8",
93		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
94DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_XOR_16, "__sync_fetch_and_xor_16",
95		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
96
97DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_NAND_N, "__sync_fetch_and_nand",
98		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
99DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_NAND_1, "__sync_fetch_and_nand_1",
100		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
101DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_NAND_2, "__sync_fetch_and_nand_2",
102		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
103DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_NAND_4, "__sync_fetch_and_nand_4",
104		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
105DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_NAND_8, "__sync_fetch_and_nand_8",
106		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
107DEF_SYNC_BUILTIN (BUILT_IN_FETCH_AND_NAND_16, "__sync_fetch_and_nand_16",
108		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
109
110DEF_SYNC_BUILTIN (BUILT_IN_ADD_AND_FETCH_N, "__sync_add_and_fetch",
111		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
112DEF_SYNC_BUILTIN (BUILT_IN_ADD_AND_FETCH_1, "__sync_add_and_fetch_1",
113		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
114DEF_SYNC_BUILTIN (BUILT_IN_ADD_AND_FETCH_2, "__sync_add_and_fetch_2",
115		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
116DEF_SYNC_BUILTIN (BUILT_IN_ADD_AND_FETCH_4, "__sync_add_and_fetch_4",
117		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
118DEF_SYNC_BUILTIN (BUILT_IN_ADD_AND_FETCH_8, "__sync_add_and_fetch_8",
119		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
120DEF_SYNC_BUILTIN (BUILT_IN_ADD_AND_FETCH_16, "__sync_add_and_fetch_16",
121		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
122
123DEF_SYNC_BUILTIN (BUILT_IN_SUB_AND_FETCH_N, "__sync_sub_and_fetch",
124		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
125DEF_SYNC_BUILTIN (BUILT_IN_SUB_AND_FETCH_1, "__sync_sub_and_fetch_1",
126		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
127DEF_SYNC_BUILTIN (BUILT_IN_SUB_AND_FETCH_2, "__sync_sub_and_fetch_2",
128		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
129DEF_SYNC_BUILTIN (BUILT_IN_SUB_AND_FETCH_4, "__sync_sub_and_fetch_4",
130		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
131DEF_SYNC_BUILTIN (BUILT_IN_SUB_AND_FETCH_8, "__sync_sub_and_fetch_8",
132		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
133DEF_SYNC_BUILTIN (BUILT_IN_SUB_AND_FETCH_16, "__sync_sub_and_fetch_16",
134		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
135
136DEF_SYNC_BUILTIN (BUILT_IN_OR_AND_FETCH_N, "__sync_or_and_fetch",
137		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
138DEF_SYNC_BUILTIN (BUILT_IN_OR_AND_FETCH_1, "__sync_or_and_fetch_1",
139		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
140DEF_SYNC_BUILTIN (BUILT_IN_OR_AND_FETCH_2, "__sync_or_and_fetch_2",
141		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
142DEF_SYNC_BUILTIN (BUILT_IN_OR_AND_FETCH_4, "__sync_or_and_fetch_4",
143		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
144DEF_SYNC_BUILTIN (BUILT_IN_OR_AND_FETCH_8, "__sync_or_and_fetch_8",
145		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
146DEF_SYNC_BUILTIN (BUILT_IN_OR_AND_FETCH_16, "__sync_or_and_fetch_16",
147		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
148
149DEF_SYNC_BUILTIN (BUILT_IN_AND_AND_FETCH_N, "__sync_and_and_fetch",
150		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
151DEF_SYNC_BUILTIN (BUILT_IN_AND_AND_FETCH_1, "__sync_and_and_fetch_1",
152		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
153DEF_SYNC_BUILTIN (BUILT_IN_AND_AND_FETCH_2, "__sync_and_and_fetch_2",
154		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
155DEF_SYNC_BUILTIN (BUILT_IN_AND_AND_FETCH_4, "__sync_and_and_fetch_4",
156		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
157DEF_SYNC_BUILTIN (BUILT_IN_AND_AND_FETCH_8, "__sync_and_and_fetch_8",
158		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
159DEF_SYNC_BUILTIN (BUILT_IN_AND_AND_FETCH_16, "__sync_and_and_fetch_16",
160		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
161
162DEF_SYNC_BUILTIN (BUILT_IN_XOR_AND_FETCH_N, "__sync_xor_and_fetch",
163		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
164DEF_SYNC_BUILTIN (BUILT_IN_XOR_AND_FETCH_1, "__sync_xor_and_fetch_1",
165		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
166DEF_SYNC_BUILTIN (BUILT_IN_XOR_AND_FETCH_2, "__sync_xor_and_fetch_2",
167		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
168DEF_SYNC_BUILTIN (BUILT_IN_XOR_AND_FETCH_4, "__sync_xor_and_fetch_4",
169		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
170DEF_SYNC_BUILTIN (BUILT_IN_XOR_AND_FETCH_8, "__sync_xor_and_fetch_8",
171		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
172DEF_SYNC_BUILTIN (BUILT_IN_XOR_AND_FETCH_16, "__sync_xor_and_fetch_16",
173		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
174
175DEF_SYNC_BUILTIN (BUILT_IN_NAND_AND_FETCH_N, "__sync_nand_and_fetch",
176		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
177DEF_SYNC_BUILTIN (BUILT_IN_NAND_AND_FETCH_1, "__sync_nand_and_fetch_1",
178		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
179DEF_SYNC_BUILTIN (BUILT_IN_NAND_AND_FETCH_2, "__sync_nand_and_fetch_2",
180		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
181DEF_SYNC_BUILTIN (BUILT_IN_NAND_AND_FETCH_4, "__sync_nand_and_fetch_4",
182		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
183DEF_SYNC_BUILTIN (BUILT_IN_NAND_AND_FETCH_8, "__sync_nand_and_fetch_8",
184		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
185DEF_SYNC_BUILTIN (BUILT_IN_NAND_AND_FETCH_16, "__sync_nand_and_fetch_16",
186		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
187
188DEF_SYNC_BUILTIN (BUILT_IN_BOOL_COMPARE_AND_SWAP_N,
189		  "__sync_bool_compare_and_swap",
190		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
191DEF_SYNC_BUILTIN (BUILT_IN_BOOL_COMPARE_AND_SWAP_1,
192		  "__sync_bool_compare_and_swap_1",
193		  BT_FN_BOOL_VPTR_I1_I1, ATTR_NOTHROW_LIST)
194DEF_SYNC_BUILTIN (BUILT_IN_BOOL_COMPARE_AND_SWAP_2,
195		  "__sync_bool_compare_and_swap_2",
196		  BT_FN_BOOL_VPTR_I2_I2, ATTR_NOTHROW_LIST)
197DEF_SYNC_BUILTIN (BUILT_IN_BOOL_COMPARE_AND_SWAP_4,
198		  "__sync_bool_compare_and_swap_4",
199		  BT_FN_BOOL_VPTR_I4_I4, ATTR_NOTHROW_LIST)
200DEF_SYNC_BUILTIN (BUILT_IN_BOOL_COMPARE_AND_SWAP_8,
201		  "__sync_bool_compare_and_swap_8",
202		  BT_FN_BOOL_VPTR_I8_I8, ATTR_NOTHROW_LIST)
203DEF_SYNC_BUILTIN (BUILT_IN_BOOL_COMPARE_AND_SWAP_16,
204		  "__sync_bool_compare_and_swap_16",
205		  BT_FN_BOOL_VPTR_I16_I16, ATTR_NOTHROW_LIST)
206
207DEF_SYNC_BUILTIN (BUILT_IN_VAL_COMPARE_AND_SWAP_N,
208		  "__sync_val_compare_and_swap",
209		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
210DEF_SYNC_BUILTIN (BUILT_IN_VAL_COMPARE_AND_SWAP_1,
211		  "__sync_val_compare_and_swap_1",
212		  BT_FN_I1_VPTR_I1_I1, ATTR_NOTHROW_LIST)
213DEF_SYNC_BUILTIN (BUILT_IN_VAL_COMPARE_AND_SWAP_2,
214		  "__sync_val_compare_and_swap_2",
215		  BT_FN_I2_VPTR_I2_I2, ATTR_NOTHROW_LIST)
216DEF_SYNC_BUILTIN (BUILT_IN_VAL_COMPARE_AND_SWAP_4,
217		  "__sync_val_compare_and_swap_4",
218		  BT_FN_I4_VPTR_I4_I4, ATTR_NOTHROW_LIST)
219DEF_SYNC_BUILTIN (BUILT_IN_VAL_COMPARE_AND_SWAP_8,
220		  "__sync_val_compare_and_swap_8",
221		  BT_FN_I8_VPTR_I8_I8, ATTR_NOTHROW_LIST)
222DEF_SYNC_BUILTIN (BUILT_IN_VAL_COMPARE_AND_SWAP_16,
223		  "__sync_val_compare_and_swap_16",
224		  BT_FN_I16_VPTR_I16_I16, ATTR_NOTHROW_LIST)
225
226DEF_SYNC_BUILTIN (BUILT_IN_LOCK_TEST_AND_SET_N, "__sync_lock_test_and_set",
227		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
228DEF_SYNC_BUILTIN (BUILT_IN_LOCK_TEST_AND_SET_1, "__sync_lock_test_and_set_1",
229		  BT_FN_I1_VPTR_I1, ATTR_NOTHROW_LIST)
230DEF_SYNC_BUILTIN (BUILT_IN_LOCK_TEST_AND_SET_2, "__sync_lock_test_and_set_2",
231		  BT_FN_I2_VPTR_I2, ATTR_NOTHROW_LIST)
232DEF_SYNC_BUILTIN (BUILT_IN_LOCK_TEST_AND_SET_4, "__sync_lock_test_and_set_4",
233		  BT_FN_I4_VPTR_I4, ATTR_NOTHROW_LIST)
234DEF_SYNC_BUILTIN (BUILT_IN_LOCK_TEST_AND_SET_8, "__sync_lock_test_and_set_8",
235		  BT_FN_I8_VPTR_I8, ATTR_NOTHROW_LIST)
236DEF_SYNC_BUILTIN (BUILT_IN_LOCK_TEST_AND_SET_16, "__sync_lock_test_and_set_16",
237		  BT_FN_I16_VPTR_I16, ATTR_NOTHROW_LIST)
238
239DEF_SYNC_BUILTIN (BUILT_IN_LOCK_RELEASE_N, "__sync_lock_release",
240		  BT_FN_VOID_VAR, ATTR_NOTHROW_LIST)
241DEF_SYNC_BUILTIN (BUILT_IN_LOCK_RELEASE_1, "__sync_lock_release_1",
242		  BT_FN_VOID_VPTR, ATTR_NOTHROW_LIST)
243DEF_SYNC_BUILTIN (BUILT_IN_LOCK_RELEASE_2, "__sync_lock_release_2",
244		  BT_FN_VOID_VPTR, ATTR_NOTHROW_LIST)
245DEF_SYNC_BUILTIN (BUILT_IN_LOCK_RELEASE_4, "__sync_lock_release_4",
246		  BT_FN_VOID_VPTR, ATTR_NOTHROW_LIST)
247DEF_SYNC_BUILTIN (BUILT_IN_LOCK_RELEASE_8, "__sync_lock_release_8",
248		  BT_FN_VOID_VPTR, ATTR_NOTHROW_LIST)
249DEF_SYNC_BUILTIN (BUILT_IN_LOCK_RELEASE_16, "__sync_lock_release_16",
250		  BT_FN_VOID_VPTR, ATTR_NOTHROW_LIST)
251
252DEF_SYNC_BUILTIN (BUILT_IN_SYNCHRONIZE, "__sync_synchronize",
253		  BT_FN_VOID, ATTR_NOTHROW_LIST)
254