X86 cost model: Exit before calling getSimpleVT on non-simple VTs
[oota-llvm.git] / test / Analysis / CostModel / X86 / uitofp.ll
1 ; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s
2 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
3
4 ; In X86TargetTransformInfo::getCastInstrCost we have code that depends on
5 ; getSimpleVT on a value type. On AVX2 we execute this code. Make sure we exit
6 ; early if the type is not a simple value type before we call this function.
7 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -cost-model -analyze < %s
8
9 define <2 x double> @uitofpv2i8v2double(<2 x i8> %a) {
10   ; SSE2: uitofpv2i8v2double
11   ; SSE2: cost of 20 {{.*}} uitofp
12   ; SSE2-CODEGEN: uitofpv2i8v2double
13   ; SSE2-CODEGEN: movapd  LCPI
14   ; SSE2-CODEGEN: subpd
15   ; SSE2-CODEGEN: addpd
16   %1 = uitofp <2 x i8> %a to <2 x double>
17   ret <2 x double> %1
18 }
19
20 define <4 x double> @uitofpv4i8v4double(<4 x i8> %a) {
21   ; SSE2: uitofpv4i8v4double
22   ; SSE2: cost of 40 {{.*}} uitofp
23   ; SSE2-CODEGEN: uitofpv4i8v4double
24   ; SSE2-CODEGEN: movapd  LCPI
25   ; SSE2-CODEGEN: subpd
26   ; SSE2-CODEGEN: addpd
27   %1 = uitofp <4 x i8> %a to <4 x double>
28   ret <4 x double> %1
29 }
30
31 define <8 x double> @uitofpv8i8v8double(<8 x i8> %a) {
32   ; SSE2: uitofpv8i8v8double
33   ; SSE2: cost of 80 {{.*}} uitofp
34   ; SSE2-CODEGEN: uitofpv8i8v8double
35   ; SSE2-CODEGEN: movapd  LCPI
36   ; SSE2-CODEGEN: subpd
37   ; SSE2-CODEGEN: addpd
38 %1 = uitofp <8 x i8> %a to <8 x double>
39   ret <8 x double> %1
40 }
41
42 define <16 x double> @uitofpv16i8v16double(<16 x i8> %a) {
43   ; SSE2: uitofpv16i8v16double
44   ; SSE2: cost of 160 {{.*}} uitofp
45   ; SSE2-CODEGEN: uitofpv16i8v16double
46   ; SSE2-CODEGEN: movapd  LCPI
47   ; SSE2-CODEGEN: subpd
48   ; SSE2-CODEGEN: addpd
49   %1 = uitofp <16 x i8> %a to <16 x double>
50   ret <16 x double> %1
51 }
52
53 define <32 x double> @uitofpv32i8v32double(<32 x i8> %a) {
54   ; SSE2: uitofpv32i8v32double
55   ; SSE2: cost of 320 {{.*}} uitofp
56   ; SSE2-CODEGEN: uitofpv32i8v32double
57   ; SSE2-CODEGEN: movapd  LCPI
58   ; SSE2-CODEGEN: subpd
59   ; SSE2-CODEGEN: addpd
60   %1 = uitofp <32 x i8> %a to <32 x double>
61   ret <32 x double> %1
62 }
63
64 define <2 x double> @uitofpv2i16v2double(<2 x i16> %a) {
65   ; SSE2: uitofpv2i16v2double
66   ; SSE2: cost of 20 {{.*}} uitofp
67   ; SSE2-CODEGEN: uitofpv2i16v2double
68   ; SSE2-CODEGEN: movapd  LCPI
69   ; SSE2-CODEGEN: subpd
70   ; SSE2-CODEGEN: addpd
71   %1 = uitofp <2 x i16> %a to <2 x double>
72   ret <2 x double> %1
73 }
74
75 define <4 x double> @uitofpv4i16v4double(<4 x i16> %a) {
76   ; SSE2: uitofpv4i16v4double
77   ; SSE2: cost of 40 {{.*}} uitofp
78   ; SSE2-CODEGEN: uitofpv4i16v4double
79   ; SSE2-CODEGEN: movapd  LCPI
80   ; SSE2-CODEGEN: subpd
81   ; SSE2-CODEGEN: addpd
82   %1 = uitofp <4 x i16> %a to <4 x double>
83   ret <4 x double> %1
84 }
85
86 define <8 x double> @uitofpv8i16v8double(<8 x i16> %a) {
87   ; SSE2: uitofpv8i16v8double
88   ; SSE2: cost of 80 {{.*}} uitofp
89   ; SSE2-CODEGEN: uitofpv8i16v8double
90   ; SSE2-CODEGEN: movapd  LCPI
91   ; SSE2-CODEGEN: subpd
92   ; SSE2-CODEGEN: addpd
93   %1 = uitofp <8 x i16> %a to <8 x double>
94   ret <8 x double> %1
95 }
96
97 define <16 x double> @uitofpv16i16v16double(<16 x i16> %a) {
98   ; SSE2: uitofpv16i16v16double
99   ; SSE2: cost of 160 {{.*}} uitofp
100   ; SSE2-CODEGEN: uitofpv16i16v16double
101   ; SSE2-CODEGEN: movapd  LCPI
102   ; SSE2-CODEGEN: subpd
103   ; SSE2-CODEGEN: addpd
104   %1 = uitofp <16 x i16> %a to <16 x double>
105   ret <16 x double> %1
106 }
107
108 define <32 x double> @uitofpv32i16v32double(<32 x i16> %a) {
109   ; SSE2: uitofpv32i16v32double
110   ; SSE2: cost of 320 {{.*}} uitofp
111   ; SSE2-CODEGEN: uitofpv32i16v32double
112   ; SSE2-CODEGEN: movapd  LCPI
113   ; SSE2-CODEGEN: subpd
114   ; SSE2-CODEGEN: addpd
115   %1 = uitofp <32 x i16> %a to <32 x double>
116   ret <32 x double> %1
117 }
118
119 define <2 x double> @uitofpv2i32v2double(<2 x i32> %a) {
120   ; SSE2: uitofpv2i32v2double
121   ; SSE2: cost of 20 {{.*}} uitofp
122   ; SSE2-CODEGEN: uitofpv2i32v2double
123   ; SSE2-CODEGEN: movapd  LCPI
124   ; SSE2-CODEGEN: subpd
125   ; SSE2-CODEGEN: addpd
126   %1 = uitofp <2 x i32> %a to <2 x double>
127   ret <2 x double> %1
128 }
129
130 define <4 x double> @uitofpv4i32v4double(<4 x i32> %a) {
131   ; SSE2: uitofpv4i32v4double
132   ; SSE2: cost of 40 {{.*}} uitofp
133   ; SSE2-CODEGEN: uitofpv4i32v4double
134   ; SSE2-CODEGEN: movapd  LCPI
135   ; SSE2-CODEGEN: subpd
136   ; SSE2-CODEGEN: addpd
137   %1 = uitofp <4 x i32> %a to <4 x double>
138   ret <4 x double> %1
139 }
140
141 define <8 x double> @uitofpv8i32v8double(<8 x i32> %a) {
142   ; SSE2: uitofpv8i32v8double
143   ; SSE2: cost of 80 {{.*}} uitofp
144   ; SSE2-CODEGEN: uitofpv8i32v8double
145   ; SSE2-CODEGEN: movapd  LCPI
146   ; SSE2-CODEGEN: subpd
147   ; SSE2-CODEGEN: addpd
148   %1 = uitofp <8 x i32> %a to <8 x double>
149   ret <8 x double> %1
150 }
151
152 define <16 x double> @uitofpv16i32v16double(<16 x i32> %a) {
153   ; SSE2: uitofpv16i32v16double
154   ; SSE2: cost of 160 {{.*}} uitofp
155   ; SSE2-CODEGEN: uitofpv16i32v16double
156   ; SSE2-CODEGEN: movapd  LCPI
157   ; SSE2-CODEGEN: subpd
158   ; SSE2-CODEGEN: addpd
159   %1 = uitofp <16 x i32> %a to <16 x double>
160   ret <16 x double> %1
161 }
162
163 define <32 x double> @uitofpv32i32v32double(<32 x i32> %a) {
164   ; SSE2: uitofpv32i32v32double
165   ; SSE2: cost of 320 {{.*}} uitofp
166   ; SSE2-CODEGEN: uitofpv32i32v32double
167   ; SSE2-CODEGEN: movapd  LCPI
168   ; SSE2-CODEGEN: subpd
169   ; SSE2-CODEGEN: addpd
170   %1 = uitofp <32 x i32> %a to <32 x double>
171   ret <32 x double> %1
172 }
173
174 define <2 x double> @uitofpv2i64v2double(<2 x i64> %a) {
175   ; SSE2: uitofpv2i64v2double
176   ; SSE2: cost of 20 {{.*}} uitofp
177   ; SSE2-CODEGEN: uitofpv2i64v2double
178   ; SSE2-CODEGEN: movapd  LCPI
179   ; SSE2-CODEGEN: subpd
180   ; SSE2-CODEGEN: addpd
181   %1 = uitofp <2 x i64> %a to <2 x double>
182   ret <2 x double> %1
183 }
184
185 define <4 x double> @uitofpv4i64v4double(<4 x i64> %a) {
186   ; SSE2: uitofpv4i64v4double
187   ; SSE2: cost of 40 {{.*}} uitofp
188   ; SSE2-CODEGEN: uitofpv4i64v4double
189   ; SSE2-CODEGEN: movapd  LCPI
190   ; SSE2-CODEGEN: subpd
191   ; SSE2-CODEGEN: addpd
192   %1 = uitofp <4 x i64> %a to <4 x double>
193   ret <4 x double> %1
194 }
195
196 define <8 x double> @uitofpv8i64v8double(<8 x i64> %a) {
197   %1 = uitofp <8 x i64> %a to <8 x double>
198   ; SSE2: uitofpv8i64v8double
199   ; SSE2: cost of 80 {{.*}} uitofp
200   ; SSE2-CODEGEN: uitofpv8i64v8double
201   ; SSE2-CODEGEN: movapd  LCPI
202   ; SSE2-CODEGEN: subpd
203   ; SSE2-CODEGEN: addpd
204   ret <8 x double> %1
205 }
206
207 define <16 x double> @uitofpv16i64v16double(<16 x i64> %a) {
208   ; SSE2: uitofpv16i64v16double
209   ; SSE2: cost of 160 {{.*}} uitofp
210   ; SSE2-CODEGEN: uitofpv16i64v16double
211   ; SSE2-CODEGEN: movapd  LCPI
212   ; SSE2-CODEGEN: subpd
213   ; SSE2-CODEGEN: addpd
214   %1 = uitofp <16 x i64> %a to <16 x double>
215   ret <16 x double> %1
216 }
217
218 define <32 x double> @uitofpv32i64v32double(<32 x i64> %a) {
219   ; SSE2: uitofpv32i64v32double
220   ; SSE2: cost of 320 {{.*}} uitofp
221   ; SSE2-CODEGEN: uitofpv32i64v32double
222   ; SSE2-CODEGEN: movapd  LCPI
223   ; SSE2-CODEGEN: subpd
224   ; SSE2-CODEGEN: addpd
225   %1 = uitofp <32 x i64> %a to <32 x double>
226   ret <32 x double> %1
227 }
228
229 define <2 x float> @uitofpv2i8v2float(<2 x i8> %a) {
230   ; SSE2: uitofpv2i8v2float
231   ; SSE2: cost of 15 {{.*}} uitofp
232   %1 = uitofp <2 x i8> %a to <2 x float>
233   ret <2 x float> %1
234 }
235
236 define <4 x float> @uitofpv4i8v4float(<4 x i8> %a) {
237   ; SSE2: uitofpv4i8v4float
238   ; SSE2: cost of 15 {{.*}} uitofp
239   %1 = uitofp <4 x i8> %a to <4 x float>
240   ret <4 x float> %1
241 }
242
243 define <8 x float> @uitofpv8i8v8float(<8 x i8> %a) {
244   ; SSE2: uitofpv8i8v8float
245   ; SSE2: cost of 15 {{.*}} uitofp
246   %1 = uitofp <8 x i8> %a to <8 x float>
247   ret <8 x float> %1
248 }
249
250 define <16 x float> @uitofpv16i8v16float(<16 x i8> %a) {
251   ; SSE2: uitofpv16i8v16float
252   ; SSE2: cost of 8 {{.*}} uitofp
253   %1 = uitofp <16 x i8> %a to <16 x float>
254   ret <16 x float> %1
255 }
256
257 define <32 x float> @uitofpv32i8v32float(<32 x i8> %a) {
258   ; SSE2: uitofpv32i8v32float
259   ; SSE2: cost of 16 {{.*}} uitofp
260   %1 = uitofp <32 x i8> %a to <32 x float>
261   ret <32 x float> %1
262 }
263
264 define <2 x float> @uitofpv2i16v2float(<2 x i16> %a) {
265   ; SSE2: uitofpv2i16v2float
266   ; SSE2: cost of 15 {{.*}} uitofp
267   %1 = uitofp <2 x i16> %a to <2 x float>
268   ret <2 x float> %1
269 }
270
271 define <4 x float> @uitofpv4i16v4float(<4 x i16> %a) {
272   ; SSE2: uitofpv4i16v4float
273   ; SSE2: cost of 15 {{.*}} uitofp
274   %1 = uitofp <4 x i16> %a to <4 x float>
275   ret <4 x float> %1
276 }
277
278 define <8 x float> @uitofpv8i16v8float(<8 x i16> %a) {
279   ; SSE2: uitofpv8i16v8float
280   ; SSE2: cost of 15 {{.*}} uitofp
281   %1 = uitofp <8 x i16> %a to <8 x float>
282   ret <8 x float> %1
283 }
284
285 define <16 x float> @uitofpv16i16v16float(<16 x i16> %a) {
286   ; SSE2: uitofpv16i16v16float
287   ; SSE2: cost of 30 {{.*}} uitofp
288   %1 = uitofp <16 x i16> %a to <16 x float>
289   ret <16 x float> %1
290 }
291
292 define <32 x float> @uitofpv32i16v32float(<32 x i16> %a) {
293   ; SSE2: uitofpv32i16v32float
294   ; SSE2: cost of 60 {{.*}} uitofp
295   %1 = uitofp <32 x i16> %a to <32 x float>
296   ret <32 x float> %1
297 }
298
299 define <2 x float> @uitofpv2i32v2float(<2 x i32> %a) {
300   ; SSE2: uitofpv2i32v2float
301   ; SSE2: cost of 15 {{.*}} uitofp
302   %1 = uitofp <2 x i32> %a to <2 x float>
303   ret <2 x float> %1
304 }
305
306 define <4 x float> @uitofpv4i32v4float(<4 x i32> %a) {
307   ; SSE2: uitofpv4i32v4float
308   ; SSE2: cost of 15 {{.*}} uitofp
309   %1 = uitofp <4 x i32> %a to <4 x float>
310   ret <4 x float> %1
311 }
312
313 define <8 x float> @uitofpv8i32v8float(<8 x i32> %a) {
314   ; SSE2: uitofpv8i32v8float
315   ; SSE2: cost of 30 {{.*}} uitofp
316   %1 = uitofp <8 x i32> %a to <8 x float>
317   ret <8 x float> %1
318 }
319
320 define <16 x float> @uitofpv16i32v16float(<16 x i32> %a) {
321   ; SSE2: uitofpv16i32v16float
322   ; SSE2: cost of 60 {{.*}} uitofp
323   %1 = uitofp <16 x i32> %a to <16 x float>
324   ret <16 x float> %1
325 }
326
327 define <32 x float> @uitofpv32i32v32float(<32 x i32> %a) {
328   ; SSE2: uitofpv32i32v32float
329   ; SSE2: cost of 120 {{.*}} uitofp
330   %1 = uitofp <32 x i32> %a to <32 x float>
331   ret <32 x float> %1
332 }
333
334 define <2 x float> @uitofpv2i64v2float(<2 x i64> %a) {
335   ; SSE2: uitofpv2i64v2float
336   ; SSE2: cost of 15 {{.*}} uitofp
337   %1 = uitofp <2 x i64> %a to <2 x float>
338   ret <2 x float> %1
339 }
340
341 define <4 x float> @uitofpv4i64v4float(<4 x i64> %a) {
342   ; SSE2: uitofpv4i64v4float
343   ; SSE2: cost of 30 {{.*}} uitofp
344   %1 = uitofp <4 x i64> %a to <4 x float>
345   ret <4 x float> %1
346 }
347
348 define <8 x float> @uitofpv8i64v8float(<8 x i64> %a) {
349   ; SSE2: uitofpv8i64v8float
350   ; SSE2: cost of 60 {{.*}} uitofp
351   %1 = uitofp <8 x i64> %a to <8 x float>
352   ret <8 x float> %1
353 }
354
355 define <16 x float> @uitofpv16i64v16float(<16 x i64> %a) {
356   ; SSE2: uitofpv16i64v16float
357   ; SSE2: cost of 120 {{.*}} uitofp
358   %1 = uitofp <16 x i64> %a to <16 x float>
359   ret <16 x float> %1
360 }
361
362 define <32 x float> @uitofpv32i64v32float(<32 x i64> %a) {
363   ; SSE2: uitofpv32i64v32float
364   ; SSE2: cost of 240 {{.*}} uitofp
365   %1 = uitofp <32 x i64> %a to <32 x float>
366   ret <32 x float> %1
367 }
368