make thread-pointer-loading asm non-volatile
authorRich Felker <dalias@aerifal.cx>
Tue, 16 Oct 2018 18:08:01 +0000 (14:08 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 16 Oct 2018 18:11:46 +0000 (14:11 -0400)
this will allow the compiler to cache and reuse the result, meaning we
no longer have to take care not to load it more than once for the sake
of archs where the load may be expensive.

depends on commit 1c84c99913bf1cd47b866ed31e665848a0da84a2 for
correctness, since otherwise the compiler could hoist loads during
stage 3 of dynamic linking before the initial thread-pointer setup.

14 files changed:
arch/aarch64/pthread_arch.h
arch/arm/pthread_arch.h
arch/i386/pthread_arch.h
arch/microblaze/pthread_arch.h
arch/mips/pthread_arch.h
arch/mips64/pthread_arch.h
arch/mipsn32/pthread_arch.h
arch/or1k/pthread_arch.h
arch/powerpc/pthread_arch.h
arch/powerpc64/pthread_arch.h
arch/s390x/pthread_arch.h
arch/sh/pthread_arch.h
arch/x32/pthread_arch.h
arch/x86_64/pthread_arch.h

index e8499d8e200b1b8371e698a0d2275970ab2bcf7c..e64b126d2c60339cfb4c361e6112d96c56583b2e 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        char *self;
-       __asm__ __volatile__ ("mrs %0,tpidr_el0" : "=r"(self));
+       __asm__ ("mrs %0,tpidr_el0" : "=r"(self));
        return (void*)(self - sizeof(struct pthread));
 }
 
index 5c6aff28a3d5f9ed6e834ad750852c632bda19ba..e689ea212ae22e148788deec9e74f5b2e9f49f7d 100644 (file)
@@ -4,7 +4,7 @@
 static inline pthread_t __pthread_self()
 {
        char *p;
-       __asm__ __volatile__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
+       __asm__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
        return (void *)(p-sizeof(struct pthread));
 }
 
@@ -20,7 +20,7 @@ static inline pthread_t __pthread_self()
 {
        extern hidden uintptr_t __a_gettp_ptr;
        register uintptr_t p __asm__("r0");
-       __asm__ __volatile__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
+       __asm__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
        return (void *)(p-sizeof(struct pthread));
 }
 
index 7f38a56289032a3026a1580a798118e7214ae3ac..6f600b9e0151a0ea6cfca1199d2f4e4097988c0e 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        struct pthread *self;
-       __asm__ __volatile__ ("movl %%gs:0,%0" : "=r" (self) );
+       __asm__ ("movl %%gs:0,%0" : "=r" (self) );
        return self;
 }
 
index 08d1ba7db35f52d7ca507dc0e82f7bc6da21aa0b..f6ba8de981fd2b6b8a56c86f3b720665a5ccbe5e 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        struct pthread *self;
-       __asm__ __volatile__ ("ori %0, r21, 0" : "=r" (self) );
+       __asm__ ("ori %0, r21, 0" : "=r" (self) );
        return self;
 }
 
index 5fea15ad5f290a5dac80db84b1d555696da1f6ac..1e7839ea6740ceac26c7a5b222e02bf92b5b05e7 100644 (file)
@@ -2,10 +2,10 @@ static inline struct pthread *__pthread_self()
 {
 #if __mips_isa_rev < 2
        register char *tp __asm__("$3");
-       __asm__ __volatile__ (".word 0x7c03e83b" : "=r" (tp) );
+       __asm__ (".word 0x7c03e83b" : "=r" (tp) );
 #else
        char *tp;
-       __asm__ __volatile__ ("rdhwr %0, $29" : "=r" (tp) );
+       __asm__ ("rdhwr %0, $29" : "=r" (tp) );
 #endif
        return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
 }
index 5fea15ad5f290a5dac80db84b1d555696da1f6ac..1e7839ea6740ceac26c7a5b222e02bf92b5b05e7 100644 (file)
@@ -2,10 +2,10 @@ static inline struct pthread *__pthread_self()
 {
 #if __mips_isa_rev < 2
        register char *tp __asm__("$3");
-       __asm__ __volatile__ (".word 0x7c03e83b" : "=r" (tp) );
+       __asm__ (".word 0x7c03e83b" : "=r" (tp) );
 #else
        char *tp;
-       __asm__ __volatile__ ("rdhwr %0, $29" : "=r" (tp) );
+       __asm__ ("rdhwr %0, $29" : "=r" (tp) );
 #endif
        return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
 }
index 5fea15ad5f290a5dac80db84b1d555696da1f6ac..1e7839ea6740ceac26c7a5b222e02bf92b5b05e7 100644 (file)
@@ -2,10 +2,10 @@ static inline struct pthread *__pthread_self()
 {
 #if __mips_isa_rev < 2
        register char *tp __asm__("$3");
-       __asm__ __volatile__ (".word 0x7c03e83b" : "=r" (tp) );
+       __asm__ (".word 0x7c03e83b" : "=r" (tp) );
 #else
        char *tp;
-       __asm__ __volatile__ ("rdhwr %0, $29" : "=r" (tp) );
+       __asm__ ("rdhwr %0, $29" : "=r" (tp) );
 #endif
        return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
 }
index 521b9c53b9f831ba09bc3a704577df76c81ceca9..1b806f8917140849f2c7463843c0594d96e2fc81 100644 (file)
@@ -3,10 +3,10 @@ static inline struct pthread *__pthread_self()
 {
 #ifdef __clang__
        char *tp;
-       __asm__ __volatile__ ("l.ori %0, r10, 0" : "=r" (tp) );
+       __asm__ ("l.ori %0, r10, 0" : "=r" (tp) );
 #else
        register char *tp __asm__("r10");
-       __asm__ __volatile__ ("" : "=r" (tp) );
+       __asm__ ("" : "=r" (tp) );
 #endif
        return (struct pthread *) (tp - sizeof(struct pthread));
 }
index bab2e6ca459cc8530fa2da595a76a16f7deaafef..ae0f28d6d1e13c5161f4c13af3dc4048aecea144 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        register char *tp __asm__("r2");
-       __asm__ __volatile__ ("" : "=r" (tp) );
+       __asm__ ("" : "=r" (tp) );
        return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
 }
                         
index 37b75e291992ce7cd4c5eaac4a16393d2f192f01..79c3ecd8af03df07836af254373cb82b41746b8c 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        register char *tp __asm__("r13");
-       __asm__ __volatile__ ("" : "=r" (tp) );
+       __asm__ ("" : "=r" (tp) );
        return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
 }
 
index bd90016d3f77f3e40520c7aba1bc910b4e4602f7..e2251f1fa47f8eb74692cd0ea5942d5d9e4d7f21 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        struct pthread *self;
-       __asm__ __volatile__ (
+       __asm__ (
                "ear  %0, %%a0\n"
                "sllg %0, %0, 32\n"
                "ear  %0, %%a1\n"
index a7dd27a6c43a3705c30170ab694f3cb4721082f4..3ee9c1a9309a2cd3a647b11aa8b4cb0d129ec25b 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        char *self;
-       __asm__ __volatile__ ("stc gbr,%0" : "=r" (self) );
+       __asm__ ("stc gbr,%0" : "=r" (self) );
        return (struct pthread *) (self - sizeof(struct pthread));
 }
 
index 267ad073c79175468941cfb7f7306a1e788f04c4..f640a1a1570903575ef960b32541e449d0b35b1d 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        struct pthread *self;
-       __asm__ __volatile__ ("mov %%fs:0,%0" : "=r" (self) );
+       __asm__ ("mov %%fs:0,%0" : "=r" (self) );
        return self;
 }
 
index c61509cf3e37e4c7f839dfdc53e530311018c0e1..65e880c62e2fa13ec874a7a7092b3c8093d5cbe3 100644 (file)
@@ -1,7 +1,7 @@
 static inline struct pthread *__pthread_self()
 {
        struct pthread *self;
-       __asm__ __volatile__ ("mov %%fs:0,%0" : "=r" (self) );
+       __asm__ ("mov %%fs:0,%0" : "=r" (self) );
        return self;
 }