diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-02-08 02:30:16 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-02-08 02:30:16 +0000 |
commit | d9c734e9cdab99931ddbbbc6de30a109be1483e6 (patch) | |
tree | ba20138fe5836313747ef04cd44ceecc4c7ec1db /elf/tls-macros.h | |
parent | bd62e50b2bf2438303a2716e2e86359483a6a61c (diff) | |
download | glibc-d9c734e9cdab99931ddbbbc6de30a109be1483e6.zip glibc-d9c734e9cdab99931ddbbbc6de30a109be1483e6.tar.gz glibc-d9c734e9cdab99931ddbbbc6de30a109be1483e6.tar.bz2 |
Add non-PIC TLS macros and fix clobber list for SH.
Diffstat (limited to 'elf/tls-macros.h')
-rw-r--r-- | elf/tls-macros.h | 90 |
1 files changed, 78 insertions, 12 deletions
diff --git a/elf/tls-macros.h b/elf/tls-macros.h index a0d09db..81736c9 100644 --- a/elf/tls-macros.h +++ b/elf/tls-macros.h @@ -145,9 +145,25 @@ : "=r" (__l), "=r" (__tp)); \ __l; }) -# define TLS_IE(x) \ +# ifdef PIC +# define TLS_IE(x) \ + ({ int *__l; void *__tp; \ + register void *__gp __asm__("r12"); \ + asm ("mov.l 1f,r0\n\t" \ + "stc gbr,%1\n\t" \ + "mov.l @(r0,r12),%0\n\t" \ + "bra 2f\n\t" \ + " add %1,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@gottpoff\n\t" \ + "2:" \ + : "=r" (__l), "=r" (__tp) : "r" (__gp) : "r0"); \ + __l; }) +# else +# define TLS_IE(x) \ ({ int *__l; void *__tp; \ - asm ("mova 0f,r0\n\t" \ + asm ("mov.l r12,@-r15\n\t" \ + "mova 0f,r0\n\t" \ "mov.l 0f,r12\n\t" \ "add r0,r12\n\t" \ "mov.l 1f,r0\n\t" \ @@ -158,13 +174,40 @@ ".align 2\n\t" \ "1: .long " #x "@gottpoff\n\t" \ "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ - "2:" \ - : "=r" (__l), "=r" (__tp) : : "r0", "r12"); \ + "2: mov.l @r15+,r12" \ + : "=r" (__l), "=r" (__tp) : : "r0"); \ __l; }) +#endif -# define TLS_LD(x) \ +# ifdef PIC +# define TLS_LD(x) \ ({ int *__l; \ - asm ("mova 0f,r0\n\t" \ + register void *__gp __asm__("r12"); \ + asm ("mov.l 1f,r4\n\t" \ + "mova 2f,r0\n\t" \ + "mov.l 2f,r1\n\t" \ + "add r0,r1\n\t" \ + "jsr @r1\n\t" \ + " add r12,r4\n\t" \ + "bra 4f\n\t" \ + " nop\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tlsldm\n\t" \ + "2: .long __tls_get_addr@plt\n\t" \ + "4: mov.l 3f,%0\n\t" \ + "bra 5f\n\t" \ + " add r0,%0\n\t" \ + ".align 2\n\t" \ + "3: .long " #x "@dtpoff\n\t" \ + "5:" \ + : "=r" (__l) : "r" (__gp) : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "pr", "t"); \ + __l; }) +# else +# define TLS_LD(x) \ + ({ int *__l; \ + asm ("mov.l r12,@-r15\n\t" \ + "mova 0f,r0\n\t" \ "mov.l 0f,r12\n\t" \ "add r0,r12\n\t" \ "mov.l 1f,r4\n\t" \ @@ -184,14 +227,36 @@ " add r0,%0\n\t" \ ".align 2\n\t" \ "3: .long " #x "@dtpoff\n\t" \ - "5:" \ + "5: mov.l @r15+,r12" \ : "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ - "r12", "pr", "t"); \ + "pr", "t"); \ __l; }) +#endif -# define TLS_GD(x) \ +# ifdef PIC +# define TLS_GD(x) \ + ({ int *__l; \ + register void *__gp __asm__("r12"); \ + asm ("mov.l 1f,r4\n\t" \ + "mova 2f,r0\n\t" \ + "mov.l 2f,r1\n\t" \ + "add r0,r1\n\t" \ + "jsr @r1\n\t" \ + " add r12,r4\n\t" \ + "bra 3f\n\t" \ + " mov r0,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tlsgd\n\t" \ + "2: .long __tls_get_addr@plt\n\t" \ + "3:" \ + : "=r" (__l) : "r" (__gp) : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "pr", "t"); \ + __l; }) +# else +# define TLS_GD(x) \ ({ int *__l; \ - asm ("mova 0f,r0\n\t" \ + asm ("mov.l r12,@-r15\n\t" \ + "mova 0f,r0\n\t" \ "mov.l 0f,r12\n\t" \ "add r0,r12\n\t" \ "mov.l 1f,r4\n\t" \ @@ -206,10 +271,11 @@ "1: .long " #x "@tlsgd\n\t" \ "2: .long __tls_get_addr@plt\n\t" \ "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ - "3:" \ + "3: mov.l @r15+,r12" \ : "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ - "r12", "pr", "t"); \ + "pr", "t"); \ __l; }) +#endif #elif defined __alpha__ |