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
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
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
16 %1 = uitofp <2 x i8> %a to <2 x double>
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
27 %1 = uitofp <4 x i8> %a to <4 x double>
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
38 %1 = uitofp <8 x i8> %a to <8 x double>
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
49 %1 = uitofp <16 x i8> %a to <16 x double>
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
60 %1 = uitofp <32 x i8> %a to <32 x double>
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
71 %1 = uitofp <2 x i16> %a to <2 x double>
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
82 %1 = uitofp <4 x i16> %a to <4 x double>
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
93 %1 = uitofp <8 x i16> %a to <8 x double>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>