diff options
| author | Rich Felker <dalias@aerifal.cx> | 2012-09-07 12:18:14 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2012-09-07 12:18:14 -0400 | 
| commit | 9f65796c35bd93a1de42752ce8af901acfe4b1a4 (patch) | |
| tree | 0ebea39641b3f3e918595158a6c2489c064d27b6 | |
| parent | b9bb8f67bbac9bab5314fb00974ad469476e936e (diff) | |
| download | musl-9f65796c35bd93a1de42752ce8af901acfe4b1a4.tar.gz | |
add clang-compatible thread-pointer code for mips
clang does not presently support the "v" constraint we want to use to
get the result from $3, and trying to use register...__asm__("$3") to
do the same invokes serious compiler bugs. so for now, i'm working
around the issue with an extra temp register and putting $3 in the
clobber list instead of using it as output. when the bugs in clang are
fixed, this issue should be revisited to generate smaller/faster code
like what gcc gets.
| -rw-r--r-- | arch/mips/pthread_arch.h | 4 | 
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h index f75379cf..77b7330d 100644 --- a/arch/mips/pthread_arch.h +++ b/arch/mips/pthread_arch.h @@ -1,7 +1,11 @@  static inline struct pthread *__pthread_self()  {  	struct pthread *self; +#ifdef __clang__ +	__asm__ __volatile__ (".word 0x7c03e83b ; move %0, $3" : "=r" (self) : : "$3" ); +#else  	__asm__ __volatile__ (".word 0x7c03e83b" : "=v" (self) ); +#endif  	return self;  }  | 
