From 7cfde840694cda82da29385e812060f99bcb367c Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Sat, 15 Oct 2016 19:22:00 +0200 Subject: 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. --- ChangeLog | 9 +++++++++ sysdeps/unix/sysv/linux/hppa/atomic-machine.h | 22 +++++----------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index b383ba1..06a7338 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2016-09-22 John David Anglin + + * 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 * 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 @@ . */ #include /* Required for type definitions e.g. uint8_t. */ -#include /* 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; \ }) -- cgit v1.1