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