diff options
Diffstat (limited to 'libpthread/linuxthreads')
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/arm/pt-machine.h | 34 | 
1 files changed, 9 insertions, 25 deletions
| diff --git a/libpthread/linuxthreads/sysdeps/arm/pt-machine.h b/libpthread/linuxthreads/sysdeps/arm/pt-machine.h index fc17e9bc7..b00b10495 100644 --- a/libpthread/linuxthreads/sysdeps/arm/pt-machine.h +++ b/libpthread/linuxthreads/sysdeps/arm/pt-machine.h @@ -29,35 +29,19 @@  #endif  #if defined(__thumb2__) -PT_EI long int ldrex(int *spinlock) -{ -	long int ret; -	__asm__ __volatile__( -		"ldrex %0, [%1]\n" -		: "=r"(ret) -		: "r"(spinlock) : "memory"); -	return ret; -} - -PT_EI long int strex(int val, int *spinlock) -{ -	long int ret; -	__asm__ __volatile__( -		"strex %0, %1, [%2]\n" -		: "=r"(ret) -		: "r" (val), "r"(spinlock) : "memory"); -	return ret; -} -  /* Spinlock implementation; required.  */  PT_EI long int  testandset (int *spinlock)  { -  register unsigned int ret; - -  do { -	  ret = ldrex(spinlock); -  } while (strex(1, spinlock)); +  unsigned int ret, tmp, val = 1; + +  __asm__ __volatile__ ( +"0:    ldrex   %0, [%2]       \n" +"      strex   %1, %3, [%2]   \n" +"      cmp     %1, #0         \n" +"      bne     0b" +       : "=&r" (ret), "=&r" (tmp) +       : "r" (spinlock), "r" (val) : "memory", "cc");    return ret;  } | 
