Paul Sokolovsky | e85c389 | 2013-12-30 03:38:32 +0200 | [diff] [blame] | 1 | #ifdef __x86_64__ |
| 2 | /* x64 callee save: bx, bp, sp, r12, r14, r14, r15 */ |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 3 | |
| 4 | .file "nlr.s" |
| 5 | .text |
| 6 | |
Paul Sokolovsky | e85c389 | 2013-12-30 03:38:32 +0200 | [diff] [blame] | 7 | /* uint nlr_push(rdi=nlr_buf_t *nlr) */ |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 8 | #ifndef __apple_build_version__ |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 9 | .globl nlr_push |
| 10 | .type nlr_push, @function |
| 11 | nlr_push: |
Mikael Eiman | 5d02e2d | 2014-01-04 20:15:04 +0100 | [diff] [blame] | 12 | #else |
| 13 | .globl _nlr_push |
| 14 | _nlr_push: |
| 15 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 16 | movq (%rsp), %rax # load return %rip |
| 17 | movq %rax, 16(%rdi) # store %rip into nlr_buf |
| 18 | movq %rbp, 24(%rdi) # store %rbp into nlr_buf |
| 19 | movq %rsp, 32(%rdi) # store %rsp into nlr_buf |
| 20 | movq %rbx, 40(%rdi) # store %rbx into nlr_buf |
| 21 | movq %r12, 48(%rdi) # store %r12 into nlr_buf |
| 22 | movq %r13, 56(%rdi) # store %r13 into nlr_buf |
| 23 | movq %r14, 64(%rdi) # store %r14 into nlr_buf |
| 24 | movq %r15, 72(%rdi) # store %r15 into nlr_buf |
| 25 | movq nlr_top(%rip), %rax # get last nlr_buf |
| 26 | movq %rax, (%rdi) # store it |
| 27 | movq %rdi, nlr_top(%rip) # stor new nlr_buf (to make linked list) |
| 28 | xorq %rax, %rax # return 0, normal return |
| 29 | ret # return |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 30 | #ifndef __apple_build_version__ |
Mikael Eiman | f53cdd9 | 2014-01-04 20:19:19 +0100 | [diff] [blame] | 31 | .size nlr_push, .-nlr_push |
| 32 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 33 | |
Paul Sokolovsky | e85c389 | 2013-12-30 03:38:32 +0200 | [diff] [blame] | 34 | /* void nlr_pop() */ |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 35 | #ifndef __apple_build_version__ |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 36 | .globl nlr_pop |
| 37 | .type nlr_pop, @function |
| 38 | nlr_pop: |
Mikael Eiman | 5d02e2d | 2014-01-04 20:15:04 +0100 | [diff] [blame] | 39 | #else |
| 40 | .globl _nlr_pop |
| 41 | _nlr_pop: |
| 42 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 43 | movq nlr_top(%rip), %rax # get nlr_top into %rax |
| 44 | movq (%rax), %rax # load prev nlr_buf |
| 45 | movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) |
| 46 | ret # return |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 47 | #ifndef __apple_build_version__ |
Mikael Eiman | f53cdd9 | 2014-01-04 20:19:19 +0100 | [diff] [blame] | 48 | .size nlr_pop, .-nlr_pop |
| 49 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 50 | |
Paul Sokolovsky | e85c389 | 2013-12-30 03:38:32 +0200 | [diff] [blame] | 51 | /* void nlr_jump(rdi=uint val) */ |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 52 | #ifndef __apple_build_version__ |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 53 | .globl nlr_jump |
| 54 | .type nlr_jump, @function |
| 55 | nlr_jump: |
Mikael Eiman | 5d02e2d | 2014-01-04 20:15:04 +0100 | [diff] [blame] | 56 | #else |
| 57 | .globl _nlr_jump |
| 58 | _nlr_jump: |
| 59 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 60 | movq %rdi, %rax # put return value in %rax |
| 61 | movq nlr_top(%rip), %rdi # get nlr_top into %rdi |
| 62 | movq %rax, 8(%rdi) # store return value |
| 63 | movq (%rdi), %rax # load prev nlr_buf |
| 64 | movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) |
| 65 | movq 72(%rdi), %r15 # load saved %r15 |
| 66 | movq 64(%rdi), %r14 # load saved %r14 |
| 67 | movq 56(%rdi), %r13 # load saved %r13 |
| 68 | movq 48(%rdi), %r12 # load saved %r12 |
| 69 | movq 40(%rdi), %rbx # load saved %rbx |
| 70 | movq 32(%rdi), %rsp # load saved %rsp |
| 71 | movq 24(%rdi), %rbp # load saved %rbp |
| 72 | movq 16(%rdi), %rax # load saved %rip |
| 73 | movq %rax, (%rsp) # store saved %rip to stack |
| 74 | xorq %rax, %rax # clear return register |
| 75 | inc %al # increase to make 1, non-local return |
| 76 | ret # return |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 77 | #ifndef __apple_build_version__ |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 78 | .size nlr_jump, .-nlr_jump |
Mikael Eiman | 5d02e2d | 2014-01-04 20:15:04 +0100 | [diff] [blame] | 79 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 80 | |
Mikael Eiman | d670913 | 2014-01-04 20:27:13 +0100 | [diff] [blame] | 81 | #ifndef __apple_build_version__ |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 82 | .local nlr_top |
Mikael Eiman | 5d02e2d | 2014-01-04 20:15:04 +0100 | [diff] [blame] | 83 | #endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 84 | .comm nlr_top,8,8 |
Paul Sokolovsky | e85c389 | 2013-12-30 03:38:32 +0200 | [diff] [blame] | 85 | #endif |