summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-09-07 12:18:14 -0400
committerRich Felker <dalias@aerifal.cx>2012-09-07 12:18:14 -0400
commit9f65796c35bd93a1de42752ce8af901acfe4b1a4 (patch)
tree0ebea39641b3f3e918595158a6c2489c064d27b6 /arch
parentb9bb8f67bbac9bab5314fb00974ad469476e936e (diff)
downloadmusl-9f65796c35bd93a1de42752ce8af901acfe4b1a4.tar.gz
musl-9f65796c35bd93a1de42752ce8af901acfe4b1a4.tar.bz2
musl-9f65796c35bd93a1de42752ce8af901acfe4b1a4.tar.xz
musl-9f65796c35bd93a1de42752ce8af901acfe4b1a4.zip
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.
Diffstat (limited to 'arch')
-rw-r--r--arch/mips/pthread_arch.h4
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;
}