1658 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=i686-unknown -mul-constant-optimization=false | FileCheck %s --check-prefixes=X86-NOOPT4; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=haswell | FileCheck %s --check-prefixes=X64,X64-OPT,X64-HSW5; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=btver2 | FileCheck %s --check-prefixes=X64,X64-OPT,X64-JAG6; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=slm | FileCheck %s --check-prefixes=X64,X64-OPT,X64-SLM7; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -mcpu=haswell | FileCheck %s --check-prefixes=X64,X64-NOOPT,X64-HSW-NOOPT8; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -mcpu=btver2 | FileCheck %s --check-prefixes=X64,X64-NOOPT,X64-JAG-NOOPT9; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -mcpu=slm | FileCheck %s --check-prefixes=X64,X64-NOOPT,X64-SLM-NOOPT10 11define 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), %eax15; X86-NEXT: movl {{[0-9]+}}(%esp), %edx16; X86-NEXT: retl17;18; X86-NOOPT-LABEL: test_mul_by_1:19; X86-NOOPT: # %bb.0:20; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax21; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edx22; X86-NOOPT-NEXT: retl23;24; X64-LABEL: test_mul_by_1:25; X64: # %bb.0:26; X64-NEXT: movq %rdi, %rax27; X64-NEXT: retq28 %mul = mul nsw i64 %x, 129 ret i64 %mul30}31 32define i64 @test_mul_by_2(i64 %x) {33; X86-LABEL: test_mul_by_2:34; X86: # %bb.0:35; X86-NEXT: movl {{[0-9]+}}(%esp), %eax36; X86-NEXT: movl {{[0-9]+}}(%esp), %edx37; X86-NEXT: shldl $1, %eax, %edx38; X86-NEXT: addl %eax, %eax39; X86-NEXT: retl40;41; X86-NOOPT-LABEL: test_mul_by_2:42; X86-NOOPT: # %bb.0:43; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax44; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edx45; X86-NOOPT-NEXT: shldl $1, %eax, %edx46; X86-NOOPT-NEXT: addl %eax, %eax47; X86-NOOPT-NEXT: retl48;49; X64-LABEL: test_mul_by_2:50; X64: # %bb.0:51; X64-NEXT: leaq (%rdi,%rdi), %rax52; X64-NEXT: retq53 %mul = mul nsw i64 %x, 254 ret i64 %mul55}56 57define i64 @test_mul_by_3(i64 %x) {58; X86-LABEL: test_mul_by_3:59; X86: # %bb.0:60; X86-NEXT: movl {{[0-9]+}}(%esp), %eax61; X86-NEXT: leal (%eax,%eax,2), %ecx62; X86-NEXT: movl $3, %eax63; X86-NEXT: mull {{[0-9]+}}(%esp)64; X86-NEXT: addl %ecx, %edx65; X86-NEXT: retl66;67; X86-NOOPT-LABEL: test_mul_by_3:68; X86-NOOPT: # %bb.0:69; X86-NOOPT-NEXT: movl $3, %eax70; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)71; X86-NOOPT-NEXT: imull $3, {{[0-9]+}}(%esp), %ecx72; X86-NOOPT-NEXT: addl %ecx, %edx73; X86-NOOPT-NEXT: retl74;75; X64-LABEL: test_mul_by_3:76; X64: # %bb.0:77; X64-NEXT: leaq (%rdi,%rdi,2), %rax78; X64-NEXT: retq79 %mul = mul nsw i64 %x, 380 ret i64 %mul81}82 83define i64 @test_mul_by_4(i64 %x) {84; X86-LABEL: test_mul_by_4:85; X86: # %bb.0:86; X86-NEXT: movl {{[0-9]+}}(%esp), %eax87; X86-NEXT: movl {{[0-9]+}}(%esp), %edx88; X86-NEXT: shldl $2, %eax, %edx89; X86-NEXT: shll $2, %eax90; X86-NEXT: retl91;92; X86-NOOPT-LABEL: test_mul_by_4:93; X86-NOOPT: # %bb.0:94; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax95; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edx96; X86-NOOPT-NEXT: shldl $2, %eax, %edx97; X86-NOOPT-NEXT: shll $2, %eax98; X86-NOOPT-NEXT: retl99;100; X64-LABEL: test_mul_by_4:101; X64: # %bb.0:102; X64-NEXT: leaq (,%rdi,4), %rax103; X64-NEXT: retq104 %mul = mul nsw i64 %x, 4105 ret i64 %mul106}107 108define i64 @test_mul_by_5(i64 %x) {109; X86-LABEL: test_mul_by_5:110; X86: # %bb.0:111; X86-NEXT: movl {{[0-9]+}}(%esp), %eax112; X86-NEXT: leal (%eax,%eax,4), %ecx113; X86-NEXT: movl $5, %eax114; X86-NEXT: mull {{[0-9]+}}(%esp)115; X86-NEXT: addl %ecx, %edx116; X86-NEXT: retl117;118; X86-NOOPT-LABEL: test_mul_by_5:119; X86-NOOPT: # %bb.0:120; X86-NOOPT-NEXT: movl $5, %eax121; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)122; X86-NOOPT-NEXT: imull $5, {{[0-9]+}}(%esp), %ecx123; X86-NOOPT-NEXT: addl %ecx, %edx124; X86-NOOPT-NEXT: retl125;126; X64-LABEL: test_mul_by_5:127; X64: # %bb.0:128; X64-NEXT: leaq (%rdi,%rdi,4), %rax129; X64-NEXT: retq130 %mul = mul nsw i64 %x, 5131 ret i64 %mul132}133 134define i64 @test_mul_by_6(i64 %x) {135; X86-LABEL: test_mul_by_6:136; X86: # %bb.0:137; X86-NEXT: movl {{[0-9]+}}(%esp), %eax138; X86-NEXT: leal (%eax,%eax,2), %ecx139; X86-NEXT: movl $6, %eax140; X86-NEXT: mull {{[0-9]+}}(%esp)141; X86-NEXT: leal (%edx,%ecx,2), %edx142; X86-NEXT: retl143;144; X86-NOOPT-LABEL: test_mul_by_6:145; X86-NOOPT: # %bb.0:146; X86-NOOPT-NEXT: movl $6, %eax147; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)148; X86-NOOPT-NEXT: imull $6, {{[0-9]+}}(%esp), %ecx149; X86-NOOPT-NEXT: addl %ecx, %edx150; X86-NOOPT-NEXT: retl151;152; X64-OPT-LABEL: test_mul_by_6:153; X64-OPT: # %bb.0:154; X64-OPT-NEXT: addq %rdi, %rdi155; X64-OPT-NEXT: leaq (%rdi,%rdi,2), %rax156; X64-OPT-NEXT: retq157;158; X64-NOOPT-LABEL: test_mul_by_6:159; X64-NOOPT: # %bb.0:160; X64-NOOPT-NEXT: imulq $6, %rdi, %rax161; X64-NOOPT-NEXT: retq162 %mul = mul nsw i64 %x, 6163 ret i64 %mul164}165 166define i64 @test_mul_by_7(i64 %x) {167; X86-LABEL: test_mul_by_7:168; X86: # %bb.0:169; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx170; X86-NEXT: movl $7, %eax171; X86-NEXT: mull {{[0-9]+}}(%esp)172; X86-NEXT: leal (%edx,%ecx,8), %edx173; X86-NEXT: subl %ecx, %edx174; X86-NEXT: retl175;176; X86-NOOPT-LABEL: test_mul_by_7:177; X86-NOOPT: # %bb.0:178; X86-NOOPT-NEXT: movl $7, %eax179; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)180; X86-NOOPT-NEXT: imull $7, {{[0-9]+}}(%esp), %ecx181; X86-NOOPT-NEXT: addl %ecx, %edx182; X86-NOOPT-NEXT: retl183;184; X64-OPT-LABEL: test_mul_by_7:185; X64-OPT: # %bb.0:186; X64-OPT-NEXT: leaq (,%rdi,8), %rax187; X64-OPT-NEXT: subq %rdi, %rax188; X64-OPT-NEXT: retq189;190; X64-NOOPT-LABEL: test_mul_by_7:191; X64-NOOPT: # %bb.0:192; X64-NOOPT-NEXT: imulq $7, %rdi, %rax193; X64-NOOPT-NEXT: retq194 %mul = mul nsw i64 %x, 7195 ret i64 %mul196}197 198define i64 @test_mul_by_8(i64 %x) {199; X86-LABEL: test_mul_by_8:200; X86: # %bb.0:201; X86-NEXT: movl {{[0-9]+}}(%esp), %eax202; X86-NEXT: movl {{[0-9]+}}(%esp), %edx203; X86-NEXT: shldl $3, %eax, %edx204; X86-NEXT: shll $3, %eax205; X86-NEXT: retl206;207; X86-NOOPT-LABEL: test_mul_by_8:208; X86-NOOPT: # %bb.0:209; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax210; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edx211; X86-NOOPT-NEXT: shldl $3, %eax, %edx212; X86-NOOPT-NEXT: shll $3, %eax213; X86-NOOPT-NEXT: retl214;215; X64-LABEL: test_mul_by_8:216; X64: # %bb.0:217; X64-NEXT: leaq (,%rdi,8), %rax218; X64-NEXT: retq219 %mul = mul nsw i64 %x, 8220 ret i64 %mul221}222 223define i64 @test_mul_by_9(i64 %x) {224; X86-LABEL: test_mul_by_9:225; X86: # %bb.0:226; X86-NEXT: movl {{[0-9]+}}(%esp), %eax227; X86-NEXT: leal (%eax,%eax,8), %ecx228; X86-NEXT: movl $9, %eax229; X86-NEXT: mull {{[0-9]+}}(%esp)230; X86-NEXT: addl %ecx, %edx231; X86-NEXT: retl232;233; X86-NOOPT-LABEL: test_mul_by_9:234; X86-NOOPT: # %bb.0:235; X86-NOOPT-NEXT: movl $9, %eax236; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)237; X86-NOOPT-NEXT: imull $9, {{[0-9]+}}(%esp), %ecx238; X86-NOOPT-NEXT: addl %ecx, %edx239; X86-NOOPT-NEXT: retl240;241; X64-LABEL: test_mul_by_9:242; X64: # %bb.0:243; X64-NEXT: leaq (%rdi,%rdi,8), %rax244; X64-NEXT: retq245 %mul = mul nsw i64 %x, 9246 ret i64 %mul247}248 249define i64 @test_mul_by_10(i64 %x) {250; X86-LABEL: test_mul_by_10:251; X86: # %bb.0:252; X86-NEXT: movl {{[0-9]+}}(%esp), %eax253; X86-NEXT: leal (%eax,%eax,4), %ecx254; X86-NEXT: movl $10, %eax255; X86-NEXT: mull {{[0-9]+}}(%esp)256; X86-NEXT: leal (%edx,%ecx,2), %edx257; X86-NEXT: retl258;259; X86-NOOPT-LABEL: test_mul_by_10:260; X86-NOOPT: # %bb.0:261; X86-NOOPT-NEXT: movl $10, %eax262; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)263; X86-NOOPT-NEXT: imull $10, {{[0-9]+}}(%esp), %ecx264; X86-NOOPT-NEXT: addl %ecx, %edx265; X86-NOOPT-NEXT: retl266;267; X64-OPT-LABEL: test_mul_by_10:268; X64-OPT: # %bb.0:269; X64-OPT-NEXT: addq %rdi, %rdi270; X64-OPT-NEXT: leaq (%rdi,%rdi,4), %rax271; X64-OPT-NEXT: retq272;273; X64-NOOPT-LABEL: test_mul_by_10:274; X64-NOOPT: # %bb.0:275; X64-NOOPT-NEXT: imulq $10, %rdi, %rax276; X64-NOOPT-NEXT: retq277 %mul = mul nsw i64 %x, 10278 ret i64 %mul279}280 281define i64 @test_mul_by_11(i64 %x) {282; X86-LABEL: test_mul_by_11:283; X86: # %bb.0:284; X86-NEXT: movl {{[0-9]+}}(%esp), %eax285; X86-NEXT: leal (%eax,%eax,4), %ecx286; X86-NEXT: leal (%eax,%ecx,2), %ecx287; X86-NEXT: movl $11, %eax288; X86-NEXT: mull {{[0-9]+}}(%esp)289; X86-NEXT: addl %ecx, %edx290; X86-NEXT: retl291;292; X86-NOOPT-LABEL: test_mul_by_11:293; X86-NOOPT: # %bb.0:294; X86-NOOPT-NEXT: movl $11, %eax295; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)296; X86-NOOPT-NEXT: imull $11, {{[0-9]+}}(%esp), %ecx297; X86-NOOPT-NEXT: addl %ecx, %edx298; X86-NOOPT-NEXT: retl299;300; X64-HSW-LABEL: test_mul_by_11:301; X64-HSW: # %bb.0:302; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax303; X64-HSW-NEXT: leaq (%rdi,%rax,2), %rax304; X64-HSW-NEXT: retq305;306; X64-JAG-LABEL: test_mul_by_11:307; X64-JAG: # %bb.0:308; X64-JAG-NEXT: leaq (%rdi,%rdi,4), %rax309; X64-JAG-NEXT: leaq (%rdi,%rax,2), %rax310; X64-JAG-NEXT: retq311;312; X64-SLM-LABEL: test_mul_by_11:313; X64-SLM: # %bb.0:314; X64-SLM-NEXT: imulq $11, %rdi, %rax315; X64-SLM-NEXT: retq316;317; X64-NOOPT-LABEL: test_mul_by_11:318; X64-NOOPT: # %bb.0:319; X64-NOOPT-NEXT: imulq $11, %rdi, %rax320; X64-NOOPT-NEXT: retq321 %mul = mul nsw i64 %x, 11322 ret i64 %mul323}324 325define i64 @test_mul_by_12(i64 %x) {326; X86-LABEL: test_mul_by_12:327; X86: # %bb.0:328; X86-NEXT: movl {{[0-9]+}}(%esp), %eax329; X86-NEXT: leal (%eax,%eax,2), %ecx330; X86-NEXT: movl $12, %eax331; X86-NEXT: mull {{[0-9]+}}(%esp)332; X86-NEXT: leal (%edx,%ecx,4), %edx333; X86-NEXT: retl334;335; X86-NOOPT-LABEL: test_mul_by_12:336; X86-NOOPT: # %bb.0:337; X86-NOOPT-NEXT: movl $12, %eax338; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)339; X86-NOOPT-NEXT: imull $12, {{[0-9]+}}(%esp), %ecx340; X86-NOOPT-NEXT: addl %ecx, %edx341; X86-NOOPT-NEXT: retl342;343; X64-OPT-LABEL: test_mul_by_12:344; X64-OPT: # %bb.0:345; X64-OPT-NEXT: shlq $2, %rdi346; X64-OPT-NEXT: leaq (%rdi,%rdi,2), %rax347; X64-OPT-NEXT: retq348;349; X64-NOOPT-LABEL: test_mul_by_12:350; X64-NOOPT: # %bb.0:351; X64-NOOPT-NEXT: imulq $12, %rdi, %rax352; X64-NOOPT-NEXT: retq353 %mul = mul nsw i64 %x, 12354 ret i64 %mul355}356 357define i64 @test_mul_by_13(i64 %x) {358; X86-LABEL: test_mul_by_13:359; X86: # %bb.0:360; X86-NEXT: movl {{[0-9]+}}(%esp), %eax361; X86-NEXT: leal (%eax,%eax,2), %ecx362; X86-NEXT: leal (%eax,%ecx,4), %ecx363; X86-NEXT: movl $13, %eax364; X86-NEXT: mull {{[0-9]+}}(%esp)365; X86-NEXT: addl %ecx, %edx366; X86-NEXT: retl367;368; X86-NOOPT-LABEL: test_mul_by_13:369; X86-NOOPT: # %bb.0:370; X86-NOOPT-NEXT: movl $13, %eax371; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)372; X86-NOOPT-NEXT: imull $13, {{[0-9]+}}(%esp), %ecx373; X86-NOOPT-NEXT: addl %ecx, %edx374; X86-NOOPT-NEXT: retl375;376; X64-HSW-LABEL: test_mul_by_13:377; X64-HSW: # %bb.0:378; X64-HSW-NEXT: leaq (%rdi,%rdi,2), %rax379; X64-HSW-NEXT: leaq (%rdi,%rax,4), %rax380; X64-HSW-NEXT: retq381;382; X64-JAG-LABEL: test_mul_by_13:383; X64-JAG: # %bb.0:384; X64-JAG-NEXT: leaq (%rdi,%rdi,2), %rax385; X64-JAG-NEXT: leaq (%rdi,%rax,4), %rax386; X64-JAG-NEXT: retq387;388; X64-SLM-LABEL: test_mul_by_13:389; X64-SLM: # %bb.0:390; X64-SLM-NEXT: imulq $13, %rdi, %rax391; X64-SLM-NEXT: retq392;393; X64-NOOPT-LABEL: test_mul_by_13:394; X64-NOOPT: # %bb.0:395; X64-NOOPT-NEXT: imulq $13, %rdi, %rax396; X64-NOOPT-NEXT: retq397 %mul = mul nsw i64 %x, 13398 ret i64 %mul399}400 401define i64 @test_mul_by_14(i64 %x) {402; X86-LABEL: test_mul_by_14:403; X86: # %bb.0:404; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx405; X86-NEXT: leal (%ecx,%ecx), %eax406; X86-NEXT: shll $4, %ecx407; X86-NEXT: subl %eax, %ecx408; X86-NEXT: movl $14, %eax409; X86-NEXT: mull {{[0-9]+}}(%esp)410; X86-NEXT: addl %ecx, %edx411; X86-NEXT: retl412;413; X86-NOOPT-LABEL: test_mul_by_14:414; X86-NOOPT: # %bb.0:415; X86-NOOPT-NEXT: movl $14, %eax416; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)417; X86-NOOPT-NEXT: imull $14, {{[0-9]+}}(%esp), %ecx418; X86-NOOPT-NEXT: addl %ecx, %edx419; X86-NOOPT-NEXT: retl420;421; X64-OPT-LABEL: test_mul_by_14:422; X64-OPT: # %bb.0:423; X64-OPT-NEXT: movq %rdi, %rax424; X64-OPT-NEXT: shlq $4, %rax425; X64-OPT-NEXT: subq %rdi, %rax426; X64-OPT-NEXT: subq %rdi, %rax427; X64-OPT-NEXT: retq428;429; X64-NOOPT-LABEL: test_mul_by_14:430; X64-NOOPT: # %bb.0:431; X64-NOOPT-NEXT: imulq $14, %rdi, %rax432; X64-NOOPT-NEXT: retq433 %mul = mul nsw i64 %x, 14434 ret i64 %mul435}436 437define i64 @test_mul_by_15(i64 %x) {438; X86-LABEL: test_mul_by_15:439; X86: # %bb.0:440; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx441; X86-NEXT: movl $15, %eax442; X86-NEXT: mull {{[0-9]+}}(%esp)443; X86-NEXT: leal (%ecx,%ecx,4), %ecx444; X86-NEXT: leal (%ecx,%ecx,2), %ecx445; X86-NEXT: addl %ecx, %edx446; X86-NEXT: retl447;448; X86-NOOPT-LABEL: test_mul_by_15:449; X86-NOOPT: # %bb.0:450; X86-NOOPT-NEXT: movl $15, %eax451; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)452; X86-NOOPT-NEXT: imull $15, {{[0-9]+}}(%esp), %ecx453; X86-NOOPT-NEXT: addl %ecx, %edx454; X86-NOOPT-NEXT: retl455;456; X64-OPT-LABEL: test_mul_by_15:457; X64-OPT: # %bb.0:458; X64-OPT-NEXT: leaq (%rdi,%rdi,4), %rax459; X64-OPT-NEXT: leaq (%rax,%rax,2), %rax460; X64-OPT-NEXT: retq461;462; X64-NOOPT-LABEL: test_mul_by_15:463; X64-NOOPT: # %bb.0:464; X64-NOOPT-NEXT: imulq $15, %rdi, %rax465; X64-NOOPT-NEXT: retq466 %mul = mul nsw i64 %x, 15467 ret i64 %mul468}469 470define i64 @test_mul_by_16(i64 %x) {471; X86-LABEL: test_mul_by_16:472; X86: # %bb.0:473; X86-NEXT: movl {{[0-9]+}}(%esp), %eax474; X86-NEXT: movl {{[0-9]+}}(%esp), %edx475; X86-NEXT: shldl $4, %eax, %edx476; X86-NEXT: shll $4, %eax477; X86-NEXT: retl478;479; X86-NOOPT-LABEL: test_mul_by_16:480; X86-NOOPT: # %bb.0:481; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax482; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edx483; X86-NOOPT-NEXT: shldl $4, %eax, %edx484; X86-NOOPT-NEXT: shll $4, %eax485; X86-NOOPT-NEXT: retl486;487; X64-LABEL: test_mul_by_16:488; X64: # %bb.0:489; X64-NEXT: movq %rdi, %rax490; X64-NEXT: shlq $4, %rax491; X64-NEXT: retq492 %mul = mul nsw i64 %x, 16493 ret i64 %mul494}495 496define i64 @test_mul_by_17(i64 %x) {497; X86-LABEL: test_mul_by_17:498; X86: # %bb.0:499; X86-NEXT: movl {{[0-9]+}}(%esp), %eax500; X86-NEXT: movl %eax, %ecx501; X86-NEXT: shll $4, %ecx502; X86-NEXT: addl %eax, %ecx503; X86-NEXT: movl $17, %eax504; X86-NEXT: mull {{[0-9]+}}(%esp)505; X86-NEXT: addl %ecx, %edx506; X86-NEXT: retl507;508; X86-NOOPT-LABEL: test_mul_by_17:509; X86-NOOPT: # %bb.0:510; X86-NOOPT-NEXT: movl $17, %eax511; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)512; X86-NOOPT-NEXT: imull $17, {{[0-9]+}}(%esp), %ecx513; X86-NOOPT-NEXT: addl %ecx, %edx514; X86-NOOPT-NEXT: retl515;516; X64-OPT-LABEL: test_mul_by_17:517; X64-OPT: # %bb.0:518; X64-OPT-NEXT: movq %rdi, %rax519; X64-OPT-NEXT: shlq $4, %rax520; X64-OPT-NEXT: addq %rdi, %rax521; X64-OPT-NEXT: retq522;523; X64-NOOPT-LABEL: test_mul_by_17:524; X64-NOOPT: # %bb.0:525; X64-NOOPT-NEXT: imulq $17, %rdi, %rax526; X64-NOOPT-NEXT: retq527 %mul = mul nsw i64 %x, 17528 ret i64 %mul529}530 531define i64 @test_mul_by_18(i64 %x) {532; X86-LABEL: test_mul_by_18:533; X86: # %bb.0:534; X86-NEXT: movl {{[0-9]+}}(%esp), %eax535; X86-NEXT: leal (%eax,%eax,8), %ecx536; X86-NEXT: movl $18, %eax537; X86-NEXT: mull {{[0-9]+}}(%esp)538; X86-NEXT: leal (%edx,%ecx,2), %edx539; X86-NEXT: retl540;541; X86-NOOPT-LABEL: test_mul_by_18:542; X86-NOOPT: # %bb.0:543; X86-NOOPT-NEXT: movl $18, %eax544; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)545; X86-NOOPT-NEXT: imull $18, {{[0-9]+}}(%esp), %ecx546; X86-NOOPT-NEXT: addl %ecx, %edx547; X86-NOOPT-NEXT: retl548;549; X64-OPT-LABEL: test_mul_by_18:550; X64-OPT: # %bb.0:551; X64-OPT-NEXT: addq %rdi, %rdi552; X64-OPT-NEXT: leaq (%rdi,%rdi,8), %rax553; X64-OPT-NEXT: retq554;555; X64-NOOPT-LABEL: test_mul_by_18:556; X64-NOOPT: # %bb.0:557; X64-NOOPT-NEXT: imulq $18, %rdi, %rax558; X64-NOOPT-NEXT: retq559 %mul = mul nsw i64 %x, 18560 ret i64 %mul561}562 563define i64 @test_mul_by_19(i64 %x) {564; X86-LABEL: test_mul_by_19:565; X86: # %bb.0:566; X86-NEXT: movl {{[0-9]+}}(%esp), %eax567; X86-NEXT: leal (%eax,%eax,8), %ecx568; X86-NEXT: leal (%eax,%ecx,2), %ecx569; X86-NEXT: movl $19, %eax570; X86-NEXT: mull {{[0-9]+}}(%esp)571; X86-NEXT: addl %ecx, %edx572; X86-NEXT: retl573;574; X86-NOOPT-LABEL: test_mul_by_19:575; X86-NOOPT: # %bb.0:576; X86-NOOPT-NEXT: movl $19, %eax577; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)578; X86-NOOPT-NEXT: imull $19, {{[0-9]+}}(%esp), %ecx579; X86-NOOPT-NEXT: addl %ecx, %edx580; X86-NOOPT-NEXT: retl581;582; X64-HSW-LABEL: test_mul_by_19:583; X64-HSW: # %bb.0:584; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rax585; X64-HSW-NEXT: leaq (%rdi,%rax,2), %rax586; X64-HSW-NEXT: retq587;588; X64-JAG-LABEL: test_mul_by_19:589; X64-JAG: # %bb.0:590; X64-JAG-NEXT: leaq (%rdi,%rdi,8), %rax591; X64-JAG-NEXT: leaq (%rdi,%rax,2), %rax592; X64-JAG-NEXT: retq593;594; X64-SLM-LABEL: test_mul_by_19:595; X64-SLM: # %bb.0:596; X64-SLM-NEXT: imulq $19, %rdi, %rax597; X64-SLM-NEXT: retq598;599; X64-NOOPT-LABEL: test_mul_by_19:600; X64-NOOPT: # %bb.0:601; X64-NOOPT-NEXT: imulq $19, %rdi, %rax602; X64-NOOPT-NEXT: retq603 %mul = mul nsw i64 %x, 19604 ret i64 %mul605}606 607define i64 @test_mul_by_20(i64 %x) {608; X86-LABEL: test_mul_by_20:609; X86: # %bb.0:610; X86-NEXT: movl {{[0-9]+}}(%esp), %eax611; X86-NEXT: leal (%eax,%eax,4), %ecx612; X86-NEXT: movl $20, %eax613; X86-NEXT: mull {{[0-9]+}}(%esp)614; X86-NEXT: leal (%edx,%ecx,4), %edx615; X86-NEXT: retl616;617; X86-NOOPT-LABEL: test_mul_by_20:618; X86-NOOPT: # %bb.0:619; X86-NOOPT-NEXT: movl $20, %eax620; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)621; X86-NOOPT-NEXT: imull $20, {{[0-9]+}}(%esp), %ecx622; X86-NOOPT-NEXT: addl %ecx, %edx623; X86-NOOPT-NEXT: retl624;625; X64-OPT-LABEL: test_mul_by_20:626; X64-OPT: # %bb.0:627; X64-OPT-NEXT: shlq $2, %rdi628; X64-OPT-NEXT: leaq (%rdi,%rdi,4), %rax629; X64-OPT-NEXT: retq630;631; X64-NOOPT-LABEL: test_mul_by_20:632; X64-NOOPT: # %bb.0:633; X64-NOOPT-NEXT: imulq $20, %rdi, %rax634; X64-NOOPT-NEXT: retq635 %mul = mul nsw i64 %x, 20636 ret i64 %mul637}638 639define i64 @test_mul_by_21(i64 %x) {640; X86-LABEL: test_mul_by_21:641; X86: # %bb.0:642; X86-NEXT: movl {{[0-9]+}}(%esp), %eax643; X86-NEXT: leal (%eax,%eax,4), %ecx644; X86-NEXT: leal (%eax,%ecx,4), %ecx645; X86-NEXT: movl $21, %eax646; X86-NEXT: mull {{[0-9]+}}(%esp)647; X86-NEXT: addl %ecx, %edx648; X86-NEXT: retl649;650; X86-NOOPT-LABEL: test_mul_by_21:651; X86-NOOPT: # %bb.0:652; X86-NOOPT-NEXT: movl $21, %eax653; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)654; X86-NOOPT-NEXT: imull $21, {{[0-9]+}}(%esp), %ecx655; X86-NOOPT-NEXT: addl %ecx, %edx656; X86-NOOPT-NEXT: retl657;658; X64-HSW-LABEL: test_mul_by_21:659; X64-HSW: # %bb.0:660; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax661; X64-HSW-NEXT: leaq (%rdi,%rax,4), %rax662; X64-HSW-NEXT: retq663;664; X64-JAG-LABEL: test_mul_by_21:665; X64-JAG: # %bb.0:666; X64-JAG-NEXT: leaq (%rdi,%rdi,4), %rax667; X64-JAG-NEXT: leaq (%rdi,%rax,4), %rax668; X64-JAG-NEXT: retq669;670; X64-SLM-LABEL: test_mul_by_21:671; X64-SLM: # %bb.0:672; X64-SLM-NEXT: imulq $21, %rdi, %rax673; X64-SLM-NEXT: retq674;675; X64-NOOPT-LABEL: test_mul_by_21:676; X64-NOOPT: # %bb.0:677; X64-NOOPT-NEXT: imulq $21, %rdi, %rax678; X64-NOOPT-NEXT: retq679 %mul = mul nsw i64 %x, 21680 ret i64 %mul681}682 683define i64 @test_mul_by_22(i64 %x) {684; X86-LABEL: test_mul_by_22:685; X86: # %bb.0:686; X86-NEXT: pushl %esi687; X86-NEXT: .cfi_def_cfa_offset 8688; X86-NEXT: .cfi_offset %esi, -8689; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx690; X86-NEXT: leal (%ecx,%ecx,4), %eax691; X86-NEXT: leal (%ecx,%eax,4), %esi692; X86-NEXT: movl $22, %eax693; X86-NEXT: mull {{[0-9]+}}(%esp)694; X86-NEXT: addl %ecx, %edx695; X86-NEXT: addl %esi, %edx696; X86-NEXT: popl %esi697; X86-NEXT: .cfi_def_cfa_offset 4698; X86-NEXT: retl699;700; X86-NOOPT-LABEL: test_mul_by_22:701; X86-NOOPT: # %bb.0:702; X86-NOOPT-NEXT: movl $22, %eax703; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)704; X86-NOOPT-NEXT: imull $22, {{[0-9]+}}(%esp), %ecx705; X86-NOOPT-NEXT: addl %ecx, %edx706; X86-NOOPT-NEXT: retl707;708; X64-HSW-LABEL: test_mul_by_22:709; X64-HSW: # %bb.0:710; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax711; X64-HSW-NEXT: leaq (%rdi,%rax,4), %rax712; X64-HSW-NEXT: addq %rdi, %rax713; X64-HSW-NEXT: retq714;715; X64-JAG-LABEL: test_mul_by_22:716; X64-JAG: # %bb.0:717; X64-JAG-NEXT: leaq (%rdi,%rdi,4), %rax718; X64-JAG-NEXT: leaq (%rdi,%rax,4), %rax719; X64-JAG-NEXT: addq %rdi, %rax720; X64-JAG-NEXT: retq721;722; X64-SLM-LABEL: test_mul_by_22:723; X64-SLM: # %bb.0:724; X64-SLM-NEXT: imulq $22, %rdi, %rax725; X64-SLM-NEXT: retq726;727; X64-NOOPT-LABEL: test_mul_by_22:728; X64-NOOPT: # %bb.0:729; X64-NOOPT-NEXT: imulq $22, %rdi, %rax730; X64-NOOPT-NEXT: retq731 %mul = mul nsw i64 %x, 22732 ret i64 %mul733}734 735define i64 @test_mul_by_23(i64 %x) nounwind {736; X86-LABEL: test_mul_by_23:737; X86: # %bb.0:738; X86-NEXT: pushl %esi739; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx740; X86-NEXT: leal (%ecx,%ecx,2), %esi741; X86-NEXT: movl $23, %eax742; X86-NEXT: mull {{[0-9]+}}(%esp)743; X86-NEXT: leal (%edx,%esi,8), %edx744; X86-NEXT: subl %ecx, %edx745; X86-NEXT: popl %esi746; X86-NEXT: retl747;748; X86-NOOPT-LABEL: test_mul_by_23:749; X86-NOOPT: # %bb.0:750; X86-NOOPT-NEXT: movl $23, %eax751; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)752; X86-NOOPT-NEXT: imull $23, {{[0-9]+}}(%esp), %ecx753; X86-NOOPT-NEXT: addl %ecx, %edx754; X86-NOOPT-NEXT: retl755;756; X64-HSW-LABEL: test_mul_by_23:757; X64-HSW: # %bb.0:758; X64-HSW-NEXT: leaq (%rdi,%rdi,2), %rax759; X64-HSW-NEXT: shlq $3, %rax760; X64-HSW-NEXT: subq %rdi, %rax761; X64-HSW-NEXT: retq762;763; X64-JAG-LABEL: test_mul_by_23:764; X64-JAG: # %bb.0:765; X64-JAG-NEXT: leaq (%rdi,%rdi,2), %rax766; X64-JAG-NEXT: shlq $3, %rax767; X64-JAG-NEXT: subq %rdi, %rax768; X64-JAG-NEXT: retq769;770; X64-SLM-LABEL: test_mul_by_23:771; X64-SLM: # %bb.0:772; X64-SLM-NEXT: imulq $23, %rdi, %rax773; X64-SLM-NEXT: retq774;775; X64-NOOPT-LABEL: test_mul_by_23:776; X64-NOOPT: # %bb.0:777; X64-NOOPT-NEXT: imulq $23, %rdi, %rax778; X64-NOOPT-NEXT: retq779 %mul = mul nsw i64 %x, 23780 ret i64 %mul781}782 783define i64 @test_mul_by_24(i64 %x) {784; X86-LABEL: test_mul_by_24:785; X86: # %bb.0:786; X86-NEXT: movl {{[0-9]+}}(%esp), %eax787; X86-NEXT: leal (%eax,%eax,2), %ecx788; X86-NEXT: movl $24, %eax789; X86-NEXT: mull {{[0-9]+}}(%esp)790; X86-NEXT: leal (%edx,%ecx,8), %edx791; X86-NEXT: retl792;793; X86-NOOPT-LABEL: test_mul_by_24:794; X86-NOOPT: # %bb.0:795; X86-NOOPT-NEXT: movl $24, %eax796; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)797; X86-NOOPT-NEXT: imull $24, {{[0-9]+}}(%esp), %ecx798; X86-NOOPT-NEXT: addl %ecx, %edx799; X86-NOOPT-NEXT: retl800;801; X64-OPT-LABEL: test_mul_by_24:802; X64-OPT: # %bb.0:803; X64-OPT-NEXT: shlq $3, %rdi804; X64-OPT-NEXT: leaq (%rdi,%rdi,2), %rax805; X64-OPT-NEXT: retq806;807; X64-NOOPT-LABEL: test_mul_by_24:808; X64-NOOPT: # %bb.0:809; X64-NOOPT-NEXT: imulq $24, %rdi, %rax810; X64-NOOPT-NEXT: retq811 %mul = mul nsw i64 %x, 24812 ret i64 %mul813}814 815define i64 @test_mul_by_25(i64 %x) {816; X86-LABEL: test_mul_by_25:817; X86: # %bb.0:818; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx819; X86-NEXT: movl $25, %eax820; X86-NEXT: mull {{[0-9]+}}(%esp)821; X86-NEXT: leal (%ecx,%ecx,4), %ecx822; X86-NEXT: leal (%ecx,%ecx,4), %ecx823; X86-NEXT: addl %ecx, %edx824; X86-NEXT: retl825;826; X86-NOOPT-LABEL: test_mul_by_25:827; X86-NOOPT: # %bb.0:828; X86-NOOPT-NEXT: movl $25, %eax829; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)830; X86-NOOPT-NEXT: imull $25, {{[0-9]+}}(%esp), %ecx831; X86-NOOPT-NEXT: addl %ecx, %edx832; X86-NOOPT-NEXT: retl833;834; X64-OPT-LABEL: test_mul_by_25:835; X64-OPT: # %bb.0:836; X64-OPT-NEXT: leaq (%rdi,%rdi,4), %rax837; X64-OPT-NEXT: leaq (%rax,%rax,4), %rax838; X64-OPT-NEXT: retq839;840; X64-NOOPT-LABEL: test_mul_by_25:841; X64-NOOPT: # %bb.0:842; X64-NOOPT-NEXT: imulq $25, %rdi, %rax843; X64-NOOPT-NEXT: retq844 %mul = mul nsw i64 %x, 25845 ret i64 %mul846}847 848define i64 @test_mul_by_26(i64 %x) {849; X86-LABEL: test_mul_by_26:850; X86: # %bb.0:851; X86-NEXT: pushl %esi852; X86-NEXT: .cfi_def_cfa_offset 8853; X86-NEXT: .cfi_offset %esi, -8854; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx855; X86-NEXT: leal (%ecx,%ecx,4), %eax856; X86-NEXT: leal (%eax,%eax,4), %esi857; X86-NEXT: movl $26, %eax858; X86-NEXT: mull {{[0-9]+}}(%esp)859; X86-NEXT: addl %ecx, %edx860; X86-NEXT: addl %esi, %edx861; X86-NEXT: popl %esi862; X86-NEXT: .cfi_def_cfa_offset 4863; X86-NEXT: retl864;865; X86-NOOPT-LABEL: test_mul_by_26:866; X86-NOOPT: # %bb.0:867; X86-NOOPT-NEXT: movl $26, %eax868; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)869; X86-NOOPT-NEXT: imull $26, {{[0-9]+}}(%esp), %ecx870; X86-NOOPT-NEXT: addl %ecx, %edx871; X86-NOOPT-NEXT: retl872;873; X64-HSW-LABEL: test_mul_by_26:874; X64-HSW: # %bb.0:875; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax876; X64-HSW-NEXT: leaq (%rax,%rax,4), %rax877; X64-HSW-NEXT: addq %rdi, %rax878; X64-HSW-NEXT: retq879;880; X64-JAG-LABEL: test_mul_by_26:881; X64-JAG: # %bb.0:882; X64-JAG-NEXT: leaq (%rdi,%rdi,4), %rax883; X64-JAG-NEXT: leaq (%rax,%rax,4), %rax884; X64-JAG-NEXT: addq %rdi, %rax885; X64-JAG-NEXT: retq886;887; X64-SLM-LABEL: test_mul_by_26:888; X64-SLM: # %bb.0:889; X64-SLM-NEXT: imulq $26, %rdi, %rax890; X64-SLM-NEXT: retq891;892; X64-NOOPT-LABEL: test_mul_by_26:893; X64-NOOPT: # %bb.0:894; X64-NOOPT-NEXT: imulq $26, %rdi, %rax895; X64-NOOPT-NEXT: retq896 %mul = mul nsw i64 %x, 26897 ret i64 %mul898}899 900define i64 @test_mul_by_27(i64 %x) {901; X86-LABEL: test_mul_by_27:902; X86: # %bb.0:903; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx904; X86-NEXT: movl $27, %eax905; X86-NEXT: mull {{[0-9]+}}(%esp)906; X86-NEXT: leal (%ecx,%ecx,8), %ecx907; X86-NEXT: leal (%ecx,%ecx,2), %ecx908; X86-NEXT: addl %ecx, %edx909; X86-NEXT: retl910;911; X86-NOOPT-LABEL: test_mul_by_27:912; X86-NOOPT: # %bb.0:913; X86-NOOPT-NEXT: movl $27, %eax914; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)915; X86-NOOPT-NEXT: imull $27, {{[0-9]+}}(%esp), %ecx916; X86-NOOPT-NEXT: addl %ecx, %edx917; X86-NOOPT-NEXT: retl918;919; X64-OPT-LABEL: test_mul_by_27:920; X64-OPT: # %bb.0:921; X64-OPT-NEXT: leaq (%rdi,%rdi,8), %rax922; X64-OPT-NEXT: leaq (%rax,%rax,2), %rax923; X64-OPT-NEXT: retq924;925; X64-NOOPT-LABEL: test_mul_by_27:926; X64-NOOPT: # %bb.0:927; X64-NOOPT-NEXT: imulq $27, %rdi, %rax928; X64-NOOPT-NEXT: retq929 %mul = mul nsw i64 %x, 27930 ret i64 %mul931}932 933define i64 @test_mul_by_28(i64 %x) {934; X86-LABEL: test_mul_by_28:935; X86: # %bb.0:936; X86-NEXT: pushl %esi937; X86-NEXT: .cfi_def_cfa_offset 8938; X86-NEXT: .cfi_offset %esi, -8939; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx940; X86-NEXT: leal (%ecx,%ecx,8), %eax941; X86-NEXT: leal (%eax,%eax,2), %esi942; X86-NEXT: movl $28, %eax943; X86-NEXT: mull {{[0-9]+}}(%esp)944; X86-NEXT: addl %ecx, %edx945; X86-NEXT: addl %esi, %edx946; X86-NEXT: popl %esi947; X86-NEXT: .cfi_def_cfa_offset 4948; X86-NEXT: retl949;950; X86-NOOPT-LABEL: test_mul_by_28:951; X86-NOOPT: # %bb.0:952; X86-NOOPT-NEXT: movl $28, %eax953; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)954; X86-NOOPT-NEXT: imull $28, {{[0-9]+}}(%esp), %ecx955; X86-NOOPT-NEXT: addl %ecx, %edx956; X86-NOOPT-NEXT: retl957;958; X64-HSW-LABEL: test_mul_by_28:959; X64-HSW: # %bb.0:960; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rax961; X64-HSW-NEXT: leaq (%rax,%rax,2), %rax962; X64-HSW-NEXT: addq %rdi, %rax963; X64-HSW-NEXT: retq964;965; X64-JAG-LABEL: test_mul_by_28:966; X64-JAG: # %bb.0:967; X64-JAG-NEXT: leaq (%rdi,%rdi,8), %rax968; X64-JAG-NEXT: leaq (%rax,%rax,2), %rax969; X64-JAG-NEXT: addq %rdi, %rax970; X64-JAG-NEXT: retq971;972; X64-SLM-LABEL: test_mul_by_28:973; X64-SLM: # %bb.0:974; X64-SLM-NEXT: imulq $28, %rdi, %rax975; X64-SLM-NEXT: retq976;977; X64-NOOPT-LABEL: test_mul_by_28:978; X64-NOOPT: # %bb.0:979; X64-NOOPT-NEXT: imulq $28, %rdi, %rax980; X64-NOOPT-NEXT: retq981 %mul = mul nsw i64 %x, 28982 ret i64 %mul983}984 985define i64 @test_mul_by_29(i64 %x) {986; X86-LABEL: test_mul_by_29:987; X86: # %bb.0:988; X86-NEXT: pushl %esi989; X86-NEXT: .cfi_def_cfa_offset 8990; X86-NEXT: .cfi_offset %esi, -8991; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx992; X86-NEXT: leal (%ecx,%ecx,8), %eax993; X86-NEXT: leal (%eax,%eax,2), %esi994; X86-NEXT: addl %ecx, %ecx995; X86-NEXT: movl $29, %eax996; X86-NEXT: mull {{[0-9]+}}(%esp)997; X86-NEXT: addl %ecx, %edx998; X86-NEXT: addl %esi, %edx999; X86-NEXT: popl %esi1000; X86-NEXT: .cfi_def_cfa_offset 41001; X86-NEXT: retl1002;1003; X86-NOOPT-LABEL: test_mul_by_29:1004; X86-NOOPT: # %bb.0:1005; X86-NOOPT-NEXT: movl $29, %eax1006; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1007; X86-NOOPT-NEXT: imull $29, {{[0-9]+}}(%esp), %ecx1008; X86-NOOPT-NEXT: addl %ecx, %edx1009; X86-NOOPT-NEXT: retl1010;1011; X64-HSW-LABEL: test_mul_by_29:1012; X64-HSW: # %bb.0:1013; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rax1014; X64-HSW-NEXT: leaq (%rax,%rax,2), %rax1015; X64-HSW-NEXT: addq %rdi, %rax1016; X64-HSW-NEXT: addq %rdi, %rax1017; X64-HSW-NEXT: retq1018;1019; X64-JAG-LABEL: test_mul_by_29:1020; X64-JAG: # %bb.0:1021; X64-JAG-NEXT: leaq (%rdi,%rdi,8), %rax1022; X64-JAG-NEXT: leaq (%rax,%rax,2), %rax1023; X64-JAG-NEXT: addq %rdi, %rax1024; X64-JAG-NEXT: addq %rdi, %rax1025; X64-JAG-NEXT: retq1026;1027; X64-SLM-LABEL: test_mul_by_29:1028; X64-SLM: # %bb.0:1029; X64-SLM-NEXT: imulq $29, %rdi, %rax1030; X64-SLM-NEXT: retq1031;1032; X64-NOOPT-LABEL: test_mul_by_29:1033; X64-NOOPT: # %bb.0:1034; X64-NOOPT-NEXT: imulq $29, %rdi, %rax1035; X64-NOOPT-NEXT: retq1036 %mul = mul nsw i64 %x, 291037 ret i64 %mul1038}1039 1040define i64 @test_mul_by_30(i64 %x) {1041; X86-LABEL: test_mul_by_30:1042; X86: # %bb.0:1043; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1044; X86-NEXT: leal (%ecx,%ecx), %eax1045; X86-NEXT: shll $5, %ecx1046; X86-NEXT: subl %eax, %ecx1047; X86-NEXT: movl $30, %eax1048; X86-NEXT: mull {{[0-9]+}}(%esp)1049; X86-NEXT: addl %ecx, %edx1050; X86-NEXT: retl1051;1052; X86-NOOPT-LABEL: test_mul_by_30:1053; X86-NOOPT: # %bb.0:1054; X86-NOOPT-NEXT: movl $30, %eax1055; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1056; X86-NOOPT-NEXT: imull $30, {{[0-9]+}}(%esp), %ecx1057; X86-NOOPT-NEXT: addl %ecx, %edx1058; X86-NOOPT-NEXT: retl1059;1060; X64-OPT-LABEL: test_mul_by_30:1061; X64-OPT: # %bb.0:1062; X64-OPT-NEXT: movq %rdi, %rax1063; X64-OPT-NEXT: shlq $5, %rax1064; X64-OPT-NEXT: subq %rdi, %rax1065; X64-OPT-NEXT: subq %rdi, %rax1066; X64-OPT-NEXT: retq1067;1068; X64-NOOPT-LABEL: test_mul_by_30:1069; X64-NOOPT: # %bb.0:1070; X64-NOOPT-NEXT: imulq $30, %rdi, %rax1071; X64-NOOPT-NEXT: retq1072 %mul = mul nsw i64 %x, 301073 ret i64 %mul1074}1075 1076define i64 @test_mul_by_31(i64 %x) {1077; X86-LABEL: test_mul_by_31:1078; X86: # %bb.0:1079; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1080; X86-NEXT: movl %eax, %ecx1081; X86-NEXT: shll $5, %ecx1082; X86-NEXT: subl %eax, %ecx1083; X86-NEXT: movl $31, %eax1084; X86-NEXT: mull {{[0-9]+}}(%esp)1085; X86-NEXT: addl %ecx, %edx1086; X86-NEXT: retl1087;1088; X86-NOOPT-LABEL: test_mul_by_31:1089; X86-NOOPT: # %bb.0:1090; X86-NOOPT-NEXT: movl $31, %eax1091; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1092; X86-NOOPT-NEXT: imull $31, {{[0-9]+}}(%esp), %ecx1093; X86-NOOPT-NEXT: addl %ecx, %edx1094; X86-NOOPT-NEXT: retl1095;1096; X64-OPT-LABEL: test_mul_by_31:1097; X64-OPT: # %bb.0:1098; X64-OPT-NEXT: movq %rdi, %rax1099; X64-OPT-NEXT: shlq $5, %rax1100; X64-OPT-NEXT: subq %rdi, %rax1101; X64-OPT-NEXT: retq1102;1103; X64-NOOPT-LABEL: test_mul_by_31:1104; X64-NOOPT: # %bb.0:1105; X64-NOOPT-NEXT: imulq $31, %rdi, %rax1106; X64-NOOPT-NEXT: retq1107 %mul = mul nsw i64 %x, 311108 ret i64 %mul1109}1110 1111define i64 @test_mul_by_32(i64 %x) {1112; X86-LABEL: test_mul_by_32:1113; X86: # %bb.0:1114; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1115; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1116; X86-NEXT: shldl $5, %eax, %edx1117; X86-NEXT: shll $5, %eax1118; X86-NEXT: retl1119;1120; X86-NOOPT-LABEL: test_mul_by_32:1121; X86-NOOPT: # %bb.0:1122; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax1123; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edx1124; X86-NOOPT-NEXT: shldl $5, %eax, %edx1125; X86-NOOPT-NEXT: shll $5, %eax1126; X86-NOOPT-NEXT: retl1127;1128; X64-LABEL: test_mul_by_32:1129; X64: # %bb.0:1130; X64-NEXT: movq %rdi, %rax1131; X64-NEXT: shlq $5, %rax1132; X64-NEXT: retq1133 %mul = mul nsw i64 %x, 321134 ret i64 %mul1135}1136 1137define i64 @test_mul_by_37(i64 %x) {1138; X86-LABEL: test_mul_by_37:1139; X86: # %bb.0:1140; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1141; X86-NEXT: leal (%eax,%eax,8), %ecx1142; X86-NEXT: leal (%eax,%ecx,4), %ecx1143; X86-NEXT: movl $37, %eax1144; X86-NEXT: mull {{[0-9]+}}(%esp)1145; X86-NEXT: addl %ecx, %edx1146; X86-NEXT: retl1147;1148; X86-NOOPT-LABEL: test_mul_by_37:1149; X86-NOOPT: # %bb.0:1150; X86-NOOPT-NEXT: movl $37, %eax1151; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1152; X86-NOOPT-NEXT: imull $37, {{[0-9]+}}(%esp), %ecx1153; X86-NOOPT-NEXT: addl %ecx, %edx1154; X86-NOOPT-NEXT: retl1155;1156; X64-HSW-LABEL: test_mul_by_37:1157; X64-HSW: # %bb.0:1158; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rax1159; X64-HSW-NEXT: leaq (%rdi,%rax,4), %rax1160; X64-HSW-NEXT: retq1161;1162; X64-JAG-LABEL: test_mul_by_37:1163; X64-JAG: # %bb.0:1164; X64-JAG-NEXT: leaq (%rdi,%rdi,8), %rax1165; X64-JAG-NEXT: leaq (%rdi,%rax,4), %rax1166; X64-JAG-NEXT: retq1167;1168; X64-SLM-LABEL: test_mul_by_37:1169; X64-SLM: # %bb.0:1170; X64-SLM-NEXT: imulq $37, %rdi, %rax1171; X64-SLM-NEXT: retq1172;1173; X64-NOOPT-LABEL: test_mul_by_37:1174; X64-NOOPT: # %bb.0:1175; X64-NOOPT-NEXT: imulq $37, %rdi, %rax1176; X64-NOOPT-NEXT: retq1177 %mul = mul nsw i64 %x, 371178 ret i64 %mul1179}1180 1181define i64 @test_mul_by_41(i64 %x) {1182; X86-LABEL: test_mul_by_41:1183; X86: # %bb.0:1184; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1185; X86-NEXT: leal (%eax,%eax,4), %ecx1186; X86-NEXT: leal (%eax,%ecx,8), %ecx1187; X86-NEXT: movl $41, %eax1188; X86-NEXT: mull {{[0-9]+}}(%esp)1189; X86-NEXT: addl %ecx, %edx1190; X86-NEXT: retl1191;1192; X86-NOOPT-LABEL: test_mul_by_41:1193; X86-NOOPT: # %bb.0:1194; X86-NOOPT-NEXT: movl $41, %eax1195; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1196; X86-NOOPT-NEXT: imull $41, {{[0-9]+}}(%esp), %ecx1197; X86-NOOPT-NEXT: addl %ecx, %edx1198; X86-NOOPT-NEXT: retl1199;1200; X64-HSW-LABEL: test_mul_by_41:1201; X64-HSW: # %bb.0:1202; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax1203; X64-HSW-NEXT: leaq (%rdi,%rax,8), %rax1204; X64-HSW-NEXT: retq1205;1206; X64-JAG-LABEL: test_mul_by_41:1207; X64-JAG: # %bb.0:1208; X64-JAG-NEXT: leaq (%rdi,%rdi,4), %rax1209; X64-JAG-NEXT: leaq (%rdi,%rax,8), %rax1210; X64-JAG-NEXT: retq1211;1212; X64-SLM-LABEL: test_mul_by_41:1213; X64-SLM: # %bb.0:1214; X64-SLM-NEXT: imulq $41, %rdi, %rax1215; X64-SLM-NEXT: retq1216;1217; X64-NOOPT-LABEL: test_mul_by_41:1218; X64-NOOPT: # %bb.0:1219; X64-NOOPT-NEXT: imulq $41, %rdi, %rax1220; X64-NOOPT-NEXT: retq1221 %mul = mul nsw i64 %x, 411222 ret i64 %mul1223}1224 1225define i64 @test_mul_by_62(i64 %x) {1226; X86-LABEL: test_mul_by_62:1227; X86: # %bb.0:1228; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1229; X86-NEXT: leal (%ecx,%ecx), %eax1230; X86-NEXT: shll $6, %ecx1231; X86-NEXT: subl %eax, %ecx1232; X86-NEXT: movl $62, %eax1233; X86-NEXT: mull {{[0-9]+}}(%esp)1234; X86-NEXT: addl %ecx, %edx1235; X86-NEXT: retl1236;1237; X86-NOOPT-LABEL: test_mul_by_62:1238; X86-NOOPT: # %bb.0:1239; X86-NOOPT-NEXT: movl $62, %eax1240; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1241; X86-NOOPT-NEXT: imull $62, {{[0-9]+}}(%esp), %ecx1242; X86-NOOPT-NEXT: addl %ecx, %edx1243; X86-NOOPT-NEXT: retl1244;1245; X64-OPT-LABEL: test_mul_by_62:1246; X64-OPT: # %bb.0:1247; X64-OPT-NEXT: movq %rdi, %rax1248; X64-OPT-NEXT: shlq $6, %rax1249; X64-OPT-NEXT: subq %rdi, %rax1250; X64-OPT-NEXT: subq %rdi, %rax1251; X64-OPT-NEXT: retq1252;1253; X64-NOOPT-LABEL: test_mul_by_62:1254; X64-NOOPT: # %bb.0:1255; X64-NOOPT-NEXT: imulq $62, %rdi, %rax1256; X64-NOOPT-NEXT: retq1257 %mul = mul nsw i64 %x, 621258 ret i64 %mul1259}1260 1261define i64 @test_mul_by_66(i64 %x) {1262; X86-LABEL: test_mul_by_66:1263; X86: # %bb.0:1264; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1265; X86-NEXT: movl %eax, %ecx1266; X86-NEXT: shll $6, %ecx1267; X86-NEXT: leal (%ecx,%eax,2), %ecx1268; X86-NEXT: movl $66, %eax1269; X86-NEXT: mull {{[0-9]+}}(%esp)1270; X86-NEXT: addl %ecx, %edx1271; X86-NEXT: retl1272;1273; X86-NOOPT-LABEL: test_mul_by_66:1274; X86-NOOPT: # %bb.0:1275; X86-NOOPT-NEXT: movl $66, %eax1276; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1277; X86-NOOPT-NEXT: imull $66, {{[0-9]+}}(%esp), %ecx1278; X86-NOOPT-NEXT: addl %ecx, %edx1279; X86-NOOPT-NEXT: retl1280;1281; X64-HSW-LABEL: test_mul_by_66:1282; X64-HSW: # %bb.0:1283; X64-HSW-NEXT: movq %rdi, %rax1284; X64-HSW-NEXT: shlq $6, %rax1285; X64-HSW-NEXT: leaq (%rax,%rdi,2), %rax1286; X64-HSW-NEXT: retq1287;1288; X64-JAG-LABEL: test_mul_by_66:1289; X64-JAG: # %bb.0:1290; X64-JAG-NEXT: movq %rdi, %rax1291; X64-JAG-NEXT: shlq $6, %rax1292; X64-JAG-NEXT: leaq (%rax,%rdi,2), %rax1293; X64-JAG-NEXT: retq1294;1295; X64-SLM-LABEL: test_mul_by_66:1296; X64-SLM: # %bb.0:1297; X64-SLM-NEXT: leaq (%rdi,%rdi), %rax1298; X64-SLM-NEXT: shlq $6, %rdi1299; X64-SLM-NEXT: addq %rdi, %rax1300; X64-SLM-NEXT: retq1301;1302; X64-NOOPT-LABEL: test_mul_by_66:1303; X64-NOOPT: # %bb.0:1304; X64-NOOPT-NEXT: imulq $66, %rdi, %rax1305; X64-NOOPT-NEXT: retq1306 %mul = mul nsw i64 %x, 661307 ret i64 %mul1308}1309 1310define i64 @test_mul_by_73(i64 %x) {1311; X86-LABEL: test_mul_by_73:1312; X86: # %bb.0:1313; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1314; X86-NEXT: leal (%eax,%eax,8), %ecx1315; X86-NEXT: leal (%eax,%ecx,8), %ecx1316; X86-NEXT: movl $73, %eax1317; X86-NEXT: mull {{[0-9]+}}(%esp)1318; X86-NEXT: addl %ecx, %edx1319; X86-NEXT: retl1320;1321; X86-NOOPT-LABEL: test_mul_by_73:1322; X86-NOOPT: # %bb.0:1323; X86-NOOPT-NEXT: movl $73, %eax1324; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1325; X86-NOOPT-NEXT: imull $73, {{[0-9]+}}(%esp), %ecx1326; X86-NOOPT-NEXT: addl %ecx, %edx1327; X86-NOOPT-NEXT: retl1328;1329; X64-HSW-LABEL: test_mul_by_73:1330; X64-HSW: # %bb.0:1331; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rax1332; X64-HSW-NEXT: leaq (%rdi,%rax,8), %rax1333; X64-HSW-NEXT: retq1334;1335; X64-JAG-LABEL: test_mul_by_73:1336; X64-JAG: # %bb.0:1337; X64-JAG-NEXT: leaq (%rdi,%rdi,8), %rax1338; X64-JAG-NEXT: leaq (%rdi,%rax,8), %rax1339; X64-JAG-NEXT: retq1340;1341; X64-SLM-LABEL: test_mul_by_73:1342; X64-SLM: # %bb.0:1343; X64-SLM-NEXT: imulq $73, %rdi, %rax1344; X64-SLM-NEXT: retq1345;1346; X64-NOOPT-LABEL: test_mul_by_73:1347; X64-NOOPT: # %bb.0:1348; X64-NOOPT-NEXT: imulq $73, %rdi, %rax1349; X64-NOOPT-NEXT: retq1350 %mul = mul nsw i64 %x, 731351 ret i64 %mul1352}1353 1354define i64 @test_mul_by_520(i64 %x) {1355; X86-LABEL: test_mul_by_520:1356; X86: # %bb.0:1357; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1358; X86-NEXT: movl %eax, %ecx1359; X86-NEXT: shll $9, %ecx1360; X86-NEXT: leal (%ecx,%eax,8), %ecx1361; X86-NEXT: movl $520, %eax # imm = 0x2081362; X86-NEXT: mull {{[0-9]+}}(%esp)1363; X86-NEXT: addl %ecx, %edx1364; X86-NEXT: retl1365;1366; X86-NOOPT-LABEL: test_mul_by_520:1367; X86-NOOPT: # %bb.0:1368; X86-NOOPT-NEXT: movl $520, %eax # imm = 0x2081369; X86-NOOPT-NEXT: mull {{[0-9]+}}(%esp)1370; X86-NOOPT-NEXT: imull $520, {{[0-9]+}}(%esp), %ecx # imm = 0x2081371; X86-NOOPT-NEXT: addl %ecx, %edx1372; X86-NOOPT-NEXT: retl1373;1374; X64-HSW-LABEL: test_mul_by_520:1375; X64-HSW: # %bb.0:1376; X64-HSW-NEXT: movq %rdi, %rax1377; X64-HSW-NEXT: shlq $9, %rax1378; X64-HSW-NEXT: leaq (%rax,%rdi,8), %rax1379; X64-HSW-NEXT: retq1380;1381; X64-JAG-LABEL: test_mul_by_520:1382; X64-JAG: # %bb.0:1383; X64-JAG-NEXT: movq %rdi, %rax1384; X64-JAG-NEXT: shlq $9, %rax1385; X64-JAG-NEXT: leaq (%rax,%rdi,8), %rax1386; X64-JAG-NEXT: retq1387;1388; X64-SLM-LABEL: test_mul_by_520:1389; X64-SLM: # %bb.0:1390; X64-SLM-NEXT: imulq $520, %rdi, %rax # imm = 0x2081391; X64-SLM-NEXT: retq1392;1393; X64-NOOPT-LABEL: test_mul_by_520:1394; X64-NOOPT: # %bb.0:1395; X64-NOOPT-NEXT: imulq $520, %rdi, %rax # imm = 0x2081396; X64-NOOPT-NEXT: retq1397 %mul = mul nsw i64 %x, 5201398 ret i64 %mul1399}1400 1401define i64 @test_mul_by_neg10(i64 %x) {1402; X86-LABEL: test_mul_by_neg10:1403; X86: # %bb.0:1404; X86-NEXT: pushl %esi1405; X86-NEXT: .cfi_def_cfa_offset 81406; X86-NEXT: .cfi_offset %esi, -81407; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1408; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1409; X86-NEXT: movl $-10, %edx1410; X86-NEXT: movl %ecx, %eax1411; X86-NEXT: mull %edx1412; X86-NEXT: subl %ecx, %edx1413; X86-NEXT: addl %esi, %esi1414; X86-NEXT: leal (%esi,%esi,4), %ecx1415; X86-NEXT: subl %ecx, %edx1416; X86-NEXT: popl %esi1417; X86-NEXT: .cfi_def_cfa_offset 41418; X86-NEXT: retl1419;1420; X86-NOOPT-LABEL: test_mul_by_neg10:1421; X86-NOOPT: # %bb.0:1422; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %ecx1423; X86-NOOPT-NEXT: movl $-10, %edx1424; X86-NOOPT-NEXT: movl %ecx, %eax1425; X86-NOOPT-NEXT: mull %edx1426; X86-NOOPT-NEXT: subl %ecx, %edx1427; X86-NOOPT-NEXT: imull $-10, {{[0-9]+}}(%esp), %ecx1428; X86-NOOPT-NEXT: addl %ecx, %edx1429; X86-NOOPT-NEXT: retl1430;1431; X64-OPT-LABEL: test_mul_by_neg10:1432; X64-OPT: # %bb.0:1433; X64-OPT-NEXT: addq %rdi, %rdi1434; X64-OPT-NEXT: leaq (%rdi,%rdi,4), %rax1435; X64-OPT-NEXT: negq %rax1436; X64-OPT-NEXT: retq1437;1438; X64-NOOPT-LABEL: test_mul_by_neg10:1439; X64-NOOPT: # %bb.0:1440; X64-NOOPT-NEXT: imulq $-10, %rdi, %rax1441; X64-NOOPT-NEXT: retq1442 %mul = mul nsw i64 %x, -101443 ret i64 %mul1444}1445 1446define i64 @test_mul_by_neg36(i64 %x) {1447; X86-LABEL: test_mul_by_neg36:1448; X86: # %bb.0:1449; X86-NEXT: pushl %esi1450; X86-NEXT: .cfi_def_cfa_offset 81451; X86-NEXT: .cfi_offset %esi, -81452; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1453; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1454; X86-NEXT: movl $-36, %edx1455; X86-NEXT: movl %ecx, %eax1456; X86-NEXT: mull %edx1457; X86-NEXT: subl %ecx, %edx1458; X86-NEXT: shll $2, %esi1459; X86-NEXT: leal (%esi,%esi,8), %ecx1460; X86-NEXT: subl %ecx, %edx1461; X86-NEXT: popl %esi1462; X86-NEXT: .cfi_def_cfa_offset 41463; X86-NEXT: retl1464;1465; X86-NOOPT-LABEL: test_mul_by_neg36:1466; X86-NOOPT: # %bb.0:1467; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %ecx1468; X86-NOOPT-NEXT: movl $-36, %edx1469; X86-NOOPT-NEXT: movl %ecx, %eax1470; X86-NOOPT-NEXT: mull %edx1471; X86-NOOPT-NEXT: subl %ecx, %edx1472; X86-NOOPT-NEXT: imull $-36, {{[0-9]+}}(%esp), %ecx1473; X86-NOOPT-NEXT: addl %ecx, %edx1474; X86-NOOPT-NEXT: retl1475;1476; X64-OPT-LABEL: test_mul_by_neg36:1477; X64-OPT: # %bb.0:1478; X64-OPT-NEXT: shlq $2, %rdi1479; X64-OPT-NEXT: leaq (%rdi,%rdi,8), %rax1480; X64-OPT-NEXT: negq %rax1481; X64-OPT-NEXT: retq1482;1483; X64-NOOPT-LABEL: test_mul_by_neg36:1484; X64-NOOPT: # %bb.0:1485; X64-NOOPT-NEXT: imulq $-36, %rdi, %rax1486; X64-NOOPT-NEXT: retq1487 %mul = mul nsw i64 %x, -361488 ret i64 %mul1489}1490 1491; (x*9+42)*(x*5+2)1492define i64 @test_mul_spec(i64 %x) nounwind {1493; X86-LABEL: test_mul_spec:1494; X86: # %bb.0:1495; X86-NEXT: pushl %ebp1496; X86-NEXT: pushl %ebx1497; X86-NEXT: pushl %edi1498; X86-NEXT: pushl %esi1499; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1500; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp1501; X86-NEXT: movl $9, %ecx1502; X86-NEXT: movl %edi, %eax1503; X86-NEXT: mull %ecx1504; X86-NEXT: movl %eax, %esi1505; X86-NEXT: movl %edx, %ecx1506; X86-NEXT: leal (%ebp,%ebp,8), %eax1507; X86-NEXT: addl $42, %esi1508; X86-NEXT: adcl %eax, %ecx1509; X86-NEXT: movl $5, %edx1510; X86-NEXT: movl %edi, %eax1511; X86-NEXT: mull %edx1512; X86-NEXT: movl %eax, %edi1513; X86-NEXT: movl %edx, %ebx1514; X86-NEXT: leal (%ebp,%ebp,4), %eax1515; X86-NEXT: addl $2, %edi1516; X86-NEXT: adcl %eax, %ebx1517; X86-NEXT: movl %esi, %eax1518; X86-NEXT: mull %edi1519; X86-NEXT: imull %esi, %ebx1520; X86-NEXT: addl %ebx, %edx1521; X86-NEXT: imull %ecx, %edi1522; X86-NEXT: addl %edi, %edx1523; X86-NEXT: popl %esi1524; X86-NEXT: popl %edi1525; X86-NEXT: popl %ebx1526; X86-NEXT: popl %ebp1527; X86-NEXT: retl1528;1529; X86-NOOPT-LABEL: test_mul_spec:1530; X86-NOOPT: # %bb.0:1531; X86-NOOPT-NEXT: pushl %ebp1532; X86-NOOPT-NEXT: pushl %ebx1533; X86-NOOPT-NEXT: pushl %edi1534; X86-NOOPT-NEXT: pushl %esi1535; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %edi1536; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %ebp1537; X86-NOOPT-NEXT: movl $9, %ecx1538; X86-NOOPT-NEXT: movl %edi, %eax1539; X86-NOOPT-NEXT: mull %ecx1540; X86-NOOPT-NEXT: movl %eax, %esi1541; X86-NOOPT-NEXT: movl %edx, %ecx1542; X86-NOOPT-NEXT: leal (%ebp,%ebp,8), %eax1543; X86-NOOPT-NEXT: addl $42, %esi1544; X86-NOOPT-NEXT: adcl %eax, %ecx1545; X86-NOOPT-NEXT: movl $5, %edx1546; X86-NOOPT-NEXT: movl %edi, %eax1547; X86-NOOPT-NEXT: mull %edx1548; X86-NOOPT-NEXT: movl %eax, %edi1549; X86-NOOPT-NEXT: movl %edx, %ebx1550; X86-NOOPT-NEXT: leal (%ebp,%ebp,4), %eax1551; X86-NOOPT-NEXT: addl $2, %edi1552; X86-NOOPT-NEXT: adcl %eax, %ebx1553; X86-NOOPT-NEXT: movl %esi, %eax1554; X86-NOOPT-NEXT: mull %edi1555; X86-NOOPT-NEXT: imull %esi, %ebx1556; X86-NOOPT-NEXT: addl %ebx, %edx1557; X86-NOOPT-NEXT: imull %ecx, %edi1558; X86-NOOPT-NEXT: addl %edi, %edx1559; X86-NOOPT-NEXT: popl %esi1560; X86-NOOPT-NEXT: popl %edi1561; X86-NOOPT-NEXT: popl %ebx1562; X86-NOOPT-NEXT: popl %ebp1563; X86-NOOPT-NEXT: retl1564;1565; X64-HSW-LABEL: test_mul_spec:1566; X64-HSW: # %bb.0:1567; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rcx1568; X64-HSW-NEXT: addq $42, %rcx1569; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax1570; X64-HSW-NEXT: addq $2, %rax1571; X64-HSW-NEXT: imulq %rcx, %rax1572; X64-HSW-NEXT: retq1573;1574; X64-JAG-LABEL: test_mul_spec:1575; X64-JAG: # %bb.0:1576; X64-JAG-NEXT: leaq 42(%rdi,%rdi,8), %rcx1577; X64-JAG-NEXT: leaq 2(%rdi,%rdi,4), %rax1578; X64-JAG-NEXT: imulq %rcx, %rax1579; X64-JAG-NEXT: retq1580;1581; X64-SLM-LABEL: test_mul_spec:1582; X64-SLM: # %bb.0:1583; X64-SLM-NEXT: leaq 42(%rdi,%rdi,8), %rcx1584; X64-SLM-NEXT: leaq 2(%rdi,%rdi,4), %rax1585; X64-SLM-NEXT: imulq %rcx, %rax1586; X64-SLM-NEXT: retq1587;1588; X64-HSW-NOOPT-LABEL: test_mul_spec:1589; X64-HSW-NOOPT: # %bb.0:1590; X64-HSW-NOOPT-NEXT: leaq (%rdi,%rdi,8), %rcx1591; X64-HSW-NOOPT-NEXT: addq $42, %rcx1592; X64-HSW-NOOPT-NEXT: leaq (%rdi,%rdi,4), %rax1593; X64-HSW-NOOPT-NEXT: addq $2, %rax1594; X64-HSW-NOOPT-NEXT: imulq %rcx, %rax1595; X64-HSW-NOOPT-NEXT: retq1596;1597; X64-JAG-NOOPT-LABEL: test_mul_spec:1598; X64-JAG-NOOPT: # %bb.0:1599; X64-JAG-NOOPT-NEXT: leaq 42(%rdi,%rdi,8), %rcx1600; X64-JAG-NOOPT-NEXT: leaq 2(%rdi,%rdi,4), %rax1601; X64-JAG-NOOPT-NEXT: imulq %rcx, %rax1602; X64-JAG-NOOPT-NEXT: retq1603;1604; X64-SLM-NOOPT-LABEL: test_mul_spec:1605; X64-SLM-NOOPT: # %bb.0:1606; X64-SLM-NOOPT-NEXT: leaq 42(%rdi,%rdi,8), %rcx1607; X64-SLM-NOOPT-NEXT: leaq 2(%rdi,%rdi,4), %rax1608; X64-SLM-NOOPT-NEXT: imulq %rcx, %rax1609; X64-SLM-NOOPT-NEXT: retq1610 %mul = mul nsw i64 %x, 91611 %add = add nsw i64 %mul, 421612 %mul2 = mul nsw i64 %x, 51613 %add2 = add nsw i64 %mul2, 21614 %mul3 = mul nsw i64 %add, %add21615 ret i64 %mul31616}1617 1618define i64 @PR111325(i64 %a0, i1 %a1) {1619; X86-LABEL: PR111325:1620; X86: # %bb.0: # %entry1621; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx1622; X86-NEXT: andb $1, %cl1623; X86-NEXT: xorl %eax, %eax1624; X86-NEXT: xorl %edx, %edx1625; X86-NEXT: subl {{[0-9]+}}(%esp), %edx1626; X86-NEXT: cmpb $1, %cl1627; X86-NEXT: sbbl %eax, %eax1628; X86-NEXT: orl %edx, %eax1629; X86-NEXT: xorl %edx, %edx1630; X86-NEXT: retl1631;1632; X86-NOOPT-LABEL: PR111325:1633; X86-NOOPT: # %bb.0: # %entry1634; X86-NOOPT-NEXT: movzbl {{[0-9]+}}(%esp), %ecx1635; X86-NOOPT-NEXT: andb $1, %cl1636; X86-NOOPT-NEXT: xorl %eax, %eax1637; X86-NOOPT-NEXT: xorl %edx, %edx1638; X86-NOOPT-NEXT: subl {{[0-9]+}}(%esp), %edx1639; X86-NOOPT-NEXT: cmpb $1, %cl1640; X86-NOOPT-NEXT: sbbl %eax, %eax1641; X86-NOOPT-NEXT: orl %edx, %eax1642; X86-NOOPT-NEXT: xorl %edx, %edx1643; X86-NOOPT-NEXT: retl1644;1645; X64-LABEL: PR111325:1646; X64: # %bb.0: # %entry1647; X64-NEXT: negl %edi1648; X64-NEXT: testb $1, %sil1649; X64-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF1650; X64-NEXT: cmovneq %rdi, %rax1651; X64-NEXT: retq1652entry:1653 %mul = mul i64 %a0, 42949672951654 %mask = and i64 %mul, 42949672951655 %sel = select i1 %a1, i64 %mask, i64 42949672951656 ret i64 %sel1657}1658