aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji _at_ gmail.com>2009-06-09 03:23:08 +0900
committerShinichiro Hamaji <shinichiro.hamaji _at_ gmail.com>2009-06-09 03:23:08 +0900
commit8ea8305199496ba29b6d0da2de07aea4441844aa (patch)
tree7be3548c7ebde884607653e2ada85a10629cfde7
parent110a4edc154f6fb73ef3d312630455f68641123f (diff)
downloadtinycc-8ea8305199496ba29b6d0da2de07aea4441844aa.tar.gz
tinycc-8ea8305199496ba29b6d0da2de07aea4441844aa.tar.bz2
x86-64: Add alloca.
-rw-r--r--Makefile4
-rw-r--r--lib/alloca86_64.S33
2 files changed, 37 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index 1a2b5f7..730b817 100644
--- a/Makefile
+++ b/Makefile
@@ -177,6 +177,10 @@ VPATH+=win32/lib
endif
ifeq ($(ARCH),i386)
LIBTCC1_OBJS+=alloca86.o alloca86-bt.o
+else
+ifeq ($(ARCH),x86-64)
+LIBTCC1_OBJS+=alloca86_64.o
+endif
endif
%.o: %.c
diff --git a/lib/alloca86_64.S b/lib/alloca86_64.S
new file mode 100644
index 0000000..1751d37
--- /dev/null
+++ b/lib/alloca86_64.S
@@ -0,0 +1,33 @@
+/* ---------------------------------------------- */
+/* alloca86_64.S */
+
+#include "../config.h"
+
+.globl alloca
+
+alloca:
+ pop %rdx
+ mov %rdi,%rax
+ add $3,%rax
+ and $-4,%rax
+ jz p3
+
+#ifdef TCC_TARGET_PE
+ /* XXX: not tested */
+p1:
+ cmp $4096,%rax
+ jle p2
+ sub $4096,%rsp
+ sub $4096,%rax
+ test %rax,(%rsp)
+ jmp p1
+p2:
+#endif
+
+ sub %rax,%rsp
+ mov %rsp,%rax
+p3:
+ push %rdx
+ ret
+
+/* ---------------------------------------------- */