1; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
2; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=knl -cost-model -analyze < %s | FileCheck --check-prefix=AVX512F %s
3
4define <2 x double> @sitofpv2i8v2double(<2 x i8> %a) {
5  ; SSE2: sitofpv2i8v2double
6  ; SSE2: cost of 20 {{.*}} sitofp
7  %1 = sitofp <2 x i8> %a to <2 x double>
8  ret <2 x double> %1
9}
10
11define <4 x double> @sitofpv4i8v4double(<4 x i8> %a) {
12  ; SSE2: sitofpv4i8v4double
13  ; SSE2: cost of 40 {{.*}} sitofp
14  %1 = sitofp <4 x i8> %a to <4 x double>
15  ret <4 x double> %1
16}
17
18define <8 x double> @sitofpv8i8v8double(<8 x i8> %a) {
19  ; SSE2: sitofpv8i8v8double
20  ; SSE2: cost of 80 {{.*}} sitofp
21%1 = sitofp <8 x i8> %a to <8 x double>
22  ret <8 x double> %1
23}
24
25define <16 x double> @sitofpv16i8v16double(<16 x i8> %a) {
26  ; SSE2: sitofpv16i8v16double
27  ; SSE2: cost of 160 {{.*}} sitofp
28  %1 = sitofp <16 x i8> %a to <16 x double>
29  ret <16 x double> %1
30}
31
32define <32 x double> @sitofpv32i8v32double(<32 x i8> %a) {
33  ; SSE2: sitofpv32i8v32double
34  ; SSE2: cost of 320 {{.*}} sitofp
35  %1 = sitofp <32 x i8> %a to <32 x double>
36  ret <32 x double> %1
37}
38
39define <2 x double> @sitofpv2i16v2double(<2 x i16> %a) {
40  ; SSE2: sitofpv2i16v2double
41  ; SSE2: cost of 20 {{.*}} sitofp
42  %1 = sitofp <2 x i16> %a to <2 x double>
43  ret <2 x double> %1
44}
45
46define <4 x double> @sitofpv4i16v4double(<4 x i16> %a) {
47  ; SSE2: sitofpv4i16v4double
48  ; SSE2: cost of 40 {{.*}} sitofp
49  %1 = sitofp <4 x i16> %a to <4 x double>
50  ret <4 x double> %1
51}
52
53define <8 x double> @sitofpv8i16v8double(<8 x i16> %a) {
54  ; SSE2: sitofpv8i16v8double
55  ; SSE2: cost of 80 {{.*}} sitofp
56  %1 = sitofp <8 x i16> %a to <8 x double>
57  ret <8 x double> %1
58}
59
60define <16 x double> @sitofpv16i16v16double(<16 x i16> %a) {
61  ; SSE2: sitofpv16i16v16double
62  ; SSE2: cost of 160 {{.*}} sitofp
63  %1 = sitofp <16 x i16> %a to <16 x double>
64  ret <16 x double> %1
65}
66
67define <32 x double> @sitofpv32i16v32double(<32 x i16> %a) {
68  ; SSE2: sitofpv32i16v32double
69  ; SSE2: cost of 320 {{.*}} sitofp
70  %1 = sitofp <32 x i16> %a to <32 x double>
71  ret <32 x double> %1
72}
73
74define <2 x double> @sitofpv2i32v2double(<2 x i32> %a) {
75  ; SSE2: sitofpv2i32v2double
76  ; SSE2: cost of 20 {{.*}} sitofp
77  %1 = sitofp <2 x i32> %a to <2 x double>
78  ret <2 x double> %1
79}
80
81define <4 x double> @sitofpv4i32v4double(<4 x i32> %a) {
82  ; SSE2: sitofpv4i32v4double
83  ; SSE2: cost of 40 {{.*}} sitofp
84  %1 = sitofp <4 x i32> %a to <4 x double>
85  ret <4 x double> %1
86}
87
88define <8 x double> @sitofpv8i32v8double(<8 x i32> %a) {
89  ; SSE2: sitofpv8i32v8double
90  ; SSE2: cost of 80 {{.*}} sitofp
91  %1 = sitofp <8 x i32> %a to <8 x double>
92  ret <8 x double> %1
93}
94
95define <16 x double> @sitofpv16i32v16double(<16 x i32> %a) {
96  ; SSE2: sitofpv16i32v16double
97  ; SSE2: cost of 160 {{.*}} sitofp
98  %1 = sitofp <16 x i32> %a to <16 x double>
99  ret <16 x double> %1
100}
101
102define <32 x double> @sitofpv32i32v32double(<32 x i32> %a) {
103  ; SSE2: sitofpv32i32v32double
104  ; SSE2: cost of 320 {{.*}} sitofp
105  %1 = sitofp <32 x i32> %a to <32 x double>
106  ret <32 x double> %1
107}
108
109define <2 x double> @sitofpv2i64v2double(<2 x i64> %a) {
110  ; SSE2: sitofpv2i64v2double
111  ; SSE2: cost of 20 {{.*}} sitofp
112  %1 = sitofp <2 x i64> %a to <2 x double>
113  ret <2 x double> %1
114}
115
116define <4 x double> @sitofpv4i64v4double(<4 x i64> %a) {
117  ; SSE2: sitofpv4i64v4double
118  ; SSE2: cost of 40 {{.*}} sitofp
119  %1 = sitofp <4 x i64> %a to <4 x double>
120  ret <4 x double> %1
121}
122
123define <8 x double> @sitofpv8i64v8double(<8 x i64> %a) {
124  %1 = sitofp <8 x i64> %a to <8 x double>
125  ; SSE2: sitofpv8i64v8double
126  ; SSE2: cost of 80 {{.*}} sitofp
127  ret <8 x double> %1
128}
129
130define <16 x double> @sitofpv16i64v16double(<16 x i64> %a) {
131  ; SSE2: sitofpv16i64v16double
132  ; SSE2: cost of 160 {{.*}} sitofp
133  %1 = sitofp <16 x i64> %a to <16 x double>
134  ret <16 x double> %1
135}
136
137define <32 x double> @sitofpv32i64v32double(<32 x i64> %a) {
138  ; SSE2: sitofpv32i64v32double
139  ; SSE2: cost of 320 {{.*}} sitofp
140  %1 = sitofp <32 x i64> %a to <32 x double>
141  ret <32 x double> %1
142}
143
144define <2 x float> @sitofpv2i8v2float(<2 x i8> %a) {
145  ; SSE2: sitofpv2i8v2float
146  ; SSE2: cost of 15 {{.*}} sitofp
147  %1 = sitofp <2 x i8> %a to <2 x float>
148  ret <2 x float> %1
149}
150
151define <4 x float> @sitofpv4i8v4float(<4 x i8> %a) {
152  ; SSE2: sitofpv4i8v4float
153  ; SSE2: cost of 15 {{.*}} sitofp
154  %1 = sitofp <4 x i8> %a to <4 x float>
155  ret <4 x float> %1
156}
157
158define <8 x float> @sitofpv8i8v8float(<8 x i8> %a) {
159  ; SSE2: sitofpv8i8v8float
160  ; SSE2: cost of 15 {{.*}} sitofp
161  %1 = sitofp <8 x i8> %a to <8 x float>
162  ret <8 x float> %1
163}
164
165define <16 x float> @sitofpv16i8v16float(<16 x i8> %a) {
166  ; SSE2: sitofpv16i8v16float
167  ; SSE2: cost of 8 {{.*}} sitofp
168  %1 = sitofp <16 x i8> %a to <16 x float>
169  ret <16 x float> %1
170}
171
172define <32 x float> @sitofpv32i8v32float(<32 x i8> %a) {
173  ; SSE2: sitofpv32i8v32float
174  ; SSE2: cost of 16 {{.*}} sitofp
175  %1 = sitofp <32 x i8> %a to <32 x float>
176  ret <32 x float> %1
177}
178
179define <2 x float> @sitofpv2i16v2float(<2 x i16> %a) {
180  ; SSE2: sitofpv2i16v2float
181  ; SSE2: cost of 15 {{.*}} sitofp
182  %1 = sitofp <2 x i16> %a to <2 x float>
183  ret <2 x float> %1
184}
185
186define <4 x float> @sitofpv4i16v4float(<4 x i16> %a) {
187  ; SSE2: sitofpv4i16v4float
188  ; SSE2: cost of 15 {{.*}} sitofp
189  %1 = sitofp <4 x i16> %a to <4 x float>
190  ret <4 x float> %1
191}
192
193define <8 x float> @sitofpv8i16v8float(<8 x i16> %a) {
194  ; SSE2: sitofpv8i16v8float
195  ; SSE2: cost of 15 {{.*}} sitofp
196  %1 = sitofp <8 x i16> %a to <8 x float>
197  ret <8 x float> %1
198}
199
200define <16 x float> @sitofpv16i16v16float(<16 x i16> %a) {
201  ; SSE2: sitofpv16i16v16float
202  ; SSE2: cost of 30 {{.*}} sitofp
203  %1 = sitofp <16 x i16> %a to <16 x float>
204  ret <16 x float> %1
205}
206
207define <32 x float> @sitofpv32i16v32float(<32 x i16> %a) {
208  ; SSE2: sitofpv32i16v32float
209  ; SSE2: cost of 60 {{.*}} sitofp
210  %1 = sitofp <32 x i16> %a to <32 x float>
211  ret <32 x float> %1
212}
213
214define <2 x float> @sitofpv2i32v2float(<2 x i32> %a) {
215  ; SSE2: sitofpv2i32v2float
216  ; SSE2: cost of 15 {{.*}} sitofp
217  %1 = sitofp <2 x i32> %a to <2 x float>
218  ret <2 x float> %1
219}
220
221define <4 x float> @sitofpv4i32v4float(<4 x i32> %a) {
222  ; SSE2: sitofpv4i32v4float
223  ; SSE2: cost of 15 {{.*}} sitofp
224  %1 = sitofp <4 x i32> %a to <4 x float>
225  ret <4 x float> %1
226}
227
228define <8 x float> @sitofpv8i32v8float(<8 x i32> %a) {
229  ; SSE2: sitofpv8i32v8float
230  ; SSE2: cost of 30 {{.*}} sitofp
231  %1 = sitofp <8 x i32> %a to <8 x float>
232  ret <8 x float> %1
233}
234
235define <16 x float> @sitofpv16i32v16float(<16 x i32> %a) {
236  ; SSE2: sitofpv16i32v16float
237  ; SSE2: cost of 60 {{.*}} sitofp
238  %1 = sitofp <16 x i32> %a to <16 x float>
239  ret <16 x float> %1
240}
241
242define <32 x float> @sitofpv32i32v32float(<32 x i32> %a) {
243  ; SSE2: sitofpv32i32v32float
244  ; SSE2: cost of 120 {{.*}} sitofp
245  %1 = sitofp <32 x i32> %a to <32 x float>
246  ret <32 x float> %1
247}
248
249define <2 x float> @sitofpv2i64v2float(<2 x i64> %a) {
250  ; SSE2: sitofpv2i64v2float
251  ; SSE2: cost of 15 {{.*}} sitofp
252  %1 = sitofp <2 x i64> %a to <2 x float>
253  ret <2 x float> %1
254}
255
256define <4 x float> @sitofpv4i64v4float(<4 x i64> %a) {
257  ; SSE2: sitofpv4i64v4float
258  ; SSE2: cost of 30 {{.*}} sitofp
259  %1 = sitofp <4 x i64> %a to <4 x float>
260  ret <4 x float> %1
261}
262
263define <8 x float> @sitofpv8i64v8float(<8 x i64> %a) {
264  ; SSE2: sitofpv8i64v8float
265  ; SSE2: cost of 60 {{.*}} sitofp
266  %1 = sitofp <8 x i64> %a to <8 x float>
267  ret <8 x float> %1
268}
269
270define <16 x float> @sitofpv16i64v16float(<16 x i64> %a) {
271  ; SSE2: sitofpv16i64v16float
272  ; SSE2: cost of 120 {{.*}} sitofp
273  %1 = sitofp <16 x i64> %a to <16 x float>
274  ret <16 x float> %1
275}
276
277define <32 x float> @sitofpv32i64v32float(<32 x i64> %a) {
278  ; SSE2: sitofpv32i64v32float
279  ; SSE2: cost of 240 {{.*}} sitofp
280  %1 = sitofp <32 x i64> %a to <32 x float>
281  ret <32 x float> %1
282}
283
284; AVX512F-LABEL: sitofp_16i8_float
285; AVX512F: cost of 2 {{.*}} sitofp
286define <16 x float> @sitofp_16i8_float(<16 x i8> %a) {
287  %1 = sitofp <16 x i8> %a to <16 x float>
288  ret <16 x float> %1
289}
290
291define <16 x float> @sitofp_16i16_float(<16 x i16> %a) {
292  ; AVX512F-LABEL: sitofp_16i16_float
293  ; AVX512F: cost of 2 {{.*}} sitofp
294  %1 = sitofp <16 x i16> %a to <16 x float>
295  ret <16 x float> %1
296}
297
298; AVX512F-LABEL: sitofp_8i8_double
299; AVX512F: cost of 2 {{.*}} sitofp
300define <8 x double> @sitofp_8i8_double(<8 x i8> %a) {
301  %1 = sitofp <8 x i8> %a to <8 x double>
302  ret <8 x double> %1
303}
304
305; AVX512F-LABEL: sitofp_8i16_double
306; AVX512F: cost of 2 {{.*}} sitofp
307define <8 x double> @sitofp_8i16_double(<8 x i16> %a) {
308  %1 = sitofp <8 x i16> %a to <8 x double>
309  ret <8 x double> %1
310}
311
312; AVX512F-LABEL: sitofp_8i1_double
313; AVX512F: cost of 4 {{.*}} sitofp
314define <8 x double> @sitofp_8i1_double(<8 x double> %a) {
315  %cmpres = fcmp ogt <8 x double> %a, zeroinitializer
316  %1 = sitofp <8 x i1> %cmpres to <8 x double>
317  ret <8 x double> %1
318}
319
320; AVX512F-LABEL: sitofp_16i1_float
321; AVX512F: cost of 3 {{.*}} sitofp
322define <16 x float> @sitofp_16i1_float(<16 x float> %a) {
323  %cmpres = fcmp ogt <16 x float> %a, zeroinitializer
324  %1 = sitofp <16 x i1> %cmpres to <16 x float>
325  ret <16 x float> %1
326}
327