blob: c0c6961f8f2a944306ac9f47f2a50b19ae86f309 [file] [log] [blame]
.set noreorder
.global sigsetjmp
.global __sigsetjmp
.type sigsetjmp,@function
.type __sigsetjmp,@function
sigsetjmp:
__sigsetjmp:
lui $3, %hi(%neg(%gp_rel(sigsetjmp)))
addiu $3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
# comparing save mask with 0, if equals to 0 then
# sigsetjmp is equal to setjmp.
beq $5, $0, 1f
addu $3, $3, $25
sd $ra, 160($4)
sd $16, 168($4)
# save base of got so that we can use it later
# once we return from 'longjmp'
sd $3, 176($4)
lw $25, %got_disp(setjmp)($3)
jalr $25
move $16, $4
move $5, $2 # Return from 'setjmp' or 'longjmp'
move $4, $16 # Restore the pointer-to-sigjmp_buf
ld $ra, 160($4) # Restore ra of sigsetjmp
ld $16, 168($4) # Restore $16 of sigsetjmp
ld $3, 176($4) # Restore base of got
.hidden __sigsetjmp_tail
lw $25, %got_disp(__sigsetjmp_tail)($3)
jr $25
nop
1:
lw $25, %got_disp(setjmp)($3)
jr $25
nop