mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-22 23:24:59 +00:00
Target/X86: [PR8777][PR8778] Tweak alloca/chkstk for Windows targets.
FIXME: Some cleanups would be needed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128206 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
74
test/CodeGen/X86/win64_alloca_dynalloca.ll
Normal file
74
test/CodeGen/X86/win64_alloca_dynalloca.ll
Normal file
@@ -0,0 +1,74 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=M64
|
||||
; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s -check-prefix=W64
|
||||
; RUN: llc < %s -mtriple=x86_64-win32-macho | FileCheck %s -check-prefix=EFI
|
||||
; PR8777
|
||||
; PR8778
|
||||
|
||||
define i64 @foo(i64 %n, i64 %x) nounwind {
|
||||
entry:
|
||||
|
||||
%buf0 = alloca i8, i64 4096, align 1
|
||||
|
||||
; ___chkstk must adjust %rsp.
|
||||
; M64: movq %rsp, %rbp
|
||||
; M64: $4096, %rax
|
||||
; M64: callq ___chkstk
|
||||
; M64-NOT: %rsp
|
||||
|
||||
; __chkstk does not adjust %rsp.
|
||||
; W64: movq %rsp, %rbp
|
||||
; W64: $4096, %rax
|
||||
; W64: callq __chkstk
|
||||
; W64: subq $4096, %rsp
|
||||
|
||||
; Freestanding
|
||||
; EFI: movq %rsp, %rbp
|
||||
; EFI: $[[B0OFS:4096|4104]], %rsp
|
||||
; EFI-NOT: call
|
||||
|
||||
%buf1 = alloca i8, i64 %n, align 1
|
||||
|
||||
; M64: leaq 15(%rcx), %rax
|
||||
; M64: andq $-16, %rax
|
||||
; M64: callq ___chkstk
|
||||
; M64-NOT: %rsp
|
||||
; M64: movq %rsp, %rax
|
||||
|
||||
; W64: leaq 15(%rcx), %rax
|
||||
; W64: andq $-16, %rax
|
||||
; W64: callq __chkstk
|
||||
; W64: subq %rax, %rsp
|
||||
; W64: movq %rsp, %rax
|
||||
|
||||
; EFI: leaq 15(%rcx), %rax
|
||||
; EFI: andq $-16, %rax
|
||||
; EFI: movq %rsp, [[R64:%r..]]
|
||||
; EFI: subq %rax, [[R64]]
|
||||
; EFI: movq [[R64]], %rsp
|
||||
|
||||
%r = call i64 @bar(i64 %n, i64 %x, i64 %n, i8* %buf0, i8* %buf1) nounwind
|
||||
|
||||
; M64: subq $48, %rsp
|
||||
; M64: leaq -4096(%rbp), %r9
|
||||
; M64: movq %rax, 32(%rsp)
|
||||
; M64: callq bar
|
||||
|
||||
; W64: subq $48, %rsp
|
||||
; W64: leaq -4096(%rbp), %r9
|
||||
; W64: movq %rax, 32(%rsp)
|
||||
; W64: callq bar
|
||||
|
||||
; EFI: subq $48, %rsp
|
||||
; EFI: leaq -[[B0OFS]](%rbp), %r9
|
||||
; EFI: movq [[R64]], 32(%rsp)
|
||||
; EFI: callq _bar
|
||||
|
||||
ret i64 %r
|
||||
|
||||
; M64: movq %rbp, %rsp
|
||||
|
||||
; W64: movq %rbp, %rsp
|
||||
|
||||
}
|
||||
|
||||
declare i64 @bar(i64, i64, i64, i8* nocapture, i8* nocapture) nounwind
|
@@ -3,6 +3,7 @@
|
||||
; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X32
|
||||
; RUN: llc < %s -mtriple=x86_64-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X64
|
||||
; RUN: llc < %s -mtriple=i386-pc-linux | FileCheck %s -check-prefix=LINUX
|
||||
; RUN: llc < %s -mtriple=x86_64-pc-win32-macho | FileCheck %s -check-prefix=LINUX
|
||||
|
||||
; Windows and mingw require a prologue helper routine if more than 4096 bytes area
|
||||
; allocated on the stack. Windows uses __chkstk and mingw uses __alloca. __alloca
|
||||
@@ -16,7 +17,7 @@ entry:
|
||||
; WIN_X32: calll __chkstk
|
||||
; WIN_X64: callq __chkstk
|
||||
; MINGW_X32: calll __alloca
|
||||
; MINGW_X64: callq __chkstk
|
||||
; MINGW_X64: callq ___chkstk
|
||||
; LINUX-NOT: call __chkstk
|
||||
%array4096 = alloca [4096 x i8], align 16 ; <[4096 x i8]*> [#uses=0]
|
||||
ret i32 0
|
||||
|
Reference in New Issue
Block a user