1 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64 2 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s --check-prefix=X64 3 ; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X86 4 5 define i32 @mul4_32(i32 %A) { 6 ; X64-LABEL: mul4_32: 7 ; X64: leal 8 ; X86-LABEL: mul4_32: 9 ; X86: shll 10 %mul = mul i32 %A, 4 11 ret i32 %mul 12 } 13 14 define i64 @mul4_64(i64 %A) { 15 ; X64-LABEL: mul4_64: 16 ; X64: leaq 17 ; X86-LABEL: mul4_64: 18 ; X86: shldl 19 ; X86: shll 20 %mul = mul i64 %A, 4 21 ret i64 %mul 22 } 23 24 define i32 @mul4096_32(i32 %A) { 25 ; X64-LABEL: mul4096_32: 26 ; X64: shll 27 ; X86-LABEL: mul4096_32: 28 ; X86: shll 29 %mul = mul i32 %A, 4096 30 ret i32 %mul 31 } 32 33 define i64 @mul4096_64(i64 %A) { 34 ; X64-LABEL: mul4096_64: 35 ; X64: shlq 36 ; X86-LABEL: mul4096_64: 37 ; X86: shldl 38 ; X86: shll 39 %mul = mul i64 %A, 4096 40 ret i64 %mul 41 } 42 43 define i32 @mulmin4096_32(i32 %A) { 44 ; X64-LABEL: mulmin4096_32: 45 ; X64: shll 46 ; X64-NEXT: negl 47 ; X86-LABEL: mulmin4096_32: 48 ; X86: shll 49 ; X86-NEXT: negl 50 %mul = mul i32 %A, -4096 51 ret i32 %mul 52 } 53 54 define i64 @mulmin4096_64(i64 %A) { 55 ; X64-LABEL: mulmin4096_64: 56 ; X64: shlq 57 ; X64-NEXT: negq 58 ; X86-LABEL: mulmin4096_64: 59 ; X86: shldl 60 ; X86-NEXT: shll 61 ; X86-NEXT: xorl 62 ; X86-NEXT: negl 63 ; X86-NEXT: sbbl 64 %mul = mul i64 %A, -4096 65 ret i64 %mul 66 } 67 68 define i32 @mul3_32(i32 %A) { 69 ; X64-LABEL: mul3_32: 70 ; X64: leal 71 ; X86-LABEL: mul3_32: 72 ; But why?! 73 ; X86: imull 74 %mul = mul i32 %A, 3 75 ret i32 %mul 76 } 77 78 define i64 @mul3_64(i64 %A) { 79 ; X64-LABEL: mul3_64: 80 ; X64: leaq 81 ; X86-LABEL: mul3_64: 82 ; X86: mull 83 ; X86-NEXT: imull 84 %mul = mul i64 %A, 3 85 ret i64 %mul 86 } 87 88 define i32 @mul40_32(i32 %A) { 89 ; X64-LABEL: mul40_32: 90 ; X64: shll 91 ; X64-NEXT: leal 92 ; X86-LABEL: mul40_32: 93 ; X86: shll 94 ; X86-NEXT: leal 95 %mul = mul i32 %A, 40 96 ret i32 %mul 97 } 98 99 define i64 @mul40_64(i64 %A) { 100 ; X64-LABEL: mul40_64: 101 ; X64: shlq 102 ; X64-NEXT: leaq 103 ; X86-LABEL: mul40_64: 104 ; X86: leal 105 ; X86-NEXT: movl 106 ; X86-NEXT: mull 107 ; X86-NEXT: leal 108 %mul = mul i64 %A, 40 109 ret i64 %mul 110 } 111