1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s --check-prefix=X64 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X86 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4_32(i32 %A) { 6*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4_32: 7*9880d681SAndroid Build Coastguard Worker; X64: leal 8*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4_32: 9*9880d681SAndroid Build Coastguard Worker; X86: shll 10*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 4 11*9880d681SAndroid Build Coastguard Worker ret i32 %mul 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i64 @mul4_64(i64 %A) { 15*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4_64: 16*9880d681SAndroid Build Coastguard Worker; X64: leaq 17*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4_64: 18*9880d681SAndroid Build Coastguard Worker; X86: shldl 19*9880d681SAndroid Build Coastguard Worker; X86: shll 20*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %A, 4 21*9880d681SAndroid Build Coastguard Worker ret i64 %mul 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4096_32(i32 %A) { 25*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4096_32: 26*9880d681SAndroid Build Coastguard Worker; X64: shll 27*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4096_32: 28*9880d681SAndroid Build Coastguard Worker; X86: shll 29*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 4096 30*9880d681SAndroid Build Coastguard Worker ret i32 %mul 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i64 @mul4096_64(i64 %A) { 34*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4096_64: 35*9880d681SAndroid Build Coastguard Worker; X64: shlq 36*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4096_64: 37*9880d681SAndroid Build Coastguard Worker; X86: shldl 38*9880d681SAndroid Build Coastguard Worker; X86: shll 39*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %A, 4096 40*9880d681SAndroid Build Coastguard Worker ret i64 %mul 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine i32 @mulmin4096_32(i32 %A) { 44*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mulmin4096_32: 45*9880d681SAndroid Build Coastguard Worker; X64: shll 46*9880d681SAndroid Build Coastguard Worker; X64-NEXT: negl 47*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mulmin4096_32: 48*9880d681SAndroid Build Coastguard Worker; X86: shll 49*9880d681SAndroid Build Coastguard Worker; X86-NEXT: negl 50*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, -4096 51*9880d681SAndroid Build Coastguard Worker ret i32 %mul 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i64 @mulmin4096_64(i64 %A) { 55*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mulmin4096_64: 56*9880d681SAndroid Build Coastguard Worker; X64: shlq 57*9880d681SAndroid Build Coastguard Worker; X64-NEXT: negq 58*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mulmin4096_64: 59*9880d681SAndroid Build Coastguard Worker; X86: shldl 60*9880d681SAndroid Build Coastguard Worker; X86-NEXT: shll 61*9880d681SAndroid Build Coastguard Worker; X86-NEXT: xorl 62*9880d681SAndroid Build Coastguard Worker; X86-NEXT: negl 63*9880d681SAndroid Build Coastguard Worker; X86-NEXT: sbbl 64*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %A, -4096 65*9880d681SAndroid Build Coastguard Worker ret i64 %mul 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine i32 @mul3_32(i32 %A) { 69*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul3_32: 70*9880d681SAndroid Build Coastguard Worker; X64: leal 71*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul3_32: 72*9880d681SAndroid Build Coastguard Worker; But why?! 73*9880d681SAndroid Build Coastguard Worker; X86: imull 74*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 3 75*9880d681SAndroid Build Coastguard Worker ret i32 %mul 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i64 @mul3_64(i64 %A) { 79*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul3_64: 80*9880d681SAndroid Build Coastguard Worker; X64: leaq 81*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul3_64: 82*9880d681SAndroid Build Coastguard Worker; X86: mull 83*9880d681SAndroid Build Coastguard Worker; X86-NEXT: imull 84*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %A, 3 85*9880d681SAndroid Build Coastguard Worker ret i64 %mul 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine i32 @mul40_32(i32 %A) { 89*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul40_32: 90*9880d681SAndroid Build Coastguard Worker; X64: shll 91*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal 92*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul40_32: 93*9880d681SAndroid Build Coastguard Worker; X86: shll 94*9880d681SAndroid Build Coastguard Worker; X86-NEXT: leal 95*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 40 96*9880d681SAndroid Build Coastguard Worker ret i32 %mul 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine i64 @mul40_64(i64 %A) { 100*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul40_64: 101*9880d681SAndroid Build Coastguard Worker; X64: shlq 102*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leaq 103*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul40_64: 104*9880d681SAndroid Build Coastguard Worker; X86: leal 105*9880d681SAndroid Build Coastguard Worker; X86-NEXT: movl 106*9880d681SAndroid Build Coastguard Worker; X86-NEXT: mull 107*9880d681SAndroid Build Coastguard Worker; X86-NEXT: leal 108*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %A, 40 109*9880d681SAndroid Build Coastguard Worker ret i64 %mul 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4_32_minsize(i32 %A) minsize { 113*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4_32_minsize: 114*9880d681SAndroid Build Coastguard Worker; X64: leal 115*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4_32_minsize: 116*9880d681SAndroid Build Coastguard Worker; X86: shll 117*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 4 118*9880d681SAndroid Build Coastguard Worker ret i32 %mul 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine i32 @mul40_32_minsize(i32 %A) minsize { 122*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul40_32_minsize: 123*9880d681SAndroid Build Coastguard Worker; X64: imull 124*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul40_32_minsize: 125*9880d681SAndroid Build Coastguard Worker; X86: imull 126*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 40 127*9880d681SAndroid Build Coastguard Worker ret i32 %mul 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdefine i32 @mul33_32(i32 %A) { 131*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul33_32: 132*9880d681SAndroid Build Coastguard Worker; X64: shll 133*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal 134*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul33_32: 135*9880d681SAndroid Build Coastguard Worker; X86: shll 136*9880d681SAndroid Build Coastguard Worker; X86-NEXT: addl 137*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 33 138*9880d681SAndroid Build Coastguard Worker ret i32 %mul 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine i32 @mul31_32(i32 %A) { 142*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul31_32: 143*9880d681SAndroid Build Coastguard Worker; X64: shll 144*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl 145*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul31_32: 146*9880d681SAndroid Build Coastguard Worker; X86: shll 147*9880d681SAndroid Build Coastguard Worker; X86-NEXT: subl 148*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 31 149*9880d681SAndroid Build Coastguard Worker ret i32 %mul 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine i32 @mul0_32(i32 %A) { 153*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul0_32: 154*9880d681SAndroid Build Coastguard Worker; X64: xorl %eax, %eax 155*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 0 156*9880d681SAndroid Build Coastguard Worker ret i32 %mul 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4294967295_32(i32 %A) { 160*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4294967295_32: 161*9880d681SAndroid Build Coastguard Worker; X64: negl %edi 162*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 163*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %A, 4294967295 164*9880d681SAndroid Build Coastguard Worker ret i32 %mul 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdefine i64 @mul18446744073709551615_64(i64 %A) { 168*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul18446744073709551615_64: 169*9880d681SAndroid Build Coastguard Worker; X64: negq %rdi 170*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movq %rdi, %rax 171*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %A, 18446744073709551615 172*9880d681SAndroid Build Coastguard Worker ret i64 %mul 173*9880d681SAndroid Build Coastguard Worker} 174