blob: 441817b4f3bdeb1905b065d70bbfdc2b80ee227e [file] [log] [blame]
Paul Sokolovskye85c3892013-12-30 03:38:32 +02001#ifdef __x86_64__
2/* x64 callee save: bx, bp, sp, r12, r14, r14, r15 */
Damience89a212013-10-15 22:25:17 +01003
4 .file "nlr.s"
5 .text
6
Paul Sokolovskye85c3892013-12-30 03:38:32 +02007/* uint nlr_push(rdi=nlr_buf_t *nlr) */
Mikael Eimand6709132014-01-04 20:27:13 +01008#ifndef __apple_build_version__
Damience89a212013-10-15 22:25:17 +01009 .globl nlr_push
10 .type nlr_push, @function
11nlr_push:
Mikael Eiman5d02e2d2014-01-04 20:15:04 +010012#else
13 .globl _nlr_push
14_nlr_push:
15#endif
Damience89a212013-10-15 22:25:17 +010016 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 Eimand6709132014-01-04 20:27:13 +010030#ifndef __apple_build_version__
Mikael Eimanf53cdd92014-01-04 20:19:19 +010031 .size nlr_push, .-nlr_push
32#endif
Damience89a212013-10-15 22:25:17 +010033
Paul Sokolovskye85c3892013-12-30 03:38:32 +020034/* void nlr_pop() */
Mikael Eimand6709132014-01-04 20:27:13 +010035#ifndef __apple_build_version__
Damience89a212013-10-15 22:25:17 +010036 .globl nlr_pop
37 .type nlr_pop, @function
38nlr_pop:
Mikael Eiman5d02e2d2014-01-04 20:15:04 +010039#else
40 .globl _nlr_pop
41_nlr_pop:
42#endif
Damience89a212013-10-15 22:25:17 +010043 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 Eimand6709132014-01-04 20:27:13 +010047#ifndef __apple_build_version__
Mikael Eimanf53cdd92014-01-04 20:19:19 +010048 .size nlr_pop, .-nlr_pop
49#endif
Damience89a212013-10-15 22:25:17 +010050
Paul Sokolovskye85c3892013-12-30 03:38:32 +020051/* void nlr_jump(rdi=uint val) */
Mikael Eimand6709132014-01-04 20:27:13 +010052#ifndef __apple_build_version__
Damience89a212013-10-15 22:25:17 +010053 .globl nlr_jump
54 .type nlr_jump, @function
55nlr_jump:
Mikael Eiman5d02e2d2014-01-04 20:15:04 +010056#else
57 .globl _nlr_jump
58 _nlr_jump:
59#endif
Damience89a212013-10-15 22:25:17 +010060 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 Eimand6709132014-01-04 20:27:13 +010077#ifndef __apple_build_version__
Damience89a212013-10-15 22:25:17 +010078 .size nlr_jump, .-nlr_jump
Mikael Eiman5d02e2d2014-01-04 20:15:04 +010079#endif
Damience89a212013-10-15 22:25:17 +010080
Mikael Eimand6709132014-01-04 20:27:13 +010081#ifndef __apple_build_version__
Damience89a212013-10-15 22:25:17 +010082 .local nlr_top
Mikael Eiman5d02e2d2014-01-04 20:15:04 +010083#endif
Damience89a212013-10-15 22:25:17 +010084 .comm nlr_top,8,8
Paul Sokolovskye85c3892013-12-30 03:38:32 +020085#endif