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