aboutsummaryrefslogtreecommitdiff
path: root/tinycc/lib/alloca-bt.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/lib/alloca-bt.S
lol
Diffstat (limited to 'tinycc/lib/alloca-bt.S')
-rw-r--r--tinycc/lib/alloca-bt.S96
1 files changed, 96 insertions, 0 deletions
diff --git a/tinycc/lib/alloca-bt.S b/tinycc/lib/alloca-bt.S
new file mode 100644
index 0000000..c161488
--- /dev/null
+++ b/tinycc/lib/alloca-bt.S
@@ -0,0 +1,96 @@
+/* ---------------------------------------------- */
+/* alloca-bt.S */
+
+#ifdef __leading_underscore
+# define _(s) _##s
+#else
+# define _(s) s
+#endif
+
+/* ---------------------------------------------- */
+#if defined __i386__
+
+.globl _(__bound_alloca)
+_(__bound_alloca):
+ pop %edx
+ pop %eax
+ mov %eax, %ecx
+ add $3+1,%eax
+ and $-4,%eax
+ jz p6
+
+#ifdef _WIN32
+p4:
+ cmp $4096,%eax
+ jbe p5
+ test %eax,-4096(%esp)
+ sub $4096,%esp
+ sub $4096,%eax
+ jmp p4
+
+p5:
+#endif
+
+ sub %eax,%esp
+ mov %esp,%eax
+
+ push %edx
+ push %eax
+ push %ecx
+ push %eax
+ call _(__bound_new_region)
+ add $8, %esp
+ pop %eax
+ pop %edx
+
+p6:
+ push %edx
+ push %edx
+ ret
+
+/* ---------------------------------------------- */
+#elif defined __x86_64__
+
+.globl _(__bound_alloca)
+_(__bound_alloca):
+#ifdef _WIN32
+ inc %rcx # add one extra to separate regions
+ jmp _(alloca)
+.globl _(__bound_alloca_nr)
+_(__bound_alloca_nr):
+ dec %rcx
+ push %rax
+ mov %rcx,%rdx
+ mov %rax,%rcx
+ sub $32,%rsp
+ call _(__bound_new_region)
+ add $32,%rsp
+ pop %rax
+ ret
+#else
+ pop %rdx
+ mov %rdi,%rax
+ mov %rax,%rsi # size, a second parm to the __bound_new_region
+
+ add $15 + 1,%rax # add one extra to separate regions
+ and $-16,%rax
+ jz p3
+
+
+ sub %rax,%rsp
+ mov %rsp,%rdi # pointer, a first parm to the __bound_new_region
+ mov %rsp,%rax
+
+ push %rdx
+ push %rax
+ call _(__bound_new_region)
+ pop %rax
+ pop %rdx
+
+p3:
+ push %rdx
+ ret
+#endif
+
+/* ---------------------------------------------- */
+#endif