411 lines · plain
1; RUN: llc -mtriple=arm-eabi -mcpu=generic %s -o - | FileCheck %s --check-prefix=DISABLED2; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s3; RUN: llc -mtriple=thumb--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s4; RUN: llc -mtriple=thumbv6t2-none-eabi %s -o - | FileCheck %s5; RUN: llc -mtriple=thumbv6-none-eabi %s -o - | FileCheck %s -check-prefix=DISABLED6 7define i32 @f1(i16 %x, i32 %y) {8; CHECK-LABEL: f1:9; CHECK-NOT: sxth10; CHECK: {{smulbt r0, r0, r1|smultb r0, r1, r0}}11; DISABLED-NOT: {{smulbt|smultb}}12 %tmp1 = sext i16 %x to i3213 %tmp2 = ashr i32 %y, 1614 %tmp3 = mul i32 %tmp2, %tmp115 ret i32 %tmp316}17 18define i32 @f2(i32 %x, i32 %y) {19; CHECK-LABEL: f2:20; CHECK: smultt21; DISABLED-NOT: smultt22 %tmp1 = ashr i32 %x, 1623 %tmp3 = ashr i32 %y, 1624 %tmp4 = mul i32 %tmp3, %tmp125 ret i32 %tmp426}27 28define i32 @f3(i32 %a, i16 %x, i32 %y) {29; CHECK-LABEL: f3:30; CHECK-NOT: sxth31; CHECK: {{smlabt r0, r1, r2, r0|smlatb r0, r2, r1, r0}}32; DISABLED-NOT: {{smlabt|smlatb}}33 %tmp = sext i16 %x to i3234 %tmp2 = ashr i32 %y, 1635 %tmp3 = mul i32 %tmp2, %tmp36 %tmp5 = add i32 %tmp3, %a37 ret i32 %tmp538}39 40define i32 @f4(i32 %a, i32 %x, i32 %y) {41; CHECK-LABEL: f4:42; CHECK: smlatt43; DISABLED-NOT: smlatt44 %tmp1 = ashr i32 %x, 1645 %tmp3 = ashr i32 %y, 1646 %tmp4 = mul i32 %tmp3, %tmp147 %tmp5 = add i32 %tmp4, %a48 ret i32 %tmp549}50 51define i32 @f5(i32 %a, i16 %x, i16 %y) {52; CHECK-LABEL: f5:53; CHECK-NOT: sxth54; CHECK: smlabb55; DISABLED-NOT: smlabb56 %tmp1 = sext i16 %x to i3257 %tmp3 = sext i16 %y to i3258 %tmp4 = mul i32 %tmp3, %tmp159 %tmp5 = add i32 %tmp4, %a60 ret i32 %tmp561}62 63define i32 @f6(i32 %a, i32 %x, i16 %y) {64; CHECK-LABEL: f6:65; CHECK-NOT: sxth66; CHECK: {{smlatb r0, r1, r2, r0|smlabt r0, r2, r1, r0}}67; DISABLED-NOT: {{smlatb|smlabt}}68 %tmp1 = sext i16 %y to i3269 %tmp2 = ashr i32 %x, 1670 %tmp3 = mul i32 %tmp2, %tmp171 %tmp5 = add i32 %tmp3, %a72 ret i32 %tmp573}74 75define i32 @f7(i32 %a, i32 %b, i32 %c) {76; CHECK-LABEL: f7:77; CHECK: smlawb r0, r0, r1, r278; DISABLED-NOT: smlawb79 %shl = shl i32 %b, 1680 %shr = ashr exact i32 %shl, 1681 %conv = sext i32 %a to i6482 %conv2 = sext i32 %shr to i6483 %mul = mul nsw i64 %conv2, %conv84 %shr49 = lshr i64 %mul, 1685 %conv5 = trunc i64 %shr49 to i3286 %add = add nsw i32 %conv5, %c87 ret i32 %add88}89 90define i32 @f8(i32 %a, i16 signext %b, i32 %c) {91; CHECK-LABEL: f8:92; CHECK-NOT: sxth93; CHECK: smlawb r0, r0, r1, r294; DISABLED-NOT: smlawb95 %conv = sext i32 %a to i6496 %conv1 = sext i16 %b to i6497 %mul = mul nsw i64 %conv1, %conv98 %shr5 = lshr i64 %mul, 1699 %conv2 = trunc i64 %shr5 to i32100 %add = add nsw i32 %conv2, %c101 ret i32 %add102}103 104define i32 @f9(i32 %a, i32 %b, i32 %c) {105; CHECK-LABEL: f9:106; CHECK: smlawt r0, r0, r1, r2107; DISABLED-NOT: smlawt108 %conv = sext i32 %a to i64109 %shr = ashr i32 %b, 16110 %conv1 = sext i32 %shr to i64111 %mul = mul nsw i64 %conv1, %conv112 %shr26 = lshr i64 %mul, 16113 %conv3 = trunc i64 %shr26 to i32114 %add = add nsw i32 %conv3, %c115 ret i32 %add116}117 118define i32 @f10(i32 %a, i32 %b) {119; CHECK-LABEL: f10:120; CHECK: smulwb r0, r0, r1121; DISABLED-NOT: smulwb122 %shl = shl i32 %b, 16123 %shr = ashr exact i32 %shl, 16124 %conv = sext i32 %a to i64125 %conv2 = sext i32 %shr to i64126 %mul = mul nsw i64 %conv2, %conv127 %shr37 = lshr i64 %mul, 16128 %conv4 = trunc i64 %shr37 to i32129 ret i32 %conv4130}131 132define i32 @f11(i32 %a, i16 signext %b) {133; CHECK-LABEL: f11:134; CHECK-NOT: sxth135; CHECK: smulwb r0, r0, r1136; DISABLED-NOT: smulwb137 %conv = sext i32 %a to i64138 %conv1 = sext i16 %b to i64139 %mul = mul nsw i64 %conv1, %conv140 %shr4 = lshr i64 %mul, 16141 %conv2 = trunc i64 %shr4 to i32142 ret i32 %conv2143}144 145define i32 @f12(i32 %a, i32 %b) {146; CHECK-LABEL: f12:147; CHECK: smulwt r0, r0, r1148; DISABLED-NOT: smulwt149 %conv = sext i32 %a to i64150 %shr = ashr i32 %b, 16151 %conv1 = sext i32 %shr to i64152 %mul = mul nsw i64 %conv1, %conv153 %shr25 = lshr i64 %mul, 16154 %conv3 = trunc i64 %shr25 to i32155 ret i32 %conv3156}157 158define i32 @f13(i32 %x, i16 %y) {159; CHECK-LABEL: f13:160; CHECK-NOT: sxth161; CHECK: {{smultb r0, r0, r1|smulbt r0, r1, r0}}162; DISABLED-NOT: {{smultb|smulbt}}163 %tmp1 = sext i16 %y to i32164 %tmp2 = ashr i32 %x, 16165 %tmp3 = mul i32 %tmp2, %tmp1166 ret i32 %tmp3167}168 169define i32 @f14(i32 %x, i32 %y) {170; CHECK-LABEL: f14:171; CHECK-NOT: sxth172; CHECK: {{smultb r0, r1, r0|smulbt r0, r0, r1}}173; DISABLED-NOT: {{smultb|smulbt}}174 %tmp1 = shl i32 %x, 16175 %tmp2 = ashr i32 %tmp1, 16176 %tmp3 = ashr i32 %y, 16177 %tmp4 = mul i32 %tmp3, %tmp2178 ret i32 %tmp4179}180 181define i32 @f15(i32 %x, i32 %y) {182; CHECK-LABEL: f15:183; CHECK-NOT: sxth184; CHECK: {{smulbt r0, r0, r1|smultb r0, r1, r0}}185; DISABLED-NOT: {{smulbt|smultb}}186 %tmp1 = shl i32 %x, 16187 %tmp2 = ashr i32 %tmp1, 16188 %tmp3 = ashr i32 %y, 16189 %tmp4 = mul i32 %tmp2, %tmp3190 ret i32 %tmp4191}192 193define i32 @f16(i16 %x, i16 %y) {194; CHECK-LABEL: f16:195; CHECK-NOT: sxth196; CHECK: smulbb197; DISABLED-NOT: smulbb198 %tmp1 = sext i16 %x to i32199 %tmp2 = sext i16 %x to i32200 %tmp3 = mul i32 %tmp1, %tmp2201 ret i32 %tmp3202}203 204define i32 @f17(i32 %x, i32 %y) {205; CHECK-LABEL: f17:206; CHECK-NOT: sxth207; CHECK: smulbb208; DISABLED-NOT: smulbb209 %tmp1 = shl i32 %x, 16210 %tmp2 = shl i32 %y, 16211 %tmp3 = ashr i32 %tmp1, 16212 %tmp4 = ashr i32 %tmp2, 16213 %tmp5 = mul i32 %tmp3, %tmp4214 ret i32 %tmp5215}216 217define i32 @f18(i32 %a, i32 %x, i32 %y) {218; CHECK-LABEL: f18:219; CHECK-NOT: sxth220; CHECK: {{smlabt r0, r1, r2, r0|smlatb r0, r2, r1, r0}}221; DISABLED-NOT: {{smlabt|smlatb}}222 %tmp0 = shl i32 %x, 16223 %tmp1 = ashr i32 %tmp0, 16224 %tmp2 = ashr i32 %y, 16225 %tmp3 = mul i32 %tmp2, %tmp1226 %tmp5 = add i32 %tmp3, %a227 ret i32 %tmp5228}229 230define i32 @f19(i32 %a, i32 %x, i32 %y) {231; CHECK-LABEL: f19:232; CHECK: {{smlatb r0, r2, r1, r0|smlabt r0, r1, r2, r0}}233; DISABLED-NOT: {{smlatb|smlabt}}234 %tmp0 = shl i32 %x, 16235 %tmp1 = ashr i32 %tmp0, 16236 %tmp2 = ashr i32 %y, 16237 %tmp3 = mul i32 %tmp1, %tmp2238 %tmp5 = add i32 %tmp3, %a239 ret i32 %tmp5240}241 242define i32 @f20(i32 %a, i32 %x, i32 %y) {243; CHECK-LABEL: f20:244; CHECK-NOT: sxth245; CHECK: smlabb246; DISABLED-NOT: smlabb247 %tmp1 = shl i32 %x, 16248 %tmp2 = ashr i32 %tmp1, 16249 %tmp3 = shl i32 %y, 16250 %tmp4 = ashr i32 %tmp3, 16251 %tmp5 = mul i32 %tmp2, %tmp4252 %tmp6 = add i32 %tmp5, %a253 ret i32 %tmp6254}255 256define i32 @f21(i32 %a, i32 %x, i16 %y) {257; CHECK-LABEL: f21258; CHECK-NOT: sxth259; CHECK: smlabb260; DISABLED-NOT: smlabb261 %tmp1 = shl i32 %x, 16262 %tmp2 = ashr i32 %tmp1, 16263 %tmp3 = sext i16 %y to i32264 %tmp4 = mul i32 %tmp2, %tmp3265 %tmp5 = add i32 %a, %tmp4266 ret i32 %tmp5267}268 269define i32 @f21_b(i32 %a, i32 %x, i16 %y) {270; CHECK-LABEL: f21_b271; CHECK-NOT: sxth272; CHECK: smlabb273; DISABLED-NOT: smlabb274 %tmp1 = shl i32 %x, 16275 %tmp2 = ashr i32 %tmp1, 16276 %tmp3 = sext i16 %y to i32277 %tmp4 = mul i32 %tmp3, %tmp2278 %tmp5 = add i32 %a, %tmp4279 ret i32 %tmp5280}281 282@global_b = external global i16, align 2283 284define i32 @f22(i32 %a) {285; CHECK-LABEL: f22:286; CHECK-NOT: sxth287; CHECK: smulwb r0, r0, r1288; DISABLED-NOT: smulwb289 %b = load i16, ptr @global_b, align 2290 %sext = sext i16 %b to i64291 %conv = sext i32 %a to i64292 %mul = mul nsw i64 %sext, %conv293 %shr37 = lshr i64 %mul, 16294 %conv4 = trunc i64 %shr37 to i32295 ret i32 %conv4296}297 298define i32 @f23(i32 %a, i32 %c) {299; CHECK-LABEL: f23:300; CHECK-NOT: sxth301; CHECK: smlawb r0, r0, r2, r1302; DISABLED-NOT: smlawb303 %b = load i16, ptr @global_b, align 2304 %sext = sext i16 %b to i64305 %conv = sext i32 %a to i64306 %mul = mul nsw i64 %sext, %conv307 %shr49 = lshr i64 %mul, 16308 %conv5 = trunc i64 %shr49 to i32309 %add = add nsw i32 %conv5, %c310 ret i32 %add311}312 313; CHECK-LABEL: f24314; CHECK-NOT: sxth315; CHECK: smulbb316define i32 @f24(ptr %a, ptr %b, ptr %c) {317 %ld.0 = load i16, ptr %a, align 2318 %ld.1 = load i32, ptr %b, align 4319 %conv.0 = sext i16 %ld.0 to i32320 %shift = shl i32 %ld.1, 16321 %conv.1 = ashr i32 %shift, 16322 %mul.0 = mul i32 %conv.0, %conv.1323 store i32 %ld.1, ptr %c324 ret i32 %mul.0325}326 327; CHECK-LABEL: f25328; CHECK-NOT: sxth329; CHECK: smulbb330define i32 @f25(ptr %a, i32 %b, ptr %c) {331 %ld.0 = load i16, ptr %a, align 2332 %conv.0 = sext i16 %ld.0 to i32333 %shift = shl i32 %b, 16334 %conv.1 = ashr i32 %shift, 16335 %mul.0 = mul i32 %conv.0, %conv.1336 store i32 %b, ptr %c337 ret i32 %mul.0338}339 340; CHECK-LABEL: f25_b341; CHECK-NOT: sxth342; CHECK: smulbb343define i32 @f25_b(ptr %a, i32 %b, ptr %c) {344 %ld.0 = load i16, ptr %a, align 2345 %conv.0 = sext i16 %ld.0 to i32346 %shift = shl i32 %b, 16347 %conv.1 = ashr i32 %shift, 16348 %mul.0 = mul i32 %conv.1, %conv.0349 store i32 %b, ptr %c350 ret i32 %mul.0351}352 353; CHECK-LABEL: f26354; CHECK-NOT: sxth355; CHECK: {{smulbt | smultb}}356define i32 @f26(ptr %a, i32 %b, ptr %c) {357 %ld.0 = load i16, ptr %a, align 2358 %conv.0 = sext i16 %ld.0 to i32359 %conv.1 = ashr i32 %b, 16360 %mul.0 = mul i32 %conv.0, %conv.1361 store i32 %b, ptr %c362 ret i32 %mul.0363}364 365; CHECK-LABEL: f26_b366; CHECK-NOT: sxth367; CHECK: {{smulbt | smultb}}368define i32 @f26_b(ptr %a, i32 %b, ptr %c) {369 %ld.0 = load i16, ptr %a, align 2370 %conv.0 = sext i16 %ld.0 to i32371 %conv.1 = ashr i32 %b, 16372 %mul.0 = mul i32 %conv.1, %conv.0373 store i32 %b, ptr %c374 ret i32 %mul.0375}376 377; CHECK-LABEL: f27378; CHECK-NOT: sxth379; CHECK: smulbb380; CHECK: {{smlabt | smlatb}}381define i32 @f27(ptr %a, ptr %b) {382 %ld.0 = load i16, ptr %a, align 2383 %ld.1 = load i32, ptr %b, align 4384 %conv.0 = sext i16 %ld.0 to i32385 %shift = shl i32 %ld.1, 16386 %conv.1 = ashr i32 %shift, 16387 %conv.2 = ashr i32 %ld.1, 16388 %mul.0 = mul i32 %conv.0, %conv.1389 %mul.1 = mul i32 %conv.0, %conv.2390 %add = add i32 %mul.0, %mul.1391 ret i32 %add392}393 394; CHECK-LABEL: f27_b395; CHECK-NOT: sxth396; CHECK: smulbb397; CHECK: {{smlabt | smlatb}}398define i32 @f27_b(ptr %a, ptr %b) {399 %ld.0 = load i16, ptr %a, align 2400 %ld.1 = load i32, ptr %b, align 4401 %conv.0 = sext i16 %ld.0 to i32402 %shift = shl i32 %ld.1, 16403 %conv.1 = ashr i32 %shift, 16404 %conv.2 = ashr i32 %ld.1, 16405 %mul.0 = mul i32 %conv.0, %conv.1406 %mul.1 = mul i32 %conv.2, %conv.0407 %add = add i32 %mul.0, %mul.1408 ret i32 %add409}410 411