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 8 define 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 19 define 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 28 define 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 38 define 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 48 define 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 58 define 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 68 define 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 82 define 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 94 define 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 107 define 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 120 define 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 131 define 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