aboutsummaryrefslogtreecommitdiff
path: root/tinycc/win32/lib/chkstk.S
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-07-12 13:22:29 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-07-12 13:22:29 -0300
commitfa2bdd711212ba6b7a94a20971e8bfa281e73296 (patch)
tree6713b3c0379507d49558287b71dd360ce188a2f0 /tinycc/win32/lib/chkstk.S
lol
Diffstat (limited to 'tinycc/win32/lib/chkstk.S')
-rw-r--r--tinycc/win32/lib/chkstk.S73
1 files changed, 73 insertions, 0 deletions
diff --git a/tinycc/win32/lib/chkstk.S b/tinycc/win32/lib/chkstk.S
new file mode 100644
index 0000000..6f583a5
--- /dev/null
+++ b/tinycc/win32/lib/chkstk.S
@@ -0,0 +1,73 @@
+/* ---------------------------------------------- */
+/* chkstk86.s */
+
+#ifdef __leading_underscore
+# define _(s) _##s
+#else
+# define _(s) s
+#endif
+
+/* ---------------------------------------------- */
+#ifndef __x86_64__
+/* ---------------------------------------------- */
+
+.globl _(__chkstk)
+_(__chkstk):
+ xchg (%esp),%ebp /* store ebp, get ret.addr */
+ push %ebp /* push ret.addr */
+ lea 4(%esp),%ebp /* setup frame ptr */
+ push %ecx /* save ecx */
+ mov %ebp,%ecx
+P0:
+ sub $4096,%ecx
+ test %eax,(%ecx)
+ sub $4096,%eax
+ cmp $4096,%eax
+ jge P0
+ sub %eax,%ecx
+ test %eax,(%ecx)
+
+ mov %esp,%eax
+ mov %ecx,%esp
+ mov (%eax),%ecx /* restore ecx */
+ jmp *4(%eax)
+
+/* ---------------------------------------------- */
+#else
+/* ---------------------------------------------- */
+
+.globl _(__chkstk)
+_(__chkstk):
+ xchg (%rsp),%rbp /* store ebp, get ret.addr */
+ push %rbp /* push ret.addr */
+ lea 8(%rsp),%rbp /* setup frame ptr */
+ push %rcx /* save ecx */
+ mov %rbp,%rcx
+ movslq %eax,%rax
+P0:
+ sub $4096,%rcx
+ test %rax,(%rcx)
+ sub $4096,%rax
+ cmp $4096,%rax
+ jge P0
+ sub %rax,%rcx
+ test %rax,(%rcx)
+
+ mov %rsp,%rax
+ mov %rcx,%rsp
+ mov (%rax),%rcx /* restore ecx */
+ jmp *8(%rax)
+
+/* ---------------------------------------------- */
+/* setjmp/longjmp support */
+
+.globl _(tinyc_getbp)
+_(tinyc_getbp):
+ mov %rbp,%rax
+ ret
+
+/* ---------------------------------------------- */
+#endif
+/* ---------------------------------------------- */
+
+