blob: 1ceaf5ff516b31b0aa6f70c6bb44e4e1a42735a6 [file] [log] [blame]
Tim Northovere3d42362013-02-01 11:40:47 +00001; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s
Amara Emersonf80f95f2013-10-31 09:32:11 +00002; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=-fp-armv8 < %s | FileCheck --check-prefix=CHECK-NOFP %s
Tim Northovere0e3aef2013-01-31 12:12:40 +00003
4%va_list = type {i8*, i8*, i8*, i32, i32}
5
6@var = global %va_list zeroinitializer
7
8declare void @llvm.va_start(i8*)
9
10define void @test_simple(i32 %n, ...) {
Stephen Linf799e3f2013-07-13 20:38:47 +000011; CHECK-LABEL: test_simple:
Tim Northovere0e3aef2013-01-31 12:12:40 +000012; CHECK: sub sp, sp, #[[STACKSIZE:[0-9]+]]
13; CHECK: mov x[[FPRBASE:[0-9]+]], sp
14; CHECK: str q7, [x[[FPRBASE]], #112]
15; CHECK: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]]
16; CHECK: str x7, [x[[GPRBASE]], #48]
17
Amara Emersonf80f95f2013-10-31 09:32:11 +000018; CHECK-NOFP: sub sp, sp, #[[STACKSIZE:[0-9]+]]
Amara Emersonf80f95f2013-10-31 09:32:11 +000019; CHECK-NOFP: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]]
20; CHECK-NOFP: str x7, [x[[GPRBASE]], #48]
21; CHECK-NOFP-NOT: str q7,
22; CHECK-NOFP: str x1, [sp, #[[GPRFROMSP]]]
23
Tim Northovere0e3aef2013-01-31 12:12:40 +000024; Omit the middle ones
25
26; CHECK: str q0, [sp]
27; CHECK: str x1, [sp, #[[GPRFROMSP]]]
Nico Rieckb5262d62014-01-12 14:09:17 +000028; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
Tim Northovere0e3aef2013-01-31 12:12:40 +000029
Amara Emersonf80f95f2013-10-31 09:32:11 +000030; CHECK-NOFP-NOT: str q0, [sp]
Nico Rieckb5262d62014-01-12 14:09:17 +000031; CHECK-NOFP: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
Amara Emersonf80f95f2013-10-31 09:32:11 +000032
Tim Northovere0e3aef2013-01-31 12:12:40 +000033 %addr = bitcast %va_list* @var to i8*
34 call void @llvm.va_start(i8* %addr)
Tim Northovere0e3aef2013-01-31 12:12:40 +000035; CHECK: movn [[VR_OFFS:w[0-9]+]], #127
36; CHECK: str [[VR_OFFS]], [x[[VA_LIST]], #28]
37; CHECK: movn [[GR_OFFS:w[0-9]+]], #55
38; CHECK: str [[GR_OFFS]], [x[[VA_LIST]], #24]
39; CHECK: add [[VR_TOP:x[0-9]+]], x[[FPRBASE]], #128
40; CHECK: str [[VR_TOP]], [x[[VA_LIST]], #16]
41; CHECK: add [[GR_TOP:x[0-9]+]], x[[GPRBASE]], #56
42; CHECK: str [[GR_TOP]], [x[[VA_LIST]], #8]
43; CHECK: add [[STACK:x[0-9]+]], sp, #[[STACKSIZE]]
44; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
45
Amara Emersonf80f95f2013-10-31 09:32:11 +000046; CHECK-NOFP: str wzr, [x[[VA_LIST]], #28]
47; CHECK-NOFP: movn [[GR_OFFS:w[0-9]+]], #55
48; CHECK-NOFP: str [[GR_OFFS]], [x[[VA_LIST]], #24]
49; CHECK-NOFP: add [[GR_TOP:x[0-9]+]], x[[GPRBASE]], #56
50; CHECK-NOFP: str [[GR_TOP]], [x[[VA_LIST]], #8]
51; CHECK-NOFP: add [[STACK:x[0-9]+]], sp, #[[STACKSIZE]]
52; CHECK-NOFP: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
53
Tim Northovere0e3aef2013-01-31 12:12:40 +000054 ret void
55}
56
57define void @test_fewargs(i32 %n, i32 %n1, i32 %n2, float %m, ...) {
Stephen Linf799e3f2013-07-13 20:38:47 +000058; CHECK-LABEL: test_fewargs:
Tim Northovere0e3aef2013-01-31 12:12:40 +000059; CHECK: sub sp, sp, #[[STACKSIZE:[0-9]+]]
60; CHECK: mov x[[FPRBASE:[0-9]+]], sp
61; CHECK: str q7, [x[[FPRBASE]], #96]
62; CHECK: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]]
63; CHECK: str x7, [x[[GPRBASE]], #32]
64
Amara Emersonf80f95f2013-10-31 09:32:11 +000065; CHECK-NOFP: sub sp, sp, #[[STACKSIZE:[0-9]+]]
66; CHECK-NOFP-NOT: str q7,
67; CHECK-NOFP: mov x[[GPRBASE:[0-9]+]], sp
68; CHECK-NOFP: str x7, [x[[GPRBASE]], #24]
69
Tim Northovere0e3aef2013-01-31 12:12:40 +000070; Omit the middle ones
71
72; CHECK: str q1, [sp]
73; CHECK: str x3, [sp, #[[GPRFROMSP]]]
74
Amara Emersonf80f95f2013-10-31 09:32:11 +000075; CHECK-NOFP-NOT: str q1, [sp]
76; CHECK-NOFP: str x4, [sp]
77
Tim Northovere0e3aef2013-01-31 12:12:40 +000078 %addr = bitcast %va_list* @var to i8*
79 call void @llvm.va_start(i8* %addr)
80; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
81; CHECK: movn [[VR_OFFS:w[0-9]+]], #111
82; CHECK: str [[VR_OFFS]], [x[[VA_LIST]], #28]
83; CHECK: movn [[GR_OFFS:w[0-9]+]], #39
84; CHECK: str [[GR_OFFS]], [x[[VA_LIST]], #24]
85; CHECK: add [[VR_TOP:x[0-9]+]], x[[FPRBASE]], #112
86; CHECK: str [[VR_TOP]], [x[[VA_LIST]], #16]
87; CHECK: add [[GR_TOP:x[0-9]+]], x[[GPRBASE]], #40
88; CHECK: str [[GR_TOP]], [x[[VA_LIST]], #8]
89; CHECK: add [[STACK:x[0-9]+]], sp, #[[STACKSIZE]]
90; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
91
Amara Emersonf80f95f2013-10-31 09:32:11 +000092; CHECK-NOFP: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
93; CHECK-NOFP: str wzr, [x[[VA_LIST]], #28]
94; CHECK-NOFP: movn [[GR_OFFS:w[0-9]+]], #31
95; CHECK-NOFP: str [[GR_OFFS]], [x[[VA_LIST]], #24]
96; CHECK-NOFP: add [[GR_TOP:x[0-9]+]], x[[GPRBASE]], #32
97; CHECK-NOFP: str [[GR_TOP]], [x[[VA_LIST]], #8]
98; CHECK-NOFP: add [[STACK:x[0-9]+]], sp, #[[STACKSIZE]]
99; CHECK-NOFP: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
100
Tim Northovere0e3aef2013-01-31 12:12:40 +0000101 ret void
102}
103
104define void @test_nospare([8 x i64], [8 x float], ...) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000105; CHECK-LABEL: test_nospare:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000106
107 %addr = bitcast %va_list* @var to i8*
108 call void @llvm.va_start(i8* %addr)
109; CHECK-NOT: sub sp, sp
110; CHECK: mov [[STACK:x[0-9]+]], sp
111; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
112
Amara Emersonf80f95f2013-10-31 09:32:11 +0000113; CHECK-NOFP-NOT: sub sp, sp
114; CHECK-NOFP: add [[STACK:x[0-9]+]], sp, #64
115; CHECK-NOFP: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000116 ret void
117}
118
119; If there are non-variadic arguments on the stack (here two i64s) then the
120; __stack field should point just past them.
121define void @test_offsetstack([10 x i64], [3 x float], ...) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000122; CHECK-LABEL: test_offsetstack:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000123; CHECK: sub sp, sp, #80
124; CHECK: mov x[[FPRBASE:[0-9]+]], sp
125; CHECK: str q7, [x[[FPRBASE]], #64]
126
127; CHECK-NOT: str x{{[0-9]+}},
Amara Emersonf80f95f2013-10-31 09:32:11 +0000128
129; CHECK-NOFP-NOT: str q7,
130; CHECK-NOT: str x7,
131
Tim Northovere0e3aef2013-01-31 12:12:40 +0000132; Omit the middle ones
133
134; CHECK: str q3, [sp]
135
136 %addr = bitcast %va_list* @var to i8*
137 call void @llvm.va_start(i8* %addr)
138; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
139; CHECK: movn [[VR_OFFS:w[0-9]+]], #79
140; CHECK: str [[VR_OFFS]], [x[[VA_LIST]], #28]
141; CHECK: str wzr, [x[[VA_LIST]], #24]
142; CHECK: add [[VR_TOP:x[0-9]+]], x[[FPRBASE]], #80
143; CHECK: str [[VR_TOP]], [x[[VA_LIST]], #16]
144; CHECK: add [[STACK:x[0-9]+]], sp, #96
145; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
146
Amara Emersonf80f95f2013-10-31 09:32:11 +0000147; CHECK-NOFP: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
148; CHECK-NOFP: add [[STACK:x[0-9]+]], sp, #40
149; CHECK-NOFP: str [[STACK]], [{{x[0-9]+}}, #:lo12:var]
150; CHECK-NOFP: str wzr, [x[[VA_LIST]], #28]
151; CHECK-NOFP: str wzr, [x[[VA_LIST]], #24]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000152 ret void
153}
154
155declare void @llvm.va_end(i8*)
156
157define void @test_va_end() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000158; CHECK-LABEL: test_va_end:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000159; CHECK-NEXT: BB#0
Amara Emersonf80f95f2013-10-31 09:32:11 +0000160; CHECK-NOFP: BB#0
Tim Northovere0e3aef2013-01-31 12:12:40 +0000161
162 %addr = bitcast %va_list* @var to i8*
163 call void @llvm.va_end(i8* %addr)
164
165 ret void
166; CHECK-NEXT: ret
Amara Emersonf80f95f2013-10-31 09:32:11 +0000167; CHECK-NOFP-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +0000168}
169
170declare void @llvm.va_copy(i8* %dest, i8* %src)
171
172@second_list = global %va_list zeroinitializer
173
174define void @test_va_copy() {
Stephen Linf799e3f2013-07-13 20:38:47 +0000175; CHECK-LABEL: test_va_copy:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000176 %srcaddr = bitcast %va_list* @var to i8*
177 %dstaddr = bitcast %va_list* @second_list to i8*
178 call void @llvm.va_copy(i8* %dstaddr, i8* %srcaddr)
179
180; Check beginning and end again:
181
182; CHECK: ldr [[BLOCK:x[0-9]+]], [{{x[0-9]+}}, #:lo12:var]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000183; CHECK: add x[[SRC_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
Amara Emersonf80f95f2013-10-31 09:32:11 +0000184; CHECK-NOFP: ldr [[BLOCK:x[0-9]+]], [{{x[0-9]+}}, #:lo12:var]
185; CHECK-NOFP: add x[[SRC_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
Tim Northovere0e3aef2013-01-31 12:12:40 +0000186
Tim Northover1fdb0762013-10-09 07:53:57 +0000187; CHECK: str [[BLOCK]], [{{x[0-9]+}}, #:lo12:second_list]
188
Tim Northovere0e3aef2013-01-31 12:12:40 +0000189; CHECK: ldr [[BLOCK:x[0-9]+]], [x[[SRC_LIST]], #24]
Tim Northover1fdb0762013-10-09 07:53:57 +0000190; CHECK: add x[[DEST_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:second_list
191
Tim Northovere0e3aef2013-01-31 12:12:40 +0000192; CHECK: str [[BLOCK]], [x[[DEST_LIST]], #24]
193
Amara Emersonf80f95f2013-10-31 09:32:11 +0000194; CHECK-NOFP: str [[BLOCK]], [{{x[0-9]+}}, #:lo12:second_list]
195
196; CHECK-NOFP: ldr [[BLOCK:x[0-9]+]], [x[[SRC_LIST]], #24]
197; CHECK-NOFP: add x[[DEST_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:second_list
198
199; CHECK-NOFP: str [[BLOCK]], [x[[DEST_LIST]], #24]
200
Tim Northovere0e3aef2013-01-31 12:12:40 +0000201 ret void
202; CHECK: ret
Amara Emersonf80f95f2013-10-31 09:32:11 +0000203; CHECK-NOFP: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +0000204}