blob: 5cfd4a8cfccb842543837c488d15450fc8be6fb5 [file] [log] [blame]
Paul Sokolovskye85c3892013-12-30 03:38:32 +02001#ifdef __i386__
2/* x86 callee save: bx, di, si, bp, sp */
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(4(%esp)=nlr_buf_t *nlr) */
Markus Siemens242856c2014-01-28 19:52:04 +01008#ifdef _WIN32
9 .globl _nlr_push
10 .def _nlr_push; .scl 2; .type 32; .endef
11_nlr_push:
12#else
Damience89a212013-10-15 22:25:17 +010013 .globl nlr_push
14 .type nlr_push, @function
15nlr_push:
Markus Siemens19ccc6b2014-01-27 22:53:28 +010016#endif
Damience89a212013-10-15 22:25:17 +010017 mov 4(%esp), %edx # load nlr_buf
18 mov (%esp), %eax # load return %ip
19 mov %eax, 8(%edx) # store %ip into nlr_buf+8
20 mov %ebp, 12(%edx) # store %bp into nlr_buf+12
21 mov %esp, 16(%edx) # store %sp into nlr_buf+16
22 mov %ebx, 20(%edx) # store %bx into nlr_buf+20
23 mov %edi, 24(%edx) # store %di into nlr_buf
24 mov %esi, 28(%edx) # store %si into nlr_buf
25 mov nlr_top, %eax # load nlr_top
26 mov %eax, (%edx) # store it
27 mov %edx, nlr_top # stor new nlr_buf (to make linked list)
28 xor %eax, %eax # return 0, normal return
29 ret # return
Markus Siemens242856c2014-01-28 19:52:04 +010030#ifndef _WIN32
Damience89a212013-10-15 22:25:17 +010031 .size nlr_push, .-nlr_push
Markus Siemens19ccc6b2014-01-27 22:53:28 +010032#endif
Damience89a212013-10-15 22:25:17 +010033
Paul Sokolovskye85c3892013-12-30 03:38:32 +020034/* void nlr_pop() */
Markus Siemens242856c2014-01-28 19:52:04 +010035#ifdef _WIN32
36 .globl _nlr_pop
37 .def _nlr_pop; .scl 2; .type 32; .endef
38_nlr_pop:
39#else
Damience89a212013-10-15 22:25:17 +010040 .globl nlr_pop
41 .type nlr_pop, @function
42nlr_pop:
Markus Siemens19ccc6b2014-01-27 22:53:28 +010043#endif
Damience89a212013-10-15 22:25:17 +010044 mov nlr_top, %eax # load nlr_top
45 mov (%eax), %eax # load prev nlr_buf
46 mov %eax, nlr_top # store nlr_top (to unlink list)
47 ret # return
Markus Siemens242856c2014-01-28 19:52:04 +010048#ifndef _WIN32
Damience89a212013-10-15 22:25:17 +010049 .size nlr_pop, .-nlr_pop
Markus Siemens19ccc6b2014-01-27 22:53:28 +010050#endif
Damience89a212013-10-15 22:25:17 +010051
Paul Sokolovskye85c3892013-12-30 03:38:32 +020052/* void nlr_jump(4(%esp)=uint val) */
Markus Siemens242856c2014-01-28 19:52:04 +010053#ifdef _WIN32
54 .globl _nlr_jump
55 .def _nlr_jump; .scl 2; .type 32; .endef
56_nlr_jump:
57#else
Damience89a212013-10-15 22:25:17 +010058 .globl nlr_jump
59 .type nlr_jump, @function
60nlr_jump:
Markus Siemens19ccc6b2014-01-27 22:53:28 +010061#endif
Damience89a212013-10-15 22:25:17 +010062 mov nlr_top, %edx # load nlr_top
63 mov 4(%esp), %eax # load return value
64 mov %eax, 4(%edx) # store return value
65 mov (%edx), %eax # load prev nlr_top
66 mov %eax, nlr_top # store nlr_top (to unlink list)
67 mov 28(%edx), %esi # load saved %si
68 mov 24(%edx), %edi # load saved %di
69 mov 20(%edx), %ebx # load saved %bx
70 mov 16(%edx), %esp # load saved %sp
71 mov 12(%edx), %ebp # load saved %bp
72 mov 8(%edx), %eax # load saved %ip
73 mov %eax, (%esp) # store saved %ip to stack
74 xor %eax, %eax # clear return register
75 inc %al # increase to make 1, non-local return
76 ret # return
Markus Siemens242856c2014-01-28 19:52:04 +010077#ifndef _WIN32
Damience89a212013-10-15 22:25:17 +010078 .size nlr_jump, .-nlr_jump
Markus Siemens19ccc6b2014-01-27 22:53:28 +010079#endif
Damience89a212013-10-15 22:25:17 +010080
Markus Siemens242856c2014-01-28 19:52:04 +010081#ifndef _WIN32
Damience89a212013-10-15 22:25:17 +010082 .local nlr_top
Markus Siemens19ccc6b2014-01-27 22:53:28 +010083#endif
Damience89a212013-10-15 22:25:17 +010084 .comm nlr_top,4,4
Markus Siemens242856c2014-01-28 19:52:04 +010085
86#endif /* __i386__ */