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