diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2014-12-22 16:41:33 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2014-12-22 16:41:33 -0800 |
commit | 17e2704a78a4beaaf6ff84c663b07d7889301286 (patch) | |
tree | 60ad569a12259bfce348f7afe054bcdda472482a /glibc | |
parent | d85d7a1c4543276d4dab27e3de35b92aae1f1d88 (diff) | |
download | riscv-gnu-toolchain-17e2704a78a4beaaf6ff84c663b07d7889301286.zip riscv-gnu-toolchain-17e2704a78a4beaaf6ff84c663b07d7889301286.tar.gz riscv-gnu-toolchain-17e2704a78a4beaaf6ff84c663b07d7889301286.tar.bz2 |
gcc, glibc: use "A" for inline asm AMO constrants
Diffstat (limited to 'glibc')
-rw-r--r-- | glibc/sysdeps/riscv/bits/atomic.h | 72 |
1 files changed, 17 insertions, 55 deletions
diff --git a/glibc/sysdeps/riscv/bits/atomic.h b/glibc/sysdeps/riscv/bits/atomic.h index 4fb43b2..56c2aa3 100644 --- a/glibc/sysdeps/riscv/bits/atomic.h +++ b/glibc/sysdeps/riscv/bits/atomic.h @@ -45,86 +45,48 @@ typedef uintmax_t uatomic_max_t; #define asm_amo(which, ordering, mem, value) ({ \ typeof(*mem) __tmp; \ if (sizeof(__tmp) == 4) \ - asm volatile (which ".w" ordering "\t%0, %z1, (%2)" : "=r"(__tmp) : "rJ"(value), "r"(mem)); \ + asm volatile (which ".w" ordering "\t%0, %z2, %1" \ + : "=r"(__tmp), "+A"(*(mem)) \ + : "rJ"(value)); \ else if (sizeof(__tmp) == 8) \ - asm volatile (which ".d" ordering "\t%0, %z1, (%2)" : "=r"(__tmp) : "rJ"(value), "r"(mem)); \ + asm volatile (which ".d" ordering "\t%0, %z2, %1" \ + : "=r"(__tmp), "+A"(*(mem)) \ + : "rJ"(value)); \ else \ abort(); \ __tmp; }) -#define asm_load_reserved(ordering, mem) ({ \ - typeof(*mem) __tmp; \ - if (sizeof(__tmp) == 4) \ - asm volatile ("lr.w" ordering "\t%0, (%1)" : "=r"(__tmp) : "r"(mem)); \ - else if (sizeof(__tmp) == 8) \ - asm volatile ("lr.d" ordering "\t%0, (%1)" : "=r"(__tmp) : "r"(mem)); \ - else \ - abort(); \ - __tmp; }) - -#define asm_store_conditional(ordering, mem, value) \ - asm_amo("sc", ordering, mem, value) - /* Atomic compare and exchange. */ -#define atomic_cas(ordering, mem, newval, oldval) ({ \ +#define atomic_cas(ordering, mem, newval, oldval) ({ \ typeof(*mem) __tmp; \ int __tmp2; \ if (sizeof(__tmp) == 4) \ - asm volatile ("1: lr.w" ordering "\t%0, (%2)\n" \ - "bne\t%0, %z4, 1f\n" \ - "sc.w" ordering "\t%1, %z3, (%2)\n" \ + asm volatile ("1: lr.w" ordering "\t%0, %2\n" \ + "bne\t%0, %z4, 1f\n" \ + "sc.w" ordering "\t%1, %z3, %2\n" \ "bnez\t%1, 1b\n" \ "1:" \ - : "=&r"(__tmp), "=&r"(__tmp2) : "r"(mem), "rJ"(newval), "rJ"(oldval)); \ + : "=&r"(__tmp), "=&r"(__tmp2), "+A"(*(mem)) \ + : "rJ"(newval), "rJ"(oldval)); \ else if (sizeof(__tmp) == 8) \ - asm volatile ("1: lr.d" ordering "\t%0, (%2)\n" \ - "bne\t%0, %z4, 1f\n" \ - "sc.d" ordering "\t%1, %z3, (%2)\n" \ + asm volatile ("1: lr.d" ordering "\t%0, %2\n" \ + "bne\t%0, %z4, 1f\n" \ + "sc.d" ordering "\t%1, %z3, %2\n" \ "bnez\t%1, 1b\n" \ "1:" \ - : "=&r"(__tmp), "=&r"(__tmp2) : "r"(mem), "rJ"(newval), "rJ"(oldval)); \ + : "=&r"(__tmp), "=&r"(__tmp2), "+A"(*(mem)) \ + : "rJ"(newval), "rJ"(oldval)); \ else \ abort(); \ __tmp; }) -#define atomic_cas_bool(ordering, mem, newval, oldval) ({ \ - __label__ failure, success; \ - typeof(*mem) __tmp; \ - int __res; \ - if (sizeof(__tmp) == 4) \ - asm goto ("1: lr.w" ordering "\tt3, (%0)\n" \ - "bne\tt3, %z2, %l[failure]\n" \ - "sc.w" ordering "\tt3, %z1, (%0)\n" \ - "bnez\tt3, 1b" \ - : : "r"(mem), "rJ"(newval), "rJ"(oldval) : "t3" : failure); \ - else if (sizeof(__tmp) == 8) \ - asm goto ("1: lr.d" ordering "\tt3, (%0)\n" \ - "bne\tt3, %z2, %l[failure]\n" \ - "sc.d" ordering "\tt3, %z1, (%0)\n" \ - "bnez\tt3, 1b" \ - : : "r"(mem), "rJ"(newval), "rJ"(oldval) : "t3" : failure); \ - else \ - abort(); \ - __res = 0; \ - goto success; \ -failure: \ - __res = 1; \ -success: \ - __res; }) - #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ atomic_cas(".aq", mem, newval, oldval) #define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \ atomic_cas(".rl", mem, newval, oldval) -#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ - atomic_cas_bool(".aq", mem, newval, oldval) - -#define atomic_compare_and_exchange_bool_rel(mem, newval, oldval) \ - atomic_cas_bool(".rl", mem, newval, oldval) - /* Atomic exchange (without compare). */ #define atomic_exchange_acq(mem, value) asm_amo("amoswap", ".aq", mem, value) |