]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/builtins/x86_64/chkstk2.S
Update llvm to release_39 branch r276489, and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / builtins / x86_64 / chkstk2.S
1 // This file is dual licensed under the MIT and the University of Illinois Open
2 // Source Licenses. See LICENSE.TXT for details.
3
4 #include "../assembly.h"
5
6 #ifdef __x86_64__
7
8 // _chkstk (_alloca) routine - probe stack between %rsp and (%rsp-%rax) in 4k increments,
9 // then decrement %rsp by %rax.  Preserves all registers except %rsp and flags.
10 // This routine is windows specific
11 // http://msdn.microsoft.com/en-us/library/ms648426.aspx
12
13 .text
14 .balign 4
15 DEFINE_COMPILERRT_FUNCTION(__alloca)
16         mov    %rcx,%rax        // x64 _alloca is a normal function with parameter in rcx
17         // fallthrough
18 DEFINE_COMPILERRT_FUNCTION(___chkstk)
19         push   %rcx
20         cmp    $0x1000,%rax
21         lea    16(%rsp),%rcx     // rsp before calling this routine -> rcx
22         jb     1f
23 2:
24         sub    $0x1000,%rcx
25         test   %rcx,(%rcx)
26         sub    $0x1000,%rax
27         cmp    $0x1000,%rax
28         ja     2b
29 1:
30         sub    %rax,%rcx
31         test   %rcx,(%rcx)
32
33         lea    8(%rsp),%rax     // load pointer to the return address into rax
34         mov    %rcx,%rsp        // install the new top of stack pointer into rsp
35         mov    -8(%rax),%rcx    // restore rcx
36         push   (%rax)           // push return address onto the stack
37         sub    %rsp,%rax        // restore the original value in rax
38         ret
39 END_COMPILERRT_FUNCTION(___chkstk)
40 END_COMPILERRT_FUNCTION(__alloca)
41
42 #endif // __x86_64__