blob: 10eedde245baec23c90f4e71832ba197d0b07dbc [file] [log] [blame]
Lei Huang10367eb2018-04-12 18:00:14 +00001; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
2; RUN: -enable-ppc-quad-precision -ppc-vsr-nums-as-vr < %s | FileCheck %s
3
4@mem = global [5 x i64] [i64 56, i64 63, i64 3, i64 5, i64 6], align 8
5@umem = global [5 x i64] [i64 560, i64 100, i64 34, i64 2, i64 5], align 8
6@swMem = global [5 x i32] [i32 5, i32 2, i32 3, i32 4, i32 0], align 4
7
8; Function Attrs: norecurse nounwind
9define void @sdwConv2qp(fp128* nocapture %a, i64 %b) {
10entry:
11 %conv = sitofp i64 %b to fp128
12 store fp128 %conv, fp128* %a, align 16
13 ret void
14
15; CHECK-LABEL: sdwConv2qp
16; CHECK: mtvsrd [[REG:[0-9]+]], 4
17; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG]]
18; CHECK-NEXT: stxv [[CONV]], 0(3)
19; CHECK-NEXT: blr
20}
21
22; Function Attrs: norecurse nounwind
23define void @sdwConv2qp_02(fp128* nocapture %a) {
24entry:
25 %0 = load i64, i64* getelementptr inbounds
26 ([5 x i64], [5 x i64]* @mem, i64 0, i64 2), align 8
27 %conv = sitofp i64 %0 to fp128
28 store fp128 %conv, fp128* %a, align 16
29 ret void
30
31; CHECK-LABEL: sdwConv2qp_02
32; CHECK: addis [[REG:[0-9]+]], 2, .LC0@toc@ha
33; CHECK: ld [[REG]], .LC0@toc@l([[REG]])
34; CHECK: lxsd [[REG0:[0-9]+]], 16([[REG]])
35; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG0]]
36; CHECK-NEXT: stxv [[CONV]], 0(3)
37; CHECK-NEXT: blr
38}
39
40; Function Attrs: norecurse nounwind
41define void @sdwConv2qp_03(fp128* nocapture %a, i64* nocapture readonly %b) {
42entry:
43 %0 = load i64, i64* %b, align 8
44 %conv = sitofp i64 %0 to fp128
45 store fp128 %conv, fp128* %a, align 16
46 ret void
47
48; CHECK-LABEL: sdwConv2qp_03
49; CHECK-NOT: ld
50; CHECK: lxsd [[REG0:[0-9]+]], 0(4)
51; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG0]]
52; CHECK-NEXT: stxv [[CONV]], 0(3)
53; CHECK-NEXT: blr
54}
55
56; Function Attrs: norecurse nounwind
57define void @udwConv2qp(fp128* nocapture %a, i64 %b) {
58entry:
59 %conv = uitofp i64 %b to fp128
60 store fp128 %conv, fp128* %a, align 16
61 ret void
62
63; CHECK-LABEL: udwConv2qp
64; CHECK: mtvsrd [[REG:[0-9]+]], 4
65; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
66; CHECK-NEXT: stxv [[CONV]], 0(3)
67; CHECK-NEXT: blr
68}
69
70; Function Attrs: norecurse nounwind
71define void @udwConv2qp_02(fp128* nocapture %a) {
72entry:
73 %0 = load i64, i64* getelementptr inbounds
74 ([5 x i64], [5 x i64]* @umem, i64 0, i64 4), align 8
75 %conv = uitofp i64 %0 to fp128
76 store fp128 %conv, fp128* %a, align 16
77 ret void
78
79; CHECK-LABEL: udwConv2qp_02
80; CHECK: addis [[REG:[0-9]+]], 2, .LC1@toc@ha
81; CHECK: ld [[REG]], .LC1@toc@l([[REG]])
82; CHECK: lxsd [[REG0:[0-9]+]], 32([[REG]])
83; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG0]]
84; CHECK-NEXT: stxv [[CONV]], 0(3)
85; CHECK-NEXT: blr
86}
87
88; Function Attrs: norecurse nounwind
89define void @udwConv2qp_03(fp128* nocapture %a, i64* nocapture readonly %b) {
90entry:
91 %0 = load i64, i64* %b, align 8
92 %conv = uitofp i64 %0 to fp128
93 store fp128 %conv, fp128* %a, align 16
94 ret void
95
96; CHECK-LABEL: udwConv2qp_03
97; CHECK-NOT: ld
98; CHECK: lxsd [[REG:[0-9]+]], 0(4)
99; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG]]
100; CHECK-NEXT: stxv [[CONV]], 0(3)
101; CHECK-NEXT: blr
102}
103
104; Function Attrs: norecurse nounwind
105define void @sdwConv2qp_testXForm(fp128* nocapture %sink,
106 i8* nocapture readonly %a) {
107entry:
108 %add.ptr = getelementptr inbounds i8, i8* %a, i64 3
109 %0 = bitcast i8* %add.ptr to i64*
110 %1 = load i64, i64* %0, align 8
111 %conv = sitofp i64 %1 to fp128
112 store fp128 %conv, fp128* %sink, align 16
113 ret void
114
115; CHECK-LABEL: sdwConv2qp_testXForm
116; CHECK: addi [[REG:[0-9]+]], 4, 3
117; CHECK-NEXT: lxsd [[REG1:[0-9]+]], 0([[REG]])
118; CHECK-NEXT: xscvsdqp [[CONV:[0-9]+]], [[REG1]]
119; CHECK-NEXT: stxv [[CONV]], 0(3)
120; CHECK-NEXT: blr
121}
122
123; Function Attrs: norecurse nounwind
124define void @udwConv2qp_testXForm(fp128* nocapture %sink,
125 i8* nocapture readonly %a) {
126entry:
127 %add.ptr = getelementptr inbounds i8, i8* %a, i64 3
128 %0 = bitcast i8* %add.ptr to i64*
129 %1 = load i64, i64* %0, align 8
130 %conv = uitofp i64 %1 to fp128
131 store fp128 %conv, fp128* %sink, align 16
132 ret void
133
134; CHECK-LABEL: udwConv2qp_testXForm
135; CHECK: addi [[REG:[0-9]+]], 4, 3
136; CHECK-NEXT: lxsd [[REG1:[0-9]+]], 0([[REG]])
137; CHECK-NEXT: xscvudqp [[CONV:[0-9]+]], [[REG1]]
138; CHECK-NEXT: stxv [[CONV]], 0(3)
139; CHECK-NEXT: blr
140}