OLD | NEW |
(Empty) | |
| 1 // size_t __tlsdesc_static(size_t *a) |
| 2 // { |
| 3 // return a[1]; |
| 4 // } |
| 5 .global __tlsdesc_static |
| 6 .hidden __tlsdesc_static |
| 7 .type __tlsdesc_static,@function |
| 8 __tlsdesc_static: |
| 9 ldr x0,[x0,#8] |
| 10 ret |
| 11 |
| 12 .hidden __tls_get_new |
| 13 |
| 14 // size_t __tlsdesc_dynamic(size_t *a) |
| 15 // { |
| 16 // struct {size_t modidx,off;} *p = (void*)a[1]; |
| 17 // size_t *dtv = *(size_t**)(tp + 16 - 8); |
| 18 // if (p->modidx <= dtv[0]) |
| 19 // return dtv[p->modidx] + p->off - tp; |
| 20 // return __tls_get_new(p) - tp; |
| 21 // } |
| 22 .global __tlsdesc_dynamic |
| 23 .hidden __tlsdesc_dynamic |
| 24 .type __tlsdesc_dynamic,@function |
| 25 __tlsdesc_dynamic: |
| 26 stp x1,x2,[sp,#-32]! |
| 27 stp x3,x4,[sp,#16] |
| 28 mrs x1,tpidr_el0 // tp |
| 29 ldr x0,[x0,#8] // p |
| 30 ldr x2,[x0] // p->modidx |
| 31 add x3,x1,#8 |
| 32 ldr x3,[x3] // dtv |
| 33 ldr x4,[x3] // dtv[0] |
| 34 cmp x2,x4 |
| 35 b.hi 1f |
| 36 ldr x2,[x3,x2,lsl #3] // dtv[p->modidx] |
| 37 ldr x0,[x0,#8] // p->off |
| 38 add x0,x0,x2 |
| 39 2: sub x0,x0,x1 |
| 40 ldp x3,x4,[sp,#16] |
| 41 ldp x1,x2,[sp],#32 |
| 42 ret |
| 43 |
| 44 // save all registers __tls_get_new may clobber |
| 45 // update sp in two steps because offset must be in [-512,509] |
| 46 1: stp x29,x30,[sp,#-160]! |
| 47 stp x5,x6,[sp,#16] |
| 48 stp x7,x8,[sp,#32] |
| 49 stp x9,x10,[sp,#48] |
| 50 stp x11,x12,[sp,#64] |
| 51 stp x13,x14,[sp,#80] |
| 52 stp x15,x16,[sp,#96] |
| 53 stp x17,x18,[sp,#112] |
| 54 stp q0,q1,[sp,#128] |
| 55 stp q2,q3,[sp,#-480]! |
| 56 stp q4,q5,[sp,#32] |
| 57 stp q6,q7,[sp,#64] |
| 58 stp q8,q9,[sp,#96] |
| 59 stp q10,q11,[sp,#128] |
| 60 stp q12,q13,[sp,#160] |
| 61 stp q14,q15,[sp,#192] |
| 62 stp q16,q17,[sp,#224] |
| 63 stp q18,q19,[sp,#256] |
| 64 stp q20,q21,[sp,#288] |
| 65 stp q22,q23,[sp,#320] |
| 66 stp q24,q25,[sp,#352] |
| 67 stp q26,q27,[sp,#384] |
| 68 stp q28,q29,[sp,#416] |
| 69 stp q30,q31,[sp,#448] |
| 70 bl __tls_get_new |
| 71 mrs x1,tpidr_el0 |
| 72 ldp q4,q5,[sp,#32] |
| 73 ldp q6,q7,[sp,#64] |
| 74 ldp q8,q9,[sp,#96] |
| 75 ldp q10,q11,[sp,#128] |
| 76 ldp q12,q13,[sp,#160] |
| 77 ldp q14,q15,[sp,#192] |
| 78 ldp q16,q17,[sp,#224] |
| 79 ldp q18,q19,[sp,#256] |
| 80 ldp q20,q21,[sp,#288] |
| 81 ldp q22,q23,[sp,#320] |
| 82 ldp q24,q25,[sp,#352] |
| 83 ldp q26,q27,[sp,#384] |
| 84 ldp q28,q29,[sp,#416] |
| 85 ldp q30,q31,[sp,#448] |
| 86 ldp q2,q3,[sp],#480 |
| 87 ldp x5,x6,[sp,#16] |
| 88 ldp x7,x8,[sp,#32] |
| 89 ldp x9,x10,[sp,#48] |
| 90 ldp x11,x12,[sp,#64] |
| 91 ldp x13,x14,[sp,#80] |
| 92 ldp x15,x16,[sp,#96] |
| 93 ldp x17,x18,[sp,#112] |
| 94 ldp q0,q1,[sp,#128] |
| 95 ldp x29,x30,[sp],#160 |
| 96 b 2b |
OLD | NEW |