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
9define <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
20define <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
31define <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
42define <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
53define <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
64define <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
75define <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
86define <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
97define <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
108define <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
119define <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
130define <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
141define <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
152define <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
163define <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
174define <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
185define <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
196define <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
207define <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
218define <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
229define <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
236define <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
243define <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
250define <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
257define <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
264define <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
271define <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
278define <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
285define <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
292define <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
299define <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
306define <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
313define <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
320define <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
327define <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
334define <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
341define <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
348define <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
355define <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
362define <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
369