]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Analysis/CostModel/X86/slm-arith-costs.ll
Vendor import of llvm release_40 branch r292009:
[FreeBSD/FreeBSD.git] / test / Analysis / CostModel / X86 / slm-arith-costs.ll
1 ; RUN: opt < %s -cost-model -analyze -mcpu=slm | FileCheck %s --check-prefix=SLM
2
3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-linux-gnu"
5
6 ; 8bit mul
7 define i8 @slm-costs_8_scalar_mul(i8 %a, i8 %b)  {
8 entry:
9 ; SLM:  cost of 1 {{.*}} mul nsw i8
10   %res = mul nsw i8 %a, %b
11   ret i8 %res
12 }
13
14 define <2 x i8> @slm-costs_8_v2_mul(<2 x i8> %a, <2 x i8> %b)  {
15 entry:
16 ; SLM:  cost of 11 {{.*}} mul nsw <2 x i8>
17   %res = mul nsw <2 x i8> %a, %b
18   ret <2 x i8> %res
19 }
20
21 define <4 x i8> @slm-costs_8_v4_mul(<4 x i8> %a, <4 x i8> %b)  {
22 entry:
23 ; SLM:  cost of 3 {{.*}} mul nsw <4 x i8>
24   %res = mul nsw <4 x i8> %a, %b
25   ret <4 x i8> %res
26 }
27
28 define <4 x i32> @slm-costs_8_v4_zext_mul(<4 x i8> %a)  {
29 entry:
30 ; SLM:  cost of 3 {{.*}} mul nsw <4 x i32>
31   %zext = zext <4 x i8> %a to <4 x i32> 
32   %res = mul nsw <4 x i32> %zext, <i32 255, i32 255, i32 255, i32 255>
33   ret <4 x i32> %res
34 }
35
36 define <4 x i32> @slm-costs_8_v4_zext_mul_fail(<4 x i8> %a)  {
37 entry:
38 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i32>
39   %zext = zext <4 x i8> %a to <4 x i32>
40   %res = mul nsw <4 x i32> %zext, <i32 255, i32 255, i32 -1, i32 255>
41   ret <4 x i32> %res
42 }
43
44 define <4 x i32> @slm-costs_8_v4_zext_mul_fail_2(<4 x i8> %a)  {
45 entry:
46 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i32>
47   %zext = zext <4 x i8> %a to <4 x i32>
48   %res = mul nsw <4 x i32> %zext, <i32 255, i32 256, i32 255, i32 255>
49   ret <4 x i32> %res
50 }
51
52 define <4 x i32> @slm-costs_8_v4_sext_mul(<4 x i8> %a)  {
53 entry:
54 ; SLM:  cost of 3 {{.*}} mul nsw <4 x i32>
55   %sext = sext <4 x i8> %a to <4 x i32>
56   %res = mul nsw <4 x i32> %sext, <i32 127, i32 -128, i32 127, i32 -128>
57   ret <4 x i32> %res
58 }
59
60 define <4 x i32> @slm-costs_8_v4_sext_mul_fail(<4 x i8> %a)  {
61 entry:
62 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i32>
63   %sext = sext <4 x i8> %a to <4 x i32>
64   %res = mul nsw <4 x i32> %sext, <i32 127, i32 -128, i32 128, i32 -128>
65   ret <4 x i32> %res
66 }
67
68 define <4 x i32> @slm-costs_8_v4_sext_mul_fail_2(<4 x i8> %a)  {
69 entry:
70 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i32>
71   %sext = sext <4 x i8> %a to <4 x i32>
72   %res = mul nsw <4 x i32> %sext, <i32 127, i32 -129, i32 127, i32 -128>
73   ret <4 x i32> %res
74 }
75
76 define <8 x i8> @slm-costs_8_v8_mul(<8 x i8> %a, <8 x i8> %b)  {
77 entry:
78 ; SLM:  cost of 2 {{.*}} mul nsw <8 x i8>
79   %res = mul nsw <8 x i8> %a, %b
80   ret <8 x i8> %res
81 }
82
83 define <16 x i8> @slm-costs_8_v16_mul(<16 x i8> %a, <16 x i8> %b)  {
84 entry:
85 ; SLM:  cost of 14 {{.*}} mul nsw <16 x i8>
86   %res = mul nsw <16 x i8> %a, %b
87   ret <16 x i8> %res
88 }
89
90 ; 16bit mul
91 define i16 @slm-costs_16_scalar_mul(i16 %a, i16 %b)  {
92 entry:
93 ; SLM:  cost of 1 {{.*}} mul nsw i16
94   %res = mul nsw i16 %a, %b
95   ret i16 %res
96 }
97
98 define <2 x i16> @slm-costs_16_v2_mul(<2 x i16> %a, <2 x i16> %b)  {
99 entry:
100 ; SLM:  cost of 11 {{.*}} mul nsw <2 x i16>
101   %res = mul nsw <2 x i16> %a, %b
102   ret <2 x i16> %res
103 }
104
105 define <4 x i16> @slm-costs_16_v4_mul(<4 x i16> %a, <4 x i16> %b)  {
106 entry:
107 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i16>
108   %res = mul nsw <4 x i16> %a, %b
109   ret <4 x i16> %res
110 }
111
112 define <4 x i32> @slm-costs_16_v4_zext_mul(<4 x i16> %a)  {
113 entry:
114 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i32>
115   %zext = zext <4 x i16> %a to <4 x i32>
116   %res = mul nsw <4 x i32> %zext, <i32 65535, i32 65535, i32 65535, i32 65535>
117   ret <4 x i32> %res
118 }
119
120 define <4 x i32> @slm-costs_16_v4_zext_mul_fail(<4 x i16> %a)  {
121 entry:
122 ; SLM:  cost of 11 {{.*}} mul nsw <4 x i32>
123   %zext = zext <4 x i16> %a to <4 x i32>
124   %res = mul nsw <4 x i32> %zext, <i32 -1, i32 65535, i32 65535, i32 65535>
125   ret <4 x i32> %res
126 }
127
128 define <4 x i32> @slm-costs_16_v4_zext_mul_fail_2(<4 x i16> %a)  {
129 entry:
130 ; SLM:  cost of 11 {{.*}} mul nsw <4 x i32>
131   %zext = zext <4 x i16> %a to <4 x i32>
132   %res = mul nsw <4 x i32> %zext, <i32 65536, i32 65535, i32 65535, i32 65535>
133   ret <4 x i32> %res
134 }
135
136 define <4 x i32> @slm-costs_16_v4_sext_mul(<4 x i16> %a)  {
137 entry:
138 ; SLM:  cost of 5 {{.*}} mul nsw <4 x i32>
139   %sext = sext <4 x i16> %a to <4 x i32>
140   %res = mul nsw <4 x i32> %sext, <i32 32767, i32 -32768, i32 32767, i32 -32768>
141   ret <4 x i32> %res
142 }
143
144 define <4 x i32> @slm-costs_16_v4_sext_mul_fail(<4 x i16> %a)  {
145 entry:
146 ; SLM:  cost of 11 {{.*}} mul nsw <4 x i32>
147   %sext = sext <4 x i16> %a to <4 x i32>
148   %res = mul nsw <4 x i32> %sext, <i32 32767, i32 -32768, i32 32768, i32 -32768>
149   ret <4 x i32> %res
150 }
151
152 define <4 x i32> @slm-costs_16_v4_sext_mul_fail_2(<4 x i16> %a)  {
153 entry:
154 ; SLM:  cost of 11 {{.*}} mul nsw <4 x i32>
155   %sext = sext <4 x i16> %a to <4 x i32>
156   %res = mul nsw <4 x i32> %sext, <i32 32767, i32 -32768, i32 32767, i32 -32769>
157   ret <4 x i32> %res
158 }
159
160 define <8 x i16> @slm-costs_16_v8_mul(<8 x i16> %a, <8 x i16> %b)  {
161 entry:
162 ; SLM:  cost of 2 {{.*}} mul nsw <8 x i16>
163   %res = mul nsw <8 x i16> %a, %b
164   ret <8 x i16> %res
165 }
166
167 define <16 x i16> @slm-costs_16_v16_mul(<16 x i16> %a, <16 x i16> %b)  {
168 entry:
169 ; SLM:  cost of 4 {{.*}} mul nsw <16 x i16>
170   %res = mul nsw <16 x i16> %a, %b
171   ret <16 x i16> %res
172 }
173
174 ; 32bit mul
175 define i32 @slm-costs_32_scalar_mul(i32 %a, i32 %b)  {
176 entry:
177 ; SLM:  cost of 1 {{.*}} mul nsw i32
178   %res = mul nsw i32 %a, %b
179   ret i32 %res 
180 }
181
182 define <2 x i32> @slm-costs_32_v2_mul(<2 x i32> %a, <2 x i32> %b)  {
183 entry:
184 ; SLM:  cost of 11 {{.*}} mul nsw <2 x i32>
185   %res = mul nsw <2 x i32> %a, %b
186   ret <2 x i32> %res
187 }
188
189 define <4 x i32> @slm-costs_32_v4_mul(<4 x i32> %a, <4 x i32> %b)  {
190 entry:
191 ; SLM:  cost of 11 {{.*}} mul nsw <4 x i32>
192   %res = mul nsw <4 x i32> %a, %b
193   ret <4 x i32> %res
194 }
195
196 define <8 x i32> @slm-costs_32_v8_mul(<8 x i32> %a, <8 x i32> %b)  {
197 entry:
198 ; SLM:  cost of 22 {{.*}} mul nsw <8 x i32>
199   %res = mul nsw <8 x i32> %a, %b
200   ret <8 x i32> %res
201 }
202
203 define <16 x i32> @slm-costs_32_v16_mul(<16 x i32> %a, <16 x i32> %b)  {
204 entry:
205 ; SLM:  cost of 44 {{.*}} mul nsw <16 x i32>
206   %res = mul nsw <16 x i32> %a, %b
207   ret <16 x i32> %res
208 }
209
210 ; 64bit mul
211 define i64 @slm-costs_64_scalar_mul(i64 %a, i64 %b)  {
212 entry:
213 ; SLM:  cost of 1 {{.*}} mul nsw i64
214   %res = mul nsw i64 %a, %b
215   ret i64 %res
216 }
217
218 define <2 x i64> @slm-costs_64_v2_mul(<2 x i64> %a, <2 x i64> %b)  {
219 entry:
220 ; SLM:  cost of 11 {{.*}} mul nsw <2 x i64>
221   %res = mul nsw <2 x i64> %a, %b
222   ret <2 x i64> %res
223 }
224
225 define <4 x i64> @slm-costs_64_v4_mul(<4 x i64> %a, <4 x i64> %b)  {
226 entry:
227 ; SLM:  cost of 22 {{.*}} mul nsw <4 x i64>
228   %res = mul nsw <4 x i64> %a, %b
229   ret <4 x i64> %res
230 }
231
232 define <8 x i64> @slm-costs_64_v8_mul(<8 x i64> %a, <8 x i64> %b)  {
233 entry:
234 ; SLM:  cost of 44 {{.*}} mul nsw <8 x i64>
235   %res = mul nsw <8 x i64> %a, %b
236   ret <8 x i64> %res
237 }
238
239 define <16 x i64> @slm-costs_64_v16_mul(<16 x i64> %a, <16 x i64> %b)  {
240 entry:
241 ; SLM:  cost of 88 {{.*}} mul nsw <16 x i64>
242   %res = mul nsw <16 x i64> %a, %b
243   ret <16 x i64> %res
244 }
245
246 ; mulsd
247 define double @slm-costs_mulsd(double %a, double %b)  {
248 entry:
249 ; SLM:  cost of 2 {{.*}} fmul double
250   %res = fmul double %a, %b
251   ret double %res
252 }
253
254 ; mulpd
255 define <2 x double> @slm-costs_mulpd(<2 x double> %a, <2 x double> %b)  {
256 entry:
257 ; SLM:  cost of 4 {{.*}} fmul <2 x double>
258   %res = fmul <2 x double> %a, %b
259   ret <2 x double> %res
260 }
261
262 ; mulps
263 define <4 x float> @slm-costs_mulps(<4 x float> %a, <4 x float> %b)  {
264 entry:
265 ; SLM:  cost of 2 {{.*}} fmul <4 x float>
266   %res = fmul <4 x float> %a, %b
267   ret <4 x float> %res
268 }
269
270 ; divss
271 define float @slm-costs_divss(float %a, float %b)  {
272 entry:
273 ; SLM:  cost of 17 {{.*}} fdiv float
274   %res = fdiv float %a, %b
275   ret float %res
276 }
277
278 ; divps
279 define <4 x float> @slm-costs_divps(<4 x float> %a, <4 x float> %b)  {
280 entry:
281 ; SLM:  cost of 39 {{.*}} fdiv <4 x float>
282   %res = fdiv <4 x float> %a, %b
283   ret <4 x float> %res
284 }
285
286 ; divsd
287 define double @slm-costs_divsd(double %a, double %b)  {
288 entry:
289 ; SLM:  cost of 32 {{.*}} fdiv double
290   %res = fdiv double %a, %b
291   ret double %res
292 }
293
294 ; divpd
295 define <2 x double> @slm-costs_divpd(<2 x double> %a, <2 x double> %b)  {
296 entry:
297 ; SLM:  cost of 69 {{.*}} fdiv <2 x double>
298   %res = fdiv <2 x double> %a, %b
299   ret <2 x double> %res
300 }
301
302 ; addpd
303 define <2 x double> @slm-costs_addpd(<2 x double> %a, <2 x double> %b)  {
304 entry:
305 ; SLM:  cost of 2 {{.*}} fadd <2 x double>
306   %res = fadd <2 x double> %a, %b
307   ret <2 x double> %res
308 }
309
310 ; subpd
311 define <2 x double> @slm-costs_subpd(<2 x double> %a, <2 x double> %b)  {
312 entry:
313 ; SLM:  cost of 2 {{.*}} fsub <2 x double>
314   %res = fsub <2 x double> %a, %b
315   ret <2 x double> %res
316 }
317