1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#define TLS_LE(x) \
({ int *__l; void *__tp; \
asm ("stc gbr,%1\n\t" \
"mov.l 1f,%0\n\t" \
"bra 2f\n\t" \
" add %1,%0\n\t" \
".align 2\n\t" \
"1: .long " #x "@tpoff\n\t" \
"2:" \
: "=r" (__l), "=r" (__tp)); \
__l; })
#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 ("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" \
"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" \
"0: .long _GLOBAL_OFFSET_TABLE_\n\t" \
"2: mov.l @r15+,r12" \
: "=r" (__l), "=r" (__tp) : : "r0"); \
__l; })
#endif
#ifdef PIC
# define TLS_LD(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 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" \
"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" \
"0: .long _GLOBAL_OFFSET_TABLE_\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: mov.l @r15+,r12" \
: "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
"pr", "t"); \
__l; })
#endif
#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 ("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" \
"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" \
"0: .long _GLOBAL_OFFSET_TABLE_\n\t" \
"3: mov.l @r15+,r12" \
: "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
"pr", "t"); \
__l; })
#endif
|