xref: /llvm-project/llvm/test/CodeGen/X86/swift-async-win64.ll (revision dd70aef05a86bb0c1e04c49cc1bd0457ca362ce3)
1; RUN: llc -mtriple x86_64-unknown-windows-msvc %s -o - | FileCheck %s -check-prefix CHECK64
2; RUN: llc -mtriple i686-windows-msvc %s -o - | FileCheck %s -check-prefix CHECK32
3
4define void @simple(ptr swiftasync %context) "frame-pointer"="all" {
5  ret void
6}
7
8; CHECK64-LABEL: simple:
9; CHECK64: pushq   %rbp
10; CHECK64: pushq   %rax
11; CHECK64: movq    %rsp, %rbp
12; CHECK64: movq    %r14, (%rbp)
13; CHECK64: addq    $8, %rsp
14; CHECK64: popq    %rbp
15; CHECK64: retq
16
17; CHECK32-LABEL: simple:
18; CHECK32: movl    8(%ebp), [[TMP:%.*]]
19; CHECK32: movl    [[TMP]], {{.*}}(%ebp)
20
21define void @more_csrs(ptr swiftasync %context) "frame-pointer"="all" {
22  call void asm sideeffect "", "~{r15}"()
23  ret void
24}
25
26; CHECK64-LABEL: more_csrs:
27; CHECK64: pushq   %rbp
28; CHECK64: .seh_pushreg %rbp
29; CHECK64: pushq   %r15
30; CHECK64: .seh_pushreg %r15
31; CHECK64: pushq   %rax
32; CHECK64: .seh_stackalloc 8
33; CHECK64: movq    %rsp, %rbp
34; CHECK64: .seh_setframe %rbp, 0
35; CHECK64: .seh_endprologue
36; CHECK64: movq    %r14, (%rbp)
37; [...]
38; CHECK64: addq    $8, %rsp
39; CHECK64: popq    %r15
40; CHECK64: popq    %rbp
41; CHECK64: retq
42
43declare void @f(ptr)
44
45define void @locals(ptr swiftasync %context) "frame-pointer"="all" {
46  %var = alloca i32, i32 10
47  call void @f(ptr %var)
48  ret void
49}
50
51; CHECK64-LABEL: locals:
52; CHECK64: pushq   %rbp
53; CHECK64: .seh_pushreg %rbp
54; CHECK64: subq    $80, %rsp
55; CHECK64: movq	%r14, -8(%rbp)
56
57; CHECK64: leaq    -48(%rbp), %rcx
58; CHECK64: callq   f
59
60; CHECK64: addq    $80, %rsp
61; CHECK64: popq    %rbp
62; CHECK64: retq
63
64define void @use_input_context(ptr swiftasync %context, ptr %ptr) "frame-pointer"="all" {
65  store ptr %context, ptr %ptr
66  ret void
67}
68
69; CHECK64-LABEL: use_input_context:
70; CHECK64: movq    %r14, (%rcx)
71
72declare ptr @llvm.swift.async.context.addr()
73
74define ptr @context_in_func() "frmae-pointer"="non-leaf" {
75  %ptr = call ptr @llvm.swift.async.context.addr()
76  ret ptr %ptr
77}
78
79; CHECK64-LABEL: context_in_func:
80; CHECK64: movq   %rsp, %rax
81
82; CHECK32-LABEL: context_in_func:
83; CHECK32: movl    %esp, %eax
84
85define void @write_frame_context(ptr swiftasync %context, ptr %new_context) "frame-pointer"="non-leaf" {
86  %ptr = call ptr @llvm.swift.async.context.addr()
87  store ptr %new_context, ptr %ptr
88  ret void
89}
90
91; CHECK64-LABEL: write_frame_context:
92; CHECK64: movq    %rcx, (%rsp)
93
94define void @simple_fp_elim(ptr swiftasync %context) "frame-pointer"="non-leaf" {
95  ret void
96}
97
98; CHECK64-LABEL: simple_fp_elim:
99; CHECK64-NOT: btsq
100
101define void @manylocals_and_overwritten_context(ptr swiftasync %context, ptr %new_context) "frame-pointer"="all" {
102  %ptr = call ptr @llvm.swift.async.context.addr()
103  store ptr %new_context, ptr %ptr
104  %var1 = alloca i64, i64 1
105  call void @f(ptr %var1)
106  %var2 = alloca i64, i64 16
107  call void @f(ptr %var2)
108  %ptr2 = call ptr @llvm.swift.async.context.addr()
109  store ptr %new_context, ptr %ptr2
110  ret void
111}
112
113; CHECK64-LABEL: manylocals_and_overwritten_context:
114; CHECK64:       pushq	%rbp
115; CHECK64:       subq	$184, %rsp
116; CHECK64:       leaq	128(%rsp), %rbp
117; CHECK64:       movq	%rcx, %rsi
118; CHECK64:       movq	%rcx, 48(%rbp)
119; CHECK64:       callq	f
120; CHECK64:       callq	f
121; CHECK64:       movq	%rsi, 48(%rbp)
122