llvm.org GIT mirror llvm / 8134565
X86 cost model: Model cost for uitofp and sitofp on SSE2 The costs are overfitted so that I can still use the legalization factor. For example the following kernel has about half the throughput vectorized than unvectorized when compiled with SSE2. Before this patch we would vectorize it. unsigned short A[1024]; double B[1024]; void f() { int i; for (i = 0; i < 1024; ++i) { B[i] = (double) A[i]; } } radar://13599001 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179033 91177308-0d34-0410-b5e6-96231b3b80d8 Arnold Schwaighofer 7 years ago
3 changed file(s) with 677 addition(s) and 3 deletion(s). Raw diff Collapse all Expand all
333333 int ISD = TLI->InstructionOpcodeToISD(Opcode);
334334 assert(ISD && "Invalid opcode");
335335
336 std::pair LTSrc = TLI->getTypeLegalizationCost(Src);
337 std::pair LTDest = TLI->getTypeLegalizationCost(Dst);
338
339 static const TypeConversionCostTblEntry SSE2ConvTbl[] = {
340 // These are somewhat magic numbers justified by looking at the output of
341 // Intel's IACA, running some kernels and making sure when we take
342 // legalization into account the throughput will be overestimated.
343 { ISD::UINT_TO_FP, MVT::v2f64, MVT::v2i64, 2*10 },
344 { ISD::UINT_TO_FP, MVT::v2f64, MVT::v4i32, 4*10 },
345 { ISD::UINT_TO_FP, MVT::v2f64, MVT::v8i16, 8*10 },
346 { ISD::UINT_TO_FP, MVT::v2f64, MVT::v16i8, 16*10 },
347 { ISD::SINT_TO_FP, MVT::v2f64, MVT::v2i64, 2*10 },
348 { ISD::SINT_TO_FP, MVT::v2f64, MVT::v4i32, 4*10 },
349 { ISD::SINT_TO_FP, MVT::v2f64, MVT::v8i16, 8*10 },
350 { ISD::SINT_TO_FP, MVT::v2f64, MVT::v16i8, 16*10 },
351 // There are faster sequences for float conversions.
352 { ISD::UINT_TO_FP, MVT::v4f32, MVT::v2i64, 15 },
353 { ISD::UINT_TO_FP, MVT::v4f32, MVT::v4i32, 15 },
354 { ISD::UINT_TO_FP, MVT::v4f32, MVT::v8i16, 15 },
355 { ISD::UINT_TO_FP, MVT::v4f32, MVT::v16i8, 8 },
356 { ISD::SINT_TO_FP, MVT::v4f32, MVT::v2i64, 15 },
357 { ISD::SINT_TO_FP, MVT::v4f32, MVT::v4i32, 15 },
358 { ISD::SINT_TO_FP, MVT::v4f32, MVT::v8i16, 15 },
359 { ISD::SINT_TO_FP, MVT::v4f32, MVT::v16i8, 8 },
360 };
361
362 if (ST->hasSSE2() && !ST->hasAVX()) {
363 int Idx = ConvertCostTableLookup(SSE2ConvTbl,
364 array_lengthof(SSE2ConvTbl),
365 ISD, LTDest.second, LTSrc.second);
366 if (Idx != -1)
367 return LTSrc.first * SSE2ConvTbl[Idx].Cost;
368 }
369
336370 EVT SrcTy = TLI->getValueType(Src);
337371 EVT DstTy = TLI->getValueType(Dst);
338
339 if (!SrcTy.isSimple() || !DstTy.isSimple())
340 return TargetTransformInfo::getCastInstrCost(Opcode, Dst, Src);
341372
342373 static const TypeConversionCostTblEntry AVXConversionTbl[] = {
343374 { ISD::SIGN_EXTEND, MVT::v8i32, MVT::v8i16, 1 },
0 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
1
2 define <2 x double> @sitofpv2i8v2double(<2 x i8> %a) {
3 ; SSE2: sitofpv2i8v2double
4 ; SSE2: cost of 20 {{.*}} sitofp
5 %1 = sitofp <2 x i8> %a to <2 x double>
6 ret <2 x double> %1
7 }
8
9 define <4 x double> @sitofpv4i8v4double(<4 x i8> %a) {
10 ; SSE2: sitofpv4i8v4double
11 ; SSE2: cost of 40 {{.*}} sitofp
12 %1 = sitofp <4 x i8> %a to <4 x double>
13 ret <4 x double> %1
14 }
15
16 define <8 x double> @sitofpv8i8v8double(<8 x i8> %a) {
17 ; SSE2: sitofpv8i8v8double
18 ; SSE2: cost of 80 {{.*}} sitofp
19 %1 = sitofp <8 x i8> %a to <8 x double>
20 ret <8 x double> %1
21 }
22
23 define <16 x double> @sitofpv16i8v16double(<16 x i8> %a) {
24 ; SSE2: sitofpv16i8v16double
25 ; SSE2: cost of 160 {{.*}} sitofp
26 %1 = sitofp <16 x i8> %a to <16 x double>
27 ret <16 x double> %1
28 }
29
30 define <32 x double> @sitofpv32i8v32double(<32 x i8> %a) {
31 ; SSE2: sitofpv32i8v32double
32 ; SSE2: cost of 320 {{.*}} sitofp
33 %1 = sitofp <32 x i8> %a to <32 x double>
34 ret <32 x double> %1
35 }
36
37 define <2 x double> @sitofpv2i16v2double(<2 x i16> %a) {
38 ; SSE2: sitofpv2i16v2double
39 ; SSE2: cost of 20 {{.*}} sitofp
40 %1 = sitofp <2 x i16> %a to <2 x double>
41 ret <2 x double> %1
42 }
43
44 define <4 x double> @sitofpv4i16v4double(<4 x i16> %a) {
45 ; SSE2: sitofpv4i16v4double
46 ; SSE2: cost of 40 {{.*}} sitofp
47 %1 = sitofp <4 x i16> %a to <4 x double>
48 ret <4 x double> %1
49 }
50
51 define <8 x double> @sitofpv8i16v8double(<8 x i16> %a) {
52 ; SSE2: sitofpv8i16v8double
53 ; SSE2: cost of 80 {{.*}} sitofp
54 %1 = sitofp <8 x i16> %a to <8 x double>
55 ret <8 x double> %1
56 }
57
58 define <16 x double> @sitofpv16i16v16double(<16 x i16> %a) {
59 ; SSE2: sitofpv16i16v16double
60 ; SSE2: cost of 160 {{.*}} sitofp
61 %1 = sitofp <16 x i16> %a to <16 x double>
62 ret <16 x double> %1
63 }
64
65 define <32 x double> @sitofpv32i16v32double(<32 x i16> %a) {
66 ; SSE2: sitofpv32i16v32double
67 ; SSE2: cost of 320 {{.*}} sitofp
68 %1 = sitofp <32 x i16> %a to <32 x double>
69 ret <32 x double> %1
70 }
71
72 define <2 x double> @sitofpv2i32v2double(<2 x i32> %a) {
73 ; SSE2: sitofpv2i32v2double
74 ; SSE2: cost of 20 {{.*}} sitofp
75 %1 = sitofp <2 x i32> %a to <2 x double>
76 ret <2 x double> %1
77 }
78
79 define <4 x double> @sitofpv4i32v4double(<4 x i32> %a) {
80 ; SSE2: sitofpv4i32v4double
81 ; SSE2: cost of 40 {{.*}} sitofp
82 %1 = sitofp <4 x i32> %a to <4 x double>
83 ret <4 x double> %1
84 }
85
86 define <8 x double> @sitofpv8i32v8double(<8 x i32> %a) {
87 ; SSE2: sitofpv8i32v8double
88 ; SSE2: cost of 80 {{.*}} sitofp
89 %1 = sitofp <8 x i32> %a to <8 x double>
90 ret <8 x double> %1
91 }
92
93 define <16 x double> @sitofpv16i32v16double(<16 x i32> %a) {
94 ; SSE2: sitofpv16i32v16double
95 ; SSE2: cost of 160 {{.*}} sitofp
96 %1 = sitofp <16 x i32> %a to <16 x double>
97 ret <16 x double> %1
98 }
99
100 define <32 x double> @sitofpv32i32v32double(<32 x i32> %a) {
101 ; SSE2: sitofpv32i32v32double
102 ; SSE2: cost of 320 {{.*}} sitofp
103 %1 = sitofp <32 x i32> %a to <32 x double>
104 ret <32 x double> %1
105 }
106
107 define <2 x double> @sitofpv2i64v2double(<2 x i64> %a) {
108 ; SSE2: sitofpv2i64v2double
109 ; SSE2: cost of 20 {{.*}} sitofp
110 %1 = sitofp <2 x i64> %a to <2 x double>
111 ret <2 x double> %1
112 }
113
114 define <4 x double> @sitofpv4i64v4double(<4 x i64> %a) {
115 ; SSE2: sitofpv4i64v4double
116 ; SSE2: cost of 40 {{.*}} sitofp
117 %1 = sitofp <4 x i64> %a to <4 x double>
118 ret <4 x double> %1
119 }
120
121 define <8 x double> @sitofpv8i64v8double(<8 x i64> %a) {
122 %1 = sitofp <8 x i64> %a to <8 x double>
123 ; SSE2: sitofpv8i64v8double
124 ; SSE2: cost of 80 {{.*}} sitofp
125 ret <8 x double> %1
126 }
127
128 define <16 x double> @sitofpv16i64v16double(<16 x i64> %a) {
129 ; SSE2: sitofpv16i64v16double
130 ; SSE2: cost of 160 {{.*}} sitofp
131 %1 = sitofp <16 x i64> %a to <16 x double>
132 ret <16 x double> %1
133 }
134
135 define <32 x double> @sitofpv32i64v32double(<32 x i64> %a) {
136 ; SSE2: sitofpv32i64v32double
137 ; SSE2: cost of 320 {{.*}} sitofp
138 %1 = sitofp <32 x i64> %a to <32 x double>
139 ret <32 x double> %1
140 }
141
142 define <2 x float> @sitofpv2i8v2float(<2 x i8> %a) {
143 ; SSE2: sitofpv2i8v2float
144 ; SSE2: cost of 15 {{.*}} sitofp
145 %1 = sitofp <2 x i8> %a to <2 x float>
146 ret <2 x float> %1
147 }
148
149 define <4 x float> @sitofpv4i8v4float(<4 x i8> %a) {
150 ; SSE2: sitofpv4i8v4float
151 ; SSE2: cost of 15 {{.*}} sitofp
152 %1 = sitofp <4 x i8> %a to <4 x float>
153 ret <4 x float> %1
154 }
155
156 define <8 x float> @sitofpv8i8v8float(<8 x i8> %a) {
157 ; SSE2: sitofpv8i8v8float
158 ; SSE2: cost of 15 {{.*}} sitofp
159 %1 = sitofp <8 x i8> %a to <8 x float>
160 ret <8 x float> %1
161 }
162
163 define <16 x float> @sitofpv16i8v16float(<16 x i8> %a) {
164 ; SSE2: sitofpv16i8v16float
165 ; SSE2: cost of 8 {{.*}} sitofp
166 %1 = sitofp <16 x i8> %a to <16 x float>
167 ret <16 x float> %1
168 }
169
170 define <32 x float> @sitofpv32i8v32float(<32 x i8> %a) {
171 ; SSE2: sitofpv32i8v32float
172 ; SSE2: cost of 16 {{.*}} sitofp
173 %1 = sitofp <32 x i8> %a to <32 x float>
174 ret <32 x float> %1
175 }
176
177 define <2 x float> @sitofpv2i16v2float(<2 x i16> %a) {
178 ; SSE2: sitofpv2i16v2float
179 ; SSE2: cost of 15 {{.*}} sitofp
180 %1 = sitofp <2 x i16> %a to <2 x float>
181 ret <2 x float> %1
182 }
183
184 define <4 x float> @sitofpv4i16v4float(<4 x i16> %a) {
185 ; SSE2: sitofpv4i16v4float
186 ; SSE2: cost of 15 {{.*}} sitofp
187 %1 = sitofp <4 x i16> %a to <4 x float>
188 ret <4 x float> %1
189 }
190
191 define <8 x float> @sitofpv8i16v8float(<8 x i16> %a) {
192 ; SSE2: sitofpv8i16v8float
193 ; SSE2: cost of 15 {{.*}} sitofp
194 %1 = sitofp <8 x i16> %a to <8 x float>
195 ret <8 x float> %1
196 }
197
198 define <16 x float> @sitofpv16i16v16float(<16 x i16> %a) {
199 ; SSE2: sitofpv16i16v16float
200 ; SSE2: cost of 30 {{.*}} sitofp
201 %1 = sitofp <16 x i16> %a to <16 x float>
202 ret <16 x float> %1
203 }
204
205 define <32 x float> @sitofpv32i16v32float(<32 x i16> %a) {
206 ; SSE2: sitofpv32i16v32float
207 ; SSE2: cost of 60 {{.*}} sitofp
208 %1 = sitofp <32 x i16> %a to <32 x float>
209 ret <32 x float> %1
210 }
211
212 define <2 x float> @sitofpv2i32v2float(<2 x i32> %a) {
213 ; SSE2: sitofpv2i32v2float
214 ; SSE2: cost of 15 {{.*}} sitofp
215 %1 = sitofp <2 x i32> %a to <2 x float>
216 ret <2 x float> %1
217 }
218
219 define <4 x float> @sitofpv4i32v4float(<4 x i32> %a) {
220 ; SSE2: sitofpv4i32v4float
221 ; SSE2: cost of 15 {{.*}} sitofp
222 %1 = sitofp <4 x i32> %a to <4 x float>
223 ret <4 x float> %1
224 }
225
226 define <8 x float> @sitofpv8i32v8float(<8 x i32> %a) {
227 ; SSE2: sitofpv8i32v8float
228 ; SSE2: cost of 30 {{.*}} sitofp
229 %1 = sitofp <8 x i32> %a to <8 x float>
230 ret <8 x float> %1
231 }
232
233 define <16 x float> @sitofpv16i32v16float(<16 x i32> %a) {
234 ; SSE2: sitofpv16i32v16float
235 ; SSE2: cost of 60 {{.*}} sitofp
236 %1 = sitofp <16 x i32> %a to <16 x float>
237 ret <16 x float> %1
238 }
239
240 define <32 x float> @sitofpv32i32v32float(<32 x i32> %a) {
241 ; SSE2: sitofpv32i32v32float
242 ; SSE2: cost of 120 {{.*}} sitofp
243 %1 = sitofp <32 x i32> %a to <32 x float>
244 ret <32 x float> %1
245 }
246
247 define <2 x float> @sitofpv2i64v2float(<2 x i64> %a) {
248 ; SSE2: sitofpv2i64v2float
249 ; SSE2: cost of 15 {{.*}} sitofp
250 %1 = sitofp <2 x i64> %a to <2 x float>
251 ret <2 x float> %1
252 }
253
254 define <4 x float> @sitofpv4i64v4float(<4 x i64> %a) {
255 ; SSE2: sitofpv4i64v4float
256 ; SSE2: cost of 30 {{.*}} sitofp
257 %1 = sitofp <4 x i64> %a to <4 x float>
258 ret <4 x float> %1
259 }
260
261 define <8 x float> @sitofpv8i64v8float(<8 x i64> %a) {
262 ; SSE2: sitofpv8i64v8float
263 ; SSE2: cost of 60 {{.*}} sitofp
264 %1 = sitofp <8 x i64> %a to <8 x float>
265 ret <8 x float> %1
266 }
267
268 define <16 x float> @sitofpv16i64v16float(<16 x i64> %a) {
269 ; SSE2: sitofpv16i64v16float
270 ; SSE2: cost of 120 {{.*}} sitofp
271 %1 = sitofp <16 x i64> %a to <16 x float>
272 ret <16 x float> %1
273 }
274
275 define <32 x float> @sitofpv32i64v32float(<32 x i64> %a) {
276 ; SSE2: sitofpv32i64v32float
277 ; SSE2: cost of 240 {{.*}} sitofp
278 %1 = sitofp <32 x i64> %a to <32 x float>
279 ret <32 x float> %1
280 }
0 ; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s
1 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
2
3 define <2 x double> @uitofpv2i8v2double(<2 x i8> %a) {
4 ; SSE2: uitofpv2i8v2double
5 ; SSE2: cost of 20 {{.*}} uitofp
6 ; SSE2-CODEGEN: uitofpv2i8v2double
7 ; SSE2-CODEGEN: movapd LCPI
8 ; SSE2-CODEGEN: subpd
9 ; SSE2-CODEGEN: addpd
10 %1 = uitofp <2 x i8> %a to <2 x double>
11 ret <2 x double> %1
12 }
13
14 define <4 x double> @uitofpv4i8v4double(<4 x i8> %a) {
15 ; SSE2: uitofpv4i8v4double
16 ; SSE2: cost of 40 {{.*}} uitofp
17 ; SSE2-CODEGEN: uitofpv4i8v4double
18 ; SSE2-CODEGEN: movapd LCPI
19 ; SSE2-CODEGEN: subpd
20 ; SSE2-CODEGEN: addpd
21 %1 = uitofp <4 x i8> %a to <4 x double>
22 ret <4 x double> %1
23 }
24
25 define <8 x double> @uitofpv8i8v8double(<8 x i8> %a) {
26 ; SSE2: uitofpv8i8v8double
27 ; SSE2: cost of 80 {{.*}} uitofp
28 ; SSE2-CODEGEN: uitofpv8i8v8double
29 ; SSE2-CODEGEN: movapd LCPI
30 ; SSE2-CODEGEN: subpd
31 ; SSE2-CODEGEN: addpd
32 %1 = uitofp <8 x i8> %a to <8 x double>
33 ret <8 x double> %1
34 }
35
36 define <16 x double> @uitofpv16i8v16double(<16 x i8> %a) {
37 ; SSE2: uitofpv16i8v16double
38 ; SSE2: cost of 160 {{.*}} uitofp
39 ; SSE2-CODEGEN: uitofpv16i8v16double
40 ; SSE2-CODEGEN: movapd LCPI
41 ; SSE2-CODEGEN: subpd
42 ; SSE2-CODEGEN: addpd
43 %1 = uitofp <16 x i8> %a to <16 x double>
44 ret <16 x double> %1
45 }
46
47 define <32 x double> @uitofpv32i8v32double(<32 x i8> %a) {
48 ; SSE2: uitofpv32i8v32double
49 ; SSE2: cost of 320 {{.*}} uitofp
50 ; SSE2-CODEGEN: uitofpv32i8v32double
51 ; SSE2-CODEGEN: movapd LCPI
52 ; SSE2-CODEGEN: subpd
53 ; SSE2-CODEGEN: addpd
54 %1 = uitofp <32 x i8> %a to <32 x double>
55 ret <32 x double> %1
56 }
57
58 define <2 x double> @uitofpv2i16v2double(<2 x i16> %a) {
59 ; SSE2: uitofpv2i16v2double
60 ; SSE2: cost of 20 {{.*}} uitofp
61 ; SSE2-CODEGEN: uitofpv2i16v2double
62 ; SSE2-CODEGEN: movapd LCPI
63 ; SSE2-CODEGEN: subpd
64 ; SSE2-CODEGEN: addpd
65 %1 = uitofp <2 x i16> %a to <2 x double>
66 ret <2 x double> %1
67 }
68
69 define <4 x double> @uitofpv4i16v4double(<4 x i16> %a) {
70 ; SSE2: uitofpv4i16v4double
71 ; SSE2: cost of 40 {{.*}} uitofp
72 ; SSE2-CODEGEN: uitofpv4i16v4double
73 ; SSE2-CODEGEN: movapd LCPI
74 ; SSE2-CODEGEN: subpd
75 ; SSE2-CODEGEN: addpd
76 %1 = uitofp <4 x i16> %a to <4 x double>
77 ret <4 x double> %1
78 }
79
80 define <8 x double> @uitofpv8i16v8double(<8 x i16> %a) {
81 ; SSE2: uitofpv8i16v8double
82 ; SSE2: cost of 80 {{.*}} uitofp
83 ; SSE2-CODEGEN: uitofpv8i16v8double
84 ; SSE2-CODEGEN: movapd LCPI
85 ; SSE2-CODEGEN: subpd
86 ; SSE2-CODEGEN: addpd
87 %1 = uitofp <8 x i16> %a to <8 x double>
88 ret <8 x double> %1
89 }
90
91 define <16 x double> @uitofpv16i16v16double(<16 x i16> %a) {
92 ; SSE2: uitofpv16i16v16double
93 ; SSE2: cost of 160 {{.*}} uitofp
94 ; SSE2-CODEGEN: uitofpv16i16v16double
95 ; SSE2-CODEGEN: movapd LCPI
96 ; SSE2-CODEGEN: subpd
97 ; SSE2-CODEGEN: addpd
98 %1 = uitofp <16 x i16> %a to <16 x double>
99 ret <16 x double> %1
100 }
101
102 define <32 x double> @uitofpv32i16v32double(<32 x i16> %a) {
103 ; SSE2: uitofpv32i16v32double
104 ; SSE2: cost of 320 {{.*}} uitofp
105 ; SSE2-CODEGEN: uitofpv32i16v32double
106 ; SSE2-CODEGEN: movapd LCPI
107 ; SSE2-CODEGEN: subpd
108 ; SSE2-CODEGEN: addpd
109 %1 = uitofp <32 x i16> %a to <32 x double>
110 ret <32 x double> %1
111 }
112
113 define <2 x double> @uitofpv2i32v2double(<2 x i32> %a) {
114 ; SSE2: uitofpv2i32v2double
115 ; SSE2: cost of 20 {{.*}} uitofp
116 ; SSE2-CODEGEN: uitofpv2i32v2double
117 ; SSE2-CODEGEN: movapd LCPI
118 ; SSE2-CODEGEN: subpd
119 ; SSE2-CODEGEN: addpd
120 %1 = uitofp <2 x i32> %a to <2 x double>
121 ret <2 x double> %1
122 }
123
124 define <4 x double> @uitofpv4i32v4double(<4 x i32> %a) {
125 ; SSE2: uitofpv4i32v4double
126 ; SSE2: cost of 40 {{.*}} uitofp
127 ; SSE2-CODEGEN: uitofpv4i32v4double
128 ; SSE2-CODEGEN: movapd LCPI
129 ; SSE2-CODEGEN: subpd
130 ; SSE2-CODEGEN: addpd
131 %1 = uitofp <4 x i32> %a to <4 x double>
132 ret <4 x double> %1
133 }
134
135 define <8 x double> @uitofpv8i32v8double(<8 x i32> %a) {
136 ; SSE2: uitofpv8i32v8double
137 ; SSE2: cost of 80 {{.*}} uitofp
138 ; SSE2-CODEGEN: uitofpv8i32v8double
139 ; SSE2-CODEGEN: movapd LCPI
140 ; SSE2-CODEGEN: subpd
141 ; SSE2-CODEGEN: addpd
142 %1 = uitofp <8 x i32> %a to <8 x double>
143 ret <8 x double> %1
144 }
145
146 define <16 x double> @uitofpv16i32v16double(<16 x i32> %a) {
147 ; SSE2: uitofpv16i32v16double
148 ; SSE2: cost of 160 {{.*}} uitofp
149 ; SSE2-CODEGEN: uitofpv16i32v16double
150 ; SSE2-CODEGEN: movapd LCPI
151 ; SSE2-CODEGEN: subpd
152 ; SSE2-CODEGEN: addpd
153 %1 = uitofp <16 x i32> %a to <16 x double>
154 ret <16 x double> %1
155 }
156
157 define <32 x double> @uitofpv32i32v32double(<32 x i32> %a) {
158 ; SSE2: uitofpv32i32v32double
159 ; SSE2: cost of 320 {{.*}} uitofp
160 ; SSE2-CODEGEN: uitofpv32i32v32double
161 ; SSE2-CODEGEN: movapd LCPI
162 ; SSE2-CODEGEN: subpd
163 ; SSE2-CODEGEN: addpd
164 %1 = uitofp <32 x i32> %a to <32 x double>
165 ret <32 x double> %1
166 }
167
168 define <2 x double> @uitofpv2i64v2double(<2 x i64> %a) {
169 ; SSE2: uitofpv2i64v2double
170 ; SSE2: cost of 20 {{.*}} uitofp
171 ; SSE2-CODEGEN: uitofpv2i64v2double
172 ; SSE2-CODEGEN: movapd LCPI
173 ; SSE2-CODEGEN: subpd
174 ; SSE2-CODEGEN: addpd
175 %1 = uitofp <2 x i64> %a to <2 x double>
176 ret <2 x double> %1
177 }
178
179 define <4 x double> @uitofpv4i64v4double(<4 x i64> %a) {
180 ; SSE2: uitofpv4i64v4double
181 ; SSE2: cost of 40 {{.*}} uitofp
182 ; SSE2-CODEGEN: uitofpv4i64v4double
183 ; SSE2-CODEGEN: movapd LCPI
184 ; SSE2-CODEGEN: subpd
185 ; SSE2-CODEGEN: addpd
186 %1 = uitofp <4 x i64> %a to <4 x double>
187 ret <4 x double> %1
188 }
189
190 define <8 x double> @uitofpv8i64v8double(<8 x i64> %a) {
191 %1 = uitofp <8 x i64> %a to <8 x double>
192 ; SSE2: uitofpv8i64v8double
193 ; SSE2: cost of 80 {{.*}} uitofp
194 ; SSE2-CODEGEN: uitofpv8i64v8double
195 ; SSE2-CODEGEN: movapd LCPI
196 ; SSE2-CODEGEN: subpd
197 ; SSE2-CODEGEN: addpd
198 ret <8 x double> %1
199 }
200
201 define <16 x double> @uitofpv16i64v16double(<16 x i64> %a) {
202 ; SSE2: uitofpv16i64v16double
203 ; SSE2: cost of 160 {{.*}} uitofp
204 ; SSE2-CODEGEN: uitofpv16i64v16double
205 ; SSE2-CODEGEN: movapd LCPI
206 ; SSE2-CODEGEN: subpd
207 ; SSE2-CODEGEN: addpd
208 %1 = uitofp <16 x i64> %a to <16 x double>
209 ret <16 x double> %1
210 }
211
212 define <32 x double> @uitofpv32i64v32double(<32 x i64> %a) {
213 ; SSE2: uitofpv32i64v32double
214 ; SSE2: cost of 320 {{.*}} uitofp
215 ; SSE2-CODEGEN: uitofpv32i64v32double
216 ; SSE2-CODEGEN: movapd LCPI
217 ; SSE2-CODEGEN: subpd
218 ; SSE2-CODEGEN: addpd
219 %1 = uitofp <32 x i64> %a to <32 x double>
220 ret <32 x double> %1
221 }
222
223 define <2 x float> @uitofpv2i8v2float(<2 x i8> %a) {
224 ; SSE2: uitofpv2i8v2float
225 ; SSE2: cost of 15 {{.*}} uitofp
226 %1 = uitofp <2 x i8> %a to <2 x float>
227 ret <2 x float> %1
228 }
229
230 define <4 x float> @uitofpv4i8v4float(<4 x i8> %a) {
231 ; SSE2: uitofpv4i8v4float
232 ; SSE2: cost of 15 {{.*}} uitofp
233 %1 = uitofp <4 x i8> %a to <4 x float>
234 ret <4 x float> %1
235 }
236
237 define <8 x float> @uitofpv8i8v8float(<8 x i8> %a) {
238 ; SSE2: uitofpv8i8v8float
239 ; SSE2: cost of 15 {{.*}} uitofp
240 %1 = uitofp <8 x i8> %a to <8 x float>
241 ret <8 x float> %1
242 }
243
244 define <16 x float> @uitofpv16i8v16float(<16 x i8> %a) {
245 ; SSE2: uitofpv16i8v16float
246 ; SSE2: cost of 8 {{.*}} uitofp
247 %1 = uitofp <16 x i8> %a to <16 x float>
248 ret <16 x float> %1
249 }
250
251 define <32 x float> @uitofpv32i8v32float(<32 x i8> %a) {
252 ; SSE2: uitofpv32i8v32float
253 ; SSE2: cost of 16 {{.*}} uitofp
254 %1 = uitofp <32 x i8> %a to <32 x float>
255 ret <32 x float> %1
256 }
257
258 define <2 x float> @uitofpv2i16v2float(<2 x i16> %a) {
259 ; SSE2: uitofpv2i16v2float
260 ; SSE2: cost of 15 {{.*}} uitofp
261 %1 = uitofp <2 x i16> %a to <2 x float>
262 ret <2 x float> %1
263 }
264
265 define <4 x float> @uitofpv4i16v4float(<4 x i16> %a) {
266 ; SSE2: uitofpv4i16v4float
267 ; SSE2: cost of 15 {{.*}} uitofp
268 %1 = uitofp <4 x i16> %a to <4 x float>
269 ret <4 x float> %1
270 }
271
272 define <8 x float> @uitofpv8i16v8float(<8 x i16> %a) {
273 ; SSE2: uitofpv8i16v8float
274 ; SSE2: cost of 15 {{.*}} uitofp
275 %1 = uitofp <8 x i16> %a to <8 x float>
276 ret <8 x float> %1
277 }
278
279 define <16 x float> @uitofpv16i16v16float(<16 x i16> %a) {
280 ; SSE2: uitofpv16i16v16float
281 ; SSE2: cost of 30 {{.*}} uitofp
282 %1 = uitofp <16 x i16> %a to <16 x float>
283 ret <16 x float> %1
284 }
285
286 define <32 x float> @uitofpv32i16v32float(<32 x i16> %a) {
287 ; SSE2: uitofpv32i16v32float
288 ; SSE2: cost of 60 {{.*}} uitofp
289 %1 = uitofp <32 x i16> %a to <32 x float>
290 ret <32 x float> %1
291 }
292
293 define <2 x float> @uitofpv2i32v2float(<2 x i32> %a) {
294 ; SSE2: uitofpv2i32v2float
295 ; SSE2: cost of 15 {{.*}} uitofp
296 %1 = uitofp <2 x i32> %a to <2 x float>
297 ret <2 x float> %1
298 }
299
300 define <4 x float> @uitofpv4i32v4float(<4 x i32> %a) {
301 ; SSE2: uitofpv4i32v4float
302 ; SSE2: cost of 15 {{.*}} uitofp
303 %1 = uitofp <4 x i32> %a to <4 x float>
304 ret <4 x float> %1
305 }
306
307 define <8 x float> @uitofpv8i32v8float(<8 x i32> %a) {
308 ; SSE2: uitofpv8i32v8float
309 ; SSE2: cost of 30 {{.*}} uitofp
310 %1 = uitofp <8 x i32> %a to <8 x float>
311 ret <8 x float> %1
312 }
313
314 define <16 x float> @uitofpv16i32v16float(<16 x i32> %a) {
315 ; SSE2: uitofpv16i32v16float
316 ; SSE2: cost of 60 {{.*}} uitofp
317 %1 = uitofp <16 x i32> %a to <16 x float>
318 ret <16 x float> %1
319 }
320
321 define <32 x float> @uitofpv32i32v32float(<32 x i32> %a) {
322 ; SSE2: uitofpv32i32v32float
323 ; SSE2: cost of 120 {{.*}} uitofp
324 %1 = uitofp <32 x i32> %a to <32 x float>
325 ret <32 x float> %1
326 }
327
328 define <2 x float> @uitofpv2i64v2float(<2 x i64> %a) {
329 ; SSE2: uitofpv2i64v2float
330 ; SSE2: cost of 15 {{.*}} uitofp
331 %1 = uitofp <2 x i64> %a to <2 x float>
332 ret <2 x float> %1
333 }
334
335 define <4 x float> @uitofpv4i64v4float(<4 x i64> %a) {
336 ; SSE2: uitofpv4i64v4float
337 ; SSE2: cost of 30 {{.*}} uitofp
338 %1 = uitofp <4 x i64> %a to <4 x float>
339 ret <4 x float> %1
340 }
341
342 define <8 x float> @uitofpv8i64v8float(<8 x i64> %a) {
343 ; SSE2: uitofpv8i64v8float
344 ; SSE2: cost of 60 {{.*}} uitofp
345 %1 = uitofp <8 x i64> %a to <8 x float>
346 ret <8 x float> %1
347 }
348
349 define <16 x float> @uitofpv16i64v16float(<16 x i64> %a) {
350 ; SSE2: uitofpv16i64v16float
351 ; SSE2: cost of 120 {{.*}} uitofp
352 %1 = uitofp <16 x i64> %a to <16 x float>
353 ret <16 x float> %1
354 }
355
356 define <32 x float> @uitofpv32i64v32float(<32 x i64> %a) {
357 ; SSE2: uitofpv32i64v32float
358 ; SSE2: cost of 240 {{.*}} uitofp
359 %1 = uitofp <32 x i64> %a to <32 x float>
360 ret <32 x float> %1
361 }