diff options
author | John David Anglin <dave.anglin@bell.net> | 2016-10-15 19:22:00 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2016-10-15 19:22:43 +0200 |
commit | 7cfde840694cda82da29385e812060f99bcb367c (patch) | |
tree | 27557cabee7c4005f8ff0276930340b06a2e4181 | |
parent | cc6a8d74575e36e2c9da8454dd1d23000c5455dd (diff) | |
download | glibc-7cfde840694cda82da29385e812060f99bcb367c.zip glibc-7cfde840694cda82da29385e812060f99bcb367c.tar.gz glibc-7cfde840694cda82da29385e812060f99bcb367c.tar.bz2 |
hppa: Optimize atomic_compare_and_exchange_val_acq
Changelog:
* sysdeps/unix/sysv/linux/hppa/atomic-machine.h: Don't include
abort-instr.h.
(EFAULT): Remove conditional define.
(ENOSYS): Likewise.
(atomic_compare_and_exchange_val_acq): Use instruction nullification
instead of conditional branch instructions.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/atomic-machine.h | 22 |
2 files changed, 14 insertions, 17 deletions
@@ -1,3 +1,12 @@ +2016-09-22 John David Anglin <dave.anglin@bell.net> + + * sysdeps/unix/sysv/linux/hppa/atomic-machine.h: Don't include + abort-instr.h. + (EFAULT): Remove conditional define. + (ENOSYS): Likewise. + (atomic_compare_and_exchange_val_acq): Use instruction nullification + instead of conditional branch instructions. + 2016-10-15 Joseph Myers <joseph@codesourcery.com> * math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] diff --git a/sysdeps/unix/sysv/linux/hppa/atomic-machine.h b/sysdeps/unix/sysv/linux/hppa/atomic-machine.h index 3f0fd15..addef2c 100644 --- a/sysdeps/unix/sysv/linux/hppa/atomic-machine.h +++ b/sysdeps/unix/sysv/linux/hppa/atomic-machine.h @@ -17,13 +17,6 @@ <http://www.gnu.org/licenses/>. */ #include <stdint.h> /* Required for type definitions e.g. uint8_t. */ -#include <abort-instr.h> /* Required for ABORT_INSTRUCTIUON. */ - -/* We need EFAULT, ENONSYS */ -#if !defined EFAULT && !defined ENOSYS -#define EFAULT 14 -#define ENOSYS 251 -#endif #ifndef _ATOMIC_MACHINE_H #define _ATOMIC_MACHINE_H 1 @@ -62,7 +55,7 @@ typedef uintmax_t uatomic_max_t; #define _ASM_EDEADLOCK "-45" /* The only basic operation needed is compare and exchange. The mem - pointer must be word aligned. */ + pointer must be word aligned. We no longer loop on deadlock. */ #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ ({ \ register long lws_errno asm("r21"); \ @@ -74,20 +67,15 @@ typedef uintmax_t uatomic_max_t; "0: \n\t" \ "ble " _LWS "(%%sr2, %%r0) \n\t" \ "ldi " _LWS_CAS ", %%r20 \n\t" \ - "ldi " _ASM_EAGAIN ", %%r20 \n\t" \ - "cmpb,=,n %%r20, %%r21, 0b \n\t" \ - "nop \n\t" \ - "ldi " _ASM_EDEADLOCK ", %%r20 \n\t" \ - "cmpb,=,n %%r20, %%r21, 0b \n\t" \ - "nop \n\t" \ + "cmpiclr,<> " _ASM_EAGAIN ", %%r21, %%r0\n\t" \ + "b,n 0b \n\t" \ + "cmpclr,= %%r0, %%r21, %%r0 \n\t" \ + "iitlbp %%r0,(%%sr0, %%r0) \n\t" \ : "=r" (lws_ret), "=r" (lws_errno) \ : "r" (lws_mem), "r" (lws_old), "r" (lws_new) \ : _LWS_CLOBBER \ ); \ \ - if (lws_errno == -EFAULT || lws_errno == -ENOSYS) \ - ABORT_INSTRUCTION; \ - \ (__typeof (oldval)) lws_ret; \ }) |