blob: 40e39c64deadbf8764aa88daded6b7999b3de958 [file] [log] [blame]
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu \
2; RUN: -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unknown-linux-gnu \
4; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE
5define double @test1(<2 x i64> %a) {
6entry:
7; CHECK-LABEL: test1
8; CHECK: xxswapd [[SW:[0-9]+]], 34
9; CHECK: xscvsxddp 1, [[SW]]
10; CHECK-BE-LABEL: test1
11; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
12; CHECK-BE: xscvsxddp 1, [[CP]]
13 %0 = extractelement <2 x i64> %a, i32 0
14 %1 = sitofp i64 %0 to double
15 ret double %1
16}
17
18define double @test2(<2 x i64> %a) {
19entry:
20; CHECK-LABEL: test2
21; CHECK: xxlor [[CP:[0-9]+]], 34, 34
22; CHECK: xscvsxddp 1, [[CP]]
23; CHECK-BE-LABEL: test2
24; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
25; CHECK-BE: xscvsxddp 1, [[SW]]
26 %0 = extractelement <2 x i64> %a, i32 1
27 %1 = sitofp i64 %0 to double
28 ret double %1
29}
30
31define float @test1f(<2 x i64> %a) {
32entry:
33; CHECK-LABEL: test1f
34; CHECK: xxswapd [[SW:[0-9]+]], 34
35; CHECK: xscvsxdsp 1, [[SW]]
36; CHECK-BE-LABEL: test1f
37; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
38; CHECK-BE: xscvsxdsp 1, [[CP]]
39 %0 = extractelement <2 x i64> %a, i32 0
40 %1 = sitofp i64 %0 to float
41 ret float %1
42}
43
44define float @test2f(<2 x i64> %a) {
45entry:
46; CHECK-LABEL: test2f
47; CHECK: xxlor [[CP:[0-9]+]], 34, 34
48; CHECK: xscvsxdsp 1, [[CP]]
49; CHECK-BE-LABEL: test2f
50; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
51; CHECK-BE: xscvsxdsp 1, [[SW]]
52 %0 = extractelement <2 x i64> %a, i32 1
53 %1 = sitofp i64 %0 to float
54 ret float %1
55}
56
57define double @test1u(<2 x i64> %a) {
58entry:
59; CHECK-LABEL: test1u
60; CHECK: xxswapd [[SW:[0-9]+]], 34
61; CHECK: xscvuxddp 1, [[SW]]
62; CHECK-BE-LABEL: test1u
63; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
64; CHECK-BE: xscvuxddp 1, [[CP]]
65 %0 = extractelement <2 x i64> %a, i32 0
66 %1 = uitofp i64 %0 to double
67 ret double %1
68}
69
70define double @test2u(<2 x i64> %a) {
71entry:
72; CHECK-LABEL: test2u
73; CHECK: xxlor [[CP:[0-9]+]], 34, 34
74; CHECK: xscvuxddp 1, [[CP]]
75; CHECK-BE-LABEL: test2u
76; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
77; CHECK-BE: xscvuxddp 1, [[SW]]
78 %0 = extractelement <2 x i64> %a, i32 1
79 %1 = uitofp i64 %0 to double
80 ret double %1
81}
82
83define float @test1fu(<2 x i64> %a) {
84entry:
85; CHECK-LABEL: test1fu
86; CHECK: xxswapd [[SW:[0-9]+]], 34
87; CHECK: xscvuxdsp 1, [[SW]]
88; CHECK-BE-LABEL: test1fu
89; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
90; CHECK-BE: xscvuxdsp 1, [[CP]]
91 %0 = extractelement <2 x i64> %a, i32 0
92 %1 = uitofp i64 %0 to float
93 ret float %1
94}
95
96define float @test2fu(<2 x i64> %a) {
97entry:
98; CHECK-LABEL: test2fu
99; CHECK: xxlor [[CP:[0-9]+]], 34, 34
100; CHECK: xscvuxdsp 1, [[CP]]
101; CHECK-BE-LABEL: test2fu
102; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
103; CHECK-BE: xscvuxdsp 1, [[SW]]
104 %0 = extractelement <2 x i64> %a, i32 1
105 %1 = uitofp i64 %0 to float
106 ret float %1
107}
Lei Huang451ef4a2017-08-14 18:09:29 +0000108
109define float @conv2fltTesti0(<4 x i32> %a) {
110entry:
111; CHECK-LABEL: conv2fltTesti0
112; CHECK: xxspltw [[SW:[0-9]+]], 34, 3
113; CHECK: xvcvsxwsp [[SW]], [[SW]]
114; CHECK: xscvspdpn 1, [[SW]]
115; CHECK-BE-LABEL: conv2fltTesti0
116; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0
117; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
118; CHECK-BE: xscvspdpn 1, [[CP]]
119 %vecext = extractelement <4 x i32> %a, i32 0
120 %conv = sitofp i32 %vecext to float
121 ret float %conv
122}
123
124define float @conv2fltTesti1(<4 x i32> %a) {
125entry:
126; CHECK-LABEL: conv2fltTesti1
127; CHECK: xxspltw [[SW:[0-9]+]], 34, 2
128; CHECK: xvcvsxwsp [[SW]], [[SW]]
129; CHECK: xscvspdpn 1, [[SW]]
130; CHECK-BE-LABEL: conv2fltTesti1
131; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1
132; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
133; CHECK-BE: xscvspdpn 1, [[CP]]
134 %vecext = extractelement <4 x i32> %a, i32 1
135 %conv = sitofp i32 %vecext to float
136 ret float %conv
137}
138
139define float @conv2fltTesti2(<4 x i32> %a) {
140entry:
141; CHECK-LABEL: conv2fltTesti2
142; CHECK: xxspltw [[SW:[0-9]+]], 34, 1
143; CHECK: xvcvsxwsp [[SW]], [[SW]]
144; CHECK: xscvspdpn 1, [[SW]]
145; CHECK-BE-LABEL: conv2fltTesti2
146; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2
147; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
148; CHECK-BE: xscvspdpn 1, [[CP]]
149 %vecext = extractelement <4 x i32> %a, i32 2
150 %conv = sitofp i32 %vecext to float
151 ret float %conv
152}
153
154define float @conv2fltTesti3(<4 x i32> %a) {
155entry:
156; CHECK-LABEL: conv2fltTesti3
157; CHECK: xxspltw [[SW:[0-9]+]], 34, 0
158; CHECK: xvcvsxwsp [[SW]], [[SW]]
159; CHECK: xscvspdpn 1, [[SW]]
160; CHECK-BE-LABEL: conv2fltTesti3
161; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3
162; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
163; CHECK-BE: xscvspdpn 1, [[CP]]
164 %vecext = extractelement <4 x i32> %a, i32 3
165 %conv = sitofp i32 %vecext to float
166 ret float %conv
167}
168
169; verify we don't crash for variable elem extract
170define float @conv2fltTestiVar(<4 x i32> %a, i32 zeroext %elem) {
171entry:
172 %vecext = extractelement <4 x i32> %a, i32 %elem
173 %conv = sitofp i32 %vecext to float
174 ret float %conv
175}
176
177define double @conv2dblTesti0(<4 x i32> %a) {
178entry:
179; CHECK-LABEL: conv2dblTesti0
180; CHECK: xxspltw [[SW:[0-9]+]], 34, 3
181; CHECK: xvcvsxwdp 1, [[SW]]
182; CHECK-BE-LABEL: conv2dblTesti0
183; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0
184; CHECK-BE: xvcvsxwdp 1, [[CP]]
185 %vecext = extractelement <4 x i32> %a, i32 0
186 %conv = sitofp i32 %vecext to double
187 ret double %conv
188}
189
190define double @conv2dblTesti1(<4 x i32> %a) {
191entry:
192; CHECK-LABEL: conv2dblTesti1
193; CHECK: xxspltw [[SW:[0-9]+]], 34, 2
194; CHECK: xvcvsxwdp 1, [[SW]]
195; CHECK-BE-LABEL: conv2dblTesti1
196; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1
197; CHECK-BE: xvcvsxwdp 1, [[CP]]
198 %vecext = extractelement <4 x i32> %a, i32 1
199 %conv = sitofp i32 %vecext to double
200 ret double %conv
201}
202
203define double @conv2dblTesti2(<4 x i32> %a) {
204entry:
205; CHECK-LABEL: conv2dblTesti2
206; CHECK: xxspltw [[SW:[0-9]+]], 34, 1
207; CHECK: xvcvsxwdp 1, [[SW]]
208; CHECK-BE-LABEL: conv2dblTesti2
209; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2
210; CHECK-BE: xvcvsxwdp 1, [[CP]]
211 %vecext = extractelement <4 x i32> %a, i32 2
212 %conv = sitofp i32 %vecext to double
213 ret double %conv
214}
215
216define double @conv2dblTesti3(<4 x i32> %a) {
217entry:
218; CHECK-LABEL: conv2dblTesti3
219; CHECK: xxspltw [[SW:[0-9]+]], 34, 0
220; CHECK: xvcvsxwdp 1, [[SW]]
221; CHECK-BE-LABEL: conv2dblTesti3
222; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3
223; CHECK-BE: xvcvsxwdp 1, [[CP]]
224 %vecext = extractelement <4 x i32> %a, i32 3
225 %conv = sitofp i32 %vecext to double
226 ret double %conv
227}
228
229; verify we don't crash for variable elem extract
230define double @conv2dblTestiVar(<4 x i32> %a, i32 zeroext %elem) {
231entry:
232 %vecext = extractelement <4 x i32> %a, i32 %elem
233 %conv = sitofp i32 %vecext to double
234 ret double %conv
235}