diff options
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h | 19 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h | 4 |
2 files changed, 10 insertions, 13 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h index 2b58d2e63a..4ffbf8deb7 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h @@ -102,12 +102,13 @@ /* Atomically store newval and return the old value. */ #define __lll_test_and_set(futex, newval) \ ({ int __val; \ - __asm __volatile ("1: lwarx %0,0,%3\n" \ + __asm __volatile (__lll_rel_instr "\n" \ + "1: lwarx %0,0,%3\n" \ " stwcx. %2,0,%3\n" \ " bne- 1b" \ : "=&r" (__val), "=m" (*futex) \ : "r" (futex), "r" (newval), "1" (*futex) \ - : "cr0"); \ + : "cr0", "memory"); \ __val; }) @@ -135,16 +136,12 @@ extern int __lll_timedlock_wait }) #define lll_mutex_unlock(lock) \ - (void) ({ \ + ((void) ({ \ int *__futex = &(lock); \ - __asm __volatile (__lll_rel_instr ::: "memory"); \ - int __val = __lll_add (__futex, -1); \ - if (__builtin_expect (__val != 1, 0)) \ - { \ - *__futex = 0; \ - lll_futex_wake (__futex, 1); \ - } \ - }) + int __val = __lll_test_and_set (__futex, 0); \ + if (__builtin_expect (__val > 1, 0)) \ + lll_futex_wake (__futex, 1); \ + })) #define lll_mutex_islocked(futex) \ (futex != 0) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h index 4a6cbf03da..7c9147e3cc 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h @@ -86,8 +86,8 @@ # ifndef __ASSEMBLER__ # define SINGLE_THREAD_P \ - __builtin_expect (THREAD_GETMEM (THREAD_SELF, multiple_threads) \ - == 0, 1) + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0, 1) # else # define SINGLE_THREAD_P \ lwz 10,MULTIPLE_THREADS_OFFSET(13); \ |