Unified · Split
| @@ -177,6 +177,10 @@ VPATH+=win32/lib · 176 unmodified lines | |||
| 177 | endif | 177 | endif |
| 178 | ifeq ($(ARCH),i386) | 178 | ifeq ($(ARCH),i386) |
| 179 | LIBTCC1_OBJS+=alloca86.o alloca86-bt.o | 179 | LIBTCC1_OBJS+=alloca86.o alloca86-bt.o |
| 180 | else | ||
| 181 | ifeq ($(ARCH),x86-64) | ||
| 182 | LIBTCC1_OBJS+=alloca86_64.o | ||
| 183 | endif | ||
| 180 | endif | 184 | endif |
| 181 | 185 | ||
| 182 | %.o: %.c | 186 | %.o: %.c |
| @@ -0,0 +1,33 @@ | |||
| 1 | /* ---------------------------------------------- */ | ||
| 2 | /* alloca86_64.S */ | ||
| 3 | |||
| 4 | #include "../config.h" | ||
| 5 | |||
| 6 | .globl alloca | ||
| 7 | |||
| 8 | alloca: | ||
| 9 | pop %rdx | ||
| 10 | mov %rdi,%rax | ||
| 11 | add $3,%rax | ||
| 12 | and $-4,%rax | ||
| 13 | jz p3 | ||
| 14 | |||
| 15 | #ifdef TCC_TARGET_PE | ||
| 16 | /* XXX: not tested */ | ||
| 17 | p1: | ||
| 18 | cmp $4096,%rax | ||
| 19 | jle p2 | ||
| 20 | sub $4096,%rsp | ||
| 21 | sub $4096,%rax | ||
| 22 | test %rax,(%rsp) | ||
| 23 | jmp p1 | ||
| 24 | p2: | ||
| 25 | #endif | ||
| 26 | |||
| 27 | sub %rax,%rsp | ||
| 28 | mov %rsp,%rax | ||
| 29 | p3: | ||
| 30 | push %rdx | ||
| 31 | ret | ||
| 32 | |||
| 33 | /* ---------------------------------------------- */ | ||