6429e4fae097800fb66a92e90e7e4b9630ff77d1
[oota-llvm.git] / test / Analysis / CostModel / X86 / sse-itoi.ll
1 ; RUN: opt -mtriple=x86_64-apple-darwin -mattr=+sse2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
2 ; RUN: opt -mtriple=x86_64-apple-darwin -mattr=+sse4.1 -cost-model -analyze < %s | FileCheck --check-prefix=SSE41 %s
3
4 define void @zext_v16i16_to_v16i32(<16 x i16>* %a) {
5 ; SSE2: zext_v16i16_to_v16i32
6 ; SSE2: cost of 6 {{.*}} zext
7 ;
8 ; SSE41: zext_v16i16_to_v16i32
9 ; SSE41: cost of 4 {{.*}} zext
10 ;
11   %1 = load <16 x i16>, <16 x i16>* %a
12   %2 = zext <16 x i16> %1 to <16 x i32>
13   store <16 x i32> %2, <16 x i32>* undef, align 4
14   ret void
15 }
16
17 define void @sext_v16i16_to_v16i32(<16 x i16>* %a) {
18 ; SSE2: sext_v16i16_to_v16i32
19 ; SSE2: cost of 8 {{.*}} sext
20 ;
21 ; SSE41: sext_v16i16_to_v16i32
22 ; SSE41: cost of 4 {{.*}} sext
23 ;
24   %1 = load <16 x i16>, <16 x i16>* %a
25   %2 = sext <16 x i16> %1 to <16 x i32>
26   store <16 x i32> %2, <16 x i32>* undef, align 4
27   ret void
28 }
29
30 define void @zext_v8i16_to_v8i32(<8 x i16>* %a) {
31 ; SSE2: zext_v8i16_to_v8i32
32 ; SSE2: cost of 3 {{.*}} zext
33 ;
34 ; SSE41: zext_v8i16_to_v8i32
35 ; SSE41: cost of 2 {{.*}} zext
36 ;
37   %1 = load <8 x i16>, <8 x i16>* %a
38   %2 = zext <8 x i16> %1 to <8 x i32>
39   store <8 x i32> %2, <8 x i32>* undef, align 4
40   ret void
41 }
42
43 define void @sext_v8i16_to_v8i32(<8 x i16>* %a) {
44 ; SSE2: sext_v8i16_to_v8i32
45 ; SSE2: cost of 4 {{.*}} sext
46 ;
47 ; SSE41: sext_v8i16_to_v8i32
48 ; SSE41: cost of 2 {{.*}} sext
49 ;
50   %1 = load <8 x i16>, <8 x i16>* %a
51   %2 = sext <8 x i16> %1 to <8 x i32>
52   store <8 x i32> %2, <8 x i32>* undef, align 4
53   ret void
54 }
55
56 define void @zext_v4i16_to_v4i32(<4 x i16>* %a) {
57 ; SSE2: zext_v4i16_to_v4i32
58 ; SSE2: cost of 1 {{.*}} zext
59 ;
60 ; SSE41: zext_v4i16_to_v4i32
61 ; SSE41: cost of 1 {{.*}} zext
62 ;
63   %1 = load <4 x i16>, <4 x i16>* %a
64   %2 = zext <4 x i16> %1 to <4 x i32>
65   store <4 x i32> %2, <4 x i32>* undef, align 4
66   ret void
67 }
68
69 define void @sext_v4i16_to_v4i32(<4 x i16>* %a) {
70 ; SSE2: sext_v4i16_to_v4i32
71 ; SSE2: cost of 2 {{.*}} sext
72 ;
73 ; SSE41: sext_v4i16_to_v4i32
74 ; SSE41: cost of 1 {{.*}} sext
75 ;
76   %1 = load <4 x i16>, <4 x i16>* %a
77   %2 = sext <4 x i16> %1 to <4 x i32>
78   store <4 x i32> %2, <4 x i32>* undef, align 4
79   ret void
80 }
81
82 define void @zext_v16i8_to_v16i32(<16 x i8>* %a) {
83 ; SSE2: zext_v16i8_to_v16i32
84 ; SSE2: cost of 9 {{.*}} zext
85 ;
86 ; SSE41: zext_v16i8_to_v16i32
87 ; SSE41: cost of 4 {{.*}} zext
88 ;
89   %1 = load <16 x i8>, <16 x i8>* %a
90   %2 = zext <16 x i8> %1 to <16 x i32>
91   store <16 x i32> %2, <16 x i32>* undef, align 4
92   ret void
93 }
94
95 define void @sext_v16i8_to_v16i32(<16 x i8>* %a) {
96 ; SSE2: sext_v16i8_to_v16i32
97 ; SSE2: cost of 12 {{.*}} sext
98 ;
99 ; SSE41: sext_v16i8_to_v16i32
100 ; SSE41: cost of 4 {{.*}} sext
101 ;
102   %1 = load <16 x i8>, <16 x i8>* %a
103   %2 = sext <16 x i8> %1 to <16 x i32>
104   store <16 x i32> %2, <16 x i32>* undef, align 4
105   ret void
106 }
107
108 define void @zext_v8i8_to_v8i32(<8 x i8>* %a) {
109 ; SSE2: zext_v8i8_to_v8i32
110 ; SSE2: cost of 6 {{.*}} zext
111 ;
112 ; SSE41: zext_v8i8_to_v8i32
113 ; SSE41: cost of 2 {{.*}} zext
114 ;
115   %1 = load <8 x i8>, <8 x i8>* %a
116   %2 = zext <8 x i8> %1 to <8 x i32>
117   store <8 x i32> %2, <8 x i32>* undef, align 4
118   ret void
119 }
120
121 define void @sext_v8i8_to_v8i32(<8 x i8>* %a) {
122 ; SSE2: sext_v8i8_to_v8i32
123 ; SSE2: cost of 6 {{.*}} sext
124 ;
125 ; SSE41: sext_v8i8_to_v8i32
126 ; SSE41: cost of 2 {{.*}} sext
127 ;
128   %1 = load <8 x i8>, <8 x i8>* %a
129   %2 = sext <8 x i8> %1 to <8 x i32>
130   store <8 x i32> %2, <8 x i32>* undef, align 4
131   ret void
132 }
133
134 define void @zext_v4i8_to_v4i32(<4 x i8>* %a) {
135 ; SSE2: zext_v4i8_to_v4i32
136 ; SSE2: cost of 2 {{.*}} zext
137 ;
138 ; SSE41: zext_v4i8_to_v4i32
139 ; SSE41: cost of 1 {{.*}} zext
140 ;
141   %1 = load <4 x i8>, <4 x i8>* %a
142   %2 = zext <4 x i8> %1 to <4 x i32>
143   store <4 x i32> %2, <4 x i32>* undef, align 4
144   ret void
145 }
146
147 define void @sext_v4i8_to_v4i32(<4 x i8>* %a) {
148 ; SSE2: sext_v4i8_to_v4i32
149 ; SSE2: cost of 3 {{.*}} sext
150 ;
151 ; SSE41: sext_v4i8_to_v4i32
152 ; SSE41: cost of 1 {{.*}} sext
153 ;
154   %1 = load <4 x i8>, <4 x i8>* %a
155   %2 = sext <4 x i8> %1 to <4 x i32>
156   store <4 x i32> %2, <4 x i32>* undef, align 4
157   ret void
158 }
159
160 define void @zext_v16i8_to_v16i16(<16 x i8>* %a) {
161 ; SSE2: zext_v16i8_to_v16i16
162 ; SSE2: cost of 3 {{.*}} zext
163 ;
164 ; SSE41: zext_v16i8_to_v16i16
165 ; SSE41: cost of 2 {{.*}} zext
166 ;
167   %1 = load <16 x i8>, <16 x i8>* %a
168   %2 = zext <16 x i8> %1 to <16 x i16>
169   store <16 x i16> %2, <16 x i16>* undef, align 4
170   ret void
171 }
172
173 define void @sext_v16i8_to_v16i16(<16 x i8>* %a) {
174 ; SSE2: sext_v16i8_to_v16i16
175 ; SSE2: cost of 4 {{.*}} sext
176 ;
177 ; SSE41: sext_v16i8_to_v16i16
178 ; SSE41: cost of 2 {{.*}} sext
179 ;
180   %1 = load <16 x i8>, <16 x i8>* %a
181   %2 = sext <16 x i8> %1 to <16 x i16>
182   store <16 x i16> %2, <16 x i16>* undef, align 4
183   ret void
184 }
185
186 define void @zext_v8i8_to_v8i16(<8 x i8>* %a) {
187 ; SSE2: zext_v8i8_to_v8i16
188 ; SSE2: cost of 1 {{.*}} zext
189 ;
190 ; SSE41: zext_v8i8_to_v8i16
191 ; SSE41: cost of 1 {{.*}} zext
192 ;
193   %1 = load <8 x i8>, <8 x i8>* %a
194   %2 = zext <8 x i8> %1 to <8 x i16>
195   store <8 x i16> %2, <8 x i16>* undef, align 4
196   ret void
197 }
198
199 define void @sext_v8i8_to_v8i16(<8 x i8>* %a) {
200 ; SSE2: sext_v8i8_to_v8i16
201 ; SSE2: cost of 2 {{.*}} sext
202 ;
203 ; SSE41: sext_v8i8_to_v8i16
204 ; SSE41: cost of 1 {{.*}} sext
205 ;
206   %1 = load <8 x i8>, <8 x i8>* %a
207   %2 = sext <8 x i8> %1 to <8 x i16>
208   store <8 x i16> %2, <8 x i16>* undef, align 4
209   ret void
210 }
211
212 define void @zext_v4i8_to_v4i16(<4 x i8>* %a) {
213 ; SSE2: zext_v4i8_to_v4i16
214 ; SSE2: cost of 1 {{.*}} zext
215 ;
216 ; SSE41: zext_v4i8_to_v4i16
217 ; SSE41: cost of 1 {{.*}} zext
218 ;
219   %1 = load <4 x i8>, <4 x i8>* %a
220   %2 = zext <4 x i8> %1 to <4 x i16>
221   store <4 x i16> %2, <4 x i16>* undef, align 4
222   ret void
223 }
224
225 define void @sext_v4i8_to_v4i16(<4 x i8>* %a) {
226 ; SSE2: sext_v4i8_to_v4i16
227 ; SSE2: cost of 6 {{.*}} sext
228 ;
229 ; SSE41: sext_v4i8_to_v4i16
230 ; SSE41: cost of 2 {{.*}} sext
231 ;
232   %1 = load <4 x i8>, <4 x i8>* %a
233   %2 = sext <4 x i8> %1 to <4 x i16>
234   store <4 x i16> %2, <4 x i16>* undef, align 4
235   ret void
236 }
237
238 define void @truncate_v16i32_to_v16i16(<16 x i32>* %a) {
239 ; SSE2: truncate_v16i32_to_v16i16
240 ; SSE2: cost of 14 {{.*}} trunc
241 ;
242 ; SSE41: truncate_v16i32_to_v16i16
243 ; SSE41: cost of 6 {{.*}} trunc
244 ;
245   %1 = load <16 x i32>, <16 x i32>* %a
246   %2 = trunc <16 x i32> %1 to <16 x i16>
247   store <16 x i16> %2, <16 x i16>* undef, align 4
248   ret void
249 }
250
251 define void @truncate_v8i32_to_v8i16(<8 x i32>* %a) {
252 ; SSE2: truncate_v8i32_to_v8i16
253 ; SSE2: cost of 7 {{.*}} trunc
254 ;
255 ; SSE41: truncate_v8i32_to_v8i16
256 ; SSE41: cost of 3 {{.*}} trunc
257 ;
258   %1 = load <8 x i32>, <8 x i32>* %a
259   %2 = trunc <8 x i32> %1 to <8 x i16>
260   store <8 x i16> %2, <8 x i16>* undef, align 4
261   ret void
262 }
263
264 define void @truncate_v4i32_to_v4i16(<4 x i32>* %a) {
265 ; SSE2: truncate_v4i32_to_v4i16
266 ; SSE2: cost of 3 {{.*}} trunc
267 ;
268 ; SSE41: truncate_v4i32_to_v4i16
269 ; SSE41: cost of 1 {{.*}} trunc
270 ;
271   %1 = load <4 x i32>, <4 x i32>* %a
272   %2 = trunc <4 x i32> %1 to <4 x i16>
273   store <4 x i16> %2, <4 x i16>* undef, align 4
274   ret void
275 }
276
277 define void @truncate_v16i32_to_v16i8(<16 x i32>* %a) {
278 ; SSE2: truncate_v16i32_to_v16i8
279 ; SSE2: cost of 31 {{.*}} trunc
280 ;
281 ; SSE41: truncate_v16i32_to_v16i8
282 ; SSE41: cost of 30 {{.*}} trunc
283 ;
284   %1 = load <16 x i32>, <16 x i32>* %a
285   %2 = trunc <16 x i32> %1 to <16 x i8>
286   store <16 x i8> %2, <16 x i8>* undef, align 4
287   ret void
288 }
289
290 define void @truncate_v8i32_to_v8i8(<8 x i32>* %a) {
291 ; SSE2: truncate_v8i32_to_v8i8
292 ; SSE2: cost of 4 {{.*}} trunc
293 ;
294 ; SSE41: truncate_v8i32_to_v8i8
295 ; SSE41: cost of 3 {{.*}} trunc
296 ;
297   %1 = load <8 x i32>, <8 x i32>* %a
298   %2 = trunc <8 x i32> %1 to <8 x i8>
299   store <8 x i8> %2, <8 x i8>* undef, align 4
300   ret void
301 }
302
303 define void @truncate_v4i32_to_v4i8(<4 x i32>* %a) {
304 ; SSE2: truncate_v4i32_to_v4i8
305 ; SSE2: cost of 3 {{.*}} trunc
306 ;
307 ; SSE41: truncate_v4i32_to_v4i8
308 ; SSE41: cost of 1 {{.*}} trunc
309 ;
310   %1 = load <4 x i32>, <4 x i32>* %a
311   %2 = trunc <4 x i32> %1 to <4 x i8>
312   store <4 x i8> %2, <4 x i8>* undef, align 4
313   ret void
314 }
315
316 define void @truncate_v16i16_to_v16i8(<16 x i16>* %a) {
317 ; SSE2: truncate_v16i16_to_v16i8
318 ; SSE2: cost of 3 {{.*}} trunc
319 ;
320 ; SSE41: truncate_v16i16_to_v16i8
321 ; SSE41: cost of 3 {{.*}} trunc
322 ;
323   %1 = load <16 x i16>, <16 x i16>* %a
324   %2 = trunc <16 x i16> %1 to <16 x i8>
325   store <16 x i8> %2, <16 x i8>* undef, align 4
326   ret void
327 }
328
329 define void @truncate_v8i16_to_v8i8(<8 x i16>* %a) {
330 ; SSE2: truncate_v8i16_to_v8i8
331 ; SSE2: cost of 2 {{.*}} trunc
332 ;
333 ; SSE41: truncate_v8i16_to_v8i8
334 ; SSE41: cost of 1 {{.*}} trunc
335 ;
336   %1 = load <8 x i16>, <8 x i16>* %a
337   %2 = trunc <8 x i16> %1 to <8 x i8>
338   store <8 x i8> %2, <8 x i8>* undef, align 4
339   ret void
340 }
341
342 define void @truncate_v4i16_to_v4i8(<4 x i16>* %a) {
343 ; SSE2: truncate_v4i16_to_v4i8
344 ; SSE2: cost of 4 {{.*}} trunc
345 ;
346 ; SSE41: truncate_v4i16_to_v4i8
347 ; SSE41: cost of 2 {{.*}} trunc
348 ;
349   %1 = load <4 x i16>, <4 x i16>* %a
350   %2 = trunc <4 x i16> %1 to <4 x i8>
351   store <4 x i8> %2, <4 x i8>* undef, align 4
352   ret void
353 }