blob: 42949685e3cc9ee737e07978fb00fe7625c76b53 [file] [log] [blame]
Lei Huang10367eb2018-04-12 18:00:14 +00001; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
Lei Huang198e6782018-04-18 16:34:22 +00002; RUN: -enable-ppc-quad-precision -ppc-vsr-nums-as-vr \
3; RUN: -verify-machineinstrs < %s | FileCheck %s
Lei Huang10367eb2018-04-12 18:00:14 +00004
5@mem = global [5 x i64] [i64 56, i64 63, i64 3, i64 5, i64 6], align 8
6@umem = global [5 x i64] [i64 560, i64 100, i64 34, i64 2, i64 5], align 8
7@swMem = global [5 x i32] [i32 5, i32 2, i32 3, i32 4, i32 0], align 4
Lei Huang198e6782018-04-18 16:34:22 +00008@uwMem = global [5 x i32] [i32 5, i32 2, i32 3, i32 4, i32 0], align 4
Lei Huang192c6cc2018-04-18 17:41:46 +00009@uhwMem = local_unnamed_addr global [5 x i16] [i16 5, i16 2, i16 3, i16 4, i16 0], align 2
10@ubMem = local_unnamed_addr global [5 x i8] c"\05\02\03\04\00", align 1
Lei Huang10367eb2018-04-12 18:00:14 +000011
12; Function Attrs: norecurse nounwind
13define void @sdwConv2qp(fp128* nocapture %a, i64 %b) {
14entry:
15 %conv = sitofp i64 %b to fp128
16 store fp128 %conv, fp128* %a, align 16
17 ret void
18
19; CHECK-LABEL: sdwConv2qp
20; CHECK: mtvsrd [[REG:[0-9]+]], 4
21; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
22; CHECK-NEXT: stxv [[CONV]], 0(3)
23; CHECK-NEXT: blr
24}
25
26; Function Attrs: norecurse nounwind
27define void @sdwConv2qp_02(fp128* nocapture %a) {
28entry:
29 %0 = load i64, i64* getelementptr inbounds
30 ([5 x i64], [5 x i64]* @mem, i64 0, i64 2), align 8
31 %conv = sitofp i64 %0 to fp128
32 store fp128 %conv, fp128* %a, align 16
33 ret void
34
35; CHECK-LABEL: sdwConv2qp_02
36; CHECK: addis [[REG:[0-9]+]], 2, .LC0@toc@ha
37; CHECK: ld [[REG]], .LC0@toc@l([[REG]])
38; CHECK: lxsd [[REG0:[0-9]+]], 16([[REG]])
39; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG0]]
40; CHECK-NEXT: stxv [[CONV]], 0(3)
41; CHECK-NEXT: blr
42}
43
44; Function Attrs: norecurse nounwind
45define void @sdwConv2qp_03(fp128* nocapture %a, i64* nocapture readonly %b) {
46entry:
47 %0 = load i64, i64* %b, align 8
48 %conv = sitofp i64 %0 to fp128
49 store fp128 %conv, fp128* %a, align 16
50 ret void
51
52; CHECK-LABEL: sdwConv2qp_03
53; CHECK-NOT: ld
54; CHECK: lxsd [[REG0:[0-9]+]], 0(4)
55; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG0]]
56; CHECK-NEXT: stxv [[CONV]], 0(3)
57; CHECK-NEXT: blr
58}
59
60; Function Attrs: norecurse nounwind
61define void @udwConv2qp(fp128* nocapture %a, i64 %b) {
62entry:
63 %conv = uitofp i64 %b to fp128
64 store fp128 %conv, fp128* %a, align 16
65 ret void
66
67; CHECK-LABEL: udwConv2qp
68; CHECK: mtvsrd [[REG:[0-9]+]], 4
69; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
70; CHECK-NEXT: stxv [[CONV]], 0(3)
71; CHECK-NEXT: blr
72}
73
74; Function Attrs: norecurse nounwind
75define void @udwConv2qp_02(fp128* nocapture %a) {
76entry:
77 %0 = load i64, i64* getelementptr inbounds
78 ([5 x i64], [5 x i64]* @umem, i64 0, i64 4), align 8
79 %conv = uitofp i64 %0 to fp128
80 store fp128 %conv, fp128* %a, align 16
81 ret void
82
83; CHECK-LABEL: udwConv2qp_02
84; CHECK: addis [[REG:[0-9]+]], 2, .LC1@toc@ha
85; CHECK: ld [[REG]], .LC1@toc@l([[REG]])
86; CHECK: lxsd [[REG0:[0-9]+]], 32([[REG]])
87; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG0]]
88; CHECK-NEXT: stxv [[CONV]], 0(3)
89; CHECK-NEXT: blr
90}
91
92; Function Attrs: norecurse nounwind
93define void @udwConv2qp_03(fp128* nocapture %a, i64* nocapture readonly %b) {
94entry:
95 %0 = load i64, i64* %b, align 8
96 %conv = uitofp i64 %0 to fp128
97 store fp128 %conv, fp128* %a, align 16
98 ret void
99
100; CHECK-LABEL: udwConv2qp_03
101; CHECK-NOT: ld
102; CHECK: lxsd [[REG:[0-9]+]], 0(4)
103; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
104; CHECK-NEXT: stxv [[CONV]], 0(3)
105; CHECK-NEXT: blr
106}
107
108; Function Attrs: norecurse nounwind
Lei Huang829cd8e2018-04-18 20:22:26 +0000109define fp128* @sdwConv2qp_testXForm(fp128* returned %sink,
110 i8* nocapture readonly %a) {
Lei Huang10367eb2018-04-12 18:00:14 +0000111entry:
Lei Huang829cd8e2018-04-18 20:22:26 +0000112 %add.ptr = getelementptr inbounds i8, i8* %a, i64 73333
Lei Huang10367eb2018-04-12 18:00:14 +0000113 %0 = bitcast i8* %add.ptr to i64*
114 %1 = load i64, i64* %0, align 8
115 %conv = sitofp i64 %1 to fp128
116 store fp128 %conv, fp128* %sink, align 16
Lei Huang829cd8e2018-04-18 20:22:26 +0000117 ret fp128* %sink
Lei Huang10367eb2018-04-12 18:00:14 +0000118
119; CHECK-LABEL: sdwConv2qp_testXForm
Lei Huang829cd8e2018-04-18 20:22:26 +0000120; CHECK: lxsdx [[REG:[0-9]+]],
121; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
Lei Huang10367eb2018-04-12 18:00:14 +0000122; CHECK-NEXT: stxv [[CONV]], 0(3)
123; CHECK-NEXT: blr
124}
125
126; Function Attrs: norecurse nounwind
Lei Huang829cd8e2018-04-18 20:22:26 +0000127define fp128* @udwConv2qp_testXForm(fp128* returned %sink,
128 i8* nocapture readonly %a) {
Lei Huang10367eb2018-04-12 18:00:14 +0000129entry:
Lei Huang829cd8e2018-04-18 20:22:26 +0000130 %add.ptr = getelementptr inbounds i8, i8* %a, i64 73333
Lei Huang10367eb2018-04-12 18:00:14 +0000131 %0 = bitcast i8* %add.ptr to i64*
132 %1 = load i64, i64* %0, align 8
133 %conv = uitofp i64 %1 to fp128
134 store fp128 %conv, fp128* %sink, align 16
Lei Huang829cd8e2018-04-18 20:22:26 +0000135 ret fp128* %sink
Lei Huang10367eb2018-04-12 18:00:14 +0000136
137; CHECK-LABEL: udwConv2qp_testXForm
Lei Huang829cd8e2018-04-18 20:22:26 +0000138; CHECK: lxsdx [[REG:[0-9]+]],
139; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
Lei Huang10367eb2018-04-12 18:00:14 +0000140; CHECK-NEXT: stxv [[CONV]], 0(3)
141; CHECK-NEXT: blr
142}
Lei Huang198e6782018-04-18 16:34:22 +0000143
144; Function Attrs: norecurse nounwind
145define void @swConv2qp(fp128* nocapture %a, i32 signext %b) {
146entry:
147 %conv = sitofp i32 %b to fp128
148 store fp128 %conv, fp128* %a, align 16
149 ret void
150
151; CHECK-LABEL: swConv2qp
152; CHECK-NOT: lwz
Lei Huang829cd8e2018-04-18 20:22:26 +0000153; CHECK: mtvsrwa [[REG:[0-9]+]], 4
154; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
Lei Huang198e6782018-04-18 16:34:22 +0000155; CHECK-NEXT: stxv [[CONV]], 0(3)
156; CHECK-NEXT: blr
157}
158
159; Function Attrs: norecurse nounwind
160define void @swConv2qp_02(fp128* nocapture %a, i32* nocapture readonly %b) {
161entry:
162 %0 = load i32, i32* %b, align 4
163 %conv = sitofp i32 %0 to fp128
164 store fp128 %conv, fp128* %a, align 16
165 ret void
166
167; CHECK-LABEL: swConv2qp_02
168; CHECK-NOT: lwz
169; CHECK: lxsiwax [[REG:[0-9]+]], 0, 4
170; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
171; CHECK-NEXT: stxv [[CONV]], 0(3)
172; CHECK-NEXT: blr
173}
174
175; Function Attrs: norecurse nounwind
176define void @swConv2qp_03(fp128* nocapture %a) {
177entry:
178 %0 = load i32, i32* getelementptr inbounds
179 ([5 x i32], [5 x i32]* @swMem, i64 0, i64 3), align 4
180 %conv = sitofp i32 %0 to fp128
181 store fp128 %conv, fp128* %a, align 16
182 ret void
183
184; CHECK-LABEL: swConv2qp_03
185; CHECK: addis [[REG:[0-9]+]], 2, .LC2@toc@ha
186; CHECK: ld [[REG]], .LC2@toc@l([[REG]])
187; CHECK: addi [[REG2:[0-9]+]], [[REG]], 12
188; CHECK: lxsiwax [[REG0:[0-9]+]], 0, [[REG2]]
189; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG0]]
190; CHECK-NEXT: stxv [[CONV]], 0(3)
191; CHECK-NEXT: blr
192}
193
194; Function Attrs: norecurse nounwind
195define void @uwConv2qp(fp128* nocapture %a, i32 zeroext %b) {
196entry:
197 %conv = uitofp i32 %b to fp128
198 store fp128 %conv, fp128* %a, align 16
199 ret void
200
201; CHECK-LABEL: uwConv2qp
202; CHECK-NOT: lwz
203; CHECK: mtvsrwz [[REG:[0-9]+]], 4
204; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
205; CHECK-NEXT: stxv [[CONV]], 0(3)
206; CHECK-NEXT: blr
207}
208
209; Function Attrs: norecurse nounwind
210define void @uwConv2qp_02(fp128* nocapture %a, i32* nocapture readonly %b) {
211entry:
212 %0 = load i32, i32* %b, align 4
213 %conv = uitofp i32 %0 to fp128
214 store fp128 %conv, fp128* %a, align 16
215 ret void
216
217; CHECK-LABEL: uwConv2qp_02
218; CHECK-NOT: lwz
219; CHECK: lxsiwzx [[REG:[0-9]+]], 0, 4
220; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
221; CHECK-NEXT: stxv [[CONV]], 0(3)
222; CHECK-NEXT: blr
223}
224
225; Function Attrs: norecurse nounwind
226define void @uwConv2qp_03(fp128* nocapture %a) {
227entry:
228 %0 = load i32, i32* getelementptr inbounds
229 ([5 x i32], [5 x i32]* @uwMem, i64 0, i64 3), align 4
230 %conv = uitofp i32 %0 to fp128
231 store fp128 %conv, fp128* %a, align 16
232 ret void
233
234; CHECK-LABEL: uwConv2qp_03
235; CHECK: addis [[REG:[0-9]+]], 2, .LC3@toc@ha
236; CHECK-NEXT: ld [[REG]], .LC3@toc@l([[REG]])
237; CHECK-NEXT: addi [[REG2:[0-9]+]], [[REG]], 12
238; CHECK-NEXT: lxsiwzx [[REG1:[0-9]+]], 0, [[REG2]]
239; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG1]]
240; CHECK-NEXT: stxv [[CONV]], 0(3)
241; CHECK-NEXT: blr
242}
243
244; Function Attrs: norecurse nounwind
245define void @uwConv2qp_04(fp128* nocapture %a,
246 i32 zeroext %b, i32* nocapture readonly %c) {
247entry:
248 %0 = load i32, i32* %c, align 4
249 %add = add i32 %0, %b
250 %conv = uitofp i32 %add to fp128
251 store fp128 %conv, fp128* %a, align 16
252 ret void
253
254; CHECK-LABEL: uwConv2qp_04
255; CHECK: lwz [[REG:[0-9]+]], 0(5)
256; CHECK-NEXT: add [[REG1:[0-9]+]], [[REG]], [[REG1]]
257; CHECK-NEXT: mtvsrwz [[REG0:[0-9]+]], [[REG1]]
258; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG0]]
259; CHECK-NEXT: stxv [[CONV]], 0(3)
260; CHECK-NEXT: blr
261}
262
263; Function Attrs: norecurse nounwind
Lei Huang192c6cc2018-04-18 17:41:46 +0000264define void @uhwConv2qp(fp128* nocapture %a, i16 zeroext %b) {
265entry:
266 %conv = uitofp i16 %b to fp128
267 store fp128 %conv, fp128* %a, align 16
268 ret void
269
270
271; CHECK-LABEL: uhwConv2qp
272; CHECK: mtvsrwz [[REG:[0-9]+]], 4
273; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
274; CHECK-NEXT: stxv [[CONV]], 0(3)
275; CHECK-NEXT: blr
276}
277
278; Function Attrs: norecurse nounwind
279define void @uhwConv2qp_02(fp128* nocapture %a, i16* nocapture readonly %b) {
280entry:
281 %0 = load i16, i16* %b, align 2
282 %conv = uitofp i16 %0 to fp128
283 store fp128 %conv, fp128* %a, align 16
284 ret void
285
286; CHECK-LABEL: uhwConv2qp_02
287; CHECK: lxsihzx [[REG:[0-9]+]], 0, 4
288; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
289; CHECK-NEXT: stxv [[CONV]], 0(3)
290; CHECK-NEXT: blr
291}
292
293; Function Attrs: norecurse nounwind
294define void @uhwConv2qp_03(fp128* nocapture %a) {
295entry:
296 %0 = load i16, i16* getelementptr inbounds
297 ([5 x i16], [5 x i16]* @uhwMem, i64 0, i64 3), align 2
298 %conv = uitofp i16 %0 to fp128
299 store fp128 %conv, fp128* %a, align 16
300 ret void
301
302; CHECK-LABEL: uhwConv2qp_03
303; CHECK: addis [[REG0:[0-9]+]], 2, .LC4@toc@ha
304; CHECK: ld [[REG0]], .LC4@toc@l([[REG0]])
305; CHECK: addi [[REG0]], [[REG0]], 6
306; CHECK: lxsihzx [[REG:[0-9]+]], 0, [[REG0]]
307; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
308; CHECK-NEXT: stxv [[CONV]], 0(3)
309; CHECK-NEXT: blr
310}
311
312; Function Attrs: norecurse nounwind
313define void @uhwConv2qp_04(fp128* nocapture %a, i16 zeroext %b,
314 i16* nocapture readonly %c) {
315entry:
316 %conv = zext i16 %b to i32
317 %0 = load i16, i16* %c, align 2
318 %conv1 = zext i16 %0 to i32
319 %add = add nuw nsw i32 %conv1, %conv
320 %conv2 = sitofp i32 %add to fp128
321 store fp128 %conv2, fp128* %a, align 16
322 ret void
323
324; CHECK-LABEL: uhwConv2qp_04
325; CHECK: lhz [[REG0:[0-9]+]], 0(5)
326; CHECK: add 4, [[REG0]], 4
327; CHECK: mtvsrwa [[REG:[0-9]+]], 4
328; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
329; CHECK-NEXT: stxv [[CONV]], 0(3)
330; CHECK-NEXT: blr
331}
332
333; Function Attrs: norecurse nounwind
334define void @ubConv2qp(fp128* nocapture %a, i8 zeroext %b) {
335entry:
336 %conv = uitofp i8 %b to fp128
337 store fp128 %conv, fp128* %a, align 16
338 ret void
339
340; CHECK-LABEL: ubConv2qp
341; CHECK: mtvsrwz [[REG:[0-9]+]], 4
342; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
343; CHECK-NEXT: stxv [[CONV]], 0(3)
344; CHECK-NEXT: blr
345}
346
347; Function Attrs: norecurse nounwind
348define void @ubConv2qp_02(fp128* nocapture %a, i8* nocapture readonly %b) {
349entry:
350 %0 = load i8, i8* %b, align 1
351 %conv = uitofp i8 %0 to fp128
352 store fp128 %conv, fp128* %a, align 16
353 ret void
354
355; CHECK-LABEL: ubConv2qp_02
356; CHECK: lxsibzx [[REG:[0-9]+]], 0, 4
357; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
358; CHECK-NEXT: stxv [[CONV]], 0(3)
359; CHECK-NEXT: blr
360}
361
362; Function Attrs: norecurse nounwind
363define void @ubConv2qp_03(fp128* nocapture %a) {
364entry:
365 %0 = load i8, i8* getelementptr inbounds
366 ([5 x i8], [5 x i8]* @ubMem, i64 0, i64 2), align 1
367 %conv = uitofp i8 %0 to fp128
368 store fp128 %conv, fp128* %a, align 16
369 ret void
370
371; CHECK-LABEL: ubConv2qp_03
372; CHECK: addis [[REG0:[0-9]+]], 2, .LC5@toc@ha
373; CHECK: ld [[REG0]], .LC5@toc@l([[REG0]])
374; CHECK: addi [[REG0]], [[REG0]], 2
375; CHECK: lxsibzx [[REG:[0-9]+]], 0, [[REG0]]
376; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
377; CHECK-NEXT: stxv [[CONV]], 0(3)
378; CHECK-NEXT: blr
379}
380
381; Function Attrs: norecurse nounwind
382define void @ubConv2qp_04(fp128* nocapture %a, i8 zeroext %b,
383 i8* nocapture readonly %c) {
384entry:
385 %conv = zext i8 %b to i32
386 %0 = load i8, i8* %c, align 1
387 %conv1 = zext i8 %0 to i32
388 %add = add nuw nsw i32 %conv1, %conv
389 %conv2 = sitofp i32 %add to fp128
390 store fp128 %conv2, fp128* %a, align 16
391 ret void
392
393; CHECK-LABEL: ubConv2qp_04
394; CHECK: lbz [[REG0:[0-9]+]], 0(5)
395; CHECK: add 4, [[REG0]], 4
396; CHECK: mtvsrwa [[REG:[0-9]+]], 4
397; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
398; CHECK-NEXT: stxv [[CONV]], 0(3)
399; CHECK-NEXT: blr
400}
Lei Huang6270ab62018-07-04 21:59:16 +0000401
402; Convert QP to DP
403
404@f128Array = global [4 x fp128]
405 [fp128 0xL00000000000000004004C00000000000,
406 fp128 0xLF000000000000000400808AB851EB851,
407 fp128 0xL5000000000000000400E0C26324C8366,
408 fp128 0xL8000000000000000400A24E2E147AE14], align 16
409@f128global = global fp128 0xL300000000000000040089CA8F5C28F5C, align 16
410
411; Function Attrs: norecurse nounwind readonly
412define double @qpConv2dp(fp128* nocapture readonly %a) {
413; CHECK-LABEL: qpConv2dp:
414; CHECK: # %bb.0: # %entry
415; CHECK-NEXT: lxv 2, 0(3)
416; CHECK-NEXT: xscvqpdp 2, 2
417; CHECK-NEXT: xxlor 1, 2, 2
418; CHECK-NEXT: blr
419entry:
420 %0 = load fp128, fp128* %a, align 16
421 %conv = fptrunc fp128 %0 to double
422 ret double %conv
423}
424
425; Function Attrs: norecurse nounwind
426define void @qpConv2dp_02(double* nocapture %res) {
427; CHECK-LABEL: qpConv2dp_02:
428; CHECK: # %bb.0: # %entry
429; CHECK-NEXT: addis 4, 2, .LC6@toc@ha
430; CHECK-NEXT: ld 4, .LC6@toc@l(4)
431; CHECK-NEXT: lxvx 2, 0, 4
432; CHECK-NEXT: xscvqpdp 2, 2
433; CHECK-NEXT: stxsd 2, 0(3)
434; CHECK-NEXT: blr
435entry:
436 %0 = load fp128, fp128* @f128global, align 16
437 %conv = fptrunc fp128 %0 to double
438 store double %conv, double* %res, align 8
439 ret void
440}
441
442; Function Attrs: norecurse nounwind
443define void @qpConv2dp_03(double* nocapture %res, i32 signext %idx) {
444; CHECK-LABEL: qpConv2dp_03:
445; CHECK: # %bb.0: # %entry
446; CHECK-NEXT: addis 5, 2, .LC7@toc@ha
447; CHECK-NEXT: sldi 4, 4, 3
448; CHECK-NEXT: ld 5, .LC7@toc@l(5)
449; CHECK-NEXT: lxvx 2, 0, 5
450; CHECK-NEXT: xscvqpdp 2, 2
451; CHECK-NEXT: stxsdx 2, 3, 4
452; CHECK-NEXT: blr
453entry:
454 %0 = load fp128, fp128* getelementptr inbounds ([4 x fp128], [4 x fp128]* @f128Array, i64 0, i64 0), align 16
455 %conv = fptrunc fp128 %0 to double
456 %idxprom = sext i32 %idx to i64
457 %arrayidx = getelementptr inbounds double, double* %res, i64 %idxprom
458 store double %conv, double* %arrayidx, align 8
459 ret void
460}
461
462; Function Attrs: norecurse nounwind
463define void @qpConv2dp_04(fp128* nocapture readonly %a, fp128* nocapture readonly %b, double* nocapture %res) {
464; CHECK-LABEL: qpConv2dp_04:
465; CHECK: # %bb.0: # %entry
466; CHECK-NEXT: lxv 2, 0(3)
467; CHECK-NEXT: lxv 3, 0(4)
468; CHECK-NEXT: xsaddqp 2, 2, 3
469; CHECK-NEXT: xscvqpdp 2, 2
470; CHECK-NEXT: stxsd 2, 0(5)
471; CHECK-NEXT: blr
472entry:
473 %0 = load fp128, fp128* %a, align 16
474 %1 = load fp128, fp128* %b, align 16
475 %add = fadd fp128 %0, %1
476 %conv = fptrunc fp128 %add to double
477 store double %conv, double* %res, align 8
478 ret void
479}
480
481; Convert QP to SP
482
483; Function Attrs: norecurse nounwind readonly
484define float @qpConv2sp(fp128* nocapture readonly %a) {
485; CHECK-LABEL: qpConv2sp:
486; CHECK: # %bb.0: # %entry
487; CHECK-NEXT: lxv 2, 0(3)
488; CHECK-NEXT: xscvqpdpo 2, 2
489; CHECK-NEXT: xsrsp 1, 2
490; CHECK-NEXT: blr
491entry:
492 %0 = load fp128, fp128* %a, align 16
493 %conv = fptrunc fp128 %0 to float
494 ret float %conv
495}
496
497; Function Attrs: norecurse nounwind
498define void @qpConv2sp_02(float* nocapture %res) {
499; CHECK-LABEL: qpConv2sp_02:
500; CHECK: # %bb.0: # %entry
501; CHECK-NEXT: addis 4, 2, .LC6@toc@ha
502; CHECK-NEXT: ld 4, .LC6@toc@l(4)
503; CHECK-NEXT: lxvx 2, 0, 4
504; CHECK-NEXT: xscvqpdpo 2, 2
505; CHECK-NEXT: xsrsp 0, 2
506; CHECK-NEXT: stfs 0, 0(3)
507; CHECK-NEXT: blr
508entry:
509 %0 = load fp128, fp128* @f128global, align 16
510 %conv = fptrunc fp128 %0 to float
511 store float %conv, float* %res, align 4
512 ret void
513}
514
515; Function Attrs: norecurse nounwind
516define void @qpConv2sp_03(float* nocapture %res, i32 signext %idx) {
517; CHECK-LABEL: qpConv2sp_03:
518; CHECK: # %bb.0: # %entry
519; CHECK-NEXT: addis 5, 2, .LC7@toc@ha
520; CHECK-NEXT: sldi 4, 4, 2
521; CHECK-NEXT: ld 5, .LC7@toc@l(5)
522; CHECK-NEXT: lxv 2, 48(5)
523; CHECK-NEXT: xscvqpdpo 2, 2
524; CHECK-NEXT: xsrsp 0, 2
525; CHECK-NEXT: stfsx 0, 3, 4
526; CHECK-NEXT: blr
527entry:
528 %0 = load fp128, fp128* getelementptr inbounds ([4 x fp128], [4 x fp128]* @f128Array, i64 0, i64 3), align 16
529 %conv = fptrunc fp128 %0 to float
530 %idxprom = sext i32 %idx to i64
531 %arrayidx = getelementptr inbounds float, float* %res, i64 %idxprom
532 store float %conv, float* %arrayidx, align 4
533 ret void
534}
535
536; Function Attrs: norecurse nounwind
537define void @qpConv2sp_04(fp128* nocapture readonly %a, fp128* nocapture readonly %b, float* nocapture %res) {
538; CHECK-LABEL: qpConv2sp_04:
539; CHECK: # %bb.0: # %entry
540; CHECK-NEXT: lxv 2, 0(3)
541; CHECK-NEXT: lxv 3, 0(4)
542; CHECK-NEXT: xsaddqp 2, 2, 3
543; CHECK-NEXT: xscvqpdpo 2, 2
544; CHECK-NEXT: xsrsp 0, 2
545; CHECK-NEXT: stfs 0, 0(5)
546; CHECK-NEXT: blr
547entry:
548 %0 = load fp128, fp128* %a, align 16
549 %1 = load fp128, fp128* %b, align 16
550 %add = fadd fp128 %0, %1
551 %conv = fptrunc fp128 %add to float
552 store float %conv, float* %res, align 4
553 ret void
554}
Lei Huangd17c39c2018-07-05 04:18:37 +0000555
556@f128Glob = common global fp128 0xL00000000000000000000000000000000, align 16
557
558; Function Attrs: norecurse nounwind readnone
559define fp128 @dpConv2qp(double %a) {
560; CHECK-LABEL: dpConv2qp:
561; CHECK: # %bb.0: # %entry
562; CHECK-NEXT: xxlor 2, 1, 1
563; CHECK-NEXT: xscvdpqp 2, 2
564; CHECK-NEXT: blr
565entry:
566 %conv = fpext double %a to fp128
567 ret fp128 %conv
568}
569
570; Function Attrs: norecurse nounwind
571define void @dpConv2qp_02(double* nocapture readonly %a) {
572; CHECK-LABEL: dpConv2qp_02:
573; CHECK: # %bb.0: # %entry
574; CHECK-NEXT: lxsd 2, 0(3)
575; CHECK-NEXT: addis 3, 2, .LC8@toc@ha
576; CHECK-NEXT: ld 3, .LC8@toc@l(3)
577; CHECK-NEXT: xscvdpqp 2, 2
578; CHECK-NEXT: stxvx 2, 0, 3
579; CHECK-NEXT: blr
580entry:
581 %0 = load double, double* %a, align 8
582 %conv = fpext double %0 to fp128
583 store fp128 %conv, fp128* @f128Glob, align 16
584 ret void
585}
586
587; Function Attrs: norecurse nounwind
588define void @dpConv2qp_02b(double* nocapture readonly %a, i32 signext %idx) {
589; CHECK-LABEL: dpConv2qp_02b:
590; CHECK: # %bb.0: # %entry
591; CHECK-NEXT: sldi 4, 4, 3
592; CHECK-NEXT: lxsdx 2, 3, 4
593; CHECK-NEXT: addis 3, 2, .LC8@toc@ha
594; CHECK-NEXT: ld 3, .LC8@toc@l(3)
595; CHECK-NEXT: xscvdpqp 2, 2
596; CHECK-NEXT: stxvx 2, 0, 3
597; CHECK-NEXT: blr
598entry:
599 %idxprom = sext i32 %idx to i64
600 %arrayidx = getelementptr inbounds double, double* %a, i64 %idxprom
601 %0 = load double, double* %arrayidx, align 8
602 %conv = fpext double %0 to fp128
603 store fp128 %conv, fp128* @f128Glob, align 16
604 ret void
605}
606
607; Function Attrs: norecurse nounwind
608define void @dpConv2qp_03(fp128* nocapture %res, i32 signext %idx, double %a) {
609; CHECK-LABEL: dpConv2qp_03:
610; CHECK: # %bb.0: # %entry
611; CHECK-NEXT: xxlor 2, 1, 1
612; CHECK-NEXT: sldi 4, 4, 4
613; CHECK-NEXT: xscvdpqp 2, 2
614; CHECK-NEXT: stxvx 2, 3, 4
615; CHECK-NEXT: blr
616entry:
617 %conv = fpext double %a to fp128
618 %idxprom = sext i32 %idx to i64
619 %arrayidx = getelementptr inbounds fp128, fp128* %res, i64 %idxprom
620 store fp128 %conv, fp128* %arrayidx, align 16
621 ret void
622}
623
624; Function Attrs: norecurse nounwind
625define void @dpConv2qp_04(double %a, fp128* nocapture %res) {
626; CHECK-LABEL: dpConv2qp_04:
627; CHECK: # %bb.0: # %entry
628; CHECK-NEXT: xxlor 2, 1, 1
629; CHECK-NEXT: xscvdpqp 2, 2
630; CHECK-NEXT: stxv 2, 0(4)
631; CHECK-NEXT: blr
632entry:
633 %conv = fpext double %a to fp128
634 store fp128 %conv, fp128* %res, align 16
635 ret void
636}
637
638; Function Attrs: norecurse nounwind readnone
639define fp128 @spConv2qp(float %a) {
640; CHECK-LABEL: spConv2qp:
641; CHECK: # %bb.0: # %entry
642; CHECK-NEXT: xxlor 2, 1, 1
643; CHECK-NEXT: xscvdpqp 2, 2
644; CHECK-NEXT: blr
645entry:
646 %conv = fpext float %a to fp128
647 ret fp128 %conv
648}
649
650; Function Attrs: norecurse nounwind
651define void @spConv2qp_02(float* nocapture readonly %a) {
652; CHECK-LABEL: spConv2qp_02:
653; CHECK: # %bb.0: # %entry
654; CHECK-NEXT: lxssp 2, 0(3)
655; CHECK-NEXT: addis 3, 2, .LC8@toc@ha
656; CHECK-NEXT: ld 3, .LC8@toc@l(3)
657; CHECK-NEXT: xscvdpqp 2, 2
658; CHECK-NEXT: stxvx 2, 0, 3
659; CHECK-NEXT: blr
660entry:
661 %0 = load float, float* %a, align 4
662 %conv = fpext float %0 to fp128
663 store fp128 %conv, fp128* @f128Glob, align 16
664 ret void
665}
666
667; Function Attrs: norecurse nounwind
668define void @spConv2qp_02b(float* nocapture readonly %a, i32 signext %idx) {
669; CHECK-LABEL: spConv2qp_02b:
670; CHECK: # %bb.0: # %entry
671; CHECK-NEXT: sldi 4, 4, 2
672; CHECK-NEXT: lxsspx 2, 3, 4
673; CHECK-NEXT: addis 3, 2, .LC8@toc@ha
674; CHECK-NEXT: ld 3, .LC8@toc@l(3)
675; CHECK-NEXT: xscvdpqp 2, 2
676; CHECK-NEXT: stxvx 2, 0, 3
677; CHECK-NEXT: blr
678entry:
679 %idxprom = sext i32 %idx to i64
680 %arrayidx = getelementptr inbounds float, float* %a, i64 %idxprom
681 %0 = load float, float* %arrayidx, align 4
682 %conv = fpext float %0 to fp128
683 store fp128 %conv, fp128* @f128Glob, align 16
684 ret void
685}
686
687; Function Attrs: norecurse nounwind
688define void @spConv2qp_03(fp128* nocapture %res, i32 signext %idx, float %a) {
689; CHECK-LABEL: spConv2qp_03:
690; CHECK: # %bb.0: # %entry
691; CHECK-NEXT: xxlor 2, 1, 1
692; CHECK-NEXT: sldi 4, 4, 4
693; CHECK-NEXT: xscvdpqp 2, 2
694; CHECK-NEXT: stxvx 2, 3, 4
695; CHECK-NEXT: blr
696entry:
697 %conv = fpext float %a to fp128
698 %idxprom = sext i32 %idx to i64
699 %arrayidx = getelementptr inbounds fp128, fp128* %res, i64 %idxprom
700 store fp128 %conv, fp128* %arrayidx, align 16
701 ret void
702}
703
704; Function Attrs: norecurse nounwind
705define void @spConv2qp_04(float %a, fp128* nocapture %res) {
706; CHECK-LABEL: spConv2qp_04:
707; CHECK: # %bb.0: # %entry
708; CHECK-NEXT: xxlor 2, 1, 1
709; CHECK-NEXT: xscvdpqp 2, 2
710; CHECK-NEXT: stxv 2, 0(4)
711; CHECK-NEXT: blr
712entry:
713 %conv = fpext float %a to fp128
714 store fp128 %conv, fp128* %res, align 16
715 ret void
716}
Lei Huang66e22c22018-07-05 07:46:01 +0000717
718; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
719
720; Function Attrs: norecurse nounwind
721define void @cvdp2sw2qp(double %val, fp128* nocapture %res) {
722; CHECK-LABEL: cvdp2sw2qp:
723; CHECK: # %bb.0: # %entry
724; CHECK-NEXT: xscvdpsxws 2, 1
725; CHECK-NEXT: vextsw2d 2, 2
726; CHECK-NEXT: xscvsdqp 2, 2
727; CHECK-NEXT: stxv 2, 0(4)
728; CHECK-NEXT: blr
729entry:
730 %conv = fptosi double %val to i32
731 %conv1 = sitofp i32 %conv to fp128
732 store fp128 %conv1, fp128* %res, align 16
733 ret void
734}
735
736; Function Attrs: norecurse nounwind
737define void @cvdp2sdw2qp(double %val, fp128* nocapture %res) {
738; CHECK-LABEL: cvdp2sdw2qp:
739; CHECK: # %bb.0: # %entry
740; CHECK-NEXT: xscvdpsxds 2, 1
741; CHECK-NEXT: xscvsdqp 2, 2
742; CHECK-NEXT: stxv 2, 0(4)
743; CHECK-NEXT: blr
744entry:
745 %conv = fptosi double %val to i64
746 %conv1 = sitofp i64 %conv to fp128
747 store fp128 %conv1, fp128* %res, align 16
748 ret void
749}
750
751; Function Attrs: norecurse nounwind
752define void @cvsp2sw2qp(float %val, fp128* nocapture %res) {
753; CHECK-LABEL: cvsp2sw2qp:
754; CHECK: # %bb.0: # %entry
755; CHECK-NEXT: xscvdpsxws 2, 1
756; CHECK-NEXT: vextsw2d 2, 2
757; CHECK-NEXT: xscvsdqp 2, 2
758; CHECK-NEXT: stxv 2, 0(4)
759; CHECK-NEXT: blr
760entry:
761 %conv = fptosi float %val to i32
762 %conv1 = sitofp i32 %conv to fp128
763 store fp128 %conv1, fp128* %res, align 16
764 ret void
765}
766
767; Function Attrs: norecurse nounwind
768define void @cvsp2sdw2qp(float %val, fp128* nocapture %res) {
769; CHECK-LABEL: cvsp2sdw2qp:
770; CHECK: # %bb.0: # %entry
771; CHECK-NEXT: xscvdpsxds 2, 1
772; CHECK-NEXT: xscvsdqp 2, 2
773; CHECK-NEXT: stxv 2, 0(4)
774; CHECK-NEXT: blr
775entry:
776 %conv = fptosi float %val to i64
777 %conv1 = sitofp i64 %conv to fp128
778 store fp128 %conv1, fp128* %res, align 16
779 ret void
780}
781
782; Function Attrs: norecurse nounwind
783define void @cvdp2uw2qp(double %val, fp128* nocapture %res) {
784; CHECK-LABEL: cvdp2uw2qp:
785; CHECK: # %bb.0: # %entry
786; CHECK-NEXT: xscvdpuxws 0, 1
787; CHECK-NEXT: xxextractuw 2, 0, 8
788; CHECK-NEXT: xscvudqp 2, 2
789; CHECK-NEXT: stxv 2, 0(4)
790; CHECK-NEXT: blr
791entry:
792 %conv = fptoui double %val to i32
793 %conv1 = uitofp i32 %conv to fp128
794 store fp128 %conv1, fp128* %res, align 16
795 ret void
796}
797
798; Function Attrs: norecurse nounwind
799define void @cvdp2udw2qp(double %val, fp128* nocapture %res) {
800; CHECK-LABEL: cvdp2udw2qp:
801; CHECK: # %bb.0: # %entry
802; CHECK-NEXT: xscvdpuxds 2, 1
803; CHECK-NEXT: xscvudqp 2, 2
804; CHECK-NEXT: stxv 2, 0(4)
805; CHECK-NEXT: blr
806entry:
807 %conv = fptoui double %val to i64
808 %conv1 = uitofp i64 %conv to fp128
809 store fp128 %conv1, fp128* %res, align 16
810 ret void
811}
812
813; Function Attrs: norecurse nounwind
814define void @cvsp2uw2qp(float %val, fp128* nocapture %res) {
815; CHECK-LABEL: cvsp2uw2qp:
816; CHECK: # %bb.0: # %entry
817; CHECK-NEXT: xscvdpuxws 0, 1
818; CHECK-NEXT: xxextractuw 2, 0, 8
819; CHECK-NEXT: xscvudqp 2, 2
820; CHECK-NEXT: stxv 2, 0(4)
821; CHECK-NEXT: blr
822entry:
823 %conv = fptoui float %val to i32
824 %conv1 = uitofp i32 %conv to fp128
825 store fp128 %conv1, fp128* %res, align 16
826 ret void
827}
828
829; Function Attrs: norecurse nounwind
830define void @cvsp2udw2qp(float %val, fp128* nocapture %res) {
831; CHECK-LABEL: cvsp2udw2qp:
832; CHECK: # %bb.0: # %entry
833; CHECK-NEXT: xscvdpuxds 2, 1
834; CHECK-NEXT: xscvudqp 2, 2
835; CHECK-NEXT: stxv 2, 0(4)
836; CHECK-NEXT: blr
837entry:
838 %conv = fptoui float %val to i64
839 %conv1 = uitofp i64 %conv to fp128
840 store fp128 %conv1, fp128* %res, align 16
841 ret void
842}