add mips n32 port (ILP32 ABI for mips64)
[musl] / src / signal / mipsn32 / sigsetjmp.s
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         addiu   $3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
10
11         # comparing save mask with 0, if equals to 0 then
12         # sigsetjmp is equal to setjmp.
13         beq     $5, $0, 1f
14         addu    $3, $3, $25
15         sd      $ra, 160($4)
16         sd      $16, 168($4)
17
18         # save base of got so that we can use it later
19         # once we return from 'longjmp'
20         sd      $3, 176($4)
21         lw      $25, %got_disp(setjmp)($3)
22         jalr    $25
23         move    $16, $4
24
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
30
31 .hidden __sigsetjmp_tail
32         lw      $25, %got_disp(__sigsetjmp_tail)($3)
33         jr      $25
34         nop
35 1:
36         lw      $25, %got_disp(setjmp)($3)
37         jr      $25
38         nop