blob: 52846b0d5729196bbe77f108e1b7b2bcba979213 [file] [log] [blame]
Paul Sokolovskyb1ce37d2014-04-30 04:19:20 +03001#if defined(__i386__) && !MICROPY_NLR_SETJMP
Paul Sokolovskye85c3892013-12-30 03:38:32 +02002/* 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
Damien George26cf55a2014-04-08 14:08:14 +000063 test %edx, %edx # check for nlr_top being NULL
Paul Sokolovsky41809a12014-04-20 22:14:58 +030064#ifdef _WIN32
65 je _nlr_jump_fail # fail if nlr_top is NULL
66#else
Damien George26cf55a2014-04-08 14:08:14 +000067 je nlr_jump_fail # fail if nlr_top is NULL
Paul Sokolovsky41809a12014-04-20 22:14:58 +030068#endif
Damience89a212013-10-15 22:25:17 +010069 mov 4(%esp), %eax # load return value
70 mov %eax, 4(%edx) # store return value
71 mov (%edx), %eax # load prev nlr_top
72 mov %eax, nlr_top # store nlr_top (to unlink list)
73 mov 28(%edx), %esi # load saved %si
74 mov 24(%edx), %edi # load saved %di
75 mov 20(%edx), %ebx # load saved %bx
76 mov 16(%edx), %esp # load saved %sp
77 mov 12(%edx), %ebp # load saved %bp
78 mov 8(%edx), %eax # load saved %ip
79 mov %eax, (%esp) # store saved %ip to stack
80 xor %eax, %eax # clear return register
81 inc %al # increase to make 1, non-local return
82 ret # return
Markus Siemens242856c2014-01-28 19:52:04 +010083#ifndef _WIN32
Damience89a212013-10-15 22:25:17 +010084 .size nlr_jump, .-nlr_jump
Markus Siemens19ccc6b2014-01-27 22:53:28 +010085#endif
Damience89a212013-10-15 22:25:17 +010086
Damien George26cf55a2014-04-08 14:08:14 +000087 .bss
Markus Siemens242856c2014-01-28 19:52:04 +010088#ifndef _WIN32
Damience89a212013-10-15 22:25:17 +010089 .local nlr_top
Markus Siemens19ccc6b2014-01-27 22:53:28 +010090#endif
Damience89a212013-10-15 22:25:17 +010091 .comm nlr_top,4,4
Markus Siemens242856c2014-01-28 19:52:04 +010092
93#endif /* __i386__ */