[PowerPC] Fix CR Bit spill pseudo expansion
[llvm-core.git] / test / CodeGen / X86 / mul-constant-i64.ll
blob0e4680becaf0920825d253a339b3403501568de6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=haswell| FileCheck %s --check-prefix=X64-HSW
4 ; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=btver2| FileCheck %s --check-prefix=X64-JAG
5 ; RUN: llc < %s -mtriple=i686-unknown -mul-constant-optimization=false | FileCheck %s --check-prefix=X86-NOOPT
6 ; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=haswell| FileCheck %s --check-prefix=HSW-NOOPT
7 ; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=btver2| FileCheck %s --check-prefix=JAG-NOOPT
8 ; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=slm| FileCheck %s --check-prefix=X64-SLM
9 ; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=slm| FileCheck %s --check-prefix=SLM-NOOPT
11 define i64 @test_mul_by_1(i64 %x) nounwind {
12 ; X86-LABEL: test_mul_by_1:
13 ; X86:       # %bb.0:
14 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
15 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
16 ; X86-NEXT:    retl
18 ; X64-HSW-LABEL: test_mul_by_1:
19 ; X64-HSW:       # %bb.0:
20 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
21 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
23 ; X64-JAG-LABEL: test_mul_by_1:
24 ; X64-JAG:       # %bb.0:
25 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
26 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
28 ; X86-NOOPT-LABEL: test_mul_by_1:
29 ; X86-NOOPT:       # %bb.0:
30 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
31 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
32 ; X86-NOOPT-NEXT:    retl
34 ; HSW-NOOPT-LABEL: test_mul_by_1:
35 ; HSW-NOOPT:       # %bb.0:
36 ; HSW-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.25]
37 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
39 ; JAG-NOOPT-LABEL: test_mul_by_1:
40 ; JAG-NOOPT:       # %bb.0:
41 ; JAG-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
42 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
44 ; X64-SLM-LABEL: test_mul_by_1:
45 ; X64-SLM:       # %bb.0:
46 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
47 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
49 ; SLM-NOOPT-LABEL: test_mul_by_1:
50 ; SLM-NOOPT:       # %bb.0:
51 ; SLM-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
52 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
53   %mul = mul nsw i64 %x, 1
54   ret i64 %mul
57 define i64 @test_mul_by_2(i64 %x) {
58 ; X86-LABEL: test_mul_by_2:
59 ; X86:       # %bb.0:
60 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
61 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
62 ; X86-NEXT:    shldl $1, %eax, %edx
63 ; X86-NEXT:    addl %eax, %eax
64 ; X86-NEXT:    retl
66 ; X64-HSW-LABEL: test_mul_by_2:
67 ; X64-HSW:       # %bb.0:
68 ; X64-HSW-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
69 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
71 ; X64-JAG-LABEL: test_mul_by_2:
72 ; X64-JAG:       # %bb.0:
73 ; X64-JAG-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
74 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
76 ; X86-NOOPT-LABEL: test_mul_by_2:
77 ; X86-NOOPT:       # %bb.0:
78 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
79 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
80 ; X86-NOOPT-NEXT:    shldl $1, %eax, %edx
81 ; X86-NOOPT-NEXT:    addl %eax, %eax
82 ; X86-NOOPT-NEXT:    retl
84 ; HSW-NOOPT-LABEL: test_mul_by_2:
85 ; HSW-NOOPT:       # %bb.0:
86 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
87 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
89 ; JAG-NOOPT-LABEL: test_mul_by_2:
90 ; JAG-NOOPT:       # %bb.0:
91 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
92 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
94 ; X64-SLM-LABEL: test_mul_by_2:
95 ; X64-SLM:       # %bb.0:
96 ; X64-SLM-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:1.00]
97 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
99 ; SLM-NOOPT-LABEL: test_mul_by_2:
100 ; SLM-NOOPT:       # %bb.0:
101 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:1.00]
102 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
103   %mul = mul nsw i64 %x, 2
104   ret i64 %mul
107 define i64 @test_mul_by_3(i64 %x) {
108 ; X86-LABEL: test_mul_by_3:
109 ; X86:       # %bb.0:
110 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
111 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
112 ; X86-NEXT:    movl $3, %eax
113 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
114 ; X86-NEXT:    addl %ecx, %edx
115 ; X86-NEXT:    retl
117 ; X64-HSW-LABEL: test_mul_by_3:
118 ; X64-HSW:       # %bb.0:
119 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
120 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
122 ; X64-JAG-LABEL: test_mul_by_3:
123 ; X64-JAG:       # %bb.0:
124 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
125 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
127 ; X86-NOOPT-LABEL: test_mul_by_3:
128 ; X86-NOOPT:       # %bb.0:
129 ; X86-NOOPT-NEXT:    movl $3, %eax
130 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
131 ; X86-NOOPT-NEXT:    imull $3, {{[0-9]+}}(%esp), %ecx
132 ; X86-NOOPT-NEXT:    addl %ecx, %edx
133 ; X86-NOOPT-NEXT:    retl
135 ; HSW-NOOPT-LABEL: test_mul_by_3:
136 ; HSW-NOOPT:       # %bb.0:
137 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
138 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
140 ; JAG-NOOPT-LABEL: test_mul_by_3:
141 ; JAG-NOOPT:       # %bb.0:
142 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
143 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
145 ; X64-SLM-LABEL: test_mul_by_3:
146 ; X64-SLM:       # %bb.0:
147 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
148 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
150 ; SLM-NOOPT-LABEL: test_mul_by_3:
151 ; SLM-NOOPT:       # %bb.0:
152 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
153 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
154   %mul = mul nsw i64 %x, 3
155   ret i64 %mul
158 define i64 @test_mul_by_4(i64 %x) {
159 ; X86-LABEL: test_mul_by_4:
160 ; X86:       # %bb.0:
161 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
162 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
163 ; X86-NEXT:    shldl $2, %eax, %edx
164 ; X86-NEXT:    shll $2, %eax
165 ; X86-NEXT:    retl
167 ; X64-HSW-LABEL: test_mul_by_4:
168 ; X64-HSW:       # %bb.0:
169 ; X64-HSW-NEXT:    leaq (,%rdi,4), %rax # sched: [1:0.50]
170 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
172 ; X64-JAG-LABEL: test_mul_by_4:
173 ; X64-JAG:       # %bb.0:
174 ; X64-JAG-NEXT:    leaq (,%rdi,4), %rax # sched: [2:1.00]
175 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
177 ; X86-NOOPT-LABEL: test_mul_by_4:
178 ; X86-NOOPT:       # %bb.0:
179 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
180 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
181 ; X86-NOOPT-NEXT:    shldl $2, %eax, %edx
182 ; X86-NOOPT-NEXT:    shll $2, %eax
183 ; X86-NOOPT-NEXT:    retl
185 ; HSW-NOOPT-LABEL: test_mul_by_4:
186 ; HSW-NOOPT:       # %bb.0:
187 ; HSW-NOOPT-NEXT:    leaq (,%rdi,4), %rax # sched: [1:0.50]
188 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
190 ; JAG-NOOPT-LABEL: test_mul_by_4:
191 ; JAG-NOOPT:       # %bb.0:
192 ; JAG-NOOPT-NEXT:    leaq (,%rdi,4), %rax # sched: [2:1.00]
193 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
195 ; X64-SLM-LABEL: test_mul_by_4:
196 ; X64-SLM:       # %bb.0:
197 ; X64-SLM-NEXT:    leaq (,%rdi,4), %rax # sched: [1:1.00]
198 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
200 ; SLM-NOOPT-LABEL: test_mul_by_4:
201 ; SLM-NOOPT:       # %bb.0:
202 ; SLM-NOOPT-NEXT:    leaq (,%rdi,4), %rax # sched: [1:1.00]
203 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
204   %mul = mul nsw i64 %x, 4
205   ret i64 %mul
208 define i64 @test_mul_by_5(i64 %x) {
209 ; X86-LABEL: test_mul_by_5:
210 ; X86:       # %bb.0:
211 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
212 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
213 ; X86-NEXT:    movl $5, %eax
214 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
215 ; X86-NEXT:    addl %ecx, %edx
216 ; X86-NEXT:    retl
218 ; X64-HSW-LABEL: test_mul_by_5:
219 ; X64-HSW:       # %bb.0:
220 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
221 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
223 ; X64-JAG-LABEL: test_mul_by_5:
224 ; X64-JAG:       # %bb.0:
225 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
226 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
228 ; X86-NOOPT-LABEL: test_mul_by_5:
229 ; X86-NOOPT:       # %bb.0:
230 ; X86-NOOPT-NEXT:    movl $5, %eax
231 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
232 ; X86-NOOPT-NEXT:    imull $5, {{[0-9]+}}(%esp), %ecx
233 ; X86-NOOPT-NEXT:    addl %ecx, %edx
234 ; X86-NOOPT-NEXT:    retl
236 ; HSW-NOOPT-LABEL: test_mul_by_5:
237 ; HSW-NOOPT:       # %bb.0:
238 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
239 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
241 ; JAG-NOOPT-LABEL: test_mul_by_5:
242 ; JAG-NOOPT:       # %bb.0:
243 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
244 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
246 ; X64-SLM-LABEL: test_mul_by_5:
247 ; X64-SLM:       # %bb.0:
248 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
249 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
251 ; SLM-NOOPT-LABEL: test_mul_by_5:
252 ; SLM-NOOPT:       # %bb.0:
253 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
254 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
255   %mul = mul nsw i64 %x, 5
256   ret i64 %mul
259 define i64 @test_mul_by_6(i64 %x) {
260 ; X86-LABEL: test_mul_by_6:
261 ; X86:       # %bb.0:
262 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
263 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
264 ; X86-NEXT:    movl $6, %eax
265 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
266 ; X86-NEXT:    leal (%edx,%ecx,2), %edx
267 ; X86-NEXT:    retl
269 ; X64-HSW-LABEL: test_mul_by_6:
270 ; X64-HSW:       # %bb.0:
271 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
272 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
273 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
275 ; X64-JAG-LABEL: test_mul_by_6:
276 ; X64-JAG:       # %bb.0:
277 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
278 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
279 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
281 ; X86-NOOPT-LABEL: test_mul_by_6:
282 ; X86-NOOPT:       # %bb.0:
283 ; X86-NOOPT-NEXT:    movl $6, %eax
284 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
285 ; X86-NOOPT-NEXT:    imull $6, {{[0-9]+}}(%esp), %ecx
286 ; X86-NOOPT-NEXT:    addl %ecx, %edx
287 ; X86-NOOPT-NEXT:    retl
289 ; HSW-NOOPT-LABEL: test_mul_by_6:
290 ; HSW-NOOPT:       # %bb.0:
291 ; HSW-NOOPT-NEXT:    imulq $6, %rdi, %rax # sched: [3:1.00]
292 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
294 ; JAG-NOOPT-LABEL: test_mul_by_6:
295 ; JAG-NOOPT:       # %bb.0:
296 ; JAG-NOOPT-NEXT:    imulq $6, %rdi, %rax # sched: [6:4.00]
297 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
299 ; X64-SLM-LABEL: test_mul_by_6:
300 ; X64-SLM:       # %bb.0:
301 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
302 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
303 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
305 ; SLM-NOOPT-LABEL: test_mul_by_6:
306 ; SLM-NOOPT:       # %bb.0:
307 ; SLM-NOOPT-NEXT:    imulq $6, %rdi, %rax # sched: [3:1.00]
308 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
309   %mul = mul nsw i64 %x, 6
310   ret i64 %mul
313 define i64 @test_mul_by_7(i64 %x) {
314 ; X86-LABEL: test_mul_by_7:
315 ; X86:       # %bb.0:
316 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
317 ; X86-NEXT:    leal (,%eax,8), %ecx
318 ; X86-NEXT:    subl %eax, %ecx
319 ; X86-NEXT:    movl $7, %eax
320 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
321 ; X86-NEXT:    addl %ecx, %edx
322 ; X86-NEXT:    retl
324 ; X64-HSW-LABEL: test_mul_by_7:
325 ; X64-HSW:       # %bb.0:
326 ; X64-HSW-NEXT:    leaq (,%rdi,8), %rax # sched: [1:0.50]
327 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
328 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
330 ; X64-JAG-LABEL: test_mul_by_7:
331 ; X64-JAG:       # %bb.0:
332 ; X64-JAG-NEXT:    leaq (,%rdi,8), %rax # sched: [2:1.00]
333 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
334 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
336 ; X86-NOOPT-LABEL: test_mul_by_7:
337 ; X86-NOOPT:       # %bb.0:
338 ; X86-NOOPT-NEXT:    movl $7, %eax
339 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
340 ; X86-NOOPT-NEXT:    imull $7, {{[0-9]+}}(%esp), %ecx
341 ; X86-NOOPT-NEXT:    addl %ecx, %edx
342 ; X86-NOOPT-NEXT:    retl
344 ; HSW-NOOPT-LABEL: test_mul_by_7:
345 ; HSW-NOOPT:       # %bb.0:
346 ; HSW-NOOPT-NEXT:    imulq $7, %rdi, %rax # sched: [3:1.00]
347 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
349 ; JAG-NOOPT-LABEL: test_mul_by_7:
350 ; JAG-NOOPT:       # %bb.0:
351 ; JAG-NOOPT-NEXT:    imulq $7, %rdi, %rax # sched: [6:4.00]
352 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
354 ; X64-SLM-LABEL: test_mul_by_7:
355 ; X64-SLM:       # %bb.0:
356 ; X64-SLM-NEXT:    leaq (,%rdi,8), %rax # sched: [1:1.00]
357 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
358 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
360 ; SLM-NOOPT-LABEL: test_mul_by_7:
361 ; SLM-NOOPT:       # %bb.0:
362 ; SLM-NOOPT-NEXT:    imulq $7, %rdi, %rax # sched: [3:1.00]
363 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
364   %mul = mul nsw i64 %x, 7
365   ret i64 %mul
368 define i64 @test_mul_by_8(i64 %x) {
369 ; X86-LABEL: test_mul_by_8:
370 ; X86:       # %bb.0:
371 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
372 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
373 ; X86-NEXT:    shldl $3, %eax, %edx
374 ; X86-NEXT:    shll $3, %eax
375 ; X86-NEXT:    retl
377 ; X64-HSW-LABEL: test_mul_by_8:
378 ; X64-HSW:       # %bb.0:
379 ; X64-HSW-NEXT:    leaq (,%rdi,8), %rax # sched: [1:0.50]
380 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
382 ; X64-JAG-LABEL: test_mul_by_8:
383 ; X64-JAG:       # %bb.0:
384 ; X64-JAG-NEXT:    leaq (,%rdi,8), %rax # sched: [2:1.00]
385 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
387 ; X86-NOOPT-LABEL: test_mul_by_8:
388 ; X86-NOOPT:       # %bb.0:
389 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
390 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
391 ; X86-NOOPT-NEXT:    shldl $3, %eax, %edx
392 ; X86-NOOPT-NEXT:    shll $3, %eax
393 ; X86-NOOPT-NEXT:    retl
395 ; HSW-NOOPT-LABEL: test_mul_by_8:
396 ; HSW-NOOPT:       # %bb.0:
397 ; HSW-NOOPT-NEXT:    leaq (,%rdi,8), %rax # sched: [1:0.50]
398 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
400 ; JAG-NOOPT-LABEL: test_mul_by_8:
401 ; JAG-NOOPT:       # %bb.0:
402 ; JAG-NOOPT-NEXT:    leaq (,%rdi,8), %rax # sched: [2:1.00]
403 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
405 ; X64-SLM-LABEL: test_mul_by_8:
406 ; X64-SLM:       # %bb.0:
407 ; X64-SLM-NEXT:    leaq (,%rdi,8), %rax # sched: [1:1.00]
408 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
410 ; SLM-NOOPT-LABEL: test_mul_by_8:
411 ; SLM-NOOPT:       # %bb.0:
412 ; SLM-NOOPT-NEXT:    leaq (,%rdi,8), %rax # sched: [1:1.00]
413 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
414   %mul = mul nsw i64 %x, 8
415   ret i64 %mul
418 define i64 @test_mul_by_9(i64 %x) {
419 ; X86-LABEL: test_mul_by_9:
420 ; X86:       # %bb.0:
421 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
422 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
423 ; X86-NEXT:    movl $9, %eax
424 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
425 ; X86-NEXT:    addl %ecx, %edx
426 ; X86-NEXT:    retl
428 ; X64-HSW-LABEL: test_mul_by_9:
429 ; X64-HSW:       # %bb.0:
430 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
431 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
433 ; X64-JAG-LABEL: test_mul_by_9:
434 ; X64-JAG:       # %bb.0:
435 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
436 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
438 ; X86-NOOPT-LABEL: test_mul_by_9:
439 ; X86-NOOPT:       # %bb.0:
440 ; X86-NOOPT-NEXT:    movl $9, %eax
441 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
442 ; X86-NOOPT-NEXT:    imull $9, {{[0-9]+}}(%esp), %ecx
443 ; X86-NOOPT-NEXT:    addl %ecx, %edx
444 ; X86-NOOPT-NEXT:    retl
446 ; HSW-NOOPT-LABEL: test_mul_by_9:
447 ; HSW-NOOPT:       # %bb.0:
448 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
449 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
451 ; JAG-NOOPT-LABEL: test_mul_by_9:
452 ; JAG-NOOPT:       # %bb.0:
453 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
454 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
456 ; X64-SLM-LABEL: test_mul_by_9:
457 ; X64-SLM:       # %bb.0:
458 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
459 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
461 ; SLM-NOOPT-LABEL: test_mul_by_9:
462 ; SLM-NOOPT:       # %bb.0:
463 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
464 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
465   %mul = mul nsw i64 %x, 9
466   ret i64 %mul
469 define i64 @test_mul_by_10(i64 %x) {
470 ; X86-LABEL: test_mul_by_10:
471 ; X86:       # %bb.0:
472 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
473 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
474 ; X86-NEXT:    movl $10, %eax
475 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
476 ; X86-NEXT:    leal (%edx,%ecx,2), %edx
477 ; X86-NEXT:    retl
479 ; X64-HSW-LABEL: test_mul_by_10:
480 ; X64-HSW:       # %bb.0:
481 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
482 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
483 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
485 ; X64-JAG-LABEL: test_mul_by_10:
486 ; X64-JAG:       # %bb.0:
487 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
488 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
489 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
491 ; X86-NOOPT-LABEL: test_mul_by_10:
492 ; X86-NOOPT:       # %bb.0:
493 ; X86-NOOPT-NEXT:    movl $10, %eax
494 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
495 ; X86-NOOPT-NEXT:    imull $10, {{[0-9]+}}(%esp), %ecx
496 ; X86-NOOPT-NEXT:    addl %ecx, %edx
497 ; X86-NOOPT-NEXT:    retl
499 ; HSW-NOOPT-LABEL: test_mul_by_10:
500 ; HSW-NOOPT:       # %bb.0:
501 ; HSW-NOOPT-NEXT:    imulq $10, %rdi, %rax # sched: [3:1.00]
502 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
504 ; JAG-NOOPT-LABEL: test_mul_by_10:
505 ; JAG-NOOPT:       # %bb.0:
506 ; JAG-NOOPT-NEXT:    imulq $10, %rdi, %rax # sched: [6:4.00]
507 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
509 ; X64-SLM-LABEL: test_mul_by_10:
510 ; X64-SLM:       # %bb.0:
511 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
512 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
513 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
515 ; SLM-NOOPT-LABEL: test_mul_by_10:
516 ; SLM-NOOPT:       # %bb.0:
517 ; SLM-NOOPT-NEXT:    imulq $10, %rdi, %rax # sched: [3:1.00]
518 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
519   %mul = mul nsw i64 %x, 10
520   ret i64 %mul
523 define i64 @test_mul_by_11(i64 %x) {
524 ; X86-LABEL: test_mul_by_11:
525 ; X86:       # %bb.0:
526 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
527 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
528 ; X86-NEXT:    leal (%eax,%ecx,2), %ecx
529 ; X86-NEXT:    movl $11, %eax
530 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
531 ; X86-NEXT:    addl %ecx, %edx
532 ; X86-NEXT:    retl
534 ; X64-HSW-LABEL: test_mul_by_11:
535 ; X64-HSW:       # %bb.0:
536 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
537 ; X64-HSW-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [1:0.50]
538 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
540 ; X64-JAG-LABEL: test_mul_by_11:
541 ; X64-JAG:       # %bb.0:
542 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
543 ; X64-JAG-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [2:1.00]
544 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
546 ; X86-NOOPT-LABEL: test_mul_by_11:
547 ; X86-NOOPT:       # %bb.0:
548 ; X86-NOOPT-NEXT:    movl $11, %eax
549 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
550 ; X86-NOOPT-NEXT:    imull $11, {{[0-9]+}}(%esp), %ecx
551 ; X86-NOOPT-NEXT:    addl %ecx, %edx
552 ; X86-NOOPT-NEXT:    retl
554 ; HSW-NOOPT-LABEL: test_mul_by_11:
555 ; HSW-NOOPT:       # %bb.0:
556 ; HSW-NOOPT-NEXT:    imulq $11, %rdi, %rax # sched: [3:1.00]
557 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
559 ; JAG-NOOPT-LABEL: test_mul_by_11:
560 ; JAG-NOOPT:       # %bb.0:
561 ; JAG-NOOPT-NEXT:    imulq $11, %rdi, %rax # sched: [6:4.00]
562 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
564 ; X64-SLM-LABEL: test_mul_by_11:
565 ; X64-SLM:       # %bb.0:
566 ; X64-SLM-NEXT:    imulq $11, %rdi, %rax # sched: [3:1.00]
567 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
569 ; SLM-NOOPT-LABEL: test_mul_by_11:
570 ; SLM-NOOPT:       # %bb.0:
571 ; SLM-NOOPT-NEXT:    imulq $11, %rdi, %rax # sched: [3:1.00]
572 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
573   %mul = mul nsw i64 %x, 11
574   ret i64 %mul
577 define i64 @test_mul_by_12(i64 %x) {
578 ; X86-LABEL: test_mul_by_12:
579 ; X86:       # %bb.0:
580 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
581 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
582 ; X86-NEXT:    movl $12, %eax
583 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
584 ; X86-NEXT:    leal (%edx,%ecx,4), %edx
585 ; X86-NEXT:    retl
587 ; X64-HSW-LABEL: test_mul_by_12:
588 ; X64-HSW:       # %bb.0:
589 ; X64-HSW-NEXT:    shlq $2, %rdi # sched: [1:0.50]
590 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
591 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
593 ; X64-JAG-LABEL: test_mul_by_12:
594 ; X64-JAG:       # %bb.0:
595 ; X64-JAG-NEXT:    shlq $2, %rdi # sched: [1:0.50]
596 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
597 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
599 ; X86-NOOPT-LABEL: test_mul_by_12:
600 ; X86-NOOPT:       # %bb.0:
601 ; X86-NOOPT-NEXT:    movl $12, %eax
602 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
603 ; X86-NOOPT-NEXT:    imull $12, {{[0-9]+}}(%esp), %ecx
604 ; X86-NOOPT-NEXT:    addl %ecx, %edx
605 ; X86-NOOPT-NEXT:    retl
607 ; HSW-NOOPT-LABEL: test_mul_by_12:
608 ; HSW-NOOPT:       # %bb.0:
609 ; HSW-NOOPT-NEXT:    imulq $12, %rdi, %rax # sched: [3:1.00]
610 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
612 ; JAG-NOOPT-LABEL: test_mul_by_12:
613 ; JAG-NOOPT:       # %bb.0:
614 ; JAG-NOOPT-NEXT:    imulq $12, %rdi, %rax # sched: [6:4.00]
615 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
617 ; X64-SLM-LABEL: test_mul_by_12:
618 ; X64-SLM:       # %bb.0:
619 ; X64-SLM-NEXT:    shlq $2, %rdi # sched: [1:1.00]
620 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
621 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
623 ; SLM-NOOPT-LABEL: test_mul_by_12:
624 ; SLM-NOOPT:       # %bb.0:
625 ; SLM-NOOPT-NEXT:    imulq $12, %rdi, %rax # sched: [3:1.00]
626 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
627   %mul = mul nsw i64 %x, 12
628   ret i64 %mul
631 define i64 @test_mul_by_13(i64 %x) {
632 ; X86-LABEL: test_mul_by_13:
633 ; X86:       # %bb.0:
634 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
635 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
636 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
637 ; X86-NEXT:    movl $13, %eax
638 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
639 ; X86-NEXT:    addl %ecx, %edx
640 ; X86-NEXT:    retl
642 ; X64-HSW-LABEL: test_mul_by_13:
643 ; X64-HSW:       # %bb.0:
644 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
645 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
646 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
648 ; X64-JAG-LABEL: test_mul_by_13:
649 ; X64-JAG:       # %bb.0:
650 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
651 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
652 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
654 ; X86-NOOPT-LABEL: test_mul_by_13:
655 ; X86-NOOPT:       # %bb.0:
656 ; X86-NOOPT-NEXT:    movl $13, %eax
657 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
658 ; X86-NOOPT-NEXT:    imull $13, {{[0-9]+}}(%esp), %ecx
659 ; X86-NOOPT-NEXT:    addl %ecx, %edx
660 ; X86-NOOPT-NEXT:    retl
662 ; HSW-NOOPT-LABEL: test_mul_by_13:
663 ; HSW-NOOPT:       # %bb.0:
664 ; HSW-NOOPT-NEXT:    imulq $13, %rdi, %rax # sched: [3:1.00]
665 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
667 ; JAG-NOOPT-LABEL: test_mul_by_13:
668 ; JAG-NOOPT:       # %bb.0:
669 ; JAG-NOOPT-NEXT:    imulq $13, %rdi, %rax # sched: [6:4.00]
670 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
672 ; X64-SLM-LABEL: test_mul_by_13:
673 ; X64-SLM:       # %bb.0:
674 ; X64-SLM-NEXT:    imulq $13, %rdi, %rax # sched: [3:1.00]
675 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
677 ; SLM-NOOPT-LABEL: test_mul_by_13:
678 ; SLM-NOOPT:       # %bb.0:
679 ; SLM-NOOPT-NEXT:    imulq $13, %rdi, %rax # sched: [3:1.00]
680 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
681   %mul = mul nsw i64 %x, 13
682   ret i64 %mul
685 define i64 @test_mul_by_14(i64 %x) {
686 ; X86-LABEL: test_mul_by_14:
687 ; X86:       # %bb.0:
688 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
689 ; X86-NEXT:    movl %eax, %ecx
690 ; X86-NEXT:    shll $4, %ecx
691 ; X86-NEXT:    subl %eax, %ecx
692 ; X86-NEXT:    subl %eax, %ecx
693 ; X86-NEXT:    movl $14, %eax
694 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
695 ; X86-NEXT:    addl %ecx, %edx
696 ; X86-NEXT:    retl
698 ; X64-HSW-LABEL: test_mul_by_14:
699 ; X64-HSW:       # %bb.0:
700 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
701 ; X64-HSW-NEXT:    shlq $4, %rax # sched: [1:0.50]
702 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
703 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
704 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
706 ; X64-JAG-LABEL: test_mul_by_14:
707 ; X64-JAG:       # %bb.0:
708 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
709 ; X64-JAG-NEXT:    shlq $4, %rax # sched: [1:0.50]
710 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
711 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
712 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
714 ; X86-NOOPT-LABEL: test_mul_by_14:
715 ; X86-NOOPT:       # %bb.0:
716 ; X86-NOOPT-NEXT:    movl $14, %eax
717 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
718 ; X86-NOOPT-NEXT:    imull $14, {{[0-9]+}}(%esp), %ecx
719 ; X86-NOOPT-NEXT:    addl %ecx, %edx
720 ; X86-NOOPT-NEXT:    retl
722 ; HSW-NOOPT-LABEL: test_mul_by_14:
723 ; HSW-NOOPT:       # %bb.0:
724 ; HSW-NOOPT-NEXT:    imulq $14, %rdi, %rax # sched: [3:1.00]
725 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
727 ; JAG-NOOPT-LABEL: test_mul_by_14:
728 ; JAG-NOOPT:       # %bb.0:
729 ; JAG-NOOPT-NEXT:    imulq $14, %rdi, %rax # sched: [6:4.00]
730 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
732 ; X64-SLM-LABEL: test_mul_by_14:
733 ; X64-SLM:       # %bb.0:
734 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
735 ; X64-SLM-NEXT:    shlq $4, %rax # sched: [1:1.00]
736 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
737 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
738 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
740 ; SLM-NOOPT-LABEL: test_mul_by_14:
741 ; SLM-NOOPT:       # %bb.0:
742 ; SLM-NOOPT-NEXT:    imulq $14, %rdi, %rax # sched: [3:1.00]
743 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
744   %mul = mul nsw i64 %x, 14
745   ret i64 %mul
748 define i64 @test_mul_by_15(i64 %x) {
749 ; X86-LABEL: test_mul_by_15:
750 ; X86:       # %bb.0:
751 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
752 ; X86-NEXT:    movl $15, %eax
753 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
754 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
755 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
756 ; X86-NEXT:    addl %ecx, %edx
757 ; X86-NEXT:    retl
759 ; X64-HSW-LABEL: test_mul_by_15:
760 ; X64-HSW:       # %bb.0:
761 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
762 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
763 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
765 ; X64-JAG-LABEL: test_mul_by_15:
766 ; X64-JAG:       # %bb.0:
767 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
768 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
769 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
771 ; X86-NOOPT-LABEL: test_mul_by_15:
772 ; X86-NOOPT:       # %bb.0:
773 ; X86-NOOPT-NEXT:    movl $15, %eax
774 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
775 ; X86-NOOPT-NEXT:    imull $15, {{[0-9]+}}(%esp), %ecx
776 ; X86-NOOPT-NEXT:    addl %ecx, %edx
777 ; X86-NOOPT-NEXT:    retl
779 ; HSW-NOOPT-LABEL: test_mul_by_15:
780 ; HSW-NOOPT:       # %bb.0:
781 ; HSW-NOOPT-NEXT:    imulq $15, %rdi, %rax # sched: [3:1.00]
782 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
784 ; JAG-NOOPT-LABEL: test_mul_by_15:
785 ; JAG-NOOPT:       # %bb.0:
786 ; JAG-NOOPT-NEXT:    imulq $15, %rdi, %rax # sched: [6:4.00]
787 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
789 ; X64-SLM-LABEL: test_mul_by_15:
790 ; X64-SLM:       # %bb.0:
791 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
792 ; X64-SLM-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:1.00]
793 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
795 ; SLM-NOOPT-LABEL: test_mul_by_15:
796 ; SLM-NOOPT:       # %bb.0:
797 ; SLM-NOOPT-NEXT:    imulq $15, %rdi, %rax # sched: [3:1.00]
798 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
799   %mul = mul nsw i64 %x, 15
800   ret i64 %mul
803 define i64 @test_mul_by_16(i64 %x) {
804 ; X86-LABEL: test_mul_by_16:
805 ; X86:       # %bb.0:
806 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
807 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
808 ; X86-NEXT:    shldl $4, %eax, %edx
809 ; X86-NEXT:    shll $4, %eax
810 ; X86-NEXT:    retl
812 ; X64-HSW-LABEL: test_mul_by_16:
813 ; X64-HSW:       # %bb.0:
814 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
815 ; X64-HSW-NEXT:    shlq $4, %rax # sched: [1:0.50]
816 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
818 ; X64-JAG-LABEL: test_mul_by_16:
819 ; X64-JAG:       # %bb.0:
820 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
821 ; X64-JAG-NEXT:    shlq $4, %rax # sched: [1:0.50]
822 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
824 ; X86-NOOPT-LABEL: test_mul_by_16:
825 ; X86-NOOPT:       # %bb.0:
826 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
827 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
828 ; X86-NOOPT-NEXT:    shldl $4, %eax, %edx
829 ; X86-NOOPT-NEXT:    shll $4, %eax
830 ; X86-NOOPT-NEXT:    retl
832 ; HSW-NOOPT-LABEL: test_mul_by_16:
833 ; HSW-NOOPT:       # %bb.0:
834 ; HSW-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.25]
835 ; HSW-NOOPT-NEXT:    shlq $4, %rax # sched: [1:0.50]
836 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
838 ; JAG-NOOPT-LABEL: test_mul_by_16:
839 ; JAG-NOOPT:       # %bb.0:
840 ; JAG-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
841 ; JAG-NOOPT-NEXT:    shlq $4, %rax # sched: [1:0.50]
842 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
844 ; X64-SLM-LABEL: test_mul_by_16:
845 ; X64-SLM:       # %bb.0:
846 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
847 ; X64-SLM-NEXT:    shlq $4, %rax # sched: [1:1.00]
848 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
850 ; SLM-NOOPT-LABEL: test_mul_by_16:
851 ; SLM-NOOPT:       # %bb.0:
852 ; SLM-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
853 ; SLM-NOOPT-NEXT:    shlq $4, %rax # sched: [1:1.00]
854 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
855   %mul = mul nsw i64 %x, 16
856   ret i64 %mul
859 define i64 @test_mul_by_17(i64 %x) {
860 ; X86-LABEL: test_mul_by_17:
861 ; X86:       # %bb.0:
862 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
863 ; X86-NEXT:    movl %eax, %ecx
864 ; X86-NEXT:    shll $4, %ecx
865 ; X86-NEXT:    addl %eax, %ecx
866 ; X86-NEXT:    movl $17, %eax
867 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
868 ; X86-NEXT:    addl %ecx, %edx
869 ; X86-NEXT:    retl
871 ; X64-HSW-LABEL: test_mul_by_17:
872 ; X64-HSW:       # %bb.0:
873 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
874 ; X64-HSW-NEXT:    shlq $4, %rax # sched: [1:0.50]
875 ; X64-HSW-NEXT:    leaq (%rax,%rdi), %rax # sched: [1:0.50]
876 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
878 ; X64-JAG-LABEL: test_mul_by_17:
879 ; X64-JAG:       # %bb.0:
880 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
881 ; X64-JAG-NEXT:    shlq $4, %rax # sched: [1:0.50]
882 ; X64-JAG-NEXT:    leaq (%rax,%rdi), %rax # sched: [1:0.50]
883 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
885 ; X86-NOOPT-LABEL: test_mul_by_17:
886 ; X86-NOOPT:       # %bb.0:
887 ; X86-NOOPT-NEXT:    movl $17, %eax
888 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
889 ; X86-NOOPT-NEXT:    imull $17, {{[0-9]+}}(%esp), %ecx
890 ; X86-NOOPT-NEXT:    addl %ecx, %edx
891 ; X86-NOOPT-NEXT:    retl
893 ; HSW-NOOPT-LABEL: test_mul_by_17:
894 ; HSW-NOOPT:       # %bb.0:
895 ; HSW-NOOPT-NEXT:    imulq $17, %rdi, %rax # sched: [3:1.00]
896 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
898 ; JAG-NOOPT-LABEL: test_mul_by_17:
899 ; JAG-NOOPT:       # %bb.0:
900 ; JAG-NOOPT-NEXT:    imulq $17, %rdi, %rax # sched: [6:4.00]
901 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
903 ; X64-SLM-LABEL: test_mul_by_17:
904 ; X64-SLM:       # %bb.0:
905 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
906 ; X64-SLM-NEXT:    shlq $4, %rax # sched: [1:1.00]
907 ; X64-SLM-NEXT:    addq %rdi, %rax # sched: [1:0.50]
908 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
910 ; SLM-NOOPT-LABEL: test_mul_by_17:
911 ; SLM-NOOPT:       # %bb.0:
912 ; SLM-NOOPT-NEXT:    imulq $17, %rdi, %rax # sched: [3:1.00]
913 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
914   %mul = mul nsw i64 %x, 17
915   ret i64 %mul
918 define i64 @test_mul_by_18(i64 %x) {
919 ; X86-LABEL: test_mul_by_18:
920 ; X86:       # %bb.0:
921 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
922 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
923 ; X86-NEXT:    movl $18, %eax
924 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
925 ; X86-NEXT:    leal (%edx,%ecx,2), %edx
926 ; X86-NEXT:    retl
928 ; X64-HSW-LABEL: test_mul_by_18:
929 ; X64-HSW:       # %bb.0:
930 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
931 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
932 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
934 ; X64-JAG-LABEL: test_mul_by_18:
935 ; X64-JAG:       # %bb.0:
936 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
937 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
938 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
940 ; X86-NOOPT-LABEL: test_mul_by_18:
941 ; X86-NOOPT:       # %bb.0:
942 ; X86-NOOPT-NEXT:    movl $18, %eax
943 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
944 ; X86-NOOPT-NEXT:    imull $18, {{[0-9]+}}(%esp), %ecx
945 ; X86-NOOPT-NEXT:    addl %ecx, %edx
946 ; X86-NOOPT-NEXT:    retl
948 ; HSW-NOOPT-LABEL: test_mul_by_18:
949 ; HSW-NOOPT:       # %bb.0:
950 ; HSW-NOOPT-NEXT:    imulq $18, %rdi, %rax # sched: [3:1.00]
951 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
953 ; JAG-NOOPT-LABEL: test_mul_by_18:
954 ; JAG-NOOPT:       # %bb.0:
955 ; JAG-NOOPT-NEXT:    imulq $18, %rdi, %rax # sched: [6:4.00]
956 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
958 ; X64-SLM-LABEL: test_mul_by_18:
959 ; X64-SLM:       # %bb.0:
960 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
961 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
962 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
964 ; SLM-NOOPT-LABEL: test_mul_by_18:
965 ; SLM-NOOPT:       # %bb.0:
966 ; SLM-NOOPT-NEXT:    imulq $18, %rdi, %rax # sched: [3:1.00]
967 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
968   %mul = mul nsw i64 %x, 18
969   ret i64 %mul
972 define i64 @test_mul_by_19(i64 %x) {
973 ; X86-LABEL: test_mul_by_19:
974 ; X86:       # %bb.0:
975 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
976 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
977 ; X86-NEXT:    leal (%eax,%ecx,2), %ecx
978 ; X86-NEXT:    movl $19, %eax
979 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
980 ; X86-NEXT:    addl %ecx, %edx
981 ; X86-NEXT:    retl
983 ; X64-HSW-LABEL: test_mul_by_19:
984 ; X64-HSW:       # %bb.0:
985 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
986 ; X64-HSW-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [1:0.50]
987 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
989 ; X64-JAG-LABEL: test_mul_by_19:
990 ; X64-JAG:       # %bb.0:
991 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
992 ; X64-JAG-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [2:1.00]
993 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
995 ; X86-NOOPT-LABEL: test_mul_by_19:
996 ; X86-NOOPT:       # %bb.0:
997 ; X86-NOOPT-NEXT:    movl $19, %eax
998 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
999 ; X86-NOOPT-NEXT:    imull $19, {{[0-9]+}}(%esp), %ecx
1000 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1001 ; X86-NOOPT-NEXT:    retl
1003 ; HSW-NOOPT-LABEL: test_mul_by_19:
1004 ; HSW-NOOPT:       # %bb.0:
1005 ; HSW-NOOPT-NEXT:    imulq $19, %rdi, %rax # sched: [3:1.00]
1006 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1008 ; JAG-NOOPT-LABEL: test_mul_by_19:
1009 ; JAG-NOOPT:       # %bb.0:
1010 ; JAG-NOOPT-NEXT:    imulq $19, %rdi, %rax # sched: [6:4.00]
1011 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1013 ; X64-SLM-LABEL: test_mul_by_19:
1014 ; X64-SLM:       # %bb.0:
1015 ; X64-SLM-NEXT:    imulq $19, %rdi, %rax # sched: [3:1.00]
1016 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1018 ; SLM-NOOPT-LABEL: test_mul_by_19:
1019 ; SLM-NOOPT:       # %bb.0:
1020 ; SLM-NOOPT-NEXT:    imulq $19, %rdi, %rax # sched: [3:1.00]
1021 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1022   %mul = mul nsw i64 %x, 19
1023   ret i64 %mul
1026 define i64 @test_mul_by_20(i64 %x) {
1027 ; X86-LABEL: test_mul_by_20:
1028 ; X86:       # %bb.0:
1029 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1030 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
1031 ; X86-NEXT:    movl $20, %eax
1032 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1033 ; X86-NEXT:    leal (%edx,%ecx,4), %edx
1034 ; X86-NEXT:    retl
1036 ; X64-HSW-LABEL: test_mul_by_20:
1037 ; X64-HSW:       # %bb.0:
1038 ; X64-HSW-NEXT:    shlq $2, %rdi # sched: [1:0.50]
1039 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1040 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1042 ; X64-JAG-LABEL: test_mul_by_20:
1043 ; X64-JAG:       # %bb.0:
1044 ; X64-JAG-NEXT:    shlq $2, %rdi # sched: [1:0.50]
1045 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1046 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1048 ; X86-NOOPT-LABEL: test_mul_by_20:
1049 ; X86-NOOPT:       # %bb.0:
1050 ; X86-NOOPT-NEXT:    movl $20, %eax
1051 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1052 ; X86-NOOPT-NEXT:    imull $20, {{[0-9]+}}(%esp), %ecx
1053 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1054 ; X86-NOOPT-NEXT:    retl
1056 ; HSW-NOOPT-LABEL: test_mul_by_20:
1057 ; HSW-NOOPT:       # %bb.0:
1058 ; HSW-NOOPT-NEXT:    imulq $20, %rdi, %rax # sched: [3:1.00]
1059 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1061 ; JAG-NOOPT-LABEL: test_mul_by_20:
1062 ; JAG-NOOPT:       # %bb.0:
1063 ; JAG-NOOPT-NEXT:    imulq $20, %rdi, %rax # sched: [6:4.00]
1064 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1066 ; X64-SLM-LABEL: test_mul_by_20:
1067 ; X64-SLM:       # %bb.0:
1068 ; X64-SLM-NEXT:    shlq $2, %rdi # sched: [1:1.00]
1069 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
1070 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1072 ; SLM-NOOPT-LABEL: test_mul_by_20:
1073 ; SLM-NOOPT:       # %bb.0:
1074 ; SLM-NOOPT-NEXT:    imulq $20, %rdi, %rax # sched: [3:1.00]
1075 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1076   %mul = mul nsw i64 %x, 20
1077   ret i64 %mul
1080 define i64 @test_mul_by_21(i64 %x) {
1081 ; X86-LABEL: test_mul_by_21:
1082 ; X86:       # %bb.0:
1083 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1084 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
1085 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
1086 ; X86-NEXT:    movl $21, %eax
1087 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1088 ; X86-NEXT:    addl %ecx, %edx
1089 ; X86-NEXT:    retl
1091 ; X64-HSW-LABEL: test_mul_by_21:
1092 ; X64-HSW:       # %bb.0:
1093 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1094 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
1095 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1097 ; X64-JAG-LABEL: test_mul_by_21:
1098 ; X64-JAG:       # %bb.0:
1099 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1100 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
1101 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1103 ; X86-NOOPT-LABEL: test_mul_by_21:
1104 ; X86-NOOPT:       # %bb.0:
1105 ; X86-NOOPT-NEXT:    movl $21, %eax
1106 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1107 ; X86-NOOPT-NEXT:    imull $21, {{[0-9]+}}(%esp), %ecx
1108 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1109 ; X86-NOOPT-NEXT:    retl
1111 ; HSW-NOOPT-LABEL: test_mul_by_21:
1112 ; HSW-NOOPT:       # %bb.0:
1113 ; HSW-NOOPT-NEXT:    imulq $21, %rdi, %rax # sched: [3:1.00]
1114 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1116 ; JAG-NOOPT-LABEL: test_mul_by_21:
1117 ; JAG-NOOPT:       # %bb.0:
1118 ; JAG-NOOPT-NEXT:    imulq $21, %rdi, %rax # sched: [6:4.00]
1119 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1121 ; X64-SLM-LABEL: test_mul_by_21:
1122 ; X64-SLM:       # %bb.0:
1123 ; X64-SLM-NEXT:    imulq $21, %rdi, %rax # sched: [3:1.00]
1124 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1126 ; SLM-NOOPT-LABEL: test_mul_by_21:
1127 ; SLM-NOOPT:       # %bb.0:
1128 ; SLM-NOOPT-NEXT:    imulq $21, %rdi, %rax # sched: [3:1.00]
1129 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1130   %mul = mul nsw i64 %x, 21
1131   ret i64 %mul
1134 define i64 @test_mul_by_22(i64 %x) {
1135 ; X86-LABEL: test_mul_by_22:
1136 ; X86:       # %bb.0:
1137 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1138 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
1139 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
1140 ; X86-NEXT:    addl %eax, %ecx
1141 ; X86-NEXT:    movl $22, %eax
1142 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1143 ; X86-NEXT:    addl %ecx, %edx
1144 ; X86-NEXT:    retl
1146 ; X64-HSW-LABEL: test_mul_by_22:
1147 ; X64-HSW:       # %bb.0:
1148 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1149 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
1150 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
1151 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1153 ; X64-JAG-LABEL: test_mul_by_22:
1154 ; X64-JAG:       # %bb.0:
1155 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1156 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
1157 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1158 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1160 ; X86-NOOPT-LABEL: test_mul_by_22:
1161 ; X86-NOOPT:       # %bb.0:
1162 ; X86-NOOPT-NEXT:    movl $22, %eax
1163 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1164 ; X86-NOOPT-NEXT:    imull $22, {{[0-9]+}}(%esp), %ecx
1165 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1166 ; X86-NOOPT-NEXT:    retl
1168 ; HSW-NOOPT-LABEL: test_mul_by_22:
1169 ; HSW-NOOPT:       # %bb.0:
1170 ; HSW-NOOPT-NEXT:    imulq $22, %rdi, %rax # sched: [3:1.00]
1171 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1173 ; JAG-NOOPT-LABEL: test_mul_by_22:
1174 ; JAG-NOOPT:       # %bb.0:
1175 ; JAG-NOOPT-NEXT:    imulq $22, %rdi, %rax # sched: [6:4.00]
1176 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1178 ; X64-SLM-LABEL: test_mul_by_22:
1179 ; X64-SLM:       # %bb.0:
1180 ; X64-SLM-NEXT:    imulq $22, %rdi, %rax # sched: [3:1.00]
1181 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1183 ; SLM-NOOPT-LABEL: test_mul_by_22:
1184 ; SLM-NOOPT:       # %bb.0:
1185 ; SLM-NOOPT-NEXT:    imulq $22, %rdi, %rax # sched: [3:1.00]
1186 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1187   %mul = mul nsw i64 %x, 22
1188   ret i64 %mul
1191 define i64 @test_mul_by_23(i64 %x) {
1192 ; X86-LABEL: test_mul_by_23:
1193 ; X86:       # %bb.0:
1194 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1195 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
1196 ; X86-NEXT:    shll $3, %ecx
1197 ; X86-NEXT:    subl %eax, %ecx
1198 ; X86-NEXT:    movl $23, %eax
1199 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1200 ; X86-NEXT:    addl %ecx, %edx
1201 ; X86-NEXT:    retl
1203 ; X64-HSW-LABEL: test_mul_by_23:
1204 ; X64-HSW:       # %bb.0:
1205 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
1206 ; X64-HSW-NEXT:    shlq $3, %rax # sched: [1:0.50]
1207 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
1208 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1210 ; X64-JAG-LABEL: test_mul_by_23:
1211 ; X64-JAG:       # %bb.0:
1212 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
1213 ; X64-JAG-NEXT:    shlq $3, %rax # sched: [1:0.50]
1214 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1215 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1217 ; X86-NOOPT-LABEL: test_mul_by_23:
1218 ; X86-NOOPT:       # %bb.0:
1219 ; X86-NOOPT-NEXT:    movl $23, %eax
1220 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1221 ; X86-NOOPT-NEXT:    imull $23, {{[0-9]+}}(%esp), %ecx
1222 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1223 ; X86-NOOPT-NEXT:    retl
1225 ; HSW-NOOPT-LABEL: test_mul_by_23:
1226 ; HSW-NOOPT:       # %bb.0:
1227 ; HSW-NOOPT-NEXT:    imulq $23, %rdi, %rax # sched: [3:1.00]
1228 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1230 ; JAG-NOOPT-LABEL: test_mul_by_23:
1231 ; JAG-NOOPT:       # %bb.0:
1232 ; JAG-NOOPT-NEXT:    imulq $23, %rdi, %rax # sched: [6:4.00]
1233 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1235 ; X64-SLM-LABEL: test_mul_by_23:
1236 ; X64-SLM:       # %bb.0:
1237 ; X64-SLM-NEXT:    imulq $23, %rdi, %rax # sched: [3:1.00]
1238 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1240 ; SLM-NOOPT-LABEL: test_mul_by_23:
1241 ; SLM-NOOPT:       # %bb.0:
1242 ; SLM-NOOPT-NEXT:    imulq $23, %rdi, %rax # sched: [3:1.00]
1243 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1244   %mul = mul nsw i64 %x, 23
1245   ret i64 %mul
1248 define i64 @test_mul_by_24(i64 %x) {
1249 ; X86-LABEL: test_mul_by_24:
1250 ; X86:       # %bb.0:
1251 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1252 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
1253 ; X86-NEXT:    movl $24, %eax
1254 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1255 ; X86-NEXT:    leal (%edx,%ecx,8), %edx
1256 ; X86-NEXT:    retl
1258 ; X64-HSW-LABEL: test_mul_by_24:
1259 ; X64-HSW:       # %bb.0:
1260 ; X64-HSW-NEXT:    shlq $3, %rdi # sched: [1:0.50]
1261 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
1262 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1264 ; X64-JAG-LABEL: test_mul_by_24:
1265 ; X64-JAG:       # %bb.0:
1266 ; X64-JAG-NEXT:    shlq $3, %rdi # sched: [1:0.50]
1267 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
1268 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1270 ; X86-NOOPT-LABEL: test_mul_by_24:
1271 ; X86-NOOPT:       # %bb.0:
1272 ; X86-NOOPT-NEXT:    movl $24, %eax
1273 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1274 ; X86-NOOPT-NEXT:    imull $24, {{[0-9]+}}(%esp), %ecx
1275 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1276 ; X86-NOOPT-NEXT:    retl
1278 ; HSW-NOOPT-LABEL: test_mul_by_24:
1279 ; HSW-NOOPT:       # %bb.0:
1280 ; HSW-NOOPT-NEXT:    imulq $24, %rdi, %rax # sched: [3:1.00]
1281 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1283 ; JAG-NOOPT-LABEL: test_mul_by_24:
1284 ; JAG-NOOPT:       # %bb.0:
1285 ; JAG-NOOPT-NEXT:    imulq $24, %rdi, %rax # sched: [6:4.00]
1286 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1288 ; X64-SLM-LABEL: test_mul_by_24:
1289 ; X64-SLM:       # %bb.0:
1290 ; X64-SLM-NEXT:    shlq $3, %rdi # sched: [1:1.00]
1291 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
1292 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1294 ; SLM-NOOPT-LABEL: test_mul_by_24:
1295 ; SLM-NOOPT:       # %bb.0:
1296 ; SLM-NOOPT-NEXT:    imulq $24, %rdi, %rax # sched: [3:1.00]
1297 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1298   %mul = mul nsw i64 %x, 24
1299   ret i64 %mul
1302 define i64 @test_mul_by_25(i64 %x) {
1303 ; X86-LABEL: test_mul_by_25:
1304 ; X86:       # %bb.0:
1305 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1306 ; X86-NEXT:    movl $25, %eax
1307 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1308 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
1309 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
1310 ; X86-NEXT:    addl %ecx, %edx
1311 ; X86-NEXT:    retl
1313 ; X64-HSW-LABEL: test_mul_by_25:
1314 ; X64-HSW:       # %bb.0:
1315 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1316 ; X64-HSW-NEXT:    leaq (%rax,%rax,4), %rax # sched: [1:0.50]
1317 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1319 ; X64-JAG-LABEL: test_mul_by_25:
1320 ; X64-JAG:       # %bb.0:
1321 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1322 ; X64-JAG-NEXT:    leaq (%rax,%rax,4), %rax # sched: [2:1.00]
1323 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1325 ; X86-NOOPT-LABEL: test_mul_by_25:
1326 ; X86-NOOPT:       # %bb.0:
1327 ; X86-NOOPT-NEXT:    movl $25, %eax
1328 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1329 ; X86-NOOPT-NEXT:    imull $25, {{[0-9]+}}(%esp), %ecx
1330 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1331 ; X86-NOOPT-NEXT:    retl
1333 ; HSW-NOOPT-LABEL: test_mul_by_25:
1334 ; HSW-NOOPT:       # %bb.0:
1335 ; HSW-NOOPT-NEXT:    imulq $25, %rdi, %rax # sched: [3:1.00]
1336 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1338 ; JAG-NOOPT-LABEL: test_mul_by_25:
1339 ; JAG-NOOPT:       # %bb.0:
1340 ; JAG-NOOPT-NEXT:    imulq $25, %rdi, %rax # sched: [6:4.00]
1341 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1343 ; X64-SLM-LABEL: test_mul_by_25:
1344 ; X64-SLM:       # %bb.0:
1345 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
1346 ; X64-SLM-NEXT:    leaq (%rax,%rax,4), %rax # sched: [1:1.00]
1347 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1349 ; SLM-NOOPT-LABEL: test_mul_by_25:
1350 ; SLM-NOOPT:       # %bb.0:
1351 ; SLM-NOOPT-NEXT:    imulq $25, %rdi, %rax # sched: [3:1.00]
1352 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1353   %mul = mul nsw i64 %x, 25
1354   ret i64 %mul
1357 define i64 @test_mul_by_26(i64 %x) {
1358 ; X86-LABEL: test_mul_by_26:
1359 ; X86:       # %bb.0:
1360 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1361 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
1362 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
1363 ; X86-NEXT:    addl %eax, %ecx
1364 ; X86-NEXT:    movl $26, %eax
1365 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1366 ; X86-NEXT:    addl %ecx, %edx
1367 ; X86-NEXT:    retl
1369 ; X64-HSW-LABEL: test_mul_by_26:
1370 ; X64-HSW:       # %bb.0:
1371 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1372 ; X64-HSW-NEXT:    leaq (%rax,%rax,4), %rax # sched: [1:0.50]
1373 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
1374 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1376 ; X64-JAG-LABEL: test_mul_by_26:
1377 ; X64-JAG:       # %bb.0:
1378 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1379 ; X64-JAG-NEXT:    leaq (%rax,%rax,4), %rax # sched: [2:1.00]
1380 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1381 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1383 ; X86-NOOPT-LABEL: test_mul_by_26:
1384 ; X86-NOOPT:       # %bb.0:
1385 ; X86-NOOPT-NEXT:    movl $26, %eax
1386 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1387 ; X86-NOOPT-NEXT:    imull $26, {{[0-9]+}}(%esp), %ecx
1388 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1389 ; X86-NOOPT-NEXT:    retl
1391 ; HSW-NOOPT-LABEL: test_mul_by_26:
1392 ; HSW-NOOPT:       # %bb.0:
1393 ; HSW-NOOPT-NEXT:    imulq $26, %rdi, %rax # sched: [3:1.00]
1394 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1396 ; JAG-NOOPT-LABEL: test_mul_by_26:
1397 ; JAG-NOOPT:       # %bb.0:
1398 ; JAG-NOOPT-NEXT:    imulq $26, %rdi, %rax # sched: [6:4.00]
1399 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1401 ; X64-SLM-LABEL: test_mul_by_26:
1402 ; X64-SLM:       # %bb.0:
1403 ; X64-SLM-NEXT:    imulq $26, %rdi, %rax # sched: [3:1.00]
1404 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1406 ; SLM-NOOPT-LABEL: test_mul_by_26:
1407 ; SLM-NOOPT:       # %bb.0:
1408 ; SLM-NOOPT-NEXT:    imulq $26, %rdi, %rax # sched: [3:1.00]
1409 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1410   %mul = mul nsw i64 %x, 26
1411   ret i64 %mul
1414 define i64 @test_mul_by_27(i64 %x) {
1415 ; X86-LABEL: test_mul_by_27:
1416 ; X86:       # %bb.0:
1417 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1418 ; X86-NEXT:    movl $27, %eax
1419 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1420 ; X86-NEXT:    leal (%ecx,%ecx,8), %ecx
1421 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
1422 ; X86-NEXT:    addl %ecx, %edx
1423 ; X86-NEXT:    retl
1425 ; X64-HSW-LABEL: test_mul_by_27:
1426 ; X64-HSW:       # %bb.0:
1427 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
1428 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
1429 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1431 ; X64-JAG-LABEL: test_mul_by_27:
1432 ; X64-JAG:       # %bb.0:
1433 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
1434 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
1435 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1437 ; X86-NOOPT-LABEL: test_mul_by_27:
1438 ; X86-NOOPT:       # %bb.0:
1439 ; X86-NOOPT-NEXT:    movl $27, %eax
1440 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1441 ; X86-NOOPT-NEXT:    imull $27, {{[0-9]+}}(%esp), %ecx
1442 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1443 ; X86-NOOPT-NEXT:    retl
1445 ; HSW-NOOPT-LABEL: test_mul_by_27:
1446 ; HSW-NOOPT:       # %bb.0:
1447 ; HSW-NOOPT-NEXT:    imulq $27, %rdi, %rax # sched: [3:1.00]
1448 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1450 ; JAG-NOOPT-LABEL: test_mul_by_27:
1451 ; JAG-NOOPT:       # %bb.0:
1452 ; JAG-NOOPT-NEXT:    imulq $27, %rdi, %rax # sched: [6:4.00]
1453 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1455 ; X64-SLM-LABEL: test_mul_by_27:
1456 ; X64-SLM:       # %bb.0:
1457 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
1458 ; X64-SLM-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:1.00]
1459 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1461 ; SLM-NOOPT-LABEL: test_mul_by_27:
1462 ; SLM-NOOPT:       # %bb.0:
1463 ; SLM-NOOPT-NEXT:    imulq $27, %rdi, %rax # sched: [3:1.00]
1464 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1465   %mul = mul nsw i64 %x, 27
1466   ret i64 %mul
1469 define i64 @test_mul_by_28(i64 %x) {
1470 ; X86-LABEL: test_mul_by_28:
1471 ; X86:       # %bb.0:
1472 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1473 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
1474 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
1475 ; X86-NEXT:    addl %eax, %ecx
1476 ; X86-NEXT:    movl $28, %eax
1477 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1478 ; X86-NEXT:    addl %ecx, %edx
1479 ; X86-NEXT:    retl
1481 ; X64-HSW-LABEL: test_mul_by_28:
1482 ; X64-HSW:       # %bb.0:
1483 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
1484 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
1485 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
1486 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1488 ; X64-JAG-LABEL: test_mul_by_28:
1489 ; X64-JAG:       # %bb.0:
1490 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
1491 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
1492 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1493 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1495 ; X86-NOOPT-LABEL: test_mul_by_28:
1496 ; X86-NOOPT:       # %bb.0:
1497 ; X86-NOOPT-NEXT:    movl $28, %eax
1498 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1499 ; X86-NOOPT-NEXT:    imull $28, {{[0-9]+}}(%esp), %ecx
1500 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1501 ; X86-NOOPT-NEXT:    retl
1503 ; HSW-NOOPT-LABEL: test_mul_by_28:
1504 ; HSW-NOOPT:       # %bb.0:
1505 ; HSW-NOOPT-NEXT:    imulq $28, %rdi, %rax # sched: [3:1.00]
1506 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1508 ; JAG-NOOPT-LABEL: test_mul_by_28:
1509 ; JAG-NOOPT:       # %bb.0:
1510 ; JAG-NOOPT-NEXT:    imulq $28, %rdi, %rax # sched: [6:4.00]
1511 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1513 ; X64-SLM-LABEL: test_mul_by_28:
1514 ; X64-SLM:       # %bb.0:
1515 ; X64-SLM-NEXT:    imulq $28, %rdi, %rax # sched: [3:1.00]
1516 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1518 ; SLM-NOOPT-LABEL: test_mul_by_28:
1519 ; SLM-NOOPT:       # %bb.0:
1520 ; SLM-NOOPT-NEXT:    imulq $28, %rdi, %rax # sched: [3:1.00]
1521 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1522   %mul = mul nsw i64 %x, 28
1523   ret i64 %mul
1526 define i64 @test_mul_by_29(i64 %x) {
1527 ; X86-LABEL: test_mul_by_29:
1528 ; X86:       # %bb.0:
1529 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1530 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
1531 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
1532 ; X86-NEXT:    addl %eax, %ecx
1533 ; X86-NEXT:    addl %eax, %ecx
1534 ; X86-NEXT:    movl $29, %eax
1535 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1536 ; X86-NEXT:    addl %ecx, %edx
1537 ; X86-NEXT:    retl
1539 ; X64-HSW-LABEL: test_mul_by_29:
1540 ; X64-HSW:       # %bb.0:
1541 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
1542 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
1543 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
1544 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
1545 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1547 ; X64-JAG-LABEL: test_mul_by_29:
1548 ; X64-JAG:       # %bb.0:
1549 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
1550 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
1551 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1552 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1553 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1555 ; X86-NOOPT-LABEL: test_mul_by_29:
1556 ; X86-NOOPT:       # %bb.0:
1557 ; X86-NOOPT-NEXT:    movl $29, %eax
1558 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1559 ; X86-NOOPT-NEXT:    imull $29, {{[0-9]+}}(%esp), %ecx
1560 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1561 ; X86-NOOPT-NEXT:    retl
1563 ; HSW-NOOPT-LABEL: test_mul_by_29:
1564 ; HSW-NOOPT:       # %bb.0:
1565 ; HSW-NOOPT-NEXT:    imulq $29, %rdi, %rax # sched: [3:1.00]
1566 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1568 ; JAG-NOOPT-LABEL: test_mul_by_29:
1569 ; JAG-NOOPT:       # %bb.0:
1570 ; JAG-NOOPT-NEXT:    imulq $29, %rdi, %rax # sched: [6:4.00]
1571 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1573 ; X64-SLM-LABEL: test_mul_by_29:
1574 ; X64-SLM:       # %bb.0:
1575 ; X64-SLM-NEXT:    imulq $29, %rdi, %rax # sched: [3:1.00]
1576 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1578 ; SLM-NOOPT-LABEL: test_mul_by_29:
1579 ; SLM-NOOPT:       # %bb.0:
1580 ; SLM-NOOPT-NEXT:    imulq $29, %rdi, %rax # sched: [3:1.00]
1581 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1582   %mul = mul nsw i64 %x, 29
1583   ret i64 %mul
1586 define i64 @test_mul_by_30(i64 %x) {
1587 ; X86-LABEL: test_mul_by_30:
1588 ; X86:       # %bb.0:
1589 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1590 ; X86-NEXT:    movl %eax, %ecx
1591 ; X86-NEXT:    shll $5, %ecx
1592 ; X86-NEXT:    subl %eax, %ecx
1593 ; X86-NEXT:    subl %eax, %ecx
1594 ; X86-NEXT:    movl $30, %eax
1595 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1596 ; X86-NEXT:    addl %ecx, %edx
1597 ; X86-NEXT:    retl
1599 ; X64-HSW-LABEL: test_mul_by_30:
1600 ; X64-HSW:       # %bb.0:
1601 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
1602 ; X64-HSW-NEXT:    shlq $5, %rax # sched: [1:0.50]
1603 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
1604 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
1605 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1607 ; X64-JAG-LABEL: test_mul_by_30:
1608 ; X64-JAG:       # %bb.0:
1609 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1610 ; X64-JAG-NEXT:    shlq $5, %rax # sched: [1:0.50]
1611 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1612 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1613 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1615 ; X86-NOOPT-LABEL: test_mul_by_30:
1616 ; X86-NOOPT:       # %bb.0:
1617 ; X86-NOOPT-NEXT:    movl $30, %eax
1618 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1619 ; X86-NOOPT-NEXT:    imull $30, {{[0-9]+}}(%esp), %ecx
1620 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1621 ; X86-NOOPT-NEXT:    retl
1623 ; HSW-NOOPT-LABEL: test_mul_by_30:
1624 ; HSW-NOOPT:       # %bb.0:
1625 ; HSW-NOOPT-NEXT:    imulq $30, %rdi, %rax # sched: [3:1.00]
1626 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1628 ; JAG-NOOPT-LABEL: test_mul_by_30:
1629 ; JAG-NOOPT:       # %bb.0:
1630 ; JAG-NOOPT-NEXT:    imulq $30, %rdi, %rax # sched: [6:4.00]
1631 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1633 ; X64-SLM-LABEL: test_mul_by_30:
1634 ; X64-SLM:       # %bb.0:
1635 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1636 ; X64-SLM-NEXT:    shlq $5, %rax # sched: [1:1.00]
1637 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1638 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1639 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1641 ; SLM-NOOPT-LABEL: test_mul_by_30:
1642 ; SLM-NOOPT:       # %bb.0:
1643 ; SLM-NOOPT-NEXT:    imulq $30, %rdi, %rax # sched: [3:1.00]
1644 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1645   %mul = mul nsw i64 %x, 30
1646   ret i64 %mul
1649 define i64 @test_mul_by_31(i64 %x) {
1650 ; X86-LABEL: test_mul_by_31:
1651 ; X86:       # %bb.0:
1652 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1653 ; X86-NEXT:    movl %eax, %ecx
1654 ; X86-NEXT:    shll $5, %ecx
1655 ; X86-NEXT:    subl %eax, %ecx
1656 ; X86-NEXT:    movl $31, %eax
1657 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1658 ; X86-NEXT:    addl %ecx, %edx
1659 ; X86-NEXT:    retl
1661 ; X64-HSW-LABEL: test_mul_by_31:
1662 ; X64-HSW:       # %bb.0:
1663 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
1664 ; X64-HSW-NEXT:    shlq $5, %rax # sched: [1:0.50]
1665 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
1666 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1668 ; X64-JAG-LABEL: test_mul_by_31:
1669 ; X64-JAG:       # %bb.0:
1670 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1671 ; X64-JAG-NEXT:    shlq $5, %rax # sched: [1:0.50]
1672 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1673 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1675 ; X86-NOOPT-LABEL: test_mul_by_31:
1676 ; X86-NOOPT:       # %bb.0:
1677 ; X86-NOOPT-NEXT:    movl $31, %eax
1678 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1679 ; X86-NOOPT-NEXT:    imull $31, {{[0-9]+}}(%esp), %ecx
1680 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1681 ; X86-NOOPT-NEXT:    retl
1683 ; HSW-NOOPT-LABEL: test_mul_by_31:
1684 ; HSW-NOOPT:       # %bb.0:
1685 ; HSW-NOOPT-NEXT:    imulq $31, %rdi, %rax # sched: [3:1.00]
1686 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1688 ; JAG-NOOPT-LABEL: test_mul_by_31:
1689 ; JAG-NOOPT:       # %bb.0:
1690 ; JAG-NOOPT-NEXT:    imulq $31, %rdi, %rax # sched: [6:4.00]
1691 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1693 ; X64-SLM-LABEL: test_mul_by_31:
1694 ; X64-SLM:       # %bb.0:
1695 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1696 ; X64-SLM-NEXT:    shlq $5, %rax # sched: [1:1.00]
1697 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1698 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1700 ; SLM-NOOPT-LABEL: test_mul_by_31:
1701 ; SLM-NOOPT:       # %bb.0:
1702 ; SLM-NOOPT-NEXT:    imulq $31, %rdi, %rax # sched: [3:1.00]
1703 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1704   %mul = mul nsw i64 %x, 31
1705   ret i64 %mul
1708 define i64 @test_mul_by_32(i64 %x) {
1709 ; X86-LABEL: test_mul_by_32:
1710 ; X86:       # %bb.0:
1711 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1712 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
1713 ; X86-NEXT:    shldl $5, %eax, %edx
1714 ; X86-NEXT:    shll $5, %eax
1715 ; X86-NEXT:    retl
1717 ; X64-HSW-LABEL: test_mul_by_32:
1718 ; X64-HSW:       # %bb.0:
1719 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
1720 ; X64-HSW-NEXT:    shlq $5, %rax # sched: [1:0.50]
1721 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1723 ; X64-JAG-LABEL: test_mul_by_32:
1724 ; X64-JAG:       # %bb.0:
1725 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1726 ; X64-JAG-NEXT:    shlq $5, %rax # sched: [1:0.50]
1727 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1729 ; X86-NOOPT-LABEL: test_mul_by_32:
1730 ; X86-NOOPT:       # %bb.0:
1731 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
1732 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
1733 ; X86-NOOPT-NEXT:    shldl $5, %eax, %edx
1734 ; X86-NOOPT-NEXT:    shll $5, %eax
1735 ; X86-NOOPT-NEXT:    retl
1737 ; HSW-NOOPT-LABEL: test_mul_by_32:
1738 ; HSW-NOOPT:       # %bb.0:
1739 ; HSW-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.25]
1740 ; HSW-NOOPT-NEXT:    shlq $5, %rax # sched: [1:0.50]
1741 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1743 ; JAG-NOOPT-LABEL: test_mul_by_32:
1744 ; JAG-NOOPT:       # %bb.0:
1745 ; JAG-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1746 ; JAG-NOOPT-NEXT:    shlq $5, %rax # sched: [1:0.50]
1747 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1749 ; X64-SLM-LABEL: test_mul_by_32:
1750 ; X64-SLM:       # %bb.0:
1751 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1752 ; X64-SLM-NEXT:    shlq $5, %rax # sched: [1:1.00]
1753 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1755 ; SLM-NOOPT-LABEL: test_mul_by_32:
1756 ; SLM-NOOPT:       # %bb.0:
1757 ; SLM-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1758 ; SLM-NOOPT-NEXT:    shlq $5, %rax # sched: [1:1.00]
1759 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1760   %mul = mul nsw i64 %x, 32
1761   ret i64 %mul
1764 define i64 @test_mul_by_37(i64 %x) {
1765 ; X86-LABEL: test_mul_by_37:
1766 ; X86:       # %bb.0:
1767 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1768 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
1769 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
1770 ; X86-NEXT:    movl $37, %eax
1771 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1772 ; X86-NEXT:    addl %ecx, %edx
1773 ; X86-NEXT:    retl
1775 ; X64-HSW-LABEL: test_mul_by_37:
1776 ; X64-HSW:       # %bb.0:
1777 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
1778 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
1779 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1781 ; X64-JAG-LABEL: test_mul_by_37:
1782 ; X64-JAG:       # %bb.0:
1783 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
1784 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
1785 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1787 ; X86-NOOPT-LABEL: test_mul_by_37:
1788 ; X86-NOOPT:       # %bb.0:
1789 ; X86-NOOPT-NEXT:    movl $37, %eax
1790 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1791 ; X86-NOOPT-NEXT:    imull $37, {{[0-9]+}}(%esp), %ecx
1792 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1793 ; X86-NOOPT-NEXT:    retl
1795 ; HSW-NOOPT-LABEL: test_mul_by_37:
1796 ; HSW-NOOPT:       # %bb.0:
1797 ; HSW-NOOPT-NEXT:    imulq $37, %rdi, %rax # sched: [3:1.00]
1798 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1800 ; JAG-NOOPT-LABEL: test_mul_by_37:
1801 ; JAG-NOOPT:       # %bb.0:
1802 ; JAG-NOOPT-NEXT:    imulq $37, %rdi, %rax # sched: [6:4.00]
1803 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1805 ; X64-SLM-LABEL: test_mul_by_37:
1806 ; X64-SLM:       # %bb.0:
1807 ; X64-SLM-NEXT:    imulq $37, %rdi, %rax # sched: [3:1.00]
1808 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1810 ; SLM-NOOPT-LABEL: test_mul_by_37:
1811 ; SLM-NOOPT:       # %bb.0:
1812 ; SLM-NOOPT-NEXT:    imulq $37, %rdi, %rax # sched: [3:1.00]
1813 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1814   %mul = mul nsw i64 %x, 37
1815   ret i64 %mul
1818 define i64 @test_mul_by_41(i64 %x) {
1819 ; X86-LABEL: test_mul_by_41:
1820 ; X86:       # %bb.0:
1821 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1822 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
1823 ; X86-NEXT:    leal (%eax,%ecx,8), %ecx
1824 ; X86-NEXT:    movl $41, %eax
1825 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1826 ; X86-NEXT:    addl %ecx, %edx
1827 ; X86-NEXT:    retl
1829 ; X64-HSW-LABEL: test_mul_by_41:
1830 ; X64-HSW:       # %bb.0:
1831 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1832 ; X64-HSW-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [1:0.50]
1833 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1835 ; X64-JAG-LABEL: test_mul_by_41:
1836 ; X64-JAG:       # %bb.0:
1837 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1838 ; X64-JAG-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [2:1.00]
1839 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1841 ; X86-NOOPT-LABEL: test_mul_by_41:
1842 ; X86-NOOPT:       # %bb.0:
1843 ; X86-NOOPT-NEXT:    movl $41, %eax
1844 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1845 ; X86-NOOPT-NEXT:    imull $41, {{[0-9]+}}(%esp), %ecx
1846 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1847 ; X86-NOOPT-NEXT:    retl
1849 ; HSW-NOOPT-LABEL: test_mul_by_41:
1850 ; HSW-NOOPT:       # %bb.0:
1851 ; HSW-NOOPT-NEXT:    imulq $41, %rdi, %rax # sched: [3:1.00]
1852 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1854 ; JAG-NOOPT-LABEL: test_mul_by_41:
1855 ; JAG-NOOPT:       # %bb.0:
1856 ; JAG-NOOPT-NEXT:    imulq $41, %rdi, %rax # sched: [6:4.00]
1857 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1859 ; X64-SLM-LABEL: test_mul_by_41:
1860 ; X64-SLM:       # %bb.0:
1861 ; X64-SLM-NEXT:    imulq $41, %rdi, %rax # sched: [3:1.00]
1862 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1864 ; SLM-NOOPT-LABEL: test_mul_by_41:
1865 ; SLM-NOOPT:       # %bb.0:
1866 ; SLM-NOOPT-NEXT:    imulq $41, %rdi, %rax # sched: [3:1.00]
1867 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1868   %mul = mul nsw i64 %x, 41
1869   ret i64 %mul
1872 define i64 @test_mul_by_62(i64 %x) {
1873 ; X86-LABEL: test_mul_by_62:
1874 ; X86:       # %bb.0:
1875 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1876 ; X86-NEXT:    movl %eax, %ecx
1877 ; X86-NEXT:    shll $6, %ecx
1878 ; X86-NEXT:    subl %eax, %ecx
1879 ; X86-NEXT:    subl %eax, %ecx
1880 ; X86-NEXT:    movl $62, %eax
1881 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1882 ; X86-NEXT:    addl %ecx, %edx
1883 ; X86-NEXT:    retl
1885 ; X64-HSW-LABEL: test_mul_by_62:
1886 ; X64-HSW:       # %bb.0:
1887 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
1888 ; X64-HSW-NEXT:    shlq $6, %rax # sched: [1:0.50]
1889 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
1890 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
1891 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1893 ; X64-JAG-LABEL: test_mul_by_62:
1894 ; X64-JAG:       # %bb.0:
1895 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1896 ; X64-JAG-NEXT:    shlq $6, %rax # sched: [1:0.50]
1897 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1898 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1899 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1901 ; X86-NOOPT-LABEL: test_mul_by_62:
1902 ; X86-NOOPT:       # %bb.0:
1903 ; X86-NOOPT-NEXT:    movl $62, %eax
1904 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1905 ; X86-NOOPT-NEXT:    imull $62, {{[0-9]+}}(%esp), %ecx
1906 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1907 ; X86-NOOPT-NEXT:    retl
1909 ; HSW-NOOPT-LABEL: test_mul_by_62:
1910 ; HSW-NOOPT:       # %bb.0:
1911 ; HSW-NOOPT-NEXT:    imulq $62, %rdi, %rax # sched: [3:1.00]
1912 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1914 ; JAG-NOOPT-LABEL: test_mul_by_62:
1915 ; JAG-NOOPT:       # %bb.0:
1916 ; JAG-NOOPT-NEXT:    imulq $62, %rdi, %rax # sched: [6:4.00]
1917 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1919 ; X64-SLM-LABEL: test_mul_by_62:
1920 ; X64-SLM:       # %bb.0:
1921 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1922 ; X64-SLM-NEXT:    shlq $6, %rax # sched: [1:1.00]
1923 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1924 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
1925 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1927 ; SLM-NOOPT-LABEL: test_mul_by_62:
1928 ; SLM-NOOPT:       # %bb.0:
1929 ; SLM-NOOPT-NEXT:    imulq $62, %rdi, %rax # sched: [3:1.00]
1930 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1931   %mul = mul nsw i64 %x, 62
1932   ret i64 %mul
1935 define i64 @test_mul_by_66(i64 %x) {
1936 ; X86-LABEL: test_mul_by_66:
1937 ; X86:       # %bb.0:
1938 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1939 ; X86-NEXT:    movl %eax, %ecx
1940 ; X86-NEXT:    shll $6, %ecx
1941 ; X86-NEXT:    leal (%ecx,%eax,2), %ecx
1942 ; X86-NEXT:    movl $66, %eax
1943 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
1944 ; X86-NEXT:    addl %ecx, %edx
1945 ; X86-NEXT:    retl
1947 ; X64-HSW-LABEL: test_mul_by_66:
1948 ; X64-HSW:       # %bb.0:
1949 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
1950 ; X64-HSW-NEXT:    shlq $6, %rax # sched: [1:0.50]
1951 ; X64-HSW-NEXT:    leaq (%rax,%rdi,2), %rax # sched: [1:0.50]
1952 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
1954 ; X64-JAG-LABEL: test_mul_by_66:
1955 ; X64-JAG:       # %bb.0:
1956 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1957 ; X64-JAG-NEXT:    shlq $6, %rax # sched: [1:0.50]
1958 ; X64-JAG-NEXT:    leaq (%rax,%rdi,2), %rax # sched: [2:1.00]
1959 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
1961 ; X86-NOOPT-LABEL: test_mul_by_66:
1962 ; X86-NOOPT:       # %bb.0:
1963 ; X86-NOOPT-NEXT:    movl $66, %eax
1964 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
1965 ; X86-NOOPT-NEXT:    imull $66, {{[0-9]+}}(%esp), %ecx
1966 ; X86-NOOPT-NEXT:    addl %ecx, %edx
1967 ; X86-NOOPT-NEXT:    retl
1969 ; HSW-NOOPT-LABEL: test_mul_by_66:
1970 ; HSW-NOOPT:       # %bb.0:
1971 ; HSW-NOOPT-NEXT:    imulq $66, %rdi, %rax # sched: [3:1.00]
1972 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
1974 ; JAG-NOOPT-LABEL: test_mul_by_66:
1975 ; JAG-NOOPT:       # %bb.0:
1976 ; JAG-NOOPT-NEXT:    imulq $66, %rdi, %rax # sched: [6:4.00]
1977 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
1979 ; X64-SLM-LABEL: test_mul_by_66:
1980 ; X64-SLM:       # %bb.0:
1981 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
1982 ; X64-SLM-NEXT:    shlq $6, %rax # sched: [1:1.00]
1983 ; X64-SLM-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1984 ; X64-SLM-NEXT:    addq %rdi, %rax # sched: [1:0.50]
1985 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
1987 ; SLM-NOOPT-LABEL: test_mul_by_66:
1988 ; SLM-NOOPT:       # %bb.0:
1989 ; SLM-NOOPT-NEXT:    imulq $66, %rdi, %rax # sched: [3:1.00]
1990 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
1991   %mul = mul nsw i64 %x, 66
1992   ret i64 %mul
1995 define i64 @test_mul_by_73(i64 %x) {
1996 ; X86-LABEL: test_mul_by_73:
1997 ; X86:       # %bb.0:
1998 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1999 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
2000 ; X86-NEXT:    leal (%eax,%ecx,8), %ecx
2001 ; X86-NEXT:    movl $73, %eax
2002 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
2003 ; X86-NEXT:    addl %ecx, %edx
2004 ; X86-NEXT:    retl
2006 ; X64-HSW-LABEL: test_mul_by_73:
2007 ; X64-HSW:       # %bb.0:
2008 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
2009 ; X64-HSW-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [1:0.50]
2010 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
2012 ; X64-JAG-LABEL: test_mul_by_73:
2013 ; X64-JAG:       # %bb.0:
2014 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
2015 ; X64-JAG-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [2:1.00]
2016 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
2018 ; X86-NOOPT-LABEL: test_mul_by_73:
2019 ; X86-NOOPT:       # %bb.0:
2020 ; X86-NOOPT-NEXT:    movl $73, %eax
2021 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
2022 ; X86-NOOPT-NEXT:    imull $73, {{[0-9]+}}(%esp), %ecx
2023 ; X86-NOOPT-NEXT:    addl %ecx, %edx
2024 ; X86-NOOPT-NEXT:    retl
2026 ; HSW-NOOPT-LABEL: test_mul_by_73:
2027 ; HSW-NOOPT:       # %bb.0:
2028 ; HSW-NOOPT-NEXT:    imulq $73, %rdi, %rax # sched: [3:1.00]
2029 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
2031 ; JAG-NOOPT-LABEL: test_mul_by_73:
2032 ; JAG-NOOPT:       # %bb.0:
2033 ; JAG-NOOPT-NEXT:    imulq $73, %rdi, %rax # sched: [6:4.00]
2034 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
2036 ; X64-SLM-LABEL: test_mul_by_73:
2037 ; X64-SLM:       # %bb.0:
2038 ; X64-SLM-NEXT:    imulq $73, %rdi, %rax # sched: [3:1.00]
2039 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
2041 ; SLM-NOOPT-LABEL: test_mul_by_73:
2042 ; SLM-NOOPT:       # %bb.0:
2043 ; SLM-NOOPT-NEXT:    imulq $73, %rdi, %rax # sched: [3:1.00]
2044 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
2045   %mul = mul nsw i64 %x, 73
2046   ret i64 %mul
2049 define i64 @test_mul_by_520(i64 %x) {
2050 ; X86-LABEL: test_mul_by_520:
2051 ; X86:       # %bb.0:
2052 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2053 ; X86-NEXT:    movl %eax, %ecx
2054 ; X86-NEXT:    shll $9, %ecx
2055 ; X86-NEXT:    leal (%ecx,%eax,8), %ecx
2056 ; X86-NEXT:    movl $520, %eax # imm = 0x208
2057 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
2058 ; X86-NEXT:    addl %ecx, %edx
2059 ; X86-NEXT:    retl
2061 ; X64-HSW-LABEL: test_mul_by_520:
2062 ; X64-HSW:       # %bb.0:
2063 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
2064 ; X64-HSW-NEXT:    shlq $9, %rax # sched: [1:0.50]
2065 ; X64-HSW-NEXT:    leaq (%rax,%rdi,8), %rax # sched: [1:0.50]
2066 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
2068 ; X64-JAG-LABEL: test_mul_by_520:
2069 ; X64-JAG:       # %bb.0:
2070 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
2071 ; X64-JAG-NEXT:    shlq $9, %rax # sched: [1:0.50]
2072 ; X64-JAG-NEXT:    leaq (%rax,%rdi,8), %rax # sched: [2:1.00]
2073 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
2075 ; X86-NOOPT-LABEL: test_mul_by_520:
2076 ; X86-NOOPT:       # %bb.0:
2077 ; X86-NOOPT-NEXT:    movl $520, %eax # imm = 0x208
2078 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
2079 ; X86-NOOPT-NEXT:    imull $520, {{[0-9]+}}(%esp), %ecx # imm = 0x208
2080 ; X86-NOOPT-NEXT:    addl %ecx, %edx
2081 ; X86-NOOPT-NEXT:    retl
2083 ; HSW-NOOPT-LABEL: test_mul_by_520:
2084 ; HSW-NOOPT:       # %bb.0:
2085 ; HSW-NOOPT-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
2086 ; HSW-NOOPT-NEXT:    # sched: [3:1.00]
2087 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
2089 ; JAG-NOOPT-LABEL: test_mul_by_520:
2090 ; JAG-NOOPT:       # %bb.0:
2091 ; JAG-NOOPT-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
2092 ; JAG-NOOPT-NEXT:    # sched: [6:4.00]
2093 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
2095 ; X64-SLM-LABEL: test_mul_by_520:
2096 ; X64-SLM:       # %bb.0:
2097 ; X64-SLM-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
2098 ; X64-SLM-NEXT:    # sched: [3:1.00]
2099 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
2101 ; SLM-NOOPT-LABEL: test_mul_by_520:
2102 ; SLM-NOOPT:       # %bb.0:
2103 ; SLM-NOOPT-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
2104 ; SLM-NOOPT-NEXT:    # sched: [3:1.00]
2105 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
2106   %mul = mul nsw i64 %x, 520
2107   ret i64 %mul
2110 define i64 @test_mul_by_neg10(i64 %x) {
2111 ; X86-LABEL: test_mul_by_neg10:
2112 ; X86:       # %bb.0:
2113 ; X86-NEXT:    pushl %esi
2114 ; X86-NEXT:    .cfi_def_cfa_offset 8
2115 ; X86-NEXT:    .cfi_offset %esi, -8
2116 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2117 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
2118 ; X86-NEXT:    movl $-10, %edx
2119 ; X86-NEXT:    movl %ecx, %eax
2120 ; X86-NEXT:    mull %edx
2121 ; X86-NEXT:    subl %ecx, %edx
2122 ; X86-NEXT:    addl %esi, %esi
2123 ; X86-NEXT:    leal (%esi,%esi,4), %ecx
2124 ; X86-NEXT:    subl %ecx, %edx
2125 ; X86-NEXT:    popl %esi
2126 ; X86-NEXT:    .cfi_def_cfa_offset 4
2127 ; X86-NEXT:    retl
2129 ; X64-HSW-LABEL: test_mul_by_neg10:
2130 ; X64-HSW:       # %bb.0:
2131 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
2132 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
2133 ; X64-HSW-NEXT:    negq %rax # sched: [1:0.25]
2134 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
2136 ; X64-JAG-LABEL: test_mul_by_neg10:
2137 ; X64-JAG:       # %bb.0:
2138 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
2139 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
2140 ; X64-JAG-NEXT:    negq %rax # sched: [1:0.50]
2141 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
2143 ; X86-NOOPT-LABEL: test_mul_by_neg10:
2144 ; X86-NOOPT:       # %bb.0:
2145 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2146 ; X86-NOOPT-NEXT:    movl $-10, %edx
2147 ; X86-NOOPT-NEXT:    movl %ecx, %eax
2148 ; X86-NOOPT-NEXT:    mull %edx
2149 ; X86-NOOPT-NEXT:    subl %ecx, %edx
2150 ; X86-NOOPT-NEXT:    imull $-10, {{[0-9]+}}(%esp), %ecx
2151 ; X86-NOOPT-NEXT:    addl %ecx, %edx
2152 ; X86-NOOPT-NEXT:    retl
2154 ; HSW-NOOPT-LABEL: test_mul_by_neg10:
2155 ; HSW-NOOPT:       # %bb.0:
2156 ; HSW-NOOPT-NEXT:    imulq $-10, %rdi, %rax # sched: [3:1.00]
2157 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
2159 ; JAG-NOOPT-LABEL: test_mul_by_neg10:
2160 ; JAG-NOOPT:       # %bb.0:
2161 ; JAG-NOOPT-NEXT:    imulq $-10, %rdi, %rax # sched: [6:4.00]
2162 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
2164 ; X64-SLM-LABEL: test_mul_by_neg10:
2165 ; X64-SLM:       # %bb.0:
2166 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
2167 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
2168 ; X64-SLM-NEXT:    negq %rax # sched: [1:0.50]
2169 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
2171 ; SLM-NOOPT-LABEL: test_mul_by_neg10:
2172 ; SLM-NOOPT:       # %bb.0:
2173 ; SLM-NOOPT-NEXT:    imulq $-10, %rdi, %rax # sched: [3:1.00]
2174 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
2175   %mul = mul nsw i64 %x, -10
2176   ret i64 %mul
2179 define i64 @test_mul_by_neg36(i64 %x) {
2180 ; X86-LABEL: test_mul_by_neg36:
2181 ; X86:       # %bb.0:
2182 ; X86-NEXT:    pushl %esi
2183 ; X86-NEXT:    .cfi_def_cfa_offset 8
2184 ; X86-NEXT:    .cfi_offset %esi, -8
2185 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2186 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
2187 ; X86-NEXT:    movl $-36, %edx
2188 ; X86-NEXT:    movl %ecx, %eax
2189 ; X86-NEXT:    mull %edx
2190 ; X86-NEXT:    subl %ecx, %edx
2191 ; X86-NEXT:    shll $2, %esi
2192 ; X86-NEXT:    leal (%esi,%esi,8), %ecx
2193 ; X86-NEXT:    subl %ecx, %edx
2194 ; X86-NEXT:    popl %esi
2195 ; X86-NEXT:    .cfi_def_cfa_offset 4
2196 ; X86-NEXT:    retl
2198 ; X64-HSW-LABEL: test_mul_by_neg36:
2199 ; X64-HSW:       # %bb.0:
2200 ; X64-HSW-NEXT:    shlq $2, %rdi # sched: [1:0.50]
2201 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
2202 ; X64-HSW-NEXT:    negq %rax # sched: [1:0.25]
2203 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
2205 ; X64-JAG-LABEL: test_mul_by_neg36:
2206 ; X64-JAG:       # %bb.0:
2207 ; X64-JAG-NEXT:    shlq $2, %rdi # sched: [1:0.50]
2208 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
2209 ; X64-JAG-NEXT:    negq %rax # sched: [1:0.50]
2210 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
2212 ; X86-NOOPT-LABEL: test_mul_by_neg36:
2213 ; X86-NOOPT:       # %bb.0:
2214 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2215 ; X86-NOOPT-NEXT:    movl $-36, %edx
2216 ; X86-NOOPT-NEXT:    movl %ecx, %eax
2217 ; X86-NOOPT-NEXT:    mull %edx
2218 ; X86-NOOPT-NEXT:    subl %ecx, %edx
2219 ; X86-NOOPT-NEXT:    imull $-36, {{[0-9]+}}(%esp), %ecx
2220 ; X86-NOOPT-NEXT:    addl %ecx, %edx
2221 ; X86-NOOPT-NEXT:    retl
2223 ; HSW-NOOPT-LABEL: test_mul_by_neg36:
2224 ; HSW-NOOPT:       # %bb.0:
2225 ; HSW-NOOPT-NEXT:    imulq $-36, %rdi, %rax # sched: [3:1.00]
2226 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
2228 ; JAG-NOOPT-LABEL: test_mul_by_neg36:
2229 ; JAG-NOOPT:       # %bb.0:
2230 ; JAG-NOOPT-NEXT:    imulq $-36, %rdi, %rax # sched: [6:4.00]
2231 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
2233 ; X64-SLM-LABEL: test_mul_by_neg36:
2234 ; X64-SLM:       # %bb.0:
2235 ; X64-SLM-NEXT:    shlq $2, %rdi # sched: [1:1.00]
2236 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
2237 ; X64-SLM-NEXT:    negq %rax # sched: [1:0.50]
2238 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
2240 ; SLM-NOOPT-LABEL: test_mul_by_neg36:
2241 ; SLM-NOOPT:       # %bb.0:
2242 ; SLM-NOOPT-NEXT:    imulq $-36, %rdi, %rax # sched: [3:1.00]
2243 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
2244   %mul = mul nsw i64 %x, -36
2245   ret i64 %mul
2248 ; (x*9+42)*(x*5+2)
2249 define i64 @test_mul_spec(i64 %x) nounwind {
2250 ; X86-LABEL: test_mul_spec:
2251 ; X86:       # %bb.0:
2252 ; X86-NEXT:    pushl %ebx
2253 ; X86-NEXT:    pushl %edi
2254 ; X86-NEXT:    pushl %esi
2255 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2256 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
2257 ; X86-NEXT:    movl $9, %edx
2258 ; X86-NEXT:    movl %ecx, %eax
2259 ; X86-NEXT:    mull %edx
2260 ; X86-NEXT:    movl %eax, %esi
2261 ; X86-NEXT:    leal (%edi,%edi,8), %ebx
2262 ; X86-NEXT:    addl $42, %esi
2263 ; X86-NEXT:    adcl %edx, %ebx
2264 ; X86-NEXT:    movl $5, %edx
2265 ; X86-NEXT:    movl %ecx, %eax
2266 ; X86-NEXT:    mull %edx
2267 ; X86-NEXT:    movl %eax, %ecx
2268 ; X86-NEXT:    leal (%edi,%edi,4), %edi
2269 ; X86-NEXT:    addl $2, %ecx
2270 ; X86-NEXT:    adcl %edx, %edi
2271 ; X86-NEXT:    movl %esi, %eax
2272 ; X86-NEXT:    mull %ecx
2273 ; X86-NEXT:    imull %esi, %edi
2274 ; X86-NEXT:    addl %edi, %edx
2275 ; X86-NEXT:    imull %ebx, %ecx
2276 ; X86-NEXT:    addl %ecx, %edx
2277 ; X86-NEXT:    popl %esi
2278 ; X86-NEXT:    popl %edi
2279 ; X86-NEXT:    popl %ebx
2280 ; X86-NEXT:    retl
2282 ; X64-HSW-LABEL: test_mul_spec:
2283 ; X64-HSW:       # %bb.0:
2284 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rcx # sched: [1:0.50]
2285 ; X64-HSW-NEXT:    addq $42, %rcx # sched: [1:0.25]
2286 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
2287 ; X64-HSW-NEXT:    addq $2, %rax # sched: [1:0.25]
2288 ; X64-HSW-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
2289 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
2291 ; X64-JAG-LABEL: test_mul_spec:
2292 ; X64-JAG:       # %bb.0:
2293 ; X64-JAG-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [2:1.00]
2294 ; X64-JAG-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [2:1.00]
2295 ; X64-JAG-NEXT:    imulq %rcx, %rax # sched: [6:4.00]
2296 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
2298 ; X86-NOOPT-LABEL: test_mul_spec:
2299 ; X86-NOOPT:       # %bb.0:
2300 ; X86-NOOPT-NEXT:    pushl %ebx
2301 ; X86-NOOPT-NEXT:    pushl %edi
2302 ; X86-NOOPT-NEXT:    pushl %esi
2303 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2304 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edi
2305 ; X86-NOOPT-NEXT:    movl $9, %edx
2306 ; X86-NOOPT-NEXT:    movl %ecx, %eax
2307 ; X86-NOOPT-NEXT:    mull %edx
2308 ; X86-NOOPT-NEXT:    movl %eax, %esi
2309 ; X86-NOOPT-NEXT:    leal (%edi,%edi,8), %ebx
2310 ; X86-NOOPT-NEXT:    addl $42, %esi
2311 ; X86-NOOPT-NEXT:    adcl %edx, %ebx
2312 ; X86-NOOPT-NEXT:    movl $5, %edx
2313 ; X86-NOOPT-NEXT:    movl %ecx, %eax
2314 ; X86-NOOPT-NEXT:    mull %edx
2315 ; X86-NOOPT-NEXT:    movl %eax, %ecx
2316 ; X86-NOOPT-NEXT:    leal (%edi,%edi,4), %edi
2317 ; X86-NOOPT-NEXT:    addl $2, %ecx
2318 ; X86-NOOPT-NEXT:    adcl %edx, %edi
2319 ; X86-NOOPT-NEXT:    movl %esi, %eax
2320 ; X86-NOOPT-NEXT:    mull %ecx
2321 ; X86-NOOPT-NEXT:    imull %esi, %edi
2322 ; X86-NOOPT-NEXT:    addl %edi, %edx
2323 ; X86-NOOPT-NEXT:    imull %ebx, %ecx
2324 ; X86-NOOPT-NEXT:    addl %ecx, %edx
2325 ; X86-NOOPT-NEXT:    popl %esi
2326 ; X86-NOOPT-NEXT:    popl %edi
2327 ; X86-NOOPT-NEXT:    popl %ebx
2328 ; X86-NOOPT-NEXT:    retl
2330 ; HSW-NOOPT-LABEL: test_mul_spec:
2331 ; HSW-NOOPT:       # %bb.0:
2332 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rcx # sched: [1:0.50]
2333 ; HSW-NOOPT-NEXT:    addq $42, %rcx # sched: [1:0.25]
2334 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
2335 ; HSW-NOOPT-NEXT:    addq $2, %rax # sched: [1:0.25]
2336 ; HSW-NOOPT-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
2337 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
2339 ; JAG-NOOPT-LABEL: test_mul_spec:
2340 ; JAG-NOOPT:       # %bb.0:
2341 ; JAG-NOOPT-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [2:1.00]
2342 ; JAG-NOOPT-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [2:1.00]
2343 ; JAG-NOOPT-NEXT:    imulq %rcx, %rax # sched: [6:4.00]
2344 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
2346 ; X64-SLM-LABEL: test_mul_spec:
2347 ; X64-SLM:       # %bb.0:
2348 ; X64-SLM-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [1:1.00]
2349 ; X64-SLM-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [1:1.00]
2350 ; X64-SLM-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
2351 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
2353 ; SLM-NOOPT-LABEL: test_mul_spec:
2354 ; SLM-NOOPT:       # %bb.0:
2355 ; SLM-NOOPT-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [1:1.00]
2356 ; SLM-NOOPT-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [1:1.00]
2357 ; SLM-NOOPT-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
2358 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
2359   %mul = mul nsw i64 %x, 9
2360   %add = add nsw i64 %mul, 42
2361   %mul2 = mul nsw i64 %x, 5
2362   %add2 = add nsw i64 %mul2, 2
2363   %mul3 = mul nsw i64 %add, %add2
2364   ret i64 %mul3