1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=generic %s -o /dev/null 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumb--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@x = weak global i16 0 ; <i16*> [#uses=1] 6*9880d681SAndroid Build Coastguard Worker@y = weak global i16 0 ; <i16*> [#uses=0] 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %y) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: smulbt 11*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* @x ; <i16> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker %tmp1 = add i16 %tmp, 2 ; <i16> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i16 %tmp1 to i32 ; <i32> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker %tmp3 = ashr i32 %y, 16 ; <i32> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i32 %tmp2, %tmp3 ; <i32> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker ret i32 %tmp4 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %x, i32 %y) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: smultt 22*9880d681SAndroid Build Coastguard Worker %tmp1 = ashr i32 %x, 16 ; <i32> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker %tmp3 = ashr i32 %y, 16 ; <i32> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i32 %tmp3, %tmp1 ; <i32> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker ret i32 %tmp4 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i16 %x, i32 %y) { 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 30*9880d681SAndroid Build Coastguard Worker; CHECK: smlabt 31*9880d681SAndroid Build Coastguard Worker %tmp = sext i16 %x to i32 ; <i32> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker %tmp2 = ashr i32 %y, 16 ; <i32> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i32 %tmp2, %tmp ; <i32> [#uses=1] 34*9880d681SAndroid Build Coastguard Worker %tmp5 = add i32 %tmp3, %a ; <i32> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker ret i32 %tmp5 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %x, i32 %y) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 40*9880d681SAndroid Build Coastguard Worker; CHECK: smlatt 41*9880d681SAndroid Build Coastguard Worker %tmp1 = ashr i32 %x, 16 42*9880d681SAndroid Build Coastguard Worker %tmp3 = ashr i32 %y, 16 43*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i32 %tmp3, %tmp1 44*9880d681SAndroid Build Coastguard Worker %tmp5 = add i32 %tmp4, %a 45*9880d681SAndroid Build Coastguard Worker ret i32 %tmp5 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i16 %x, i16 %y) { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 50*9880d681SAndroid Build Coastguard Worker; CHECK: smlabb 51*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i16 %x to i32 52*9880d681SAndroid Build Coastguard Worker %tmp3 = sext i16 %y to i32 53*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i32 %tmp3, %tmp1 54*9880d681SAndroid Build Coastguard Worker %tmp5 = add i32 %tmp4, %a 55*9880d681SAndroid Build Coastguard Worker ret i32 %tmp5 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i16 %x, i32 %y) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 60*9880d681SAndroid Build Coastguard Worker; CHECK: smlabt 61*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i16 %x to i32 62*9880d681SAndroid Build Coastguard Worker %tmp3 = ashr i32 %y, 16 63*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i32 %tmp3, %tmp1 64*9880d681SAndroid Build Coastguard Worker %tmp5 = add i32 %tmp4, %a 65*9880d681SAndroid Build Coastguard Worker ret i32 %tmp5 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b, i32 %c) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 70*9880d681SAndroid Build Coastguard Worker; CHECK: smlawb 71*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %b, 16 72*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i32 %shl, 16 73*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %a to i64 74*9880d681SAndroid Build Coastguard Worker %conv2 = sext i32 %shr to i64 75*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i64 %conv2, %conv 76*9880d681SAndroid Build Coastguard Worker %shr49 = lshr i64 %mul, 16 77*9880d681SAndroid Build Coastguard Worker %conv5 = trunc i64 %shr49 to i32 78*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %conv5, %c 79*9880d681SAndroid Build Coastguard Worker ret i32 %add 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %a, i16 signext %b, i32 %c) { 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 84*9880d681SAndroid Build Coastguard Worker; CHECK: smlawb 85*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %a to i64 86*9880d681SAndroid Build Coastguard Worker %conv1 = sext i16 %b to i64 87*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i64 %conv1, %conv 88*9880d681SAndroid Build Coastguard Worker %shr5 = lshr i64 %mul, 16 89*9880d681SAndroid Build Coastguard Worker %conv2 = trunc i64 %shr5 to i32 90*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %conv2, %c 91*9880d681SAndroid Build Coastguard Worker ret i32 %add 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(i32 %a, i32 %b, i32 %c) { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 96*9880d681SAndroid Build Coastguard Worker; CHECK: smlawt 97*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %a to i64 98*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %b, 16 99*9880d681SAndroid Build Coastguard Worker %conv1 = sext i32 %shr to i64 100*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i64 %conv1, %conv 101*9880d681SAndroid Build Coastguard Worker %shr26 = lshr i64 %mul, 16 102*9880d681SAndroid Build Coastguard Worker %conv3 = trunc i64 %shr26 to i32 103*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %conv3, %c 104*9880d681SAndroid Build Coastguard Worker ret i32 %add 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine i32 @f10(i32 %a, i32 %b, i32 %c) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 109*9880d681SAndroid Build Coastguard Worker; CHECK: smulwb 110*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %b, 16 111*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i32 %shl, 16 112*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %a to i64 113*9880d681SAndroid Build Coastguard Worker %conv2 = sext i32 %shr to i64 114*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i64 %conv2, %conv 115*9880d681SAndroid Build Coastguard Worker %shr37 = lshr i64 %mul, 16 116*9880d681SAndroid Build Coastguard Worker %conv4 = trunc i64 %shr37 to i32 117*9880d681SAndroid Build Coastguard Worker ret i32 %conv4 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine i32 @f11(i32 %a, i16 signext %b, i32 %c) { 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 122*9880d681SAndroid Build Coastguard Worker; CHECK: smulwb 123*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %a to i64 124*9880d681SAndroid Build Coastguard Worker %conv1 = sext i16 %b to i64 125*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i64 %conv1, %conv 126*9880d681SAndroid Build Coastguard Worker %shr4 = lshr i64 %mul, 16 127*9880d681SAndroid Build Coastguard Worker %conv2 = trunc i64 %shr4 to i32 128*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine i32 @f12(i32 %a, i32 %b, i32 %c) { 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 133*9880d681SAndroid Build Coastguard Worker; CHECK: smulwt 134*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %a to i64 135*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %b, 16 136*9880d681SAndroid Build Coastguard Worker %conv1 = sext i32 %shr to i64 137*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i64 %conv1, %conv 138*9880d681SAndroid Build Coastguard Worker %shr25 = lshr i64 %mul, 16 139*9880d681SAndroid Build Coastguard Worker %conv3 = trunc i64 %shr25 to i32 140*9880d681SAndroid Build Coastguard Worker ret i32 %conv3 141*9880d681SAndroid Build Coastguard Worker} 142