fixup! riscv: Implement large addend for global address
[tinycc.git] / lib / alloca.S
blob6ebafd7ccaf8e306cb05c91ccc77f6463f3e142f
1 /* ---------------------------------------------- */
2 /* alloca.S */
4 #ifdef __leading_underscore
5 # define _(s) _##s
6 #else
7 # define _(s) s
8 #endif
10 /* ---------------------------------------------- */
11 #if defined __i386__
13 .globl _(alloca), _(__alloca)
14 _(alloca):
15 _(__alloca):
16     push    %ebp
17     mov     %esp,%ebp
18     mov     8(%ebp),%eax
19     add     $3,%eax
20     and     $-4,%eax
21 #ifdef _WIN32
22     jmp     .+16 #p2
23 p1:
24     sub     $4096,%esp
25     sub     $4096,%eax
26     test    %eax,(%esp)
27 p2:
28     cmp     $4096,%eax
29     jae     p1
30 #endif
31     sub     %eax,%esp
32     mov     4(%ebp),%eax
33     mov     0(%ebp),%ebp
34     add     $8,%esp
35     push    %eax
36     lea     8(%esp),%eax
37     ret
39 /* ---------------------------------------------- */
40 #elif defined __x86_64__
42 .globl _(alloca)
43 _(alloca):
44     pop     %rdx
45 #ifdef _WIN32
46     mov     %rcx,%rax
47 #else
48     mov     %rdi,%rax
49 #endif
50     add     $15,%rax
51     and     $-16,%rax
52     jz      p3
54 #ifdef _WIN32
55 p1:
56     cmp     $4096,%rax
57     jbe     p2
58     test    %rax,-4096(%rsp)
59     sub     $4096,%rsp
60     sub     $4096,%rax
61     jmp p1
62 p2:
63 #endif
64     sub     %rax,%rsp
65     mov     %rsp,%rax
66 p3:
67     push    %rdx
68     ret
70 /* ---------------------------------------------- */
71 #elif defined __arm__
73         .text
74         .align  2
75         .global alloca
76         .type   alloca, %function
77 alloca:
78         rsb     sp, r0, sp
79         bic     sp, sp, #7
80         mov     r0, sp
81         mov     pc, lr
82         .size   alloca, .-alloca
84 /* ---------------------------------------------- */
85 #endif