10b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
20b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
30b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
40b57cec5SDimitry Andric
50b57cec5SDimitry Andric#include "../assembly.h"
60b57cec5SDimitry Andric
70b57cec5SDimitry Andric// _chkstk routine
80b57cec5SDimitry Andric// This routine is windows specific
90b57cec5SDimitry Andric// http://msdn.microsoft.com/en-us/library/ms648426.aspx
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric// Notes from r227519
120b57cec5SDimitry Andric// MSVC x64s __chkstk and cygmings ___chkstk_ms do not adjust %rsp
130b57cec5SDimitry Andric// themselves. It also does not clobber %rax so we can reuse it when
140b57cec5SDimitry Andric// adjusting %rsp.
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric#ifdef __x86_64__
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric.text
190b57cec5SDimitry Andric.balign 4
200b57cec5SDimitry AndricDEFINE_COMPILERRT_FUNCTION(___chkstk_ms)
210b57cec5SDimitry Andric        push   %rcx
220b57cec5SDimitry Andric        push   %rax
230b57cec5SDimitry Andric        cmp    $0x1000,%rax
240b57cec5SDimitry Andric        lea    24(%rsp),%rcx
250b57cec5SDimitry Andric        jb     1f
260b57cec5SDimitry Andric2:
270b57cec5SDimitry Andric        sub    $0x1000,%rcx
280b57cec5SDimitry Andric        test   %rcx,(%rcx)
290b57cec5SDimitry Andric        sub    $0x1000,%rax
300b57cec5SDimitry Andric        cmp    $0x1000,%rax
310b57cec5SDimitry Andric        ja     2b
320b57cec5SDimitry Andric1:
330b57cec5SDimitry Andric        sub    %rax,%rcx
340b57cec5SDimitry Andric        test   %rcx,(%rcx)
350b57cec5SDimitry Andric        pop    %rax
360b57cec5SDimitry Andric        pop    %rcx
370b57cec5SDimitry Andric        ret
380b57cec5SDimitry AndricEND_COMPILERRT_FUNCTION(___chkstk_ms)
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric#endif // __x86_64__
41