1570af302Sopenharmony_ci# size_t __tlsdesc_static(size_t *a)
2570af302Sopenharmony_ci# {
3570af302Sopenharmony_ci#  return a[1];
4570af302Sopenharmony_ci# }
5570af302Sopenharmony_ci.text
6570af302Sopenharmony_ci.global __tlsdesc_static
7570af302Sopenharmony_ci.hidden __tlsdesc_static
8570af302Sopenharmony_ci.type __tlsdesc_static,%function
9570af302Sopenharmony_ci__tlsdesc_static:
10570af302Sopenharmony_ci    ld.d  $a0, $a0, 8
11570af302Sopenharmony_ci    jr    $ra
12570af302Sopenharmony_ci
13570af302Sopenharmony_ci# size_t __tlsdesc_dynamic(size_t *a)
14570af302Sopenharmony_ci# {
15570af302Sopenharmony_ci#  struct {size_t modidx,off;} *p = (void*)a[1];
16570af302Sopenharmony_ci#  size_t *dtv = *(size_t**)(tp - 8);
17570af302Sopenharmony_ci#  return dtv[p->modidx] + p->off - tp;
18570af302Sopenharmony_ci# }
19570af302Sopenharmony_ci.global __tlsdesc_dynamic
20570af302Sopenharmony_ci.hidden __tlsdesc_dynamic
21570af302Sopenharmony_ci.type __tlsdesc_dynamic,%function
22570af302Sopenharmony_ci__tlsdesc_dynamic:
23570af302Sopenharmony_ci    addi.d $sp, $sp, -16
24570af302Sopenharmony_ci    st.d   $t1, $sp, 0
25570af302Sopenharmony_ci    st.d   $t2, $sp, 8
26570af302Sopenharmony_ci    ld.d   $t2, $tp, -8  # t2=dtv
27570af302Sopenharmony_ci    ld.d   $a0, $a0, 8   # a0=&{modidx,off}
28570af302Sopenharmony_ci    ld.d   $t1, $a0, 8   # t1=off
29570af302Sopenharmony_ci    ld.d   $a0, $a0, 0   # a0=modidx
30570af302Sopenharmony_ci    slli.d $a0, $a0, 3   # a0=8*modidx
31570af302Sopenharmony_ci    add.d  $a0, $a0, $t2 # a0=dtv+8*modidx
32570af302Sopenharmony_ci    ld.d   $a0, $a0, 0   # a0=dtv[modidx]
33570af302Sopenharmony_ci    add.d  $a0, $a0, $t1 # a0=dtv[modidx]+off
34570af302Sopenharmony_ci    sub.d  $a0, $a1, $tp
35570af302Sopenharmony_ci    ld.d   $t1, $sp, 0
36570af302Sopenharmony_ci    ld.d   $t2, $sp, 8
37570af302Sopenharmony_ci    addi.d $sp, $sp, 16
38570af302Sopenharmony_ci    jr    $ra
39