blob: fb2700e1c617b8dc84ec92384ad478e4e950feca [file] [log] [blame]
Lei Huang5bab6462018-07-05 06:29:28 +00001; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
2; RUN: -enable-ppc-quad-precision -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mcpu=pwr9 -mtriple=powerpc64-unknown-unknown \
Lei Huang9d70afb2018-07-05 06:51:38 +00004; RUN: -enable-ppc-quad-precision -verify-machineinstrs < %s \
5; RUN: | FileCheck -check-prefix=CHECK-BE %s
6
7; Testing homogeneous aggregates.
8
9%struct.With9fp128params = type { fp128, fp128, fp128, fp128, fp128, fp128,
10 fp128, fp128, fp128 }
11
12@a1 = common local_unnamed_addr global [3 x fp128] zeroinitializer, align 16
13
14; Function Attrs: norecurse nounwind readonly
15define fp128 @testArray_01(fp128* nocapture readonly %sa) {
16; CHECK-LABEL: testArray_01:
17; CHECK: # %bb.0: # %entry
18; CHECK-NEXT: lxv 34, 32(3)
19; CHECK-NEXT: blr
20
21; CHECK-BE-LABEL: testArray_01:
22; CHECK-BE: lxv 34, 32(3)
23; CHECK-BE-NEXT: blr
24entry:
25 %arrayidx = getelementptr inbounds fp128, fp128* %sa, i64 2
26 %0 = load fp128, fp128* %arrayidx, align 16
27 ret fp128 %0
28}
29
30; Function Attrs: norecurse nounwind readonly
31define fp128 @testArray_02() {
32; CHECK-LABEL: testArray_02:
33; CHECK: # %bb.0: # %entry
34; CHECK-NEXT: addis 3, 2, .LC0@toc@ha
35; CHECK-NEXT: ld 3, .LC0@toc@l(3)
36; CHECK-NEXT: lxv 34, 32(3)
37; CHECK-NEXT: blr
38
39; CHECK-BE-LABEL: testArray_02:
40; CHECK-BE: lxv 34, 32(3)
41; CHECK-BE-NEXT: blr
42entry:
43 %0 = load fp128, fp128* getelementptr inbounds ([3 x fp128], [3 x fp128]* @a1,
44 i64 0, i64 2), align 16
45 ret fp128 %0
46}
47
48; Function Attrs: norecurse nounwind readnone
49define fp128 @testStruct_01(fp128 inreg returned %a.coerce) {
50; CHECK-LABEL: testStruct_01:
51; CHECK: # %bb.0: # %entry
52; CHECK-NEXT: blr
53
54; CHECK-BE-LABEL: testStruct_01:
55; CHECK-BE: # %bb.0: # %entry
56; CHECK-BE-NEXT: blr
57entry:
58 ret fp128 %a.coerce
59}
60
61; Function Attrs: norecurse nounwind readnone
62define fp128 @testStruct_02([8 x fp128] %a.coerce) {
63; CHECK-LABEL: testStruct_02:
64; CHECK: # %bb.0: # %entry
65; CHECK-NEXT: vmr 2, 9
66; CHECK-NEXT: blr
67
68; CHECK-BE-LABEL: testStruct_02:
69; CHECK-BE: vmr 2, 9
70; CHECK-BE-NEXT: blr
71entry:
72 %a.coerce.fca.7.extract = extractvalue [8 x fp128] %a.coerce, 7
73 ret fp128 %a.coerce.fca.7.extract
74}
75
76; Since we can only pass a max of 8 float128 value in VSX registers, ensure we
77; store to stack if passing more.
78; Function Attrs: norecurse nounwind readonly
79define fp128 @testStruct_03(%struct.With9fp128params* byval nocapture readonly
80 align 16 %a) {
81; CHECK-LABEL: testStruct_03:
82; CHECK: # %bb.0: # %entry
83; CHECK-NEXT: lxv 34, 128(1)
84; CHECK-NEXT: std 10, 88(1)
85; CHECK-NEXT: std 9, 80(1)
86; CHECK-NEXT: std 8, 72(1)
87; CHECK-NEXT: std 7, 64(1)
88; CHECK-NEXT: std 6, 56(1)
89; CHECK-NEXT: std 5, 48(1)
90; CHECK-NEXT: std 4, 40(1)
91; CHECK-NEXT: std 3, 32(1)
92; CHECK-NEXT: blr
93
94; CHECK-BE-LABEL: testStruct_03:
95; CHECK-BE: # %bb.0: # %entry
96; CHECK-BE-NEXT: lxv 34, 144(1)
97; CHECK-BE-NEXT: std 10, 104(1)
98; CHECK-BE-NEXT: std 9, 96(1)
99; CHECK-BE-NEXT: std 8, 88(1)
100; CHECK-BE-NEXT: std 7, 80(1)
101; CHECK-BE-NEXT: std 6, 72(1)
102; CHECK-BE-NEXT: std 5, 64(1)
103; CHECK-BE-NEXT: std 4, 56(1)
104; CHECK-BE-NEXT: std 3, 48(1)
105; CHECK-BE-NEXT: blr
106entry:
107 %a7 = getelementptr inbounds %struct.With9fp128params,
108 %struct.With9fp128params* %a, i64 0, i32 6
109 %0 = load fp128, fp128* %a7, align 16
110 ret fp128 %0
111}
112
113; Function Attrs: norecurse nounwind readnone
114define fp128 @testStruct_04([8 x fp128] %a.coerce) {
115; CHECK-LABEL: testStruct_04:
116; CHECK: # %bb.0: # %entry
117; CHECK-NEXT: vmr 2, 5
118; CHECK-NEXT: blr
119
120; CHECK-BE-LABEL: testStruct_04:
121; CHECK-BE: vmr 2, 5
122; CHECK-BE-NEXT: blr
123entry:
124 %a.coerce.fca.3.extract = extractvalue [8 x fp128] %a.coerce, 3
125 ret fp128 %a.coerce.fca.3.extract
126}
127
128; Function Attrs: norecurse nounwind readnone
129define fp128 @testHUnion_01([1 x fp128] %a.coerce) {
130; CHECK-LABEL: testHUnion_01:
131; CHECK: # %bb.0: # %entry
132; CHECK-NEXT: blr
133
134; CHECK-BE-LABEL: testHUnion_01:
135; CHECK-BE: # %bb.0: # %entry
136; CHECK-BE-NEXT: blr
137entry:
138 %a.coerce.fca.0.extract = extractvalue [1 x fp128] %a.coerce, 0
139 ret fp128 %a.coerce.fca.0.extract
140}
141
142; Function Attrs: norecurse nounwind readnone
143define fp128 @testHUnion_02([3 x fp128] %a.coerce) {
144; CHECK-LABEL: testHUnion_02:
145; CHECK: # %bb.0: # %entry
146; CHECK-NEXT: blr
147
148; CHECK-BE-LABEL: testHUnion_02:
149; CHECK-BE: # %bb.0: # %entry
150; CHECK-BE-NEXT: blr
151entry:
152 %a.coerce.fca.0.extract = extractvalue [3 x fp128] %a.coerce, 0
153 ret fp128 %a.coerce.fca.0.extract
154}
155
156; Function Attrs: norecurse nounwind readnone
157define fp128 @testHUnion_03([3 x fp128] %a.coerce) {
158; CHECK-LABEL: testHUnion_03:
159; CHECK: # %bb.0: # %entry
160; CHECK-NEXT: vmr 2, 3
161; CHECK-NEXT: blr
162
163; CHECK-BE-LABEL: testHUnion_03:
164; CHECK-BE: # %bb.0: # %entry
165; CHECK-BE-NEXT: vmr 2, 3
166; CHECK-BE-NEXT: blr
167entry:
168 %a.coerce.fca.1.extract = extractvalue [3 x fp128] %a.coerce, 1
169 ret fp128 %a.coerce.fca.1.extract
170}
171
172; Function Attrs: norecurse nounwind readnone
173define fp128 @testHUnion_04([3 x fp128] %a.coerce) {
174; CHECK-LABEL: testHUnion_04:
175; CHECK: # %bb.0: # %entry
176; CHECK-NEXT: vmr 2, 4
177; CHECK-NEXT: blr
178
179; CHECK-BE-LABEL: testHUnion_04:
180; CHECK-BE: # %bb.0: # %entry
181; CHECK-BE-NEXT: vmr 2, 4
182; CHECK-BE-NEXT: blr
183entry:
184 %a.coerce.fca.2.extract = extractvalue [3 x fp128] %a.coerce, 2
185 ret fp128 %a.coerce.fca.2.extract
186}
187
188; Testing mixed member aggregates.
Lei Huang5bab6462018-07-05 06:29:28 +0000189
190%struct.MixedC = type { i32, %struct.SA, float, [12 x i8] }
191%struct.SA = type { double, fp128, <4 x float> }
192
193; Function Attrs: norecurse nounwind readnone
194define fp128 @testMixedAggregate([3 x i128] %a.coerce) {
195; CHECK-LABEL: testMixedAggregate:
196; CHECK: # %bb.0: # %entry
197; CHECK-NEXT: mtvsrdd 34, 8, 7
198; CHECK-NEXT: blr
199
200; CHECK-BE-LABEL: testMixedAggregate:
201; CHECK-BE: mtvsrdd 34, 8, 7
202; CHECK-BE-NEXT: blr
203entry:
204 %a.coerce.fca.2.extract = extractvalue [3 x i128] %a.coerce, 2
205 %0 = bitcast i128 %a.coerce.fca.2.extract to fp128
206 ret fp128 %0
207}
208
209; Function Attrs: norecurse nounwind readnone
210define fp128 @testMixedAggregate_02([4 x i128] %a.coerce) {
211; CHECK-LABEL: testMixedAggregate_02:
212; CHECK: # %bb.0: # %entry
213; CHECK-NEXT: mtvsrdd 34, 6, 5
214; CHECK-NEXT: blr
215
216; CHECK-BE-LABEL: testMixedAggregate_02:
217; CHECK-BE: mtvsrdd 34, 6, 5
218; CHECK-BE-NEXT: blr
219entry:
220 %a.coerce.fca.1.extract = extractvalue [4 x i128] %a.coerce, 1
221 %0 = bitcast i128 %a.coerce.fca.1.extract to fp128
222 ret fp128 %0
223}
224
225; Function Attrs: norecurse nounwind readnone
226define fp128 @testMixedAggregate_03([4 x i128] %sa.coerce) {
227; CHECK-LABEL: testMixedAggregate_03:
228; CHECK: # %bb.0: # %entry
229; CHECK-DAG: mtvsrwa 34, 3
230; CHECK-DAG: mtvsrdd 35, 6, 5
231; CHECK: mtvsrd 36, 10
232; CHECK: xscvsdqp 2, 2
233; CHECK-DAG: xscvsdqp [[REG:[0-9]+]], 4
234; CHECK-DAG: xsaddqp 2, 3, 2
235; CHECK: xsaddqp 2, 2, [[REG]]
236; CHECK-NEXT: blr
237entry:
238 %sa.coerce.fca.0.extract = extractvalue [4 x i128] %sa.coerce, 0
239 %sa.sroa.0.0.extract.trunc = trunc i128 %sa.coerce.fca.0.extract to i32
240 %sa.coerce.fca.1.extract = extractvalue [4 x i128] %sa.coerce, 1
241 %sa.coerce.fca.3.extract = extractvalue [4 x i128] %sa.coerce, 3
242 %sa.sroa.6.48.extract.shift = lshr i128 %sa.coerce.fca.3.extract, 64
243 %sa.sroa.6.48.extract.trunc = trunc i128 %sa.sroa.6.48.extract.shift to i64
244 %conv = sitofp i32 %sa.sroa.0.0.extract.trunc to fp128
245 %0 = bitcast i128 %sa.coerce.fca.1.extract to fp128
246 %add = fadd fp128 %0, %conv
247 %conv2 = sitofp i64 %sa.sroa.6.48.extract.trunc to fp128
248 %add3 = fadd fp128 %add, %conv2
249 ret fp128 %add3
250}
251
252
253; Function Attrs: norecurse nounwind readonly
254define fp128 @testNestedAggregate(%struct.MixedC* byval nocapture readonly align 16 %a) {
255; CHECK-LABEL: testNestedAggregate:
256; CHECK: # %bb.0: # %entry
257; CHECK-NEXT: std 8, 72(1)
258; CHECK-NEXT: std 7, 64(1)
259; CHECK-NEXT: std 10, 88(1)
260; CHECK-NEXT: std 9, 80(1)
261; CHECK-NEXT: lxv 34, 64(1)
262; CHECK-NEXT: std 6, 56(1)
263; CHECK-NEXT: std 5, 48(1)
264; CHECK-NEXT: std 4, 40(1)
265; CHECK-NEXT: std 3, 32(1)
266; CHECK-NEXT: blr
267
268; CHECK-BE-LABEL: testNestedAggregate:
269; CHECK-BE: # %bb.0: # %entry
270; CHECK-BE-NEXT: std 8, 88(1)
271; CHECK-BE-NEXT: std 7, 80(1)
272; CHECK-BE-NEXT: std 10, 104(1)
273; CHECK-BE-NEXT: std 9, 96(1)
274; CHECK-BE-NEXT: lxv 34, 80(1)
275; CHECK-BE-NEXT: std 6, 72(1)
276; CHECK-BE-NEXT: std 5, 64(1)
277; CHECK-BE-NEXT: std 4, 56(1)
278; CHECK-BE-NEXT: std 3, 48(1)
279; CHECK-BE-NEXT: blr
280entry:
281 %c = getelementptr inbounds %struct.MixedC, %struct.MixedC* %a, i64 0, i32 1, i32 1
282 %0 = load fp128, fp128* %c, align 16
283 ret fp128 %0
284}
285
286; Function Attrs: norecurse nounwind readnone
287define fp128 @testUnion_01([1 x i128] %a.coerce) {
288; CHECK-LABEL: testUnion_01:
289; CHECK: # %bb.0: # %entry
290; CHECK-NEXT: mtvsrdd 34, 4, 3
291; CHECK-NEXT: blr
292
293; CHECK-BE-LABEL: testUnion_01:
294; CHECK-BE: mtvsrdd 34, 4, 3
295; CHECK-BE-NEXT: blr
296entry:
297 %a.coerce.fca.0.extract = extractvalue [1 x i128] %a.coerce, 0
298 %0 = bitcast i128 %a.coerce.fca.0.extract to fp128
299 ret fp128 %0
300}
301
302; Function Attrs: norecurse nounwind readnone
303define fp128 @testUnion_02([1 x i128] %a.coerce) {
304; CHECK-LABEL: testUnion_02:
305; CHECK: # %bb.0: # %entry
306; CHECK-NEXT: mtvsrdd 34, 4, 3
307; CHECK-NEXT: blr
308
309; CHECK-BE-LABEL: testUnion_02:
310; CHECK-BE: mtvsrdd 34, 4, 3
311; CHECK-BE-NEXT: blr
312entry:
313 %a.coerce.fca.0.extract = extractvalue [1 x i128] %a.coerce, 0
314 %0 = bitcast i128 %a.coerce.fca.0.extract to fp128
315 ret fp128 %0
316}
317
318; Function Attrs: norecurse nounwind readnone
319define fp128 @testUnion_03([4 x i128] %a.coerce) {
320; CHECK-LABEL: testUnion_03:
321; CHECK: # %bb.0: # %entry
322; CHECK-NEXT: mtvsrdd 34, 8, 7
323; CHECK-NEXT: blr
324
325; CHECK-BE-LABEL: testUnion_03:
326; CHECK-BE: mtvsrdd 34, 8, 7
327; CHECK-BE-NEXT: blr
328entry:
329 %a.coerce.fca.2.extract = extractvalue [4 x i128] %a.coerce, 2
330 %0 = bitcast i128 %a.coerce.fca.2.extract to fp128
331 ret fp128 %0
332}
333
334; Function Attrs: nounwind
335define fp128 @sum_float128(i32 signext %count, ...) {
336; CHECK-LABEL: sum_float128:
337; CHECK: # %bb.0: # %entry
Lei Huang9d70afb2018-07-05 06:51:38 +0000338; CHECK-NEXT: addis 11, 2, .LCPI17_0@toc@ha
Lei Huang5bab6462018-07-05 06:29:28 +0000339; CHECK-NEXT: cmpwi 0, 3, 1
340; CHECK-NEXT: std 10, 88(1)
341; CHECK-NEXT: std 9, 80(1)
342; CHECK-NEXT: std 8, 72(1)
343; CHECK-NEXT: std 7, 64(1)
344; CHECK-NEXT: std 6, 56(1)
345; CHECK-NEXT: std 5, 48(1)
346; CHECK-NEXT: std 4, 40(1)
Lei Huang9d70afb2018-07-05 06:51:38 +0000347; CHECK-NEXT: addi 11, 11, .LCPI17_0@toc@l
Lei Huang5bab6462018-07-05 06:29:28 +0000348; CHECK-NEXT: lxvx 34, 0, 11
349; CHECK-NEXT: bltlr 0
350; CHECK-NEXT: # %bb.1: # %if.end
351; CHECK-NEXT: addi 3, 1, 40
352; CHECK-NEXT: lxvx 35, 0, 3
353; CHECK-NEXT: xsaddqp 2, 3, 2
354; CHECK-NEXT: lxv 35, 16(3)
355; CHECK-NEXT: addi 3, 1, 72
356; CHECK-NEXT: std 3, -8(1)
357; CHECK-NEXT: xsaddqp 2, 2, 3
358; CHECK-NEXT: blr
359entry:
360 %ap = alloca i8*, align 8
361 %0 = bitcast i8** %ap to i8*
362 call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0) #2
363 %cmp = icmp slt i32 %count, 1
364 br i1 %cmp, label %cleanup, label %if.end
365
366if.end: ; preds = %entry
367 call void @llvm.va_start(i8* nonnull %0)
368 %argp.cur = load i8*, i8** %ap, align 8
369 %argp.next = getelementptr inbounds i8, i8* %argp.cur, i64 16
370 %1 = bitcast i8* %argp.cur to fp128*
371 %2 = load fp128, fp128* %1, align 8
372 %add = fadd fp128 %2, 0xL00000000000000000000000000000000
373 %argp.next3 = getelementptr inbounds i8, i8* %argp.cur, i64 32
374 store i8* %argp.next3, i8** %ap, align 8
375 %3 = bitcast i8* %argp.next to fp128*
376 %4 = load fp128, fp128* %3, align 8
377 %add4 = fadd fp128 %add, %4
378 call void @llvm.va_end(i8* nonnull %0)
379 br label %cleanup
380
381cleanup: ; preds = %entry, %if.end
382 %retval.0 = phi fp128 [ %add4, %if.end ], [ 0xL00000000000000000000000000000000, %entry ]
383 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %0) #2
384 ret fp128 %retval.0
385}
386
387declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
388declare void @llvm.va_start(i8*) #2
389declare void @llvm.va_end(i8*) #2
390declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1