add mips64 port
[musl.git] / src / signal / mips64 / sigsetjmp.s
blob156e70bd0f6ad7b34f9bf24bdb2a5ef1a0aade94
1 .set noreorder
2 .global sigsetjmp
3 .global __sigsetjmp
4 .type sigsetjmp,@function
5 .type __sigsetjmp,@function
6 sigsetjmp:
7 __sigsetjmp:
8 lui $3, %hi(%neg(%gp_rel(sigsetjmp)))
9 daddiu $3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
11 # comparing save mask with 0, if equals to 0 then
12 # sigsetjmp is equal to setjmp.
13 beq $5, $0, 1f
14 daddu $3, $3, $25
15 sd $ra, 160($4)
16 sd $16, 168($4)
18 # save base of got so that we can use it later
19 # once we return from 'longjmp'
20 sd $3, 176($4)
21 ld $25, %got_disp(setjmp)($3)
22 jalr $25
23 move $16, $4
25 move $5, $2 # Return from 'setjmp' or 'longjmp'
26 move $4, $16 # Restore the pointer-to-sigjmp_buf
27 ld $ra, 160($4) # Restore ra of sigsetjmp
28 ld $16, 168($4) # Restore $16 of sigsetjmp
29 ld $3, 176($4) # Restore base of got
31 .hidden __sigsetjmp_tail
32 ld $25, %got_disp(__sigsetjmp_tail)($3)
33 jr $25
34 nop
36 ld $25, %got_disp(setjmp)($3)
37 jr $25
38 nop