xref: /llvm-project/llvm/test/CodeGen/AArch64/aarch64_win64cc_vararg.ll (revision db158c7c830807caeeb0691739c41f1d522029e9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s
3; RUN: llc < %s --global-isel=1 -mtriple=aarch64-apple-darwin | FileCheck %s --check-prefix=DARWIN
4
5define win64cc void @pass_va(i32 %count, ...) nounwind {
6; CHECK-LABEL: pass_va:
7; CHECK:       // %bb.0: // %entry
8; CHECK-NEXT:    sub sp, sp, #96
9; CHECK-NEXT:    add x8, sp, #40
10; CHECK-NEXT:    add x0, sp, #40
11; CHECK-NEXT:    stp x30, x18, [sp, #16] // 16-byte Folded Spill
12; CHECK-NEXT:    stp x1, x2, [sp, #40]
13; CHECK-NEXT:    stp x3, x4, [sp, #56]
14; CHECK-NEXT:    stp x5, x6, [sp, #72]
15; CHECK-NEXT:    str x7, [sp, #88]
16; CHECK-NEXT:    str x8, [sp, #8]
17; CHECK-NEXT:    bl other_func
18; CHECK-NEXT:    ldp x30, x18, [sp, #16] // 16-byte Folded Reload
19; CHECK-NEXT:    add sp, sp, #96
20; CHECK-NEXT:    ret
21;
22; DARWIN-LABEL: pass_va:
23; DARWIN:       ; %bb.0: ; %entry
24; DARWIN-NEXT:    str x18, [sp, #-96]! ; 8-byte Folded Spill
25; DARWIN-NEXT:    add x8, sp, #8
26; DARWIN-NEXT:    add x9, sp, #40
27; DARWIN-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill
28; DARWIN-NEXT:    str x9, [x8]
29; DARWIN-NEXT:    ldr x0, [sp, #8]
30; DARWIN-NEXT:    stp x1, x2, [sp, #40]
31; DARWIN-NEXT:    stp x3, x4, [sp, #56]
32; DARWIN-NEXT:    stp x5, x6, [sp, #72]
33; DARWIN-NEXT:    str x7, [sp, #88]
34; DARWIN-NEXT:    bl _other_func
35; DARWIN-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
36; DARWIN-NEXT:    ldr x18, [sp], #96 ; 8-byte Folded Reload
37; DARWIN-NEXT:    ret
38entry:
39  %ap = alloca ptr, align 8
40  call void @llvm.va_start(ptr %ap)
41  %ap2 = load ptr, ptr %ap, align 8
42  call void @other_func(ptr %ap2)
43  ret void
44}
45
46declare void @other_func(ptr) local_unnamed_addr
47
48declare void @llvm.va_start(ptr) nounwind
49declare void @llvm.va_copy(ptr, ptr) nounwind
50
51define win64cc ptr @f9(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, i64 %a8, ...) nounwind {
52; CHECK-LABEL: f9:
53; CHECK:       // %bb.0: // %entry
54; CHECK-NEXT:    str x18, [sp, #-16]! // 8-byte Folded Spill
55; CHECK-NEXT:    add x8, sp, #24
56; CHECK-NEXT:    add x0, sp, #24
57; CHECK-NEXT:    str x8, [sp, #8]
58; CHECK-NEXT:    ldr x18, [sp], #16 // 8-byte Folded Reload
59; CHECK-NEXT:    ret
60;
61; DARWIN-LABEL: f9:
62; DARWIN:       ; %bb.0: ; %entry
63; DARWIN-NEXT:    str x18, [sp, #-16]! ; 8-byte Folded Spill
64; DARWIN-NEXT:    add x8, sp, #8
65; DARWIN-NEXT:    add x9, sp, #24
66; DARWIN-NEXT:    str x9, [x8]
67; DARWIN-NEXT:    ldr x0, [sp, #8]
68; DARWIN-NEXT:    ldr x18, [sp], #16 ; 8-byte Folded Reload
69; DARWIN-NEXT:    ret
70entry:
71  %ap = alloca ptr, align 8
72  call void @llvm.va_start(ptr %ap)
73  %ap2 = load ptr, ptr %ap, align 8
74  ret ptr %ap2
75}
76
77define win64cc ptr @f8(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, ...) nounwind {
78; CHECK-LABEL: f8:
79; CHECK:       // %bb.0: // %entry
80; CHECK-NEXT:    str x18, [sp, #-16]! // 8-byte Folded Spill
81; CHECK-NEXT:    add x8, sp, #16
82; CHECK-NEXT:    add x0, sp, #16
83; CHECK-NEXT:    str x8, [sp, #8]
84; CHECK-NEXT:    ldr x18, [sp], #16 // 8-byte Folded Reload
85; CHECK-NEXT:    ret
86;
87; DARWIN-LABEL: f8:
88; DARWIN:       ; %bb.0: ; %entry
89; DARWIN-NEXT:    str x18, [sp, #-16]! ; 8-byte Folded Spill
90; DARWIN-NEXT:    add x8, sp, #8
91; DARWIN-NEXT:    add x9, sp, #16
92; DARWIN-NEXT:    str x9, [x8]
93; DARWIN-NEXT:    ldr x0, [sp, #8]
94; DARWIN-NEXT:    ldr x18, [sp], #16 ; 8-byte Folded Reload
95; DARWIN-NEXT:    ret
96entry:
97  %ap = alloca ptr, align 8
98  call void @llvm.va_start(ptr %ap)
99  %ap2 = load ptr, ptr %ap, align 8
100  ret ptr %ap2
101}
102
103define win64cc ptr @f7(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, ...) nounwind {
104; CHECK-LABEL: f7:
105; CHECK:       // %bb.0: // %entry
106; CHECK-NEXT:    str x18, [sp, #-32]! // 8-byte Folded Spill
107; CHECK-NEXT:    add x8, sp, #24
108; CHECK-NEXT:    add x0, sp, #24
109; CHECK-NEXT:    str x7, [sp, #24]
110; CHECK-NEXT:    str x8, [sp, #8]
111; CHECK-NEXT:    ldr x18, [sp], #32 // 8-byte Folded Reload
112; CHECK-NEXT:    ret
113;
114; DARWIN-LABEL: f7:
115; DARWIN:       ; %bb.0: ; %entry
116; DARWIN-NEXT:    str x18, [sp, #-32]! ; 8-byte Folded Spill
117; DARWIN-NEXT:    add x8, sp, #8
118; DARWIN-NEXT:    add x9, sp, #24
119; DARWIN-NEXT:    str x7, [sp, #24]
120; DARWIN-NEXT:    str x9, [x8]
121; DARWIN-NEXT:    ldr x0, [sp, #8]
122; DARWIN-NEXT:    ldr x18, [sp], #32 ; 8-byte Folded Reload
123; DARWIN-NEXT:    ret
124entry:
125  %ap = alloca ptr, align 8
126  call void @llvm.va_start(ptr %ap)
127  %ap2 = load ptr, ptr %ap, align 8
128  ret ptr %ap2
129}
130