123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /*
- * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com)
- *
- * Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
- */
- #include <stdint.h>
- #include <sysdep.h>
- typedef int8_t atomic8_t;
- typedef uint8_t uatomic8_t;
- typedef int_fast8_t atomic_fast8_t;
- typedef uint_fast8_t uatomic_fast8_t;
- typedef int32_t atomic32_t;
- typedef uint32_t uatomic32_t;
- typedef int_fast32_t atomic_fast32_t;
- typedef uint_fast32_t uatomic_fast32_t;
- typedef intptr_t atomicptr_t;
- typedef uintptr_t uatomicptr_t;
- typedef intmax_t atomic_max_t;
- typedef uintmax_t uatomic_max_t;
- void __arc_link_error (void);
- #ifdef __A7__
- #define atomic_full_barrier() __asm__ __volatile__("": : :"memory")
- #else
- #define atomic_full_barrier() __asm__ __volatile__("dmb 3": : :"memory")
- #endif
- /* Atomic compare and exchange. */
- #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
- ({ __arc_link_error (); oldval; })
- #define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
- ({ __arc_link_error (); oldval; })
- #define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
- ({ \
- __typeof(oldval) prev; \
- \
- __asm__ __volatile__( \
- "1: llock %0, [%1] \n" \
- " brne %0, %2, 2f \n" \
- " scond %3, [%1] \n" \
- " bnz 1b \n" \
- "2: \n" \
- : "=&r"(prev) \
- : "r"(mem), "ir"(oldval), \
- "r"(newval) /* can't be "ir". scond can't take limm for "b" */\
- : "cc", "memory"); \
- \
- prev; \
- })
- #define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
- ({ __arc_link_error (); oldval; })
|