xref: /llvm-project/llvm/test/CodeGen/X86/mul-constant-i32.ll (revision 4196ca3278f78c6e19246e54ab0ecb364e37d66a)
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 -mcpu=haswell                                  | FileCheck %s --check-prefixes=X64,X64-HSW
4; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=btver2                                   | FileCheck %s --check-prefixes=X64,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 -mcpu=haswell | FileCheck %s --check-prefixes=X64-NOOPT,HSW-NOOPT
7; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -mcpu=btver2  | FileCheck %s --check-prefixes=X64-NOOPT,JAG-NOOPT
8; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=slm                                      | FileCheck %s --check-prefixes=X64,X64-SLM
9; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -mcpu=slm     | FileCheck %s --check-prefixes=X64-NOOPT,SLM-NOOPT
10
11define i32 @test_mul_by_1(i32 %x) {
12; X86-LABEL: test_mul_by_1:
13; X86:       # %bb.0:
14; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
15; X86-NEXT:    retl
16;
17; X64-LABEL: test_mul_by_1:
18; X64:       # %bb.0:
19; X64-NEXT:    movl %edi, %eax
20; X64-NEXT:    retq
21;
22; X86-NOOPT-LABEL: test_mul_by_1:
23; X86-NOOPT:       # %bb.0:
24; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
25; X86-NOOPT-NEXT:    retl
26;
27; X64-NOOPT-LABEL: test_mul_by_1:
28; X64-NOOPT:       # %bb.0:
29; X64-NOOPT-NEXT:    movl %edi, %eax
30; X64-NOOPT-NEXT:    retq
31  %mul = mul nsw i32 %x, 1
32  ret i32 %mul
33}
34
35define i32 @test_mul_by_2(i32 %x) {
36; X86-LABEL: test_mul_by_2:
37; X86:       # %bb.0:
38; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
39; X86-NEXT:    addl %eax, %eax
40; X86-NEXT:    retl
41;
42; X64-LABEL: test_mul_by_2:
43; X64:       # %bb.0:
44; X64-NEXT:    # kill: def $edi killed $edi def $rdi
45; X64-NEXT:    leal (%rdi,%rdi), %eax
46; X64-NEXT:    retq
47;
48; X86-NOOPT-LABEL: test_mul_by_2:
49; X86-NOOPT:       # %bb.0:
50; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
51; X86-NOOPT-NEXT:    addl %eax, %eax
52; X86-NOOPT-NEXT:    retl
53;
54; X64-NOOPT-LABEL: test_mul_by_2:
55; X64-NOOPT:       # %bb.0:
56; X64-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
57; X64-NOOPT-NEXT:    leal (%rdi,%rdi), %eax
58; X64-NOOPT-NEXT:    retq
59  %mul = mul nsw i32 %x, 2
60  ret i32 %mul
61}
62
63define i32 @test_mul_by_3(i32 %x) {
64; X86-LABEL: test_mul_by_3:
65; X86:       # %bb.0:
66; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
67; X86-NEXT:    leal (%eax,%eax,2), %eax
68; X86-NEXT:    retl
69;
70; X64-LABEL: test_mul_by_3:
71; X64:       # %bb.0:
72; X64-NEXT:    # kill: def $edi killed $edi def $rdi
73; X64-NEXT:    leal (%rdi,%rdi,2), %eax
74; X64-NEXT:    retq
75;
76; X86-NOOPT-LABEL: test_mul_by_3:
77; X86-NOOPT:       # %bb.0:
78; X86-NOOPT-NEXT:    imull $3, {{[0-9]+}}(%esp), %eax
79; X86-NOOPT-NEXT:    retl
80;
81; X64-NOOPT-LABEL: test_mul_by_3:
82; X64-NOOPT:       # %bb.0:
83; X64-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
84; X64-NOOPT-NEXT:    leal (%rdi,%rdi,2), %eax
85; X64-NOOPT-NEXT:    retq
86  %mul = mul nsw i32 %x, 3
87  ret i32 %mul
88}
89
90define i32 @test_mul_by_4(i32 %x) {
91; X86-LABEL: test_mul_by_4:
92; X86:       # %bb.0:
93; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
94; X86-NEXT:    shll $2, %eax
95; X86-NEXT:    retl
96;
97; X64-LABEL: test_mul_by_4:
98; X64:       # %bb.0:
99; X64-NEXT:    # kill: def $edi killed $edi def $rdi
100; X64-NEXT:    leal (,%rdi,4), %eax
101; X64-NEXT:    retq
102;
103; X86-NOOPT-LABEL: test_mul_by_4:
104; X86-NOOPT:       # %bb.0:
105; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
106; X86-NOOPT-NEXT:    shll $2, %eax
107; X86-NOOPT-NEXT:    retl
108;
109; X64-NOOPT-LABEL: test_mul_by_4:
110; X64-NOOPT:       # %bb.0:
111; X64-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
112; X64-NOOPT-NEXT:    leal (,%rdi,4), %eax
113; X64-NOOPT-NEXT:    retq
114  %mul = mul nsw i32 %x, 4
115  ret i32 %mul
116}
117
118define i32 @test_mul_by_5(i32 %x) {
119; X86-LABEL: test_mul_by_5:
120; X86:       # %bb.0:
121; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
122; X86-NEXT:    leal (%eax,%eax,4), %eax
123; X86-NEXT:    retl
124;
125; X64-LABEL: test_mul_by_5:
126; X64:       # %bb.0:
127; X64-NEXT:    # kill: def $edi killed $edi def $rdi
128; X64-NEXT:    leal (%rdi,%rdi,4), %eax
129; X64-NEXT:    retq
130;
131; X86-NOOPT-LABEL: test_mul_by_5:
132; X86-NOOPT:       # %bb.0:
133; X86-NOOPT-NEXT:    imull $5, {{[0-9]+}}(%esp), %eax
134; X86-NOOPT-NEXT:    retl
135;
136; X64-NOOPT-LABEL: test_mul_by_5:
137; X64-NOOPT:       # %bb.0:
138; X64-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
139; X64-NOOPT-NEXT:    leal (%rdi,%rdi,4), %eax
140; X64-NOOPT-NEXT:    retq
141  %mul = mul nsw i32 %x, 5
142  ret i32 %mul
143}
144
145define i32 @test_mul_by_6(i32 %x) {
146; X86-LABEL: test_mul_by_6:
147; X86:       # %bb.0:
148; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
149; X86-NEXT:    addl %eax, %eax
150; X86-NEXT:    leal (%eax,%eax,2), %eax
151; X86-NEXT:    retl
152;
153; X64-LABEL: test_mul_by_6:
154; X64:       # %bb.0:
155; X64-NEXT:    # kill: def $edi killed $edi def $rdi
156; X64-NEXT:    addl %edi, %edi
157; X64-NEXT:    leal (%rdi,%rdi,2), %eax
158; X64-NEXT:    retq
159;
160; X86-NOOPT-LABEL: test_mul_by_6:
161; X86-NOOPT:       # %bb.0:
162; X86-NOOPT-NEXT:    imull $6, {{[0-9]+}}(%esp), %eax
163; X86-NOOPT-NEXT:    retl
164;
165; X64-NOOPT-LABEL: test_mul_by_6:
166; X64-NOOPT:       # %bb.0:
167; X64-NOOPT-NEXT:    imull $6, %edi, %eax
168; X64-NOOPT-NEXT:    retq
169  %mul = mul nsw i32 %x, 6
170  ret i32 %mul
171}
172
173define i32 @test_mul_by_7(i32 %x) {
174; X86-LABEL: test_mul_by_7:
175; X86:       # %bb.0:
176; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
177; X86-NEXT:    leal (,%ecx,8), %eax
178; X86-NEXT:    subl %ecx, %eax
179; X86-NEXT:    retl
180;
181; X64-LABEL: test_mul_by_7:
182; X64:       # %bb.0:
183; X64-NEXT:    # kill: def $edi killed $edi def $rdi
184; X64-NEXT:    leal (,%rdi,8), %eax
185; X64-NEXT:    subl %edi, %eax
186; X64-NEXT:    retq
187;
188; X86-NOOPT-LABEL: test_mul_by_7:
189; X86-NOOPT:       # %bb.0:
190; X86-NOOPT-NEXT:    imull $7, {{[0-9]+}}(%esp), %eax
191; X86-NOOPT-NEXT:    retl
192;
193; X64-NOOPT-LABEL: test_mul_by_7:
194; X64-NOOPT:       # %bb.0:
195; X64-NOOPT-NEXT:    imull $7, %edi, %eax
196; X64-NOOPT-NEXT:    retq
197  %mul = mul nsw i32 %x, 7
198  ret i32 %mul
199}
200
201define i32 @test_mul_by_8(i32 %x) {
202; X86-LABEL: test_mul_by_8:
203; X86:       # %bb.0:
204; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
205; X86-NEXT:    shll $3, %eax
206; X86-NEXT:    retl
207;
208; X64-LABEL: test_mul_by_8:
209; X64:       # %bb.0:
210; X64-NEXT:    # kill: def $edi killed $edi def $rdi
211; X64-NEXT:    leal (,%rdi,8), %eax
212; X64-NEXT:    retq
213;
214; X86-NOOPT-LABEL: test_mul_by_8:
215; X86-NOOPT:       # %bb.0:
216; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
217; X86-NOOPT-NEXT:    shll $3, %eax
218; X86-NOOPT-NEXT:    retl
219;
220; X64-NOOPT-LABEL: test_mul_by_8:
221; X64-NOOPT:       # %bb.0:
222; X64-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
223; X64-NOOPT-NEXT:    leal (,%rdi,8), %eax
224; X64-NOOPT-NEXT:    retq
225  %mul = mul nsw i32 %x, 8
226  ret i32 %mul
227}
228
229define i32 @test_mul_by_9(i32 %x) {
230; X86-LABEL: test_mul_by_9:
231; X86:       # %bb.0:
232; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
233; X86-NEXT:    leal (%eax,%eax,8), %eax
234; X86-NEXT:    retl
235;
236; X64-LABEL: test_mul_by_9:
237; X64:       # %bb.0:
238; X64-NEXT:    # kill: def $edi killed $edi def $rdi
239; X64-NEXT:    leal (%rdi,%rdi,8), %eax
240; X64-NEXT:    retq
241;
242; X86-NOOPT-LABEL: test_mul_by_9:
243; X86-NOOPT:       # %bb.0:
244; X86-NOOPT-NEXT:    imull $9, {{[0-9]+}}(%esp), %eax
245; X86-NOOPT-NEXT:    retl
246;
247; X64-NOOPT-LABEL: test_mul_by_9:
248; X64-NOOPT:       # %bb.0:
249; X64-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
250; X64-NOOPT-NEXT:    leal (%rdi,%rdi,8), %eax
251; X64-NOOPT-NEXT:    retq
252  %mul = mul nsw i32 %x, 9
253  ret i32 %mul
254}
255
256define i32 @test_mul_by_10(i32 %x) {
257; X86-LABEL: test_mul_by_10:
258; X86:       # %bb.0:
259; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
260; X86-NEXT:    addl %eax, %eax
261; X86-NEXT:    leal (%eax,%eax,4), %eax
262; X86-NEXT:    retl
263;
264; X64-LABEL: test_mul_by_10:
265; X64:       # %bb.0:
266; X64-NEXT:    # kill: def $edi killed $edi def $rdi
267; X64-NEXT:    addl %edi, %edi
268; X64-NEXT:    leal (%rdi,%rdi,4), %eax
269; X64-NEXT:    retq
270;
271; X86-NOOPT-LABEL: test_mul_by_10:
272; X86-NOOPT:       # %bb.0:
273; X86-NOOPT-NEXT:    imull $10, {{[0-9]+}}(%esp), %eax
274; X86-NOOPT-NEXT:    retl
275;
276; X64-NOOPT-LABEL: test_mul_by_10:
277; X64-NOOPT:       # %bb.0:
278; X64-NOOPT-NEXT:    imull $10, %edi, %eax
279; X64-NOOPT-NEXT:    retq
280  %mul = mul nsw i32 %x, 10
281  ret i32 %mul
282}
283
284define i32 @test_mul_by_11(i32 %x) {
285; X86-LABEL: test_mul_by_11:
286; X86:       # %bb.0:
287; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
288; X86-NEXT:    leal (%eax,%eax,4), %ecx
289; X86-NEXT:    leal (%eax,%ecx,2), %eax
290; X86-NEXT:    retl
291;
292; X64-HSW-LABEL: test_mul_by_11:
293; X64-HSW:       # %bb.0:
294; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
295; X64-HSW-NEXT:    leal (%rdi,%rdi,4), %eax
296; X64-HSW-NEXT:    leal (%rdi,%rax,2), %eax
297; X64-HSW-NEXT:    retq
298;
299; X64-JAG-LABEL: test_mul_by_11:
300; X64-JAG:       # %bb.0:
301; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
302; X64-JAG-NEXT:    leal (%rdi,%rdi,4), %eax
303; X64-JAG-NEXT:    leal (%rdi,%rax,2), %eax
304; X64-JAG-NEXT:    retq
305;
306; X86-NOOPT-LABEL: test_mul_by_11:
307; X86-NOOPT:       # %bb.0:
308; X86-NOOPT-NEXT:    imull $11, {{[0-9]+}}(%esp), %eax
309; X86-NOOPT-NEXT:    retl
310;
311; X64-NOOPT-LABEL: test_mul_by_11:
312; X64-NOOPT:       # %bb.0:
313; X64-NOOPT-NEXT:    imull $11, %edi, %eax
314; X64-NOOPT-NEXT:    retq
315;
316; X64-SLM-LABEL: test_mul_by_11:
317; X64-SLM:       # %bb.0:
318; X64-SLM-NEXT:    imull $11, %edi, %eax
319; X64-SLM-NEXT:    retq
320  %mul = mul nsw i32 %x, 11
321  ret i32 %mul
322}
323
324define i32 @test_mul_by_12(i32 %x) {
325; X86-LABEL: test_mul_by_12:
326; X86:       # %bb.0:
327; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
328; X86-NEXT:    shll $2, %eax
329; X86-NEXT:    leal (%eax,%eax,2), %eax
330; X86-NEXT:    retl
331;
332; X64-LABEL: test_mul_by_12:
333; X64:       # %bb.0:
334; X64-NEXT:    # kill: def $edi killed $edi def $rdi
335; X64-NEXT:    shll $2, %edi
336; X64-NEXT:    leal (%rdi,%rdi,2), %eax
337; X64-NEXT:    retq
338;
339; X86-NOOPT-LABEL: test_mul_by_12:
340; X86-NOOPT:       # %bb.0:
341; X86-NOOPT-NEXT:    imull $12, {{[0-9]+}}(%esp), %eax
342; X86-NOOPT-NEXT:    retl
343;
344; X64-NOOPT-LABEL: test_mul_by_12:
345; X64-NOOPT:       # %bb.0:
346; X64-NOOPT-NEXT:    imull $12, %edi, %eax
347; X64-NOOPT-NEXT:    retq
348  %mul = mul nsw i32 %x, 12
349  ret i32 %mul
350}
351
352define i32 @test_mul_by_13(i32 %x) {
353; X86-LABEL: test_mul_by_13:
354; X86:       # %bb.0:
355; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
356; X86-NEXT:    leal (%eax,%eax,2), %ecx
357; X86-NEXT:    leal (%eax,%ecx,4), %eax
358; X86-NEXT:    retl
359;
360; X64-HSW-LABEL: test_mul_by_13:
361; X64-HSW:       # %bb.0:
362; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
363; X64-HSW-NEXT:    leal (%rdi,%rdi,2), %eax
364; X64-HSW-NEXT:    leal (%rdi,%rax,4), %eax
365; X64-HSW-NEXT:    retq
366;
367; X64-JAG-LABEL: test_mul_by_13:
368; X64-JAG:       # %bb.0:
369; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
370; X64-JAG-NEXT:    leal (%rdi,%rdi,2), %eax
371; X64-JAG-NEXT:    leal (%rdi,%rax,4), %eax
372; X64-JAG-NEXT:    retq
373;
374; X86-NOOPT-LABEL: test_mul_by_13:
375; X86-NOOPT:       # %bb.0:
376; X86-NOOPT-NEXT:    imull $13, {{[0-9]+}}(%esp), %eax
377; X86-NOOPT-NEXT:    retl
378;
379; X64-NOOPT-LABEL: test_mul_by_13:
380; X64-NOOPT:       # %bb.0:
381; X64-NOOPT-NEXT:    imull $13, %edi, %eax
382; X64-NOOPT-NEXT:    retq
383;
384; X64-SLM-LABEL: test_mul_by_13:
385; X64-SLM:       # %bb.0:
386; X64-SLM-NEXT:    imull $13, %edi, %eax
387; X64-SLM-NEXT:    retq
388  %mul = mul nsw i32 %x, 13
389  ret i32 %mul
390}
391
392define i32 @test_mul_by_14(i32 %x) {
393; X86-LABEL: test_mul_by_14:
394; X86:       # %bb.0:
395; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
396; X86-NEXT:    leal (%eax,%eax), %ecx
397; X86-NEXT:    shll $4, %eax
398; X86-NEXT:    subl %ecx, %eax
399; X86-NEXT:    retl
400;
401; X64-LABEL: test_mul_by_14:
402; X64:       # %bb.0:
403; X64-NEXT:    movl %edi, %eax
404; X64-NEXT:    leal (%rax,%rax), %ecx
405; X64-NEXT:    shll $4, %eax
406; X64-NEXT:    subl %ecx, %eax
407; X64-NEXT:    # kill: def $eax killed $eax killed $rax
408; X64-NEXT:    retq
409;
410; X86-NOOPT-LABEL: test_mul_by_14:
411; X86-NOOPT:       # %bb.0:
412; X86-NOOPT-NEXT:    imull $14, {{[0-9]+}}(%esp), %eax
413; X86-NOOPT-NEXT:    retl
414;
415; X64-NOOPT-LABEL: test_mul_by_14:
416; X64-NOOPT:       # %bb.0:
417; X64-NOOPT-NEXT:    imull $14, %edi, %eax
418; X64-NOOPT-NEXT:    retq
419  %mul = mul nsw i32 %x, 14
420  ret i32 %mul
421}
422
423define i32 @test_mul_by_15(i32 %x) {
424; X86-LABEL: test_mul_by_15:
425; X86:       # %bb.0:
426; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
427; X86-NEXT:    leal (%eax,%eax,4), %eax
428; X86-NEXT:    leal (%eax,%eax,2), %eax
429; X86-NEXT:    retl
430;
431; X64-LABEL: test_mul_by_15:
432; X64:       # %bb.0:
433; X64-NEXT:    # kill: def $edi killed $edi def $rdi
434; X64-NEXT:    leal (%rdi,%rdi,4), %eax
435; X64-NEXT:    leal (%rax,%rax,2), %eax
436; X64-NEXT:    retq
437;
438; X86-NOOPT-LABEL: test_mul_by_15:
439; X86-NOOPT:       # %bb.0:
440; X86-NOOPT-NEXT:    imull $15, {{[0-9]+}}(%esp), %eax
441; X86-NOOPT-NEXT:    retl
442;
443; X64-NOOPT-LABEL: test_mul_by_15:
444; X64-NOOPT:       # %bb.0:
445; X64-NOOPT-NEXT:    imull $15, %edi, %eax
446; X64-NOOPT-NEXT:    retq
447  %mul = mul nsw i32 %x, 15
448  ret i32 %mul
449}
450
451define i32 @test_mul_by_16(i32 %x) {
452; X86-LABEL: test_mul_by_16:
453; X86:       # %bb.0:
454; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
455; X86-NEXT:    shll $4, %eax
456; X86-NEXT:    retl
457;
458; X64-LABEL: test_mul_by_16:
459; X64:       # %bb.0:
460; X64-NEXT:    movl %edi, %eax
461; X64-NEXT:    shll $4, %eax
462; X64-NEXT:    retq
463;
464; X86-NOOPT-LABEL: test_mul_by_16:
465; X86-NOOPT:       # %bb.0:
466; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
467; X86-NOOPT-NEXT:    shll $4, %eax
468; X86-NOOPT-NEXT:    retl
469;
470; X64-NOOPT-LABEL: test_mul_by_16:
471; X64-NOOPT:       # %bb.0:
472; X64-NOOPT-NEXT:    movl %edi, %eax
473; X64-NOOPT-NEXT:    shll $4, %eax
474; X64-NOOPT-NEXT:    retq
475  %mul = mul nsw i32 %x, 16
476  ret i32 %mul
477}
478
479define i32 @test_mul_by_17(i32 %x) {
480; X86-LABEL: test_mul_by_17:
481; X86:       # %bb.0:
482; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
483; X86-NEXT:    movl %ecx, %eax
484; X86-NEXT:    shll $4, %eax
485; X86-NEXT:    addl %ecx, %eax
486; X86-NEXT:    retl
487;
488; X64-LABEL: test_mul_by_17:
489; X64:       # %bb.0:
490; X64-NEXT:    movl %edi, %eax
491; X64-NEXT:    shll $4, %eax
492; X64-NEXT:    addl %edi, %eax
493; X64-NEXT:    retq
494;
495; X86-NOOPT-LABEL: test_mul_by_17:
496; X86-NOOPT:       # %bb.0:
497; X86-NOOPT-NEXT:    imull $17, {{[0-9]+}}(%esp), %eax
498; X86-NOOPT-NEXT:    retl
499;
500; X64-NOOPT-LABEL: test_mul_by_17:
501; X64-NOOPT:       # %bb.0:
502; X64-NOOPT-NEXT:    imull $17, %edi, %eax
503; X64-NOOPT-NEXT:    retq
504  %mul = mul nsw i32 %x, 17
505  ret i32 %mul
506}
507
508define i32 @test_mul_by_18(i32 %x) {
509; X86-LABEL: test_mul_by_18:
510; X86:       # %bb.0:
511; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
512; X86-NEXT:    addl %eax, %eax
513; X86-NEXT:    leal (%eax,%eax,8), %eax
514; X86-NEXT:    retl
515;
516; X64-LABEL: test_mul_by_18:
517; X64:       # %bb.0:
518; X64-NEXT:    # kill: def $edi killed $edi def $rdi
519; X64-NEXT:    addl %edi, %edi
520; X64-NEXT:    leal (%rdi,%rdi,8), %eax
521; X64-NEXT:    retq
522;
523; X86-NOOPT-LABEL: test_mul_by_18:
524; X86-NOOPT:       # %bb.0:
525; X86-NOOPT-NEXT:    imull $18, {{[0-9]+}}(%esp), %eax
526; X86-NOOPT-NEXT:    retl
527;
528; X64-NOOPT-LABEL: test_mul_by_18:
529; X64-NOOPT:       # %bb.0:
530; X64-NOOPT-NEXT:    imull $18, %edi, %eax
531; X64-NOOPT-NEXT:    retq
532  %mul = mul nsw i32 %x, 18
533  ret i32 %mul
534}
535
536define i32 @test_mul_by_19(i32 %x) {
537; X86-LABEL: test_mul_by_19:
538; X86:       # %bb.0:
539; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
540; X86-NEXT:    leal (%eax,%eax,8), %ecx
541; X86-NEXT:    leal (%eax,%ecx,2), %eax
542; X86-NEXT:    retl
543;
544; X64-HSW-LABEL: test_mul_by_19:
545; X64-HSW:       # %bb.0:
546; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
547; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %eax
548; X64-HSW-NEXT:    leal (%rdi,%rax,2), %eax
549; X64-HSW-NEXT:    retq
550;
551; X64-JAG-LABEL: test_mul_by_19:
552; X64-JAG:       # %bb.0:
553; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
554; X64-JAG-NEXT:    leal (%rdi,%rdi,8), %eax
555; X64-JAG-NEXT:    leal (%rdi,%rax,2), %eax
556; X64-JAG-NEXT:    retq
557;
558; X86-NOOPT-LABEL: test_mul_by_19:
559; X86-NOOPT:       # %bb.0:
560; X86-NOOPT-NEXT:    imull $19, {{[0-9]+}}(%esp), %eax
561; X86-NOOPT-NEXT:    retl
562;
563; X64-NOOPT-LABEL: test_mul_by_19:
564; X64-NOOPT:       # %bb.0:
565; X64-NOOPT-NEXT:    imull $19, %edi, %eax
566; X64-NOOPT-NEXT:    retq
567;
568; X64-SLM-LABEL: test_mul_by_19:
569; X64-SLM:       # %bb.0:
570; X64-SLM-NEXT:    imull $19, %edi, %eax
571; X64-SLM-NEXT:    retq
572  %mul = mul nsw i32 %x, 19
573  ret i32 %mul
574}
575
576define i32 @test_mul_by_20(i32 %x) {
577; X86-LABEL: test_mul_by_20:
578; X86:       # %bb.0:
579; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
580; X86-NEXT:    shll $2, %eax
581; X86-NEXT:    leal (%eax,%eax,4), %eax
582; X86-NEXT:    retl
583;
584; X64-LABEL: test_mul_by_20:
585; X64:       # %bb.0:
586; X64-NEXT:    # kill: def $edi killed $edi def $rdi
587; X64-NEXT:    shll $2, %edi
588; X64-NEXT:    leal (%rdi,%rdi,4), %eax
589; X64-NEXT:    retq
590;
591; X86-NOOPT-LABEL: test_mul_by_20:
592; X86-NOOPT:       # %bb.0:
593; X86-NOOPT-NEXT:    imull $20, {{[0-9]+}}(%esp), %eax
594; X86-NOOPT-NEXT:    retl
595;
596; X64-NOOPT-LABEL: test_mul_by_20:
597; X64-NOOPT:       # %bb.0:
598; X64-NOOPT-NEXT:    imull $20, %edi, %eax
599; X64-NOOPT-NEXT:    retq
600  %mul = mul nsw i32 %x, 20
601  ret i32 %mul
602}
603
604define i32 @test_mul_by_21(i32 %x) {
605; X86-LABEL: test_mul_by_21:
606; X86:       # %bb.0:
607; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
608; X86-NEXT:    leal (%eax,%eax,4), %ecx
609; X86-NEXT:    leal (%eax,%ecx,4), %eax
610; X86-NEXT:    retl
611;
612; X64-HSW-LABEL: test_mul_by_21:
613; X64-HSW:       # %bb.0:
614; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
615; X64-HSW-NEXT:    leal (%rdi,%rdi,4), %eax
616; X64-HSW-NEXT:    leal (%rdi,%rax,4), %eax
617; X64-HSW-NEXT:    retq
618;
619; X64-JAG-LABEL: test_mul_by_21:
620; X64-JAG:       # %bb.0:
621; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
622; X64-JAG-NEXT:    leal (%rdi,%rdi,4), %eax
623; X64-JAG-NEXT:    leal (%rdi,%rax,4), %eax
624; X64-JAG-NEXT:    retq
625;
626; X86-NOOPT-LABEL: test_mul_by_21:
627; X86-NOOPT:       # %bb.0:
628; X86-NOOPT-NEXT:    imull $21, {{[0-9]+}}(%esp), %eax
629; X86-NOOPT-NEXT:    retl
630;
631; X64-NOOPT-LABEL: test_mul_by_21:
632; X64-NOOPT:       # %bb.0:
633; X64-NOOPT-NEXT:    imull $21, %edi, %eax
634; X64-NOOPT-NEXT:    retq
635;
636; X64-SLM-LABEL: test_mul_by_21:
637; X64-SLM:       # %bb.0:
638; X64-SLM-NEXT:    imull $21, %edi, %eax
639; X64-SLM-NEXT:    retq
640  %mul = mul nsw i32 %x, 21
641  ret i32 %mul
642}
643
644define i32 @test_mul_by_22(i32 %x) {
645; X86-LABEL: test_mul_by_22:
646; X86:       # %bb.0:
647; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
648; X86-NEXT:    leal (%ecx,%ecx,4), %eax
649; X86-NEXT:    leal (%ecx,%eax,4), %eax
650; X86-NEXT:    addl %ecx, %eax
651; X86-NEXT:    retl
652;
653; X64-HSW-LABEL: test_mul_by_22:
654; X64-HSW:       # %bb.0:
655; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
656; X64-HSW-NEXT:    leal (%rdi,%rdi,4), %eax
657; X64-HSW-NEXT:    leal (%rdi,%rax,4), %eax
658; X64-HSW-NEXT:    addl %edi, %eax
659; X64-HSW-NEXT:    retq
660;
661; X64-JAG-LABEL: test_mul_by_22:
662; X64-JAG:       # %bb.0:
663; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
664; X64-JAG-NEXT:    leal (%rdi,%rdi,4), %eax
665; X64-JAG-NEXT:    leal (%rdi,%rax,4), %eax
666; X64-JAG-NEXT:    addl %edi, %eax
667; X64-JAG-NEXT:    retq
668;
669; X86-NOOPT-LABEL: test_mul_by_22:
670; X86-NOOPT:       # %bb.0:
671; X86-NOOPT-NEXT:    imull $22, {{[0-9]+}}(%esp), %eax
672; X86-NOOPT-NEXT:    retl
673;
674; X64-NOOPT-LABEL: test_mul_by_22:
675; X64-NOOPT:       # %bb.0:
676; X64-NOOPT-NEXT:    imull $22, %edi, %eax
677; X64-NOOPT-NEXT:    retq
678;
679; X64-SLM-LABEL: test_mul_by_22:
680; X64-SLM:       # %bb.0:
681; X64-SLM-NEXT:    imull $22, %edi, %eax
682; X64-SLM-NEXT:    retq
683  %mul = mul nsw i32 %x, 22
684  ret i32 %mul
685}
686
687define i32 @test_mul_by_23(i32 %x) {
688; X86-LABEL: test_mul_by_23:
689; X86:       # %bb.0:
690; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
691; X86-NEXT:    leal (%ecx,%ecx,2), %eax
692; X86-NEXT:    shll $3, %eax
693; X86-NEXT:    subl %ecx, %eax
694; X86-NEXT:    retl
695;
696; X64-HSW-LABEL: test_mul_by_23:
697; X64-HSW:       # %bb.0:
698; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
699; X64-HSW-NEXT:    leal (%rdi,%rdi,2), %eax
700; X64-HSW-NEXT:    shll $3, %eax
701; X64-HSW-NEXT:    subl %edi, %eax
702; X64-HSW-NEXT:    retq
703;
704; X64-JAG-LABEL: test_mul_by_23:
705; X64-JAG:       # %bb.0:
706; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
707; X64-JAG-NEXT:    leal (%rdi,%rdi,2), %eax
708; X64-JAG-NEXT:    shll $3, %eax
709; X64-JAG-NEXT:    subl %edi, %eax
710; X64-JAG-NEXT:    retq
711;
712; X86-NOOPT-LABEL: test_mul_by_23:
713; X86-NOOPT:       # %bb.0:
714; X86-NOOPT-NEXT:    imull $23, {{[0-9]+}}(%esp), %eax
715; X86-NOOPT-NEXT:    retl
716;
717; X64-NOOPT-LABEL: test_mul_by_23:
718; X64-NOOPT:       # %bb.0:
719; X64-NOOPT-NEXT:    imull $23, %edi, %eax
720; X64-NOOPT-NEXT:    retq
721;
722; X64-SLM-LABEL: test_mul_by_23:
723; X64-SLM:       # %bb.0:
724; X64-SLM-NEXT:    imull $23, %edi, %eax
725; X64-SLM-NEXT:    retq
726  %mul = mul nsw i32 %x, 23
727  ret i32 %mul
728}
729
730define i32 @test_mul_by_24(i32 %x) {
731; X86-LABEL: test_mul_by_24:
732; X86:       # %bb.0:
733; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
734; X86-NEXT:    shll $3, %eax
735; X86-NEXT:    leal (%eax,%eax,2), %eax
736; X86-NEXT:    retl
737;
738; X64-LABEL: test_mul_by_24:
739; X64:       # %bb.0:
740; X64-NEXT:    # kill: def $edi killed $edi def $rdi
741; X64-NEXT:    shll $3, %edi
742; X64-NEXT:    leal (%rdi,%rdi,2), %eax
743; X64-NEXT:    retq
744;
745; X86-NOOPT-LABEL: test_mul_by_24:
746; X86-NOOPT:       # %bb.0:
747; X86-NOOPT-NEXT:    imull $24, {{[0-9]+}}(%esp), %eax
748; X86-NOOPT-NEXT:    retl
749;
750; X64-NOOPT-LABEL: test_mul_by_24:
751; X64-NOOPT:       # %bb.0:
752; X64-NOOPT-NEXT:    imull $24, %edi, %eax
753; X64-NOOPT-NEXT:    retq
754  %mul = mul nsw i32 %x, 24
755  ret i32 %mul
756}
757
758define i32 @test_mul_by_25(i32 %x) {
759; X86-LABEL: test_mul_by_25:
760; X86:       # %bb.0:
761; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
762; X86-NEXT:    leal (%eax,%eax,4), %eax
763; X86-NEXT:    leal (%eax,%eax,4), %eax
764; X86-NEXT:    retl
765;
766; X64-LABEL: test_mul_by_25:
767; X64:       # %bb.0:
768; X64-NEXT:    # kill: def $edi killed $edi def $rdi
769; X64-NEXT:    leal (%rdi,%rdi,4), %eax
770; X64-NEXT:    leal (%rax,%rax,4), %eax
771; X64-NEXT:    retq
772;
773; X86-NOOPT-LABEL: test_mul_by_25:
774; X86-NOOPT:       # %bb.0:
775; X86-NOOPT-NEXT:    imull $25, {{[0-9]+}}(%esp), %eax
776; X86-NOOPT-NEXT:    retl
777;
778; X64-NOOPT-LABEL: test_mul_by_25:
779; X64-NOOPT:       # %bb.0:
780; X64-NOOPT-NEXT:    imull $25, %edi, %eax
781; X64-NOOPT-NEXT:    retq
782  %mul = mul nsw i32 %x, 25
783  ret i32 %mul
784}
785
786define i32 @test_mul_by_26(i32 %x) {
787; X86-LABEL: test_mul_by_26:
788; X86:       # %bb.0:
789; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
790; X86-NEXT:    leal (%ecx,%ecx,4), %eax
791; X86-NEXT:    leal (%eax,%eax,4), %eax
792; X86-NEXT:    addl %ecx, %eax
793; X86-NEXT:    retl
794;
795; X64-HSW-LABEL: test_mul_by_26:
796; X64-HSW:       # %bb.0:
797; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
798; X64-HSW-NEXT:    leal (%rdi,%rdi,4), %eax
799; X64-HSW-NEXT:    leal (%rax,%rax,4), %eax
800; X64-HSW-NEXT:    addl %edi, %eax
801; X64-HSW-NEXT:    retq
802;
803; X64-JAG-LABEL: test_mul_by_26:
804; X64-JAG:       # %bb.0:
805; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
806; X64-JAG-NEXT:    leal (%rdi,%rdi,4), %eax
807; X64-JAG-NEXT:    leal (%rax,%rax,4), %eax
808; X64-JAG-NEXT:    addl %edi, %eax
809; X64-JAG-NEXT:    retq
810;
811; X86-NOOPT-LABEL: test_mul_by_26:
812; X86-NOOPT:       # %bb.0:
813; X86-NOOPT-NEXT:    imull $26, {{[0-9]+}}(%esp), %eax
814; X86-NOOPT-NEXT:    retl
815;
816; X64-NOOPT-LABEL: test_mul_by_26:
817; X64-NOOPT:       # %bb.0:
818; X64-NOOPT-NEXT:    imull $26, %edi, %eax
819; X64-NOOPT-NEXT:    retq
820;
821; X64-SLM-LABEL: test_mul_by_26:
822; X64-SLM:       # %bb.0:
823; X64-SLM-NEXT:    imull $26, %edi, %eax
824; X64-SLM-NEXT:    retq
825  %mul = mul nsw i32 %x, 26
826  ret i32 %mul
827}
828
829define i32 @test_mul_by_27(i32 %x) {
830; X86-LABEL: test_mul_by_27:
831; X86:       # %bb.0:
832; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
833; X86-NEXT:    leal (%eax,%eax,8), %eax
834; X86-NEXT:    leal (%eax,%eax,2), %eax
835; X86-NEXT:    retl
836;
837; X64-LABEL: test_mul_by_27:
838; X64:       # %bb.0:
839; X64-NEXT:    # kill: def $edi killed $edi def $rdi
840; X64-NEXT:    leal (%rdi,%rdi,8), %eax
841; X64-NEXT:    leal (%rax,%rax,2), %eax
842; X64-NEXT:    retq
843;
844; X86-NOOPT-LABEL: test_mul_by_27:
845; X86-NOOPT:       # %bb.0:
846; X86-NOOPT-NEXT:    imull $27, {{[0-9]+}}(%esp), %eax
847; X86-NOOPT-NEXT:    retl
848;
849; X64-NOOPT-LABEL: test_mul_by_27:
850; X64-NOOPT:       # %bb.0:
851; X64-NOOPT-NEXT:    imull $27, %edi, %eax
852; X64-NOOPT-NEXT:    retq
853  %mul = mul nsw i32 %x, 27
854  ret i32 %mul
855}
856
857define i32 @test_mul_by_28(i32 %x) {
858; X86-LABEL: test_mul_by_28:
859; X86:       # %bb.0:
860; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
861; X86-NEXT:    leal (%ecx,%ecx,8), %eax
862; X86-NEXT:    leal (%eax,%eax,2), %eax
863; X86-NEXT:    addl %ecx, %eax
864; X86-NEXT:    retl
865;
866; X64-HSW-LABEL: test_mul_by_28:
867; X64-HSW:       # %bb.0:
868; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
869; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %eax
870; X64-HSW-NEXT:    leal (%rax,%rax,2), %eax
871; X64-HSW-NEXT:    addl %edi, %eax
872; X64-HSW-NEXT:    retq
873;
874; X64-JAG-LABEL: test_mul_by_28:
875; X64-JAG:       # %bb.0:
876; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
877; X64-JAG-NEXT:    leal (%rdi,%rdi,8), %eax
878; X64-JAG-NEXT:    leal (%rax,%rax,2), %eax
879; X64-JAG-NEXT:    addl %edi, %eax
880; X64-JAG-NEXT:    retq
881;
882; X86-NOOPT-LABEL: test_mul_by_28:
883; X86-NOOPT:       # %bb.0:
884; X86-NOOPT-NEXT:    imull $28, {{[0-9]+}}(%esp), %eax
885; X86-NOOPT-NEXT:    retl
886;
887; X64-NOOPT-LABEL: test_mul_by_28:
888; X64-NOOPT:       # %bb.0:
889; X64-NOOPT-NEXT:    imull $28, %edi, %eax
890; X64-NOOPT-NEXT:    retq
891;
892; X64-SLM-LABEL: test_mul_by_28:
893; X64-SLM:       # %bb.0:
894; X64-SLM-NEXT:    imull $28, %edi, %eax
895; X64-SLM-NEXT:    retq
896  %mul = mul nsw i32 %x, 28
897  ret i32 %mul
898}
899
900define i32 @test_mul_by_29(i32 %x) {
901; X86-LABEL: test_mul_by_29:
902; X86:       # %bb.0:
903; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
904; X86-NEXT:    leal (%eax,%eax,8), %ecx
905; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
906; X86-NEXT:    addl %eax, %eax
907; X86-NEXT:    addl %ecx, %eax
908; X86-NEXT:    retl
909;
910; X64-HSW-LABEL: test_mul_by_29:
911; X64-HSW:       # %bb.0:
912; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
913; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %eax
914; X64-HSW-NEXT:    leal (%rax,%rax,2), %eax
915; X64-HSW-NEXT:    addl %edi, %eax
916; X64-HSW-NEXT:    addl %edi, %eax
917; X64-HSW-NEXT:    retq
918;
919; X64-JAG-LABEL: test_mul_by_29:
920; X64-JAG:       # %bb.0:
921; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
922; X64-JAG-NEXT:    leal (%rdi,%rdi,8), %eax
923; X64-JAG-NEXT:    leal (%rax,%rax,2), %eax
924; X64-JAG-NEXT:    addl %edi, %eax
925; X64-JAG-NEXT:    addl %edi, %eax
926; X64-JAG-NEXT:    retq
927;
928; X86-NOOPT-LABEL: test_mul_by_29:
929; X86-NOOPT:       # %bb.0:
930; X86-NOOPT-NEXT:    imull $29, {{[0-9]+}}(%esp), %eax
931; X86-NOOPT-NEXT:    retl
932;
933; X64-NOOPT-LABEL: test_mul_by_29:
934; X64-NOOPT:       # %bb.0:
935; X64-NOOPT-NEXT:    imull $29, %edi, %eax
936; X64-NOOPT-NEXT:    retq
937;
938; X64-SLM-LABEL: test_mul_by_29:
939; X64-SLM:       # %bb.0:
940; X64-SLM-NEXT:    imull $29, %edi, %eax
941; X64-SLM-NEXT:    retq
942  %mul = mul nsw i32 %x, 29
943  ret i32 %mul
944}
945
946define i32 @test_mul_by_30(i32 %x) {
947; X86-LABEL: test_mul_by_30:
948; X86:       # %bb.0:
949; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
950; X86-NEXT:    leal (%eax,%eax), %ecx
951; X86-NEXT:    shll $5, %eax
952; X86-NEXT:    subl %ecx, %eax
953; X86-NEXT:    retl
954;
955; X64-LABEL: test_mul_by_30:
956; X64:       # %bb.0:
957; X64-NEXT:    movl %edi, %eax
958; X64-NEXT:    leal (%rax,%rax), %ecx
959; X64-NEXT:    shll $5, %eax
960; X64-NEXT:    subl %ecx, %eax
961; X64-NEXT:    # kill: def $eax killed $eax killed $rax
962; X64-NEXT:    retq
963;
964; X86-NOOPT-LABEL: test_mul_by_30:
965; X86-NOOPT:       # %bb.0:
966; X86-NOOPT-NEXT:    imull $30, {{[0-9]+}}(%esp), %eax
967; X86-NOOPT-NEXT:    retl
968;
969; X64-NOOPT-LABEL: test_mul_by_30:
970; X64-NOOPT:       # %bb.0:
971; X64-NOOPT-NEXT:    imull $30, %edi, %eax
972; X64-NOOPT-NEXT:    retq
973  %mul = mul nsw i32 %x, 30
974  ret i32 %mul
975}
976
977define i32 @test_mul_by_31(i32 %x) {
978; X86-LABEL: test_mul_by_31:
979; X86:       # %bb.0:
980; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
981; X86-NEXT:    movl %ecx, %eax
982; X86-NEXT:    shll $5, %eax
983; X86-NEXT:    subl %ecx, %eax
984; X86-NEXT:    retl
985;
986; X64-LABEL: test_mul_by_31:
987; X64:       # %bb.0:
988; X64-NEXT:    movl %edi, %eax
989; X64-NEXT:    shll $5, %eax
990; X64-NEXT:    subl %edi, %eax
991; X64-NEXT:    retq
992;
993; X86-NOOPT-LABEL: test_mul_by_31:
994; X86-NOOPT:       # %bb.0:
995; X86-NOOPT-NEXT:    imull $31, {{[0-9]+}}(%esp), %eax
996; X86-NOOPT-NEXT:    retl
997;
998; X64-NOOPT-LABEL: test_mul_by_31:
999; X64-NOOPT:       # %bb.0:
1000; X64-NOOPT-NEXT:    imull $31, %edi, %eax
1001; X64-NOOPT-NEXT:    retq
1002  %mul = mul nsw i32 %x, 31
1003  ret i32 %mul
1004}
1005
1006define i32 @test_mul_by_32(i32 %x) {
1007; X86-LABEL: test_mul_by_32:
1008; X86:       # %bb.0:
1009; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1010; X86-NEXT:    shll $5, %eax
1011; X86-NEXT:    retl
1012;
1013; X64-LABEL: test_mul_by_32:
1014; X64:       # %bb.0:
1015; X64-NEXT:    movl %edi, %eax
1016; X64-NEXT:    shll $5, %eax
1017; X64-NEXT:    retq
1018;
1019; X86-NOOPT-LABEL: test_mul_by_32:
1020; X86-NOOPT:       # %bb.0:
1021; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
1022; X86-NOOPT-NEXT:    shll $5, %eax
1023; X86-NOOPT-NEXT:    retl
1024;
1025; X64-NOOPT-LABEL: test_mul_by_32:
1026; X64-NOOPT:       # %bb.0:
1027; X64-NOOPT-NEXT:    movl %edi, %eax
1028; X64-NOOPT-NEXT:    shll $5, %eax
1029; X64-NOOPT-NEXT:    retq
1030  %mul = mul nsw i32 %x, 32
1031  ret i32 %mul
1032}
1033
1034define i32 @test_mul_by_37(i32 %x) {
1035; X86-LABEL: test_mul_by_37:
1036; X86:       # %bb.0:
1037; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1038; X86-NEXT:    leal (%eax,%eax,8), %ecx
1039; X86-NEXT:    leal (%eax,%ecx,4), %eax
1040; X86-NEXT:    retl
1041;
1042; X64-HSW-LABEL: test_mul_by_37:
1043; X64-HSW:       # %bb.0:
1044; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1045; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %eax
1046; X64-HSW-NEXT:    leal (%rdi,%rax,4), %eax
1047; X64-HSW-NEXT:    retq
1048;
1049; X64-JAG-LABEL: test_mul_by_37:
1050; X64-JAG:       # %bb.0:
1051; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1052; X64-JAG-NEXT:    leal (%rdi,%rdi,8), %eax
1053; X64-JAG-NEXT:    leal (%rdi,%rax,4), %eax
1054; X64-JAG-NEXT:    retq
1055;
1056; X86-NOOPT-LABEL: test_mul_by_37:
1057; X86-NOOPT:       # %bb.0:
1058; X86-NOOPT-NEXT:    imull $37, {{[0-9]+}}(%esp), %eax
1059; X86-NOOPT-NEXT:    retl
1060;
1061; X64-NOOPT-LABEL: test_mul_by_37:
1062; X64-NOOPT:       # %bb.0:
1063; X64-NOOPT-NEXT:    imull $37, %edi, %eax
1064; X64-NOOPT-NEXT:    retq
1065;
1066; X64-SLM-LABEL: test_mul_by_37:
1067; X64-SLM:       # %bb.0:
1068; X64-SLM-NEXT:    imull $37, %edi, %eax
1069; X64-SLM-NEXT:    retq
1070  %mul = mul nsw i32 %x, 37
1071  ret i32 %mul
1072}
1073
1074define i32 @test_mul_by_41(i32 %x) {
1075; X86-LABEL: test_mul_by_41:
1076; X86:       # %bb.0:
1077; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1078; X86-NEXT:    leal (%eax,%eax,4), %ecx
1079; X86-NEXT:    leal (%eax,%ecx,8), %eax
1080; X86-NEXT:    retl
1081;
1082; X64-HSW-LABEL: test_mul_by_41:
1083; X64-HSW:       # %bb.0:
1084; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1085; X64-HSW-NEXT:    leal (%rdi,%rdi,4), %eax
1086; X64-HSW-NEXT:    leal (%rdi,%rax,8), %eax
1087; X64-HSW-NEXT:    retq
1088;
1089; X64-JAG-LABEL: test_mul_by_41:
1090; X64-JAG:       # %bb.0:
1091; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1092; X64-JAG-NEXT:    leal (%rdi,%rdi,4), %eax
1093; X64-JAG-NEXT:    leal (%rdi,%rax,8), %eax
1094; X64-JAG-NEXT:    retq
1095;
1096; X86-NOOPT-LABEL: test_mul_by_41:
1097; X86-NOOPT:       # %bb.0:
1098; X86-NOOPT-NEXT:    imull $41, {{[0-9]+}}(%esp), %eax
1099; X86-NOOPT-NEXT:    retl
1100;
1101; X64-NOOPT-LABEL: test_mul_by_41:
1102; X64-NOOPT:       # %bb.0:
1103; X64-NOOPT-NEXT:    imull $41, %edi, %eax
1104; X64-NOOPT-NEXT:    retq
1105;
1106; X64-SLM-LABEL: test_mul_by_41:
1107; X64-SLM:       # %bb.0:
1108; X64-SLM-NEXT:    imull $41, %edi, %eax
1109; X64-SLM-NEXT:    retq
1110  %mul = mul nsw i32 %x, 41
1111  ret i32 %mul
1112}
1113
1114define i32 @test_mul_by_62(i32 %x) {
1115; X86-LABEL: test_mul_by_62:
1116; X86:       # %bb.0:
1117; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1118; X86-NEXT:    leal (%eax,%eax), %ecx
1119; X86-NEXT:    shll $6, %eax
1120; X86-NEXT:    subl %ecx, %eax
1121; X86-NEXT:    retl
1122;
1123; X64-LABEL: test_mul_by_62:
1124; X64:       # %bb.0:
1125; X64-NEXT:    movl %edi, %eax
1126; X64-NEXT:    leal (%rax,%rax), %ecx
1127; X64-NEXT:    shll $6, %eax
1128; X64-NEXT:    subl %ecx, %eax
1129; X64-NEXT:    # kill: def $eax killed $eax killed $rax
1130; X64-NEXT:    retq
1131;
1132; X86-NOOPT-LABEL: test_mul_by_62:
1133; X86-NOOPT:       # %bb.0:
1134; X86-NOOPT-NEXT:    imull $62, {{[0-9]+}}(%esp), %eax
1135; X86-NOOPT-NEXT:    retl
1136;
1137; X64-NOOPT-LABEL: test_mul_by_62:
1138; X64-NOOPT:       # %bb.0:
1139; X64-NOOPT-NEXT:    imull $62, %edi, %eax
1140; X64-NOOPT-NEXT:    retq
1141  %mul = mul nsw i32 %x, 62
1142  ret i32 %mul
1143}
1144
1145define i32 @test_mul_by_66(i32 %x) {
1146; X86-LABEL: test_mul_by_66:
1147; X86:       # %bb.0:
1148; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1149; X86-NEXT:    movl %eax, %ecx
1150; X86-NEXT:    shll $6, %ecx
1151; X86-NEXT:    leal (%ecx,%eax,2), %eax
1152; X86-NEXT:    retl
1153;
1154; X64-HSW-LABEL: test_mul_by_66:
1155; X64-HSW:       # %bb.0:
1156; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1157; X64-HSW-NEXT:    movl %edi, %eax
1158; X64-HSW-NEXT:    shll $6, %eax
1159; X64-HSW-NEXT:    leal (%rax,%rdi,2), %eax
1160; X64-HSW-NEXT:    retq
1161;
1162; X64-JAG-LABEL: test_mul_by_66:
1163; X64-JAG:       # %bb.0:
1164; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1165; X64-JAG-NEXT:    movl %edi, %eax
1166; X64-JAG-NEXT:    shll $6, %eax
1167; X64-JAG-NEXT:    leal (%rax,%rdi,2), %eax
1168; X64-JAG-NEXT:    retq
1169;
1170; X86-NOOPT-LABEL: test_mul_by_66:
1171; X86-NOOPT:       # %bb.0:
1172; X86-NOOPT-NEXT:    imull $66, {{[0-9]+}}(%esp), %eax
1173; X86-NOOPT-NEXT:    retl
1174;
1175; X64-NOOPT-LABEL: test_mul_by_66:
1176; X64-NOOPT:       # %bb.0:
1177; X64-NOOPT-NEXT:    imull $66, %edi, %eax
1178; X64-NOOPT-NEXT:    retq
1179;
1180; X64-SLM-LABEL: test_mul_by_66:
1181; X64-SLM:       # %bb.0:
1182; X64-SLM-NEXT:    # kill: def $edi killed $edi def $rdi
1183; X64-SLM-NEXT:    leal (%rdi,%rdi), %eax
1184; X64-SLM-NEXT:    shll $6, %edi
1185; X64-SLM-NEXT:    addl %edi, %eax
1186; X64-SLM-NEXT:    retq
1187  %mul = mul nsw i32 %x, 66
1188  ret i32 %mul
1189}
1190
1191define i32 @test_mul_by_73(i32 %x) {
1192; X86-LABEL: test_mul_by_73:
1193; X86:       # %bb.0:
1194; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1195; X86-NEXT:    leal (%eax,%eax,8), %ecx
1196; X86-NEXT:    leal (%eax,%ecx,8), %eax
1197; X86-NEXT:    retl
1198;
1199; X64-HSW-LABEL: test_mul_by_73:
1200; X64-HSW:       # %bb.0:
1201; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1202; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %eax
1203; X64-HSW-NEXT:    leal (%rdi,%rax,8), %eax
1204; X64-HSW-NEXT:    retq
1205;
1206; X64-JAG-LABEL: test_mul_by_73:
1207; X64-JAG:       # %bb.0:
1208; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1209; X64-JAG-NEXT:    leal (%rdi,%rdi,8), %eax
1210; X64-JAG-NEXT:    leal (%rdi,%rax,8), %eax
1211; X64-JAG-NEXT:    retq
1212;
1213; X86-NOOPT-LABEL: test_mul_by_73:
1214; X86-NOOPT:       # %bb.0:
1215; X86-NOOPT-NEXT:    imull $73, {{[0-9]+}}(%esp), %eax
1216; X86-NOOPT-NEXT:    retl
1217;
1218; X64-NOOPT-LABEL: test_mul_by_73:
1219; X64-NOOPT:       # %bb.0:
1220; X64-NOOPT-NEXT:    imull $73, %edi, %eax
1221; X64-NOOPT-NEXT:    retq
1222;
1223; X64-SLM-LABEL: test_mul_by_73:
1224; X64-SLM:       # %bb.0:
1225; X64-SLM-NEXT:    imull $73, %edi, %eax
1226; X64-SLM-NEXT:    retq
1227  %mul = mul nsw i32 %x, 73
1228  ret i32 %mul
1229}
1230
1231define i32 @test_mul_by_520(i32 %x) {
1232; X86-LABEL: test_mul_by_520:
1233; X86:       # %bb.0:
1234; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1235; X86-NEXT:    movl %eax, %ecx
1236; X86-NEXT:    shll $9, %ecx
1237; X86-NEXT:    leal (%ecx,%eax,8), %eax
1238; X86-NEXT:    retl
1239;
1240; X64-HSW-LABEL: test_mul_by_520:
1241; X64-HSW:       # %bb.0:
1242; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1243; X64-HSW-NEXT:    movl %edi, %eax
1244; X64-HSW-NEXT:    shll $9, %eax
1245; X64-HSW-NEXT:    leal (%rax,%rdi,8), %eax
1246; X64-HSW-NEXT:    retq
1247;
1248; X64-JAG-LABEL: test_mul_by_520:
1249; X64-JAG:       # %bb.0:
1250; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1251; X64-JAG-NEXT:    movl %edi, %eax
1252; X64-JAG-NEXT:    shll $9, %eax
1253; X64-JAG-NEXT:    leal (%rax,%rdi,8), %eax
1254; X64-JAG-NEXT:    retq
1255;
1256; X86-NOOPT-LABEL: test_mul_by_520:
1257; X86-NOOPT:       # %bb.0:
1258; X86-NOOPT-NEXT:    imull $520, {{[0-9]+}}(%esp), %eax # imm = 0x208
1259; X86-NOOPT-NEXT:    retl
1260;
1261; X64-NOOPT-LABEL: test_mul_by_520:
1262; X64-NOOPT:       # %bb.0:
1263; X64-NOOPT-NEXT:    imull $520, %edi, %eax # imm = 0x208
1264; X64-NOOPT-NEXT:    retq
1265;
1266; X64-SLM-LABEL: test_mul_by_520:
1267; X64-SLM:       # %bb.0:
1268; X64-SLM-NEXT:    imull $520, %edi, %eax # imm = 0x208
1269; X64-SLM-NEXT:    retq
1270  %mul = mul nsw i32 %x, 520
1271  ret i32 %mul
1272}
1273
1274define i32 @test_mul_by_neg10(i32 %x) {
1275; X86-LABEL: test_mul_by_neg10:
1276; X86:       # %bb.0:
1277; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1278; X86-NEXT:    addl %eax, %eax
1279; X86-NEXT:    leal (%eax,%eax,4), %eax
1280; X86-NEXT:    negl %eax
1281; X86-NEXT:    retl
1282;
1283; X64-LABEL: test_mul_by_neg10:
1284; X64:       # %bb.0:
1285; X64-NEXT:    # kill: def $edi killed $edi def $rdi
1286; X64-NEXT:    addl %edi, %edi
1287; X64-NEXT:    leal (%rdi,%rdi,4), %eax
1288; X64-NEXT:    negl %eax
1289; X64-NEXT:    retq
1290;
1291; X86-NOOPT-LABEL: test_mul_by_neg10:
1292; X86-NOOPT:       # %bb.0:
1293; X86-NOOPT-NEXT:    imull $-10, {{[0-9]+}}(%esp), %eax
1294; X86-NOOPT-NEXT:    retl
1295;
1296; X64-NOOPT-LABEL: test_mul_by_neg10:
1297; X64-NOOPT:       # %bb.0:
1298; X64-NOOPT-NEXT:    imull $-10, %edi, %eax
1299; X64-NOOPT-NEXT:    retq
1300  %mul = mul nsw i32 %x, -10
1301  ret i32 %mul
1302}
1303
1304define i32 @test_mul_by_neg36(i32 %x) {
1305; X86-LABEL: test_mul_by_neg36:
1306; X86:       # %bb.0:
1307; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1308; X86-NEXT:    shll $2, %eax
1309; X86-NEXT:    leal (%eax,%eax,8), %eax
1310; X86-NEXT:    negl %eax
1311; X86-NEXT:    retl
1312;
1313; X64-LABEL: test_mul_by_neg36:
1314; X64:       # %bb.0:
1315; X64-NEXT:    # kill: def $edi killed $edi def $rdi
1316; X64-NEXT:    shll $2, %edi
1317; X64-NEXT:    leal (%rdi,%rdi,8), %eax
1318; X64-NEXT:    negl %eax
1319; X64-NEXT:    retq
1320;
1321; X86-NOOPT-LABEL: test_mul_by_neg36:
1322; X86-NOOPT:       # %bb.0:
1323; X86-NOOPT-NEXT:    imull $-36, {{[0-9]+}}(%esp), %eax
1324; X86-NOOPT-NEXT:    retl
1325;
1326; X64-NOOPT-LABEL: test_mul_by_neg36:
1327; X64-NOOPT:       # %bb.0:
1328; X64-NOOPT-NEXT:    imull $-36, %edi, %eax
1329; X64-NOOPT-NEXT:    retq
1330  %mul = mul nsw i32 %x, -36
1331  ret i32 %mul
1332}
1333
1334; (x*9+42)*(x*5+2)
1335define i32 @test_mul_spec(i32 %x) nounwind {
1336; X86-LABEL: test_mul_spec:
1337; X86:       # %bb.0:
1338; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1339; X86-NEXT:    leal 42(%eax,%eax,8), %ecx
1340; X86-NEXT:    leal 2(%eax,%eax,4), %eax
1341; X86-NEXT:    imull %ecx, %eax
1342; X86-NEXT:    retl
1343;
1344; X64-HSW-LABEL: test_mul_spec:
1345; X64-HSW:       # %bb.0:
1346; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1347; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %ecx
1348; X64-HSW-NEXT:    addl $42, %ecx
1349; X64-HSW-NEXT:    leal (%rdi,%rdi,4), %eax
1350; X64-HSW-NEXT:    addl $2, %eax
1351; X64-HSW-NEXT:    imull %ecx, %eax
1352; X64-HSW-NEXT:    retq
1353;
1354; X64-JAG-LABEL: test_mul_spec:
1355; X64-JAG:       # %bb.0:
1356; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1357; X64-JAG-NEXT:    leal 42(%rdi,%rdi,8), %ecx
1358; X64-JAG-NEXT:    leal 2(%rdi,%rdi,4), %eax
1359; X64-JAG-NEXT:    imull %ecx, %eax
1360; X64-JAG-NEXT:    retq
1361;
1362; X86-NOOPT-LABEL: test_mul_spec:
1363; X86-NOOPT:       # %bb.0:
1364; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
1365; X86-NOOPT-NEXT:    leal 42(%eax,%eax,8), %ecx
1366; X86-NOOPT-NEXT:    leal 2(%eax,%eax,4), %eax
1367; X86-NOOPT-NEXT:    imull %ecx, %eax
1368; X86-NOOPT-NEXT:    retl
1369;
1370; HSW-NOOPT-LABEL: test_mul_spec:
1371; HSW-NOOPT:       # %bb.0:
1372; HSW-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
1373; HSW-NOOPT-NEXT:    leal (%rdi,%rdi,8), %ecx
1374; HSW-NOOPT-NEXT:    addl $42, %ecx
1375; HSW-NOOPT-NEXT:    leal (%rdi,%rdi,4), %eax
1376; HSW-NOOPT-NEXT:    addl $2, %eax
1377; HSW-NOOPT-NEXT:    imull %ecx, %eax
1378; HSW-NOOPT-NEXT:    retq
1379;
1380; JAG-NOOPT-LABEL: test_mul_spec:
1381; JAG-NOOPT:       # %bb.0:
1382; JAG-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
1383; JAG-NOOPT-NEXT:    leal 42(%rdi,%rdi,8), %ecx
1384; JAG-NOOPT-NEXT:    leal 2(%rdi,%rdi,4), %eax
1385; JAG-NOOPT-NEXT:    imull %ecx, %eax
1386; JAG-NOOPT-NEXT:    retq
1387;
1388; X64-SLM-LABEL: test_mul_spec:
1389; X64-SLM:       # %bb.0:
1390; X64-SLM-NEXT:    # kill: def $edi killed $edi def $rdi
1391; X64-SLM-NEXT:    leal 42(%rdi,%rdi,8), %ecx
1392; X64-SLM-NEXT:    leal 2(%rdi,%rdi,4), %eax
1393; X64-SLM-NEXT:    imull %ecx, %eax
1394; X64-SLM-NEXT:    retq
1395;
1396; SLM-NOOPT-LABEL: test_mul_spec:
1397; SLM-NOOPT:       # %bb.0:
1398; SLM-NOOPT-NEXT:    # kill: def $edi killed $edi def $rdi
1399; SLM-NOOPT-NEXT:    leal 42(%rdi,%rdi,8), %ecx
1400; SLM-NOOPT-NEXT:    leal 2(%rdi,%rdi,4), %eax
1401; SLM-NOOPT-NEXT:    imull %ecx, %eax
1402; SLM-NOOPT-NEXT:    retq
1403  %mul = mul nsw i32 %x, 9
1404  %add = add nsw i32 %mul, 42
1405  %mul2 = mul nsw i32 %x, 5
1406  %add2 = add nsw i32 %mul2, 2
1407  %mul3 = mul nsw i32 %add, %add2
1408  ret i32 %mul3
1409}
1410
1411; This makes sure we are able to fold the negate generated by the mul expansion
1412; into the next instruction.
1413; FIXME: We make this work.
1414define i32 @mul_neg_fold(i32 %a, i32 %b) {
1415; X86-LABEL: mul_neg_fold:
1416; X86:       # %bb.0:
1417; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1418; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1419; X86-NEXT:    leal (%ecx,%ecx,8), %ecx
1420; X86-NEXT:    subl %ecx, %eax
1421; X86-NEXT:    retl
1422;
1423; X64-HSW-LABEL: mul_neg_fold:
1424; X64-HSW:       # %bb.0:
1425; X64-HSW-NEXT:    movl %esi, %eax
1426; X64-HSW-NEXT:    # kill: def $edi killed $edi def $rdi
1427; X64-HSW-NEXT:    leal (%rdi,%rdi,8), %ecx
1428; X64-HSW-NEXT:    subl %ecx, %eax
1429; X64-HSW-NEXT:    retq
1430;
1431; X64-JAG-LABEL: mul_neg_fold:
1432; X64-JAG:       # %bb.0:
1433; X64-JAG-NEXT:    # kill: def $edi killed $edi def $rdi
1434; X64-JAG-NEXT:    leal (%rdi,%rdi,8), %ecx
1435; X64-JAG-NEXT:    movl %esi, %eax
1436; X64-JAG-NEXT:    subl %ecx, %eax
1437; X64-JAG-NEXT:    retq
1438;
1439; X86-NOOPT-LABEL: mul_neg_fold:
1440; X86-NOOPT:       # %bb.0:
1441; X86-NOOPT-NEXT:    imull $-9, {{[0-9]+}}(%esp), %eax
1442; X86-NOOPT-NEXT:    addl {{[0-9]+}}(%esp), %eax
1443; X86-NOOPT-NEXT:    retl
1444;
1445; X64-NOOPT-LABEL: mul_neg_fold:
1446; X64-NOOPT:       # %bb.0:
1447; X64-NOOPT-NEXT:    imull $-9, %edi, %eax
1448; X64-NOOPT-NEXT:    addl %esi, %eax
1449; X64-NOOPT-NEXT:    retq
1450;
1451; X64-SLM-LABEL: mul_neg_fold:
1452; X64-SLM:       # %bb.0:
1453; X64-SLM-NEXT:    # kill: def $edi killed $edi def $rdi
1454; X64-SLM-NEXT:    movl %esi, %eax
1455; X64-SLM-NEXT:    leal (%rdi,%rdi,8), %ecx
1456; X64-SLM-NEXT:    subl %ecx, %eax
1457; X64-SLM-NEXT:    retq
1458  %c = mul i32 %a, -9
1459  %d = add i32 %b, %c
1460  ret i32 %d
1461}
1462