1c482cb11SRichard Henderson /*
2c482cb11SRichard Henderson * Atomic helper templates
3c482cb11SRichard Henderson * Included from tcg-runtime.c and cputlb.c.
4c482cb11SRichard Henderson *
5c482cb11SRichard Henderson * Copyright (c) 2016 Red Hat, Inc
6c482cb11SRichard Henderson *
7c482cb11SRichard Henderson * This library is free software; you can redistribute it and/or
8c482cb11SRichard Henderson * modify it under the terms of the GNU Lesser General Public
9c482cb11SRichard Henderson * License as published by the Free Software Foundation; either
10fb0343d5SThomas Huth * version 2.1 of the License, or (at your option) any later version.
11c482cb11SRichard Henderson *
12c482cb11SRichard Henderson * This library is distributed in the hope that it will be useful,
13c482cb11SRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of
14c482cb11SRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15c482cb11SRichard Henderson * Lesser General Public License for more details.
16c482cb11SRichard Henderson *
17c482cb11SRichard Henderson * You should have received a copy of the GNU Lesser General Public
18c482cb11SRichard Henderson * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19c482cb11SRichard Henderson */
20c482cb11SRichard Henderson
21e6d86bedSEmilio G. Cota #include "qemu/plugin.h"
22d071f4cdSEmilio G. Cota
237ebee43eSRichard Henderson #if DATA_SIZE == 16
247ebee43eSRichard Henderson # define SUFFIX o
257ebee43eSRichard Henderson # define DATA_TYPE Int128
267ebee43eSRichard Henderson # define BSWAP bswap128
27d071f4cdSEmilio G. Cota # define SHIFT 4
287ebee43eSRichard Henderson #elif DATA_SIZE == 8
29c482cb11SRichard Henderson # define SUFFIX q
309ef0c6d6SRichard Henderson # define DATA_TYPE aligned_uint64_t
319ef0c6d6SRichard Henderson # define SDATA_TYPE aligned_int64_t
32c482cb11SRichard Henderson # define BSWAP bswap64
33d071f4cdSEmilio G. Cota # define SHIFT 3
34c482cb11SRichard Henderson #elif DATA_SIZE == 4
35c482cb11SRichard Henderson # define SUFFIX l
36c482cb11SRichard Henderson # define DATA_TYPE uint32_t
375507c2bfSRichard Henderson # define SDATA_TYPE int32_t
38c482cb11SRichard Henderson # define BSWAP bswap32
39d071f4cdSEmilio G. Cota # define SHIFT 2
40c482cb11SRichard Henderson #elif DATA_SIZE == 2
41c482cb11SRichard Henderson # define SUFFIX w
42c482cb11SRichard Henderson # define DATA_TYPE uint16_t
435507c2bfSRichard Henderson # define SDATA_TYPE int16_t
44c482cb11SRichard Henderson # define BSWAP bswap16
45d071f4cdSEmilio G. Cota # define SHIFT 1
46c482cb11SRichard Henderson #elif DATA_SIZE == 1
47c482cb11SRichard Henderson # define SUFFIX b
48c482cb11SRichard Henderson # define DATA_TYPE uint8_t
495507c2bfSRichard Henderson # define SDATA_TYPE int8_t
50c482cb11SRichard Henderson # define BSWAP
51d071f4cdSEmilio G. Cota # define SHIFT 0
52c482cb11SRichard Henderson #else
53c482cb11SRichard Henderson # error unsupported data size
54c482cb11SRichard Henderson #endif
55c482cb11SRichard Henderson
56b709da5dSPierrick Bouvier #if DATA_SIZE == 16
57b709da5dSPierrick Bouvier # define VALUE_LOW(val) int128_getlo(val)
58b709da5dSPierrick Bouvier # define VALUE_HIGH(val) int128_gethi(val)
59b709da5dSPierrick Bouvier #else
60b709da5dSPierrick Bouvier # define VALUE_LOW(val) val
61b709da5dSPierrick Bouvier # define VALUE_HIGH(val) 0
62b709da5dSPierrick Bouvier #endif
63b709da5dSPierrick Bouvier
64c482cb11SRichard Henderson #if DATA_SIZE >= 4
65c482cb11SRichard Henderson # define ABI_TYPE DATA_TYPE
66c482cb11SRichard Henderson #else
67c482cb11SRichard Henderson # define ABI_TYPE uint32_t
68c482cb11SRichard Henderson #endif
69c482cb11SRichard Henderson
70c482cb11SRichard Henderson /* Define host-endian atomic operations. Note that END is used within
71c482cb11SRichard Henderson the ATOMIC_NAME macro, and redefined below. */
72c482cb11SRichard Henderson #if DATA_SIZE == 1
73c482cb11SRichard Henderson # define END
74e03b5686SMarc-André Lureau #elif HOST_BIG_ENDIAN
75c482cb11SRichard Henderson # define END _be
76c482cb11SRichard Henderson #else
77c482cb11SRichard Henderson # define END _le
78c482cb11SRichard Henderson #endif
79c482cb11SRichard Henderson
ATOMIC_NAME(cmpxchg)80*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, vaddr addr,
8148688fafSRichard Henderson ABI_TYPE cmpv, ABI_TYPE newv,
829002ffcbSRichard Henderson MemOpIdx oi, uintptr_t retaddr)
83c482cb11SRichard Henderson {
84d560225fSAnton Johansson DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
85d560225fSAnton Johansson DATA_SIZE, retaddr);
86d071f4cdSEmilio G. Cota DATA_TYPE ret;
87d071f4cdSEmilio G. Cota
88e6cd4bb5SRichard Henderson #if DATA_SIZE == 16
89e6cd4bb5SRichard Henderson ret = atomic16_cmpxchg(haddr, cmpv, newv);
90e6cd4bb5SRichard Henderson #else
91d73415a3SStefan Hajnoczi ret = qatomic_cmpxchg__nocheck(haddr, cmpv, newv);
92e6cd4bb5SRichard Henderson #endif
93ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP;
94b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr,
95b709da5dSPierrick Bouvier VALUE_LOW(ret),
96b709da5dSPierrick Bouvier VALUE_HIGH(ret),
97b709da5dSPierrick Bouvier VALUE_LOW(newv),
98b709da5dSPierrick Bouvier VALUE_HIGH(newv),
99b709da5dSPierrick Bouvier oi);
100ec603b55SRichard Henderson return ret;
101c482cb11SRichard Henderson }
102c482cb11SRichard Henderson
103ec4a9629SRichard Henderson #if DATA_SIZE < 16
ATOMIC_NAME(xchg)104*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, vaddr addr, ABI_TYPE val,
1059002ffcbSRichard Henderson MemOpIdx oi, uintptr_t retaddr)
106c482cb11SRichard Henderson {
107d560225fSAnton Johansson DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
108d560225fSAnton Johansson DATA_SIZE, retaddr);
109d071f4cdSEmilio G. Cota DATA_TYPE ret;
110d071f4cdSEmilio G. Cota
111d73415a3SStefan Hajnoczi ret = qatomic_xchg__nocheck(haddr, val);
112ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP;
113b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr,
114b709da5dSPierrick Bouvier VALUE_LOW(ret),
115b709da5dSPierrick Bouvier VALUE_HIGH(ret),
116b709da5dSPierrick Bouvier VALUE_LOW(val),
117b709da5dSPierrick Bouvier VALUE_HIGH(val),
118b709da5dSPierrick Bouvier oi);
119ec603b55SRichard Henderson return ret;
120c482cb11SRichard Henderson }
121c482cb11SRichard Henderson
122c482cb11SRichard Henderson #define GEN_ATOMIC_HELPER(X) \
123*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, vaddr addr, \
1249002ffcbSRichard Henderson ABI_TYPE val, MemOpIdx oi, uintptr_t retaddr) \
125c482cb11SRichard Henderson { \
1267bedee32SRichard Henderson DATA_TYPE *haddr, ret; \
127d560225fSAnton Johansson haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
128d73415a3SStefan Hajnoczi ret = qatomic_##X(haddr, val); \
129ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; \
130b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr, \
131b709da5dSPierrick Bouvier VALUE_LOW(ret), \
132b709da5dSPierrick Bouvier VALUE_HIGH(ret), \
133b709da5dSPierrick Bouvier VALUE_LOW(val), \
134b709da5dSPierrick Bouvier VALUE_HIGH(val), \
135b709da5dSPierrick Bouvier oi); \
136ec603b55SRichard Henderson return ret; \
137ec603b55SRichard Henderson }
138c482cb11SRichard Henderson
139c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_add)
GEN_ATOMIC_HELPER(fetch_and)140c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_and)
141c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_or)
142c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_xor)
143c482cb11SRichard Henderson GEN_ATOMIC_HELPER(add_fetch)
144c482cb11SRichard Henderson GEN_ATOMIC_HELPER(and_fetch)
145c482cb11SRichard Henderson GEN_ATOMIC_HELPER(or_fetch)
146c482cb11SRichard Henderson GEN_ATOMIC_HELPER(xor_fetch)
147c482cb11SRichard Henderson
148c482cb11SRichard Henderson #undef GEN_ATOMIC_HELPER
1495507c2bfSRichard Henderson
150a754f7f3SRichard Henderson /*
151a754f7f3SRichard Henderson * These helpers are, as a whole, full barriers. Within the helper,
1525507c2bfSRichard Henderson * the leading barrier is explicit and the trailing barrier is within
1535507c2bfSRichard Henderson * cmpxchg primitive.
154d071f4cdSEmilio G. Cota *
155d071f4cdSEmilio G. Cota * Trace this load + RMW loop as a single RMW op. This way, regardless
156d071f4cdSEmilio G. Cota * of CF_PARALLEL's value, we'll trace just a read and a write.
1575507c2bfSRichard Henderson */
1585507c2bfSRichard Henderson #define GEN_ATOMIC_HELPER_FN(X, FN, XDATA_TYPE, RET) \
159*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, vaddr addr, \
1609002ffcbSRichard Henderson ABI_TYPE xval, MemOpIdx oi, uintptr_t retaddr) \
1615507c2bfSRichard Henderson { \
1627bedee32SRichard Henderson XDATA_TYPE *haddr, cmp, old, new, val = xval; \
163d560225fSAnton Johansson haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
1645507c2bfSRichard Henderson smp_mb(); \
165d73415a3SStefan Hajnoczi cmp = qatomic_read__nocheck(haddr); \
1665507c2bfSRichard Henderson do { \
1675507c2bfSRichard Henderson old = cmp; new = FN(old, val); \
168d73415a3SStefan Hajnoczi cmp = qatomic_cmpxchg__nocheck(haddr, old, new); \
1695507c2bfSRichard Henderson } while (cmp != old); \
1705507c2bfSRichard Henderson ATOMIC_MMU_CLEANUP; \
171b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr, \
172b709da5dSPierrick Bouvier VALUE_LOW(old), \
173b709da5dSPierrick Bouvier VALUE_HIGH(old), \
174b709da5dSPierrick Bouvier VALUE_LOW(xval), \
175b709da5dSPierrick Bouvier VALUE_HIGH(xval), \
176b709da5dSPierrick Bouvier oi); \
1775507c2bfSRichard Henderson return RET; \
1785507c2bfSRichard Henderson }
1795507c2bfSRichard Henderson
1805507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smin, MIN, SDATA_TYPE, old)
1815507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umin, MIN, DATA_TYPE, old)
1825507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smax, MAX, SDATA_TYPE, old)
1835507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umax, MAX, DATA_TYPE, old)
1845507c2bfSRichard Henderson
1855507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smin_fetch, MIN, SDATA_TYPE, new)
1865507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umin_fetch, MIN, DATA_TYPE, new)
1875507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smax_fetch, MAX, SDATA_TYPE, new)
1885507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umax_fetch, MAX, DATA_TYPE, new)
1895507c2bfSRichard Henderson
1905507c2bfSRichard Henderson #undef GEN_ATOMIC_HELPER_FN
191ec4a9629SRichard Henderson #endif /* DATA SIZE < 16 */
1927ebee43eSRichard Henderson
193c482cb11SRichard Henderson #undef END
194c482cb11SRichard Henderson
195c482cb11SRichard Henderson #if DATA_SIZE > 1
196c482cb11SRichard Henderson
197c482cb11SRichard Henderson /* Define reverse-host-endian atomic operations. Note that END is used
198c482cb11SRichard Henderson within the ATOMIC_NAME macro. */
199e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN
200c482cb11SRichard Henderson # define END _le
201c482cb11SRichard Henderson #else
202c482cb11SRichard Henderson # define END _be
203c482cb11SRichard Henderson #endif
204c482cb11SRichard Henderson
205*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, vaddr addr,
20648688fafSRichard Henderson ABI_TYPE cmpv, ABI_TYPE newv,
2079002ffcbSRichard Henderson MemOpIdx oi, uintptr_t retaddr)
208c482cb11SRichard Henderson {
209d560225fSAnton Johansson DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
210d560225fSAnton Johansson DATA_SIZE, retaddr);
211d071f4cdSEmilio G. Cota DATA_TYPE ret;
212d071f4cdSEmilio G. Cota
213e6cd4bb5SRichard Henderson #if DATA_SIZE == 16
214e6cd4bb5SRichard Henderson ret = atomic16_cmpxchg(haddr, BSWAP(cmpv), BSWAP(newv));
215e6cd4bb5SRichard Henderson #else
216d73415a3SStefan Hajnoczi ret = qatomic_cmpxchg__nocheck(haddr, BSWAP(cmpv), BSWAP(newv));
217e6cd4bb5SRichard Henderson #endif
218ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP;
219b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr,
220b709da5dSPierrick Bouvier VALUE_LOW(ret),
221b709da5dSPierrick Bouvier VALUE_HIGH(ret),
222b709da5dSPierrick Bouvier VALUE_LOW(newv),
223b709da5dSPierrick Bouvier VALUE_HIGH(newv),
224b709da5dSPierrick Bouvier oi);
225ec603b55SRichard Henderson return BSWAP(ret);
226c482cb11SRichard Henderson }
227c482cb11SRichard Henderson
228ec4a9629SRichard Henderson #if DATA_SIZE < 16
ATOMIC_NAME(xchg)229*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, vaddr addr, ABI_TYPE val,
2309002ffcbSRichard Henderson MemOpIdx oi, uintptr_t retaddr)
231c482cb11SRichard Henderson {
232d560225fSAnton Johansson DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
233d560225fSAnton Johansson DATA_SIZE, retaddr);
234d071f4cdSEmilio G. Cota ABI_TYPE ret;
235d071f4cdSEmilio G. Cota
236d73415a3SStefan Hajnoczi ret = qatomic_xchg__nocheck(haddr, BSWAP(val));
237ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP;
238b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr,
239b709da5dSPierrick Bouvier VALUE_LOW(ret),
240b709da5dSPierrick Bouvier VALUE_HIGH(ret),
241b709da5dSPierrick Bouvier VALUE_LOW(val),
242b709da5dSPierrick Bouvier VALUE_HIGH(val),
243b709da5dSPierrick Bouvier oi);
244ec603b55SRichard Henderson return BSWAP(ret);
245c482cb11SRichard Henderson }
246c482cb11SRichard Henderson
247c482cb11SRichard Henderson #define GEN_ATOMIC_HELPER(X) \
248*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, vaddr addr, \
2499002ffcbSRichard Henderson ABI_TYPE val, MemOpIdx oi, uintptr_t retaddr) \
250c482cb11SRichard Henderson { \
2517bedee32SRichard Henderson DATA_TYPE *haddr, ret; \
252d560225fSAnton Johansson haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
253d73415a3SStefan Hajnoczi ret = qatomic_##X(haddr, BSWAP(val)); \
254ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; \
255b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr, \
256b709da5dSPierrick Bouvier VALUE_LOW(ret), \
257b709da5dSPierrick Bouvier VALUE_HIGH(ret), \
258b709da5dSPierrick Bouvier VALUE_LOW(val), \
259b709da5dSPierrick Bouvier VALUE_HIGH(val), \
260b709da5dSPierrick Bouvier oi); \
261ec603b55SRichard Henderson return BSWAP(ret); \
262c482cb11SRichard Henderson }
263c482cb11SRichard Henderson
264c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_and)
265c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_or)
266c482cb11SRichard Henderson GEN_ATOMIC_HELPER(fetch_xor)
267c482cb11SRichard Henderson GEN_ATOMIC_HELPER(and_fetch)
268c482cb11SRichard Henderson GEN_ATOMIC_HELPER(or_fetch)
269c482cb11SRichard Henderson GEN_ATOMIC_HELPER(xor_fetch)
270c482cb11SRichard Henderson
271c482cb11SRichard Henderson #undef GEN_ATOMIC_HELPER
272c482cb11SRichard Henderson
2735507c2bfSRichard Henderson /* These helpers are, as a whole, full barriers. Within the helper,
2745507c2bfSRichard Henderson * the leading barrier is explicit and the trailing barrier is within
2755507c2bfSRichard Henderson * cmpxchg primitive.
276d071f4cdSEmilio G. Cota *
277d071f4cdSEmilio G. Cota * Trace this load + RMW loop as a single RMW op. This way, regardless
278d071f4cdSEmilio G. Cota * of CF_PARALLEL's value, we'll trace just a read and a write.
2795507c2bfSRichard Henderson */
2805507c2bfSRichard Henderson #define GEN_ATOMIC_HELPER_FN(X, FN, XDATA_TYPE, RET) \
281*446321b3SRichard Henderson ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, vaddr addr, \
2829002ffcbSRichard Henderson ABI_TYPE xval, MemOpIdx oi, uintptr_t retaddr) \
2835507c2bfSRichard Henderson { \
2847bedee32SRichard Henderson XDATA_TYPE *haddr, ldo, ldn, old, new, val = xval; \
285d560225fSAnton Johansson haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
2865507c2bfSRichard Henderson smp_mb(); \
287d73415a3SStefan Hajnoczi ldn = qatomic_read__nocheck(haddr); \
2885507c2bfSRichard Henderson do { \
2895507c2bfSRichard Henderson ldo = ldn; old = BSWAP(ldo); new = FN(old, val); \
290d73415a3SStefan Hajnoczi ldn = qatomic_cmpxchg__nocheck(haddr, ldo, BSWAP(new)); \
2915507c2bfSRichard Henderson } while (ldo != ldn); \
2925507c2bfSRichard Henderson ATOMIC_MMU_CLEANUP; \
293b709da5dSPierrick Bouvier atomic_trace_rmw_post(env, addr, \
294b709da5dSPierrick Bouvier VALUE_LOW(old), \
295b709da5dSPierrick Bouvier VALUE_HIGH(old), \
296b709da5dSPierrick Bouvier VALUE_LOW(xval), \
297b709da5dSPierrick Bouvier VALUE_HIGH(xval), \
298b709da5dSPierrick Bouvier oi); \
2995507c2bfSRichard Henderson return RET; \
3005507c2bfSRichard Henderson }
3015507c2bfSRichard Henderson
3025507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smin, MIN, SDATA_TYPE, old)
3035507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umin, MIN, DATA_TYPE, old)
3045507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smax, MAX, SDATA_TYPE, old)
3055507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umax, MAX, DATA_TYPE, old)
3065507c2bfSRichard Henderson
3075507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smin_fetch, MIN, SDATA_TYPE, new)
3085507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umin_fetch, MIN, DATA_TYPE, new)
3095507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smax_fetch, MAX, SDATA_TYPE, new)
3105507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umax_fetch, MAX, DATA_TYPE, new)
3115507c2bfSRichard Henderson
31258edf9eeSRichard Henderson /* Note that for addition, we need to use a separate cmpxchg loop instead
31358edf9eeSRichard Henderson of bswaps for the reverse-host-endian helpers. */
31458edf9eeSRichard Henderson #define ADD(X, Y) (X + Y)
31558edf9eeSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_add, ADD, DATA_TYPE, old)
31658edf9eeSRichard Henderson GEN_ATOMIC_HELPER_FN(add_fetch, ADD, DATA_TYPE, new)
31758edf9eeSRichard Henderson #undef ADD
31858edf9eeSRichard Henderson
3195507c2bfSRichard Henderson #undef GEN_ATOMIC_HELPER_FN
320ec4a9629SRichard Henderson #endif /* DATA_SIZE < 16 */
321c482cb11SRichard Henderson
322c482cb11SRichard Henderson #undef END
323c482cb11SRichard Henderson #endif /* DATA_SIZE > 1 */
324c482cb11SRichard Henderson
325c482cb11SRichard Henderson #undef BSWAP
326c482cb11SRichard Henderson #undef ABI_TYPE
327c482cb11SRichard Henderson #undef DATA_TYPE
3285507c2bfSRichard Henderson #undef SDATA_TYPE
329c482cb11SRichard Henderson #undef SUFFIX
330c482cb11SRichard Henderson #undef DATA_SIZE
331d071f4cdSEmilio G. Cota #undef SHIFT
332b709da5dSPierrick Bouvier #undef VALUE_LOW
333b709da5dSPierrick Bouvier #undef VALUE_HIGH
334