1570af302Sopenharmony_ci// size_t __tlsdesc_static(size_t *a)
2570af302Sopenharmony_ci// {
3570af302Sopenharmony_ci// 	return a[1];
4570af302Sopenharmony_ci// }
5570af302Sopenharmony_ci.global __tlsdesc_static
6570af302Sopenharmony_ci.hidden __tlsdesc_static
7570af302Sopenharmony_ci.type __tlsdesc_static,@function
8570af302Sopenharmony_ci__tlsdesc_static:
9570af302Sopenharmony_ci	ldr x0,[x0,#8]
10570af302Sopenharmony_ci	ret
11570af302Sopenharmony_ci
12570af302Sopenharmony_ci// size_t __tlsdesc_dynamic(size_t *a)
13570af302Sopenharmony_ci// {
14570af302Sopenharmony_ci// 	struct {size_t modidx,off;} *p = (void*)a[1];
15570af302Sopenharmony_ci// 	size_t *dtv = *(size_t**)(tp - 8);
16570af302Sopenharmony_ci// 	return dtv[p->modidx] + p->off - tp;
17570af302Sopenharmony_ci// }
18570af302Sopenharmony_ci.global __tlsdesc_dynamic
19570af302Sopenharmony_ci.hidden __tlsdesc_dynamic
20570af302Sopenharmony_ci.type __tlsdesc_dynamic,@function
21570af302Sopenharmony_ci.cfi_startproc
22570af302Sopenharmony_ci__tlsdesc_dynamic:
23570af302Sopenharmony_ci	stp x1,x2,[sp,#-16]!
24570af302Sopenharmony_ci	.cfi_def_cfa_offset 16
25570af302Sopenharmony_ci	.cfi_rel_offset x1, 0
26570af302Sopenharmony_ci	.cfi_rel_offset x2, 8
27570af302Sopenharmony_ci	mrs x1,tpidr_el0      // tp
28570af302Sopenharmony_ci	ldr x0,[x0,#8]        // p
29570af302Sopenharmony_ci	ldp x0,x2,[x0]        // p->modidx, p->off
30570af302Sopenharmony_ci	sub x2,x2,x1          // p->off - tp
31570af302Sopenharmony_ci	ldr x1,[x1,#-8]       // dtv
32570af302Sopenharmony_ci	ldr x1,[x1,x0,lsl #3] // dtv[p->modidx]
33570af302Sopenharmony_ci	add x0,x1,x2          // dtv[p->modidx] + p->off - tp
34570af302Sopenharmony_ci	ldp x1,x2,[sp],#16
35570af302Sopenharmony_ci	.cfi_def_cfa_offset 0
36570af302Sopenharmony_ci	ret
37570af302Sopenharmony_ci.cfi_endproc
38