]> sourceware.org Git - glibc.git/commitdiff
hppa: Optimize atomic_compare_and_exchange_val_acq
authorJohn David Anglin <dave.anglin@bell.net>
Sat, 15 Oct 2016 17:22:00 +0000 (19:22 +0200)
committerAurelien Jarno <aurelien@aurel32.net>
Sat, 15 Oct 2016 17:22:43 +0000 (19:22 +0200)
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
sysdeps/unix/sysv/linux/hppa/atomic-machine.h

index b383ba117657fb77f83fb57761b9673c751b4127..06a7338866ef2bf9c0853681d129a1364c2f9ea1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)]
index 3f0fd15e720f3e4c410a895e5b3347691d3aff61..addef2c1ec6448831ff9cb5e33421f13fa41ac46 100644 (file)
    <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;                                      \
    })
 
This page took 0.170832 seconds and 5 git commands to generate.