]> git.lizzy.rs Git - rust.git/blob - src/rt/arch/x86_64/morestack.S
hastily port so we don't fail to build
[rust.git] / src / rt / arch / x86_64 / morestack.S
1     .text
2
3 // __morestack
4 //
5 // LLVM generates a call to this to allocate more stack space in a functiono
6 // prolog when we run out.
7
8 #if defined(__APPLE__) || defined(_WIN32)
9 #define RUST_NEW_STACK      _rust_new_stack
10 #define RUST_DEL_STACK      _rust_del_stack
11 #else
12 #define RUST_NEW_STACK      rust_new_stack
13 #define RUST_DEL_STACK      rust_del_stack
14 #endif
15
16         // Naturally, nobody can agree as to
17         // which arguments should go in which
18         // registers:
19 #if defined(_WIN32)
20 #  define ARG0 %rcx
21 #  define ARG1 %rdx
22 #  define ARG2 %r8
23 #else
24 #  define ARG0 %rdi
25 #  define ARG1 %rsi
26 #  define ARG2 %rdx
27 #endif
28
29 .globl RUST_NEW_STACK
30 .globl RUST_DEL_STACK
31
32 .globl __morestack
33
34 __morestack:
35         // Hastily and probably incorrectly ported from i386 version.
36         // Actually this calling convention doens't make so much sense
37         // for x86_64...
38         mov %rcx, ARG0      // param 0: amount of space needed
39         mov %rdx, ARG2      // param 2: size of arguments
40         lea 8(%rsp),ARG1
41         call RUST_NEW_STACK
42
43         mov (%rsp),%rdx        // Grab the return pointer.
44         inc %rdx               // Skip past the `ret`.
45         mov %rax,%rsp          // Switch to the new stack.
46         call *%rdx             // Enter the new function.
47
48         // Now the function that called us has returned, so we need to delete the
49         // old stack space.
50         call RUST_DEL_STACK
51         mov %rax,%rsp          // Switch back to the old stack.
52         ret