110f7d4d5SPhilippe Mathieu-Daudé /* 210f7d4d5SPhilippe Mathieu-Daudé * Atomic helper templates 310f7d4d5SPhilippe Mathieu-Daudé * Included from tcg-runtime.c and cputlb.c. 410f7d4d5SPhilippe Mathieu-Daudé * 510f7d4d5SPhilippe Mathieu-Daudé * Copyright (c) 2016 Red Hat, Inc 610f7d4d5SPhilippe Mathieu-Daudé * 710f7d4d5SPhilippe Mathieu-Daudé * This library is free software; you can redistribute it and/or 810f7d4d5SPhilippe Mathieu-Daudé * modify it under the terms of the GNU Lesser General Public 910f7d4d5SPhilippe Mathieu-Daudé * License as published by the Free Software Foundation; either 1010f7d4d5SPhilippe Mathieu-Daudé * version 2 of the License, or (at your option) any later version. 1110f7d4d5SPhilippe Mathieu-Daudé * 1210f7d4d5SPhilippe Mathieu-Daudé * This library is distributed in the hope that it will be useful, 1310f7d4d5SPhilippe Mathieu-Daudé * but WITHOUT ANY WARRANTY; without even the implied warranty of 1410f7d4d5SPhilippe Mathieu-Daudé * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1510f7d4d5SPhilippe Mathieu-Daudé * Lesser General Public License for more details. 1610f7d4d5SPhilippe Mathieu-Daudé * 1710f7d4d5SPhilippe Mathieu-Daudé * You should have received a copy of the GNU Lesser General Public 1810f7d4d5SPhilippe Mathieu-Daudé * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1910f7d4d5SPhilippe Mathieu-Daudé */ 2010f7d4d5SPhilippe Mathieu-Daudé 2110f7d4d5SPhilippe Mathieu-Daudé #if DATA_SIZE == 16 2210f7d4d5SPhilippe Mathieu-Daudé # define SUFFIX o 2310f7d4d5SPhilippe Mathieu-Daudé # define DATA_TYPE Int128 2410f7d4d5SPhilippe Mathieu-Daudé # define BSWAP bswap128 2510f7d4d5SPhilippe Mathieu-Daudé #elif DATA_SIZE == 8 2610f7d4d5SPhilippe Mathieu-Daudé # define SUFFIX q 2710f7d4d5SPhilippe Mathieu-Daudé # define DATA_TYPE uint64_t 285507c2bfSRichard Henderson # define SDATA_TYPE int64_t 2910f7d4d5SPhilippe Mathieu-Daudé # define BSWAP bswap64 3010f7d4d5SPhilippe Mathieu-Daudé #elif DATA_SIZE == 4 3110f7d4d5SPhilippe Mathieu-Daudé # define SUFFIX l 3210f7d4d5SPhilippe Mathieu-Daudé # define DATA_TYPE uint32_t 335507c2bfSRichard Henderson # define SDATA_TYPE int32_t 3410f7d4d5SPhilippe Mathieu-Daudé # define BSWAP bswap32 3510f7d4d5SPhilippe Mathieu-Daudé #elif DATA_SIZE == 2 3610f7d4d5SPhilippe Mathieu-Daudé # define SUFFIX w 3710f7d4d5SPhilippe Mathieu-Daudé # define DATA_TYPE uint16_t 385507c2bfSRichard Henderson # define SDATA_TYPE int16_t 3910f7d4d5SPhilippe Mathieu-Daudé # define BSWAP bswap16 4010f7d4d5SPhilippe Mathieu-Daudé #elif DATA_SIZE == 1 4110f7d4d5SPhilippe Mathieu-Daudé # define SUFFIX b 4210f7d4d5SPhilippe Mathieu-Daudé # define DATA_TYPE uint8_t 435507c2bfSRichard Henderson # define SDATA_TYPE int8_t 4410f7d4d5SPhilippe Mathieu-Daudé # define BSWAP 4510f7d4d5SPhilippe Mathieu-Daudé #else 4610f7d4d5SPhilippe Mathieu-Daudé # error unsupported data size 4710f7d4d5SPhilippe Mathieu-Daudé #endif 4810f7d4d5SPhilippe Mathieu-Daudé 4910f7d4d5SPhilippe Mathieu-Daudé #if DATA_SIZE >= 4 5010f7d4d5SPhilippe Mathieu-Daudé # define ABI_TYPE DATA_TYPE 5110f7d4d5SPhilippe Mathieu-Daudé #else 5210f7d4d5SPhilippe Mathieu-Daudé # define ABI_TYPE uint32_t 5310f7d4d5SPhilippe Mathieu-Daudé #endif 5410f7d4d5SPhilippe Mathieu-Daudé 5510f7d4d5SPhilippe Mathieu-Daudé /* Define host-endian atomic operations. Note that END is used within 5610f7d4d5SPhilippe Mathieu-Daudé the ATOMIC_NAME macro, and redefined below. */ 5710f7d4d5SPhilippe Mathieu-Daudé #if DATA_SIZE == 1 5810f7d4d5SPhilippe Mathieu-Daudé # define END 5910f7d4d5SPhilippe Mathieu-Daudé #elif defined(HOST_WORDS_BIGENDIAN) 6010f7d4d5SPhilippe Mathieu-Daudé # define END _be 6110f7d4d5SPhilippe Mathieu-Daudé #else 6210f7d4d5SPhilippe Mathieu-Daudé # define END _le 6310f7d4d5SPhilippe Mathieu-Daudé #endif 6410f7d4d5SPhilippe Mathieu-Daudé 6510f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr, 6610f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE cmpv, ABI_TYPE newv EXTRA_ARGS) 6710f7d4d5SPhilippe Mathieu-Daudé { 6834d49937SPeter Maydell ATOMIC_MMU_DECLS; 6910f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; 70ec603b55SRichard Henderson DATA_TYPE ret = atomic_cmpxchg__nocheck(haddr, cmpv, newv); 71ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 72ec603b55SRichard Henderson return ret; 7310f7d4d5SPhilippe Mathieu-Daudé } 7410f7d4d5SPhilippe Mathieu-Daudé 7510f7d4d5SPhilippe Mathieu-Daudé #if DATA_SIZE >= 16 7610f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr EXTRA_ARGS) 7710f7d4d5SPhilippe Mathieu-Daudé { 7834d49937SPeter Maydell ATOMIC_MMU_DECLS; 7910f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE val, *haddr = ATOMIC_MMU_LOOKUP; 8010f7d4d5SPhilippe Mathieu-Daudé __atomic_load(haddr, &val, __ATOMIC_RELAXED); 81ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 8210f7d4d5SPhilippe Mathieu-Daudé return val; 8310f7d4d5SPhilippe Mathieu-Daudé } 8410f7d4d5SPhilippe Mathieu-Daudé 8510f7d4d5SPhilippe Mathieu-Daudé void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, 8610f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE val EXTRA_ARGS) 8710f7d4d5SPhilippe Mathieu-Daudé { 8834d49937SPeter Maydell ATOMIC_MMU_DECLS; 8910f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; 9010f7d4d5SPhilippe Mathieu-Daudé __atomic_store(haddr, &val, __ATOMIC_RELAXED); 91ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 9210f7d4d5SPhilippe Mathieu-Daudé } 9310f7d4d5SPhilippe Mathieu-Daudé #else 9410f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, 9510f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE val EXTRA_ARGS) 9610f7d4d5SPhilippe Mathieu-Daudé { 9734d49937SPeter Maydell ATOMIC_MMU_DECLS; 9810f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; 99ec603b55SRichard Henderson DATA_TYPE ret = atomic_xchg__nocheck(haddr, val); 100ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 101ec603b55SRichard Henderson return ret; 10210f7d4d5SPhilippe Mathieu-Daudé } 10310f7d4d5SPhilippe Mathieu-Daudé 10410f7d4d5SPhilippe Mathieu-Daudé #define GEN_ATOMIC_HELPER(X) \ 10510f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \ 10610f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE val EXTRA_ARGS) \ 10710f7d4d5SPhilippe Mathieu-Daudé { \ 10834d49937SPeter Maydell ATOMIC_MMU_DECLS; \ 10910f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \ 110ec603b55SRichard Henderson DATA_TYPE ret = atomic_##X(haddr, val); \ 111ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; \ 112ec603b55SRichard Henderson return ret; \ 113ec603b55SRichard Henderson } 11410f7d4d5SPhilippe Mathieu-Daudé 11510f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_add) 11610f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_and) 11710f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_or) 11810f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_xor) 11910f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(add_fetch) 12010f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(and_fetch) 12110f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(or_fetch) 12210f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(xor_fetch) 12310f7d4d5SPhilippe Mathieu-Daudé 12410f7d4d5SPhilippe Mathieu-Daudé #undef GEN_ATOMIC_HELPER 1255507c2bfSRichard Henderson 1265507c2bfSRichard Henderson /* These helpers are, as a whole, full barriers. Within the helper, 1275507c2bfSRichard Henderson * the leading barrier is explicit and the trailing barrier is within 1285507c2bfSRichard Henderson * cmpxchg primitive. 1295507c2bfSRichard Henderson */ 1305507c2bfSRichard Henderson #define GEN_ATOMIC_HELPER_FN(X, FN, XDATA_TYPE, RET) \ 1315507c2bfSRichard Henderson ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \ 1325507c2bfSRichard Henderson ABI_TYPE xval EXTRA_ARGS) \ 1335507c2bfSRichard Henderson { \ 1345507c2bfSRichard Henderson ATOMIC_MMU_DECLS; \ 1355507c2bfSRichard Henderson XDATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \ 1365507c2bfSRichard Henderson XDATA_TYPE cmp, old, new, val = xval; \ 1375507c2bfSRichard Henderson smp_mb(); \ 1385507c2bfSRichard Henderson cmp = atomic_read__nocheck(haddr); \ 1395507c2bfSRichard Henderson do { \ 1405507c2bfSRichard Henderson old = cmp; new = FN(old, val); \ 1415507c2bfSRichard Henderson cmp = atomic_cmpxchg__nocheck(haddr, old, new); \ 1425507c2bfSRichard Henderson } while (cmp != old); \ 1435507c2bfSRichard Henderson ATOMIC_MMU_CLEANUP; \ 1445507c2bfSRichard Henderson return RET; \ 1455507c2bfSRichard Henderson } 1465507c2bfSRichard Henderson 1475507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smin, MIN, SDATA_TYPE, old) 1485507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umin, MIN, DATA_TYPE, old) 1495507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smax, MAX, SDATA_TYPE, old) 1505507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umax, MAX, DATA_TYPE, old) 1515507c2bfSRichard Henderson 1525507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smin_fetch, MIN, SDATA_TYPE, new) 1535507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umin_fetch, MIN, DATA_TYPE, new) 1545507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smax_fetch, MAX, SDATA_TYPE, new) 1555507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umax_fetch, MAX, DATA_TYPE, new) 1565507c2bfSRichard Henderson 1575507c2bfSRichard Henderson #undef GEN_ATOMIC_HELPER_FN 15810f7d4d5SPhilippe Mathieu-Daudé #endif /* DATA SIZE >= 16 */ 15910f7d4d5SPhilippe Mathieu-Daudé 16010f7d4d5SPhilippe Mathieu-Daudé #undef END 16110f7d4d5SPhilippe Mathieu-Daudé 16210f7d4d5SPhilippe Mathieu-Daudé #if DATA_SIZE > 1 16310f7d4d5SPhilippe Mathieu-Daudé 16410f7d4d5SPhilippe Mathieu-Daudé /* Define reverse-host-endian atomic operations. Note that END is used 16510f7d4d5SPhilippe Mathieu-Daudé within the ATOMIC_NAME macro. */ 16610f7d4d5SPhilippe Mathieu-Daudé #ifdef HOST_WORDS_BIGENDIAN 16710f7d4d5SPhilippe Mathieu-Daudé # define END _le 16810f7d4d5SPhilippe Mathieu-Daudé #else 16910f7d4d5SPhilippe Mathieu-Daudé # define END _be 17010f7d4d5SPhilippe Mathieu-Daudé #endif 17110f7d4d5SPhilippe Mathieu-Daudé 17210f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr, 17310f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE cmpv, ABI_TYPE newv EXTRA_ARGS) 17410f7d4d5SPhilippe Mathieu-Daudé { 17534d49937SPeter Maydell ATOMIC_MMU_DECLS; 17610f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; 177ec603b55SRichard Henderson DATA_TYPE ret = atomic_cmpxchg__nocheck(haddr, BSWAP(cmpv), BSWAP(newv)); 178ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 179ec603b55SRichard Henderson return BSWAP(ret); 18010f7d4d5SPhilippe Mathieu-Daudé } 18110f7d4d5SPhilippe Mathieu-Daudé 18210f7d4d5SPhilippe Mathieu-Daudé #if DATA_SIZE >= 16 18310f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr EXTRA_ARGS) 18410f7d4d5SPhilippe Mathieu-Daudé { 18534d49937SPeter Maydell ATOMIC_MMU_DECLS; 18610f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE val, *haddr = ATOMIC_MMU_LOOKUP; 18710f7d4d5SPhilippe Mathieu-Daudé __atomic_load(haddr, &val, __ATOMIC_RELAXED); 188ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 18910f7d4d5SPhilippe Mathieu-Daudé return BSWAP(val); 19010f7d4d5SPhilippe Mathieu-Daudé } 19110f7d4d5SPhilippe Mathieu-Daudé 19210f7d4d5SPhilippe Mathieu-Daudé void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, 19310f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE val EXTRA_ARGS) 19410f7d4d5SPhilippe Mathieu-Daudé { 19534d49937SPeter Maydell ATOMIC_MMU_DECLS; 19610f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; 19710f7d4d5SPhilippe Mathieu-Daudé val = BSWAP(val); 19810f7d4d5SPhilippe Mathieu-Daudé __atomic_store(haddr, &val, __ATOMIC_RELAXED); 199ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 20010f7d4d5SPhilippe Mathieu-Daudé } 20110f7d4d5SPhilippe Mathieu-Daudé #else 20210f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, 20310f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE val EXTRA_ARGS) 20410f7d4d5SPhilippe Mathieu-Daudé { 20534d49937SPeter Maydell ATOMIC_MMU_DECLS; 20610f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; 207ec603b55SRichard Henderson ABI_TYPE ret = atomic_xchg__nocheck(haddr, BSWAP(val)); 208ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; 209ec603b55SRichard Henderson return BSWAP(ret); 21010f7d4d5SPhilippe Mathieu-Daudé } 21110f7d4d5SPhilippe Mathieu-Daudé 21210f7d4d5SPhilippe Mathieu-Daudé #define GEN_ATOMIC_HELPER(X) \ 21310f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \ 21410f7d4d5SPhilippe Mathieu-Daudé ABI_TYPE val EXTRA_ARGS) \ 21510f7d4d5SPhilippe Mathieu-Daudé { \ 21634d49937SPeter Maydell ATOMIC_MMU_DECLS; \ 21710f7d4d5SPhilippe Mathieu-Daudé DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \ 218ec603b55SRichard Henderson DATA_TYPE ret = atomic_##X(haddr, BSWAP(val)); \ 219ec603b55SRichard Henderson ATOMIC_MMU_CLEANUP; \ 220ec603b55SRichard Henderson return BSWAP(ret); \ 22110f7d4d5SPhilippe Mathieu-Daudé } 22210f7d4d5SPhilippe Mathieu-Daudé 22310f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_and) 22410f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_or) 22510f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(fetch_xor) 22610f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(and_fetch) 22710f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(or_fetch) 22810f7d4d5SPhilippe Mathieu-Daudé GEN_ATOMIC_HELPER(xor_fetch) 22910f7d4d5SPhilippe Mathieu-Daudé 23010f7d4d5SPhilippe Mathieu-Daudé #undef GEN_ATOMIC_HELPER 23110f7d4d5SPhilippe Mathieu-Daudé 2325507c2bfSRichard Henderson /* These helpers are, as a whole, full barriers. Within the helper, 2335507c2bfSRichard Henderson * the leading barrier is explicit and the trailing barrier is within 2345507c2bfSRichard Henderson * cmpxchg primitive. 2355507c2bfSRichard Henderson */ 2365507c2bfSRichard Henderson #define GEN_ATOMIC_HELPER_FN(X, FN, XDATA_TYPE, RET) \ 2375507c2bfSRichard Henderson ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \ 2385507c2bfSRichard Henderson ABI_TYPE xval EXTRA_ARGS) \ 2395507c2bfSRichard Henderson { \ 2405507c2bfSRichard Henderson ATOMIC_MMU_DECLS; \ 2415507c2bfSRichard Henderson XDATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \ 2425507c2bfSRichard Henderson XDATA_TYPE ldo, ldn, old, new, val = xval; \ 2435507c2bfSRichard Henderson smp_mb(); \ 2445507c2bfSRichard Henderson ldn = atomic_read__nocheck(haddr); \ 2455507c2bfSRichard Henderson do { \ 2465507c2bfSRichard Henderson ldo = ldn; old = BSWAP(ldo); new = FN(old, val); \ 2475507c2bfSRichard Henderson ldn = atomic_cmpxchg__nocheck(haddr, ldo, BSWAP(new)); \ 2485507c2bfSRichard Henderson } while (ldo != ldn); \ 2495507c2bfSRichard Henderson ATOMIC_MMU_CLEANUP; \ 2505507c2bfSRichard Henderson return RET; \ 2515507c2bfSRichard Henderson } 2525507c2bfSRichard Henderson 2535507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smin, MIN, SDATA_TYPE, old) 2545507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umin, MIN, DATA_TYPE, old) 2555507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_smax, MAX, SDATA_TYPE, old) 2565507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_umax, MAX, DATA_TYPE, old) 2575507c2bfSRichard Henderson 2585507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smin_fetch, MIN, SDATA_TYPE, new) 2595507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umin_fetch, MIN, DATA_TYPE, new) 2605507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(smax_fetch, MAX, SDATA_TYPE, new) 2615507c2bfSRichard Henderson GEN_ATOMIC_HELPER_FN(umax_fetch, MAX, DATA_TYPE, new) 2625507c2bfSRichard Henderson 263*58edf9eeSRichard Henderson /* Note that for addition, we need to use a separate cmpxchg loop instead 264*58edf9eeSRichard Henderson of bswaps for the reverse-host-endian helpers. */ 265*58edf9eeSRichard Henderson #define ADD(X, Y) (X + Y) 266*58edf9eeSRichard Henderson GEN_ATOMIC_HELPER_FN(fetch_add, ADD, DATA_TYPE, old) 267*58edf9eeSRichard Henderson GEN_ATOMIC_HELPER_FN(add_fetch, ADD, DATA_TYPE, new) 268*58edf9eeSRichard Henderson #undef ADD 269*58edf9eeSRichard Henderson 2705507c2bfSRichard Henderson #undef GEN_ATOMIC_HELPER_FN 27110f7d4d5SPhilippe Mathieu-Daudé #endif /* DATA_SIZE >= 16 */ 27210f7d4d5SPhilippe Mathieu-Daudé 27310f7d4d5SPhilippe Mathieu-Daudé #undef END 27410f7d4d5SPhilippe Mathieu-Daudé #endif /* DATA_SIZE > 1 */ 27510f7d4d5SPhilippe Mathieu-Daudé 27610f7d4d5SPhilippe Mathieu-Daudé #undef BSWAP 27710f7d4d5SPhilippe Mathieu-Daudé #undef ABI_TYPE 27810f7d4d5SPhilippe Mathieu-Daudé #undef DATA_TYPE 2795507c2bfSRichard Henderson #undef SDATA_TYPE 28010f7d4d5SPhilippe Mathieu-Daudé #undef SUFFIX 28110f7d4d5SPhilippe Mathieu-Daudé #undef DATA_SIZE 282