summaryrefslogtreecommitdiff
path: root/src/ldso/loongarch64/tlsdesc.s
blob: 4b6ea0e510747e8c605ff1495aaf3ab48297a96d (plain) (blame)
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
.text
.global __tlsdesc_static
.hidden __tlsdesc_static
.type __tlsdesc_static,%function
__tlsdesc_static:
	ld.d $a0, $a0, 8
	jr $ra
# size_t __tlsdesc_dynamic(size_t *a)
# {
#      struct {size_t modidx,off;} *p = (void*)a[1];
#      size_t *dtv = *(size_t**)(tp - 8);
#      return dtv[p->modidx] + p->off - tp;
# }
.global __tlsdesc_dynamic
.hidden __tlsdesc_dynamic
.type __tlsdesc_dynamic,%function
__tlsdesc_dynamic:
	addi.d $sp, $sp, -16
	st.d $t1, $sp, 0
	st.d $t2, $sp, 8

	ld.d $t2, $tp, -8 # t2=dtv

	ld.d $a0, $a0, 8  # a0=&{modidx,off}
	ld.d $t1, $a0, 8  # t1=off
	ld.d $a0, $a0, 0  # a0=modidx
	slli.d $a0, $a0, 3  # a0=8*modidx

	add.d $a0, $a0, $t2  # a0=dtv+8*modidx
	ld.d $a0, $a0, 0  # a0=dtv[modidx]
	add.d $a0, $a0, $t1 # a0=dtv[modidx]+off
	sub.d $a0, $a0, $tp # a0=dtv[modidx]+off-tp

	ld.d $t1, $sp, 0
	ld.d $t2, $sp, 8
	addi.d $sp, $sp, 16
	jr $ra