1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=aarch64 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Convert mul x, pow2 to shift. 4*9880d681SAndroid Build Coastguard Worker; Convert mul x, pow2 +/- 1 to shift + add/sub. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %x) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2 8*9880d681SAndroid Build Coastguard Worker; CHECK: lsl w0, w0, #1 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %x, 1 11*9880d681SAndroid Build Coastguard Worker ret i32 %mul 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %x) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3 16*9880d681SAndroid Build Coastguard Worker; CHECK: add w0, w0, w0, lsl #1 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, 3 19*9880d681SAndroid Build Coastguard Worker ret i32 %mul 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %x) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4 24*9880d681SAndroid Build Coastguard Worker; CHECK: lsl w0, w0, #2 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %x, 2 27*9880d681SAndroid Build Coastguard Worker ret i32 %mul 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %x) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5 32*9880d681SAndroid Build Coastguard Worker; CHECK: add w0, w0, w0, lsl #2 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, 5 36*9880d681SAndroid Build Coastguard Worker ret i32 %mul 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %x) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7 41*9880d681SAndroid Build Coastguard Worker; CHECK: lsl {{w[0-9]+}}, w0, #3 42*9880d681SAndroid Build Coastguard Worker; CHECK: sub w0, {{w[0-9]+}}, w0 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, 7 45*9880d681SAndroid Build Coastguard Worker ret i32 %mul 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %x) { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8 50*9880d681SAndroid Build Coastguard Worker; CHECK: lsl w0, w0, #3 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %x, 3 53*9880d681SAndroid Build Coastguard Worker ret i32 %mul 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %x) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9 58*9880d681SAndroid Build Coastguard Worker; CHECK: add w0, w0, w0, lsl #3 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, 9 61*9880d681SAndroid Build Coastguard Worker ret i32 %mul 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; Convert mul x, -pow2 to shift. 65*9880d681SAndroid Build Coastguard Worker; Convert mul x, -(pow2 +/- 1) to shift + add/sub. 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest2(i32 %x) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest2 69*9880d681SAndroid Build Coastguard Worker; CHECK: neg w0, w0, lsl #1 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -2 72*9880d681SAndroid Build Coastguard Worker ret i32 %mul 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest3(i32 %x) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest3 77*9880d681SAndroid Build Coastguard Worker; CHECK: sub w0, w0, w0, lsl #2 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -3 80*9880d681SAndroid Build Coastguard Worker ret i32 %mul 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest4(i32 %x) { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest4 85*9880d681SAndroid Build Coastguard Worker; CHECK:neg w0, w0, lsl #2 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -4 88*9880d681SAndroid Build Coastguard Worker ret i32 %mul 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest5(i32 %x) { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest5 93*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, w0, w0, lsl #2 94*9880d681SAndroid Build Coastguard Worker; CHECK: neg w0, {{w[0-9]+}} 95*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -5 96*9880d681SAndroid Build Coastguard Worker ret i32 %mul 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest7(i32 %x) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest7 101*9880d681SAndroid Build Coastguard Worker; CHECK: sub w0, w0, w0, lsl #3 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -7 104*9880d681SAndroid Build Coastguard Worker ret i32 %mul 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest8(i32 %x) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest8 109*9880d681SAndroid Build Coastguard Worker; CHECK: neg w0, w0, lsl #3 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -8 112*9880d681SAndroid Build Coastguard Worker ret i32 %mul 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine i32 @ntest9(i32 %x) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ntest9 117*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, w0, w0, lsl #3 118*9880d681SAndroid Build Coastguard Worker; CHECK: neg w0, {{w[0-9]+}} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, -9 121*9880d681SAndroid Build Coastguard Worker ret i32 %mul 122*9880d681SAndroid Build Coastguard Worker} 123