xref: /aosp_15_r20/external/musl/src/signal/mipsn32/sigsetjmp.s (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker.set	noreorder
2*c9945492SAndroid Build Coastguard Worker.global	sigsetjmp
3*c9945492SAndroid Build Coastguard Worker.global	__sigsetjmp
4*c9945492SAndroid Build Coastguard Worker.type	sigsetjmp,@function
5*c9945492SAndroid Build Coastguard Worker.type	__sigsetjmp,@function
6*c9945492SAndroid Build Coastguard Workersigsetjmp:
7*c9945492SAndroid Build Coastguard Worker__sigsetjmp:
8*c9945492SAndroid Build Coastguard Worker	lui	$3, %hi(%neg(%gp_rel(sigsetjmp)))
9*c9945492SAndroid Build Coastguard Worker	addiu	$3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
10*c9945492SAndroid Build Coastguard Worker
11*c9945492SAndroid Build Coastguard Worker	# comparing save mask with 0, if equals to 0 then
12*c9945492SAndroid Build Coastguard Worker	# sigsetjmp is equal to setjmp.
13*c9945492SAndroid Build Coastguard Worker	beq	$5, $0, 1f
14*c9945492SAndroid Build Coastguard Worker	addu	$3, $3, $25
15*c9945492SAndroid Build Coastguard Worker	sd	$ra, 160($4)
16*c9945492SAndroid Build Coastguard Worker	sd	$16, 168($4)
17*c9945492SAndroid Build Coastguard Worker
18*c9945492SAndroid Build Coastguard Worker	# save base of got so that we can use it later
19*c9945492SAndroid Build Coastguard Worker	# once we return from 'longjmp'
20*c9945492SAndroid Build Coastguard Worker	sd	$3, 176($4)
21*c9945492SAndroid Build Coastguard Worker	lw	$25, %got_disp(setjmp)($3)
22*c9945492SAndroid Build Coastguard Worker	jalr	$25
23*c9945492SAndroid Build Coastguard Worker	move	$16, $4
24*c9945492SAndroid Build Coastguard Worker
25*c9945492SAndroid Build Coastguard Worker	move	$5, $2		# Return from 'setjmp' or 'longjmp'
26*c9945492SAndroid Build Coastguard Worker	move	$4, $16		# Restore the pointer-to-sigjmp_buf
27*c9945492SAndroid Build Coastguard Worker	ld	$ra, 160($4)	# Restore ra of sigsetjmp
28*c9945492SAndroid Build Coastguard Worker	ld	$16, 168($4)	# Restore $16 of sigsetjmp
29*c9945492SAndroid Build Coastguard Worker	ld	$3, 176($4)	# Restore base of got
30*c9945492SAndroid Build Coastguard Worker
31*c9945492SAndroid Build Coastguard Worker.hidden	__sigsetjmp_tail
32*c9945492SAndroid Build Coastguard Worker	lw	$25, %got_disp(__sigsetjmp_tail)($3)
33*c9945492SAndroid Build Coastguard Worker	jr	$25
34*c9945492SAndroid Build Coastguard Worker	nop
35*c9945492SAndroid Build Coastguard Worker1:
36*c9945492SAndroid Build Coastguard Worker	lw	$25, %got_disp(setjmp)($3)
37*c9945492SAndroid Build Coastguard Worker	jr	$25
38*c9945492SAndroid Build Coastguard Worker	nop
39