loongarch64: add TLSDESC support
[musl.git] / src / ldso / loongarch64 / tlsdesc.s
blob4b6ea0e510747e8c605ff1495aaf3ab48297a96d
1 .text
2 .global __tlsdesc_static
3 .hidden __tlsdesc_static
4 .type __tlsdesc_static,%function
5 __tlsdesc_static:
6 ld.d $a0, $a0, 8
7 jr $ra
8 # size_t __tlsdesc_dynamic(size_t *a)
9 # {
10 # struct {size_t modidx,off;} *p = (void*)a[1];
11 # size_t *dtv = *(size_t**)(tp - 8);
12 # return dtv[p->modidx] + p->off - tp;
13 # }
14 .global __tlsdesc_dynamic
15 .hidden __tlsdesc_dynamic
16 .type __tlsdesc_dynamic,%function
17 __tlsdesc_dynamic:
18 addi.d $sp, $sp, -16
19 st.d $t1, $sp, 0
20 st.d $t2, $sp, 8
22 ld.d $t2, $tp, -8 # t2=dtv
24 ld.d $a0, $a0, 8 # a0=&{modidx,off}
25 ld.d $t1, $a0, 8 # t1=off
26 ld.d $a0, $a0, 0 # a0=modidx
27 slli.d $a0, $a0, 3 # a0=8*modidx
29 add.d $a0, $a0, $t2 # a0=dtv+8*modidx
30 ld.d $a0, $a0, 0 # a0=dtv[modidx]
31 add.d $a0, $a0, $t1 # a0=dtv[modidx]+off
32 sub.d $a0, $a0, $tp # a0=dtv[modidx]+off-tp
34 ld.d $t1, $sp, 0
35 ld.d $t2, $sp, 8
36 addi.d $sp, $sp, 16
37 jr $ra