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