• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32     | FileCheck %s -check-prefix=M64
2; RUN: llc < %s -mcpu=generic -mtriple=x86_64-win32       | FileCheck %s -check-prefix=W64
3; RUN: llc < %s -mcpu=generic -mtriple=x86_64-win32-macho | FileCheck %s -check-prefix=EFI
4; PR8777
5; PR8778
6
7define i64 @foo(i64 %n, i64 %x) nounwind {
8entry:
9
10  %buf0 = alloca i8, i64 4096, align 1
11
12; ___chkstk must adjust %rsp.
13; M64: movq  %rsp, %rbp
14; M64:       $4096, %rax
15; M64: callq ___chkstk
16; M64-NOT:   %rsp
17
18; __chkstk does not adjust %rsp.
19; W64: movq  %rsp, %rbp
20; W64:       $4096, %rax
21; W64: callq __chkstk
22; W64: subq  $4096, %rsp
23
24; Freestanding
25; EFI: movq  %rsp, %rbp
26; EFI:       $[[B0OFS:4096|4104]], %rsp
27; EFI-NOT:   call
28
29  %buf1 = alloca i8, i64 %n, align 1
30
31; M64: leaq  15(%{{.*}}), %rax
32; M64: andq  $-16, %rax
33; M64: callq ___chkstk
34; M64-NOT:   %rsp
35; M64: movq  %rsp, %rax
36
37; W64: leaq  15(%{{.*}}), %rax
38; W64: andq  $-16, %rax
39; W64: callq __chkstk
40; W64: subq  %rax, %rsp
41; W64: movq  %rsp, %rax
42
43; EFI: leaq  15(%{{.*}}), [[R1:%r.*]]
44; EFI: andq  $-16, [[R1]]
45; EFI: movq  %rsp, [[R64:%r.*]]
46; EFI: subq  [[R1]], [[R64]]
47; EFI: movq  [[R64]], %rsp
48
49  %r = call i64 @bar(i64 %n, i64 %x, i64 %n, i8* %buf0, i8* %buf1) nounwind
50
51; M64: subq  $48, %rsp
52; M64: leaq  -4096(%rbp), %r9
53; M64: movq  %rax, 32(%rsp)
54; M64: callq bar
55
56; W64: subq  $48, %rsp
57; W64: leaq  -4096(%rbp), %r9
58; W64: movq  %rax, 32(%rsp)
59; W64: callq bar
60
61; EFI: subq  $48, %rsp
62; EFI: leaq  -[[B0OFS]](%rbp), %r9
63; EFI: movq  [[R64]], 32(%rsp)
64; EFI: callq _bar
65
66  ret i64 %r
67
68; M64: movq    %rbp, %rsp
69
70; W64: movq    %rbp, %rsp
71
72}
73
74declare i64 @bar(i64, i64, i64, i8* nocapture, i8* nocapture) nounwind
75