aboutsummaryrefslogtreecommitdiff
path: root/py/nlrx64.S
diff options
context:
space:
mode:
authorPaul Sokolovsky2013-12-30 03:38:32 +0200
committerPaul Sokolovsky2013-12-30 03:38:32 +0200
commite85c38992da1f62fc07ee8e203ea98a221857b59 (patch)
tree8b7dae173caa4b9063d6d35569946280a7082261 /py/nlrx64.S
parent732407f1bf12364375162e8fb73816532a5d139c (diff)
Make "unix" target be crossplatform and support x86, x64, ARM hosts.
Diffstat (limited to 'py/nlrx64.S')
-rw-r--r--py/nlrx64.S62
1 files changed, 62 insertions, 0 deletions
diff --git a/py/nlrx64.S b/py/nlrx64.S
new file mode 100644
index 000000000..6d0e2118f
--- /dev/null
+++ b/py/nlrx64.S
@@ -0,0 +1,62 @@
+#ifdef __x86_64__
+/* x64 callee save: bx, bp, sp, r12, r14, r14, r15 */
+
+ .file "nlr.s"
+ .text
+
+/* uint nlr_push(rdi=nlr_buf_t *nlr) */
+ .globl nlr_push
+ .type nlr_push, @function
+nlr_push:
+ movq (%rsp), %rax # load return %rip
+ movq %rax, 16(%rdi) # store %rip into nlr_buf
+ movq %rbp, 24(%rdi) # store %rbp into nlr_buf
+ movq %rsp, 32(%rdi) # store %rsp into nlr_buf
+ movq %rbx, 40(%rdi) # store %rbx into nlr_buf
+ movq %r12, 48(%rdi) # store %r12 into nlr_buf
+ movq %r13, 56(%rdi) # store %r13 into nlr_buf
+ movq %r14, 64(%rdi) # store %r14 into nlr_buf
+ movq %r15, 72(%rdi) # store %r15 into nlr_buf
+ movq nlr_top(%rip), %rax # get last nlr_buf
+ movq %rax, (%rdi) # store it
+ movq %rdi, nlr_top(%rip) # stor new nlr_buf (to make linked list)
+ xorq %rax, %rax # return 0, normal return
+ ret # return
+ .size nlr_push, .-nlr_push
+
+/* void nlr_pop() */
+ .globl nlr_pop
+ .type nlr_pop, @function
+nlr_pop:
+ movq nlr_top(%rip), %rax # get nlr_top into %rax
+ movq (%rax), %rax # load prev nlr_buf
+ movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list)
+ ret # return
+ .size nlr_pop, .-nlr_pop
+
+/* void nlr_jump(rdi=uint val) */
+ .globl nlr_jump
+ .type nlr_jump, @function
+nlr_jump:
+ movq %rdi, %rax # put return value in %rax
+ movq nlr_top(%rip), %rdi # get nlr_top into %rdi
+ movq %rax, 8(%rdi) # store return value
+ movq (%rdi), %rax # load prev nlr_buf
+ movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list)
+ movq 72(%rdi), %r15 # load saved %r15
+ movq 64(%rdi), %r14 # load saved %r14
+ movq 56(%rdi), %r13 # load saved %r13
+ movq 48(%rdi), %r12 # load saved %r12
+ movq 40(%rdi), %rbx # load saved %rbx
+ movq 32(%rdi), %rsp # load saved %rsp
+ movq 24(%rdi), %rbp # load saved %rbp
+ movq 16(%rdi), %rax # load saved %rip
+ movq %rax, (%rsp) # store saved %rip to stack
+ xorq %rax, %rax # clear return register
+ inc %al # increase to make 1, non-local return
+ ret # return
+ .size nlr_jump, .-nlr_jump
+
+ .local nlr_top
+ .comm nlr_top,8,8
+#endif