Rich Felker | 5972c4a | 2016-04-18 05:19:13 +0000 | [diff] [blame^] | 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 |