OSDN Git Service

inline cp15 thread pointer load in arm dynamic TLSDESC asm when possible
[android-x86/external-musl-libc.git] / src / ldso / arm / tlsdesc.S
index f3d67fc..b81f311 100644 (file)
@@ -19,6 +19,10 @@ __tlsdesc_dynamic:
        ldr r2,[r1,#4]  // r2 = offset
        ldr r1,[r1]     // r1 = modid
 
+#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+       mrc p15,0,r0,c13,c0,3
+#else
        ldr r0,1f
        add r0,r0,pc
        ldr r0,[r0]
@@ -29,6 +33,7 @@ __tlsdesc_dynamic:
        mov lr,pc
        bx r0
 #endif
+#endif
        ldr r3,[r0,#-4] // r3 = dtv
        ldr ip,[r3]     // ip = dtv slot count
        cmp r1,ip
@@ -58,5 +63,9 @@ __tlsdesc_dynamic:
        sub r0,r0,r1    // r0 = retval-tp
        b 4b
 
+#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+#else
        .align 2
 1:     .word __a_gettp_ptr - 2b
+#endif