877 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s3 4declare {i32, i32} @llvm.arm.mve.asrl(i32, i32, i32)5declare {i32, i32} @llvm.arm.mve.lsll(i32, i32, i32)6 7define i32 @ashr_demand_bottom3(i64 %X) {8; CHECK-LABEL: ashr_demand_bottom3:9; CHECK: @ %bb.0: @ %entry10; CHECK-NEXT: asrl r0, r1, #311; CHECK-NEXT: bx lr12entry:13 %0 = lshr i64 %X, 3214 %1 = trunc i64 %0 to i3215 %2 = trunc i64 %X to i3216 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 3)17 %4 = extractvalue { i32, i32 } %3, 118 %5 = zext i32 %4 to i6419 %6 = shl nuw i64 %5, 3220 %7 = extractvalue { i32, i32 } %3, 021 %8 = zext i32 %7 to i6422 %shr = or i64 %6, %823 %t = trunc i64 %shr to i3224 ret i32 %t25}26 27define i32 @lsll_demand_bottom3(i64 %X) {28; CHECK-LABEL: lsll_demand_bottom3:29; CHECK: @ %bb.0: @ %entry30; CHECK-NEXT: lsll r0, r1, #331; CHECK-NEXT: bx lr32entry:33 %0 = lshr i64 %X, 3234 %1 = trunc i64 %0 to i3235 %2 = trunc i64 %X to i3236 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 3)37 %4 = extractvalue { i32, i32 } %3, 138 %5 = zext i32 %4 to i6439 %6 = shl nuw i64 %5, 3240 %7 = extractvalue { i32, i32 } %3, 041 %8 = zext i32 %7 to i6442 %shr = or i64 %6, %843 %t = trunc i64 %shr to i3244 ret i32 %t45}46 47define i32 @ashr_demand_bottomm3(i64 %X) {48; CHECK-LABEL: ashr_demand_bottomm3:49; CHECK: @ %bb.0: @ %entry50; CHECK-NEXT: lsll r0, r1, #351; CHECK-NEXT: bx lr52entry:53 %0 = lshr i64 %X, 3254 %1 = trunc i64 %0 to i3255 %2 = trunc i64 %X to i3256 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -3)57 %4 = extractvalue { i32, i32 } %3, 158 %5 = zext i32 %4 to i6459 %6 = shl nuw i64 %5, 3260 %7 = extractvalue { i32, i32 } %3, 061 %8 = zext i32 %7 to i6462 %shr = or i64 %6, %863 %t = trunc i64 %shr to i3264 ret i32 %t65}66 67define i32 @lsll_demand_bottomm3(i64 %X) {68; CHECK-LABEL: lsll_demand_bottomm3:69; CHECK: @ %bb.0: @ %entry70; CHECK-NEXT: lsrl r0, r1, #371; CHECK-NEXT: bx lr72entry:73 %0 = lshr i64 %X, 3274 %1 = trunc i64 %0 to i3275 %2 = trunc i64 %X to i3276 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -3)77 %4 = extractvalue { i32, i32 } %3, 178 %5 = zext i32 %4 to i6479 %6 = shl nuw i64 %5, 3280 %7 = extractvalue { i32, i32 } %3, 081 %8 = zext i32 %7 to i6482 %shr = or i64 %6, %883 %t = trunc i64 %shr to i3284 ret i32 %t85}86 87 88define i32 @ashr_demand_bottom31(i64 %X) {89; CHECK-LABEL: ashr_demand_bottom31:90; CHECK: @ %bb.0: @ %entry91; CHECK-NEXT: asrl r0, r1, #3192; CHECK-NEXT: bx lr93entry:94 %0 = lshr i64 %X, 3295 %1 = trunc i64 %0 to i3296 %2 = trunc i64 %X to i3297 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 31)98 %4 = extractvalue { i32, i32 } %3, 199 %5 = zext i32 %4 to i64100 %6 = shl nuw i64 %5, 32101 %7 = extractvalue { i32, i32 } %3, 0102 %8 = zext i32 %7 to i64103 %shr = or i64 %6, %8104 %t = trunc i64 %shr to i32105 ret i32 %t106}107 108define i32 @lsll_demand_bottom31(i64 %X) {109; CHECK-LABEL: lsll_demand_bottom31:110; CHECK: @ %bb.0: @ %entry111; CHECK-NEXT: lsll r0, r1, #31112; CHECK-NEXT: bx lr113entry:114 %0 = lshr i64 %X, 32115 %1 = trunc i64 %0 to i32116 %2 = trunc i64 %X to i32117 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 31)118 %4 = extractvalue { i32, i32 } %3, 1119 %5 = zext i32 %4 to i64120 %6 = shl nuw i64 %5, 32121 %7 = extractvalue { i32, i32 } %3, 0122 %8 = zext i32 %7 to i64123 %shr = or i64 %6, %8124 %t = trunc i64 %shr to i32125 ret i32 %t126}127 128define i32 @ashr_demand_bottomm31(i64 %X) {129; CHECK-LABEL: ashr_demand_bottomm31:130; CHECK: @ %bb.0: @ %entry131; CHECK-NEXT: lsll r0, r1, #31132; CHECK-NEXT: bx lr133entry:134 %0 = lshr i64 %X, 32135 %1 = trunc i64 %0 to i32136 %2 = trunc i64 %X to i32137 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -31)138 %4 = extractvalue { i32, i32 } %3, 1139 %5 = zext i32 %4 to i64140 %6 = shl nuw i64 %5, 32141 %7 = extractvalue { i32, i32 } %3, 0142 %8 = zext i32 %7 to i64143 %shr = or i64 %6, %8144 %t = trunc i64 %shr to i32145 ret i32 %t146}147 148define i32 @lsll_demand_bottomm31(i64 %X) {149; CHECK-LABEL: lsll_demand_bottomm31:150; CHECK: @ %bb.0: @ %entry151; CHECK-NEXT: lsrl r0, r1, #31152; CHECK-NEXT: bx lr153entry:154 %0 = lshr i64 %X, 32155 %1 = trunc i64 %0 to i32156 %2 = trunc i64 %X to i32157 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -31)158 %4 = extractvalue { i32, i32 } %3, 1159 %5 = zext i32 %4 to i64160 %6 = shl nuw i64 %5, 32161 %7 = extractvalue { i32, i32 } %3, 0162 %8 = zext i32 %7 to i64163 %shr = or i64 %6, %8164 %t = trunc i64 %shr to i32165 ret i32 %t166}167 168 169define i32 @ashr_demand_bottom32(i64 %X) {170; CHECK-LABEL: ashr_demand_bottom32:171; CHECK: @ %bb.0: @ %entry172; CHECK-NEXT: asrl r0, r1, #32173; CHECK-NEXT: bx lr174entry:175 %0 = lshr i64 %X, 32176 %1 = trunc i64 %0 to i32177 %2 = trunc i64 %X to i32178 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 32)179 %4 = extractvalue { i32, i32 } %3, 1180 %5 = zext i32 %4 to i64181 %6 = shl nuw i64 %5, 32182 %7 = extractvalue { i32, i32 } %3, 0183 %8 = zext i32 %7 to i64184 %shr = or i64 %6, %8185 %t = trunc i64 %shr to i32186 ret i32 %t187}188 189define i32 @lsll_demand_bottom32(i64 %X) {190; CHECK-LABEL: lsll_demand_bottom32:191; CHECK: @ %bb.0: @ %entry192; CHECK-NEXT: lsll r0, r1, #32193; CHECK-NEXT: bx lr194entry:195 %0 = lshr i64 %X, 32196 %1 = trunc i64 %0 to i32197 %2 = trunc i64 %X to i32198 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 32)199 %4 = extractvalue { i32, i32 } %3, 1200 %5 = zext i32 %4 to i64201 %6 = shl nuw i64 %5, 32202 %7 = extractvalue { i32, i32 } %3, 0203 %8 = zext i32 %7 to i64204 %shr = or i64 %6, %8205 %t = trunc i64 %shr to i32206 ret i32 %t207}208 209define i32 @ashr_demand_bottomm32(i64 %X) {210; CHECK-LABEL: ashr_demand_bottomm32:211; CHECK: @ %bb.0: @ %entry212; CHECK-NEXT: lsll r0, r1, #32213; CHECK-NEXT: bx lr214entry:215 %0 = lshr i64 %X, 32216 %1 = trunc i64 %0 to i32217 %2 = trunc i64 %X to i32218 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -32)219 %4 = extractvalue { i32, i32 } %3, 1220 %5 = zext i32 %4 to i64221 %6 = shl nuw i64 %5, 32222 %7 = extractvalue { i32, i32 } %3, 0223 %8 = zext i32 %7 to i64224 %shr = or i64 %6, %8225 %t = trunc i64 %shr to i32226 ret i32 %t227}228 229define i32 @lsll_demand_bottomm32(i64 %X) {230; CHECK-LABEL: lsll_demand_bottomm32:231; CHECK: @ %bb.0: @ %entry232; CHECK-NEXT: lsrl r0, r1, #32233; CHECK-NEXT: bx lr234entry:235 %0 = lshr i64 %X, 32236 %1 = trunc i64 %0 to i32237 %2 = trunc i64 %X to i32238 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -32)239 %4 = extractvalue { i32, i32 } %3, 1240 %5 = zext i32 %4 to i64241 %6 = shl nuw i64 %5, 32242 %7 = extractvalue { i32, i32 } %3, 0243 %8 = zext i32 %7 to i64244 %shr = or i64 %6, %8245 %t = trunc i64 %shr to i32246 ret i32 %t247}248 249 250define i32 @ashr_demand_bottom44(i64 %X) {251; CHECK-LABEL: ashr_demand_bottom44:252; CHECK: @ %bb.0: @ %entry253; CHECK-NEXT: movs r2, #44254; CHECK-NEXT: asrl r0, r1, r2255; CHECK-NEXT: bx lr256entry:257 %0 = lshr i64 %X, 32258 %1 = trunc i64 %0 to i32259 %2 = trunc i64 %X to i32260 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 44)261 %4 = extractvalue { i32, i32 } %3, 1262 %5 = zext i32 %4 to i64263 %6 = shl nuw i64 %5, 32264 %7 = extractvalue { i32, i32 } %3, 0265 %8 = zext i32 %7 to i64266 %shr = or i64 %6, %8267 %t = trunc i64 %shr to i32268 ret i32 %t269}270 271define i32 @lsll_demand_bottom44(i64 %X) {272; CHECK-LABEL: lsll_demand_bottom44:273; CHECK: @ %bb.0: @ %entry274; CHECK-NEXT: movs r2, #44275; CHECK-NEXT: lsll r0, r1, r2276; CHECK-NEXT: bx lr277entry:278 %0 = lshr i64 %X, 32279 %1 = trunc i64 %0 to i32280 %2 = trunc i64 %X to i32281 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 44)282 %4 = extractvalue { i32, i32 } %3, 1283 %5 = zext i32 %4 to i64284 %6 = shl nuw i64 %5, 32285 %7 = extractvalue { i32, i32 } %3, 0286 %8 = zext i32 %7 to i64287 %shr = or i64 %6, %8288 %t = trunc i64 %shr to i32289 ret i32 %t290}291 292define i32 @ashr_demand_bottomm44(i64 %X) {293; CHECK-LABEL: ashr_demand_bottomm44:294; CHECK: @ %bb.0: @ %entry295; CHECK-NEXT: mvn r2, #43296; CHECK-NEXT: asrl r0, r1, r2297; CHECK-NEXT: bx lr298entry:299 %0 = lshr i64 %X, 32300 %1 = trunc i64 %0 to i32301 %2 = trunc i64 %X to i32302 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -44)303 %4 = extractvalue { i32, i32 } %3, 1304 %5 = zext i32 %4 to i64305 %6 = shl nuw i64 %5, 32306 %7 = extractvalue { i32, i32 } %3, 0307 %8 = zext i32 %7 to i64308 %shr = or i64 %6, %8309 %t = trunc i64 %shr to i32310 ret i32 %t311}312 313define i32 @lsll_demand_bottomm44(i64 %X) {314; CHECK-LABEL: lsll_demand_bottomm44:315; CHECK: @ %bb.0: @ %entry316; CHECK-NEXT: mvn r2, #43317; CHECK-NEXT: lsll r0, r1, r2318; CHECK-NEXT: bx lr319entry:320 %0 = lshr i64 %X, 32321 %1 = trunc i64 %0 to i32322 %2 = trunc i64 %X to i32323 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -44)324 %4 = extractvalue { i32, i32 } %3, 1325 %5 = zext i32 %4 to i64326 %6 = shl nuw i64 %5, 32327 %7 = extractvalue { i32, i32 } %3, 0328 %8 = zext i32 %7 to i64329 %shr = or i64 %6, %8330 %t = trunc i64 %shr to i32331 ret i32 %t332}333 334 335 336 337 338 339 340define i32 @ashr_demand_top3(i64 %X) {341; CHECK-LABEL: ashr_demand_top3:342; CHECK: @ %bb.0: @ %entry343; CHECK-NEXT: asrl r0, r1, #3344; CHECK-NEXT: mov r0, r1345; CHECK-NEXT: bx lr346entry:347 %0 = lshr i64 %X, 32348 %1 = trunc i64 %0 to i32349 %2 = trunc i64 %X to i32350 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 3)351 %4 = extractvalue { i32, i32 } %3, 1352 %5 = zext i32 %4 to i64353 %6 = shl nuw i64 %5, 32354 %7 = extractvalue { i32, i32 } %3, 0355 %8 = zext i32 %7 to i64356 %shr = or i64 %6, %8357 %sm = lshr i64 %shr, 32358 %t = trunc i64 %sm to i32359 ret i32 %t360}361 362define i32 @lsll_demand_top3(i64 %X) {363; CHECK-LABEL: lsll_demand_top3:364; CHECK: @ %bb.0: @ %entry365; CHECK-NEXT: lsll r0, r1, #3366; CHECK-NEXT: mov r0, r1367; CHECK-NEXT: bx lr368entry:369 %0 = lshr i64 %X, 32370 %1 = trunc i64 %0 to i32371 %2 = trunc i64 %X to i32372 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 3)373 %4 = extractvalue { i32, i32 } %3, 1374 %5 = zext i32 %4 to i64375 %6 = shl nuw i64 %5, 32376 %7 = extractvalue { i32, i32 } %3, 0377 %8 = zext i32 %7 to i64378 %shr = or i64 %6, %8379 %sm = lshr i64 %shr, 32380 %t = trunc i64 %sm to i32381 ret i32 %t382}383 384define i32 @ashr_demand_topm3(i64 %X) {385; CHECK-LABEL: ashr_demand_topm3:386; CHECK: @ %bb.0: @ %entry387; CHECK-NEXT: lsll r0, r1, #3388; CHECK-NEXT: mov r0, r1389; CHECK-NEXT: bx lr390entry:391 %0 = lshr i64 %X, 32392 %1 = trunc i64 %0 to i32393 %2 = trunc i64 %X to i32394 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -3)395 %4 = extractvalue { i32, i32 } %3, 1396 %5 = zext i32 %4 to i64397 %6 = shl nuw i64 %5, 32398 %7 = extractvalue { i32, i32 } %3, 0399 %8 = zext i32 %7 to i64400 %shr = or i64 %6, %8401 %sm = lshr i64 %shr, 32402 %t = trunc i64 %sm to i32403 ret i32 %t404}405 406define i32 @lsll_demand_topm3(i64 %X) {407; CHECK-LABEL: lsll_demand_topm3:408; CHECK: @ %bb.0: @ %entry409; CHECK-NEXT: lsrl r0, r1, #3410; CHECK-NEXT: mov r0, r1411; CHECK-NEXT: bx lr412entry:413 %0 = lshr i64 %X, 32414 %1 = trunc i64 %0 to i32415 %2 = trunc i64 %X to i32416 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -3)417 %4 = extractvalue { i32, i32 } %3, 1418 %5 = zext i32 %4 to i64419 %6 = shl nuw i64 %5, 32420 %7 = extractvalue { i32, i32 } %3, 0421 %8 = zext i32 %7 to i64422 %shr = or i64 %6, %8423 %sm = lshr i64 %shr, 32424 %t = trunc i64 %sm to i32425 ret i32 %t426}427 428 429define i32 @ashr_demand_top31(i64 %X) {430; CHECK-LABEL: ashr_demand_top31:431; CHECK: @ %bb.0: @ %entry432; CHECK-NEXT: asrl r0, r1, #31433; CHECK-NEXT: mov r0, r1434; CHECK-NEXT: bx lr435entry:436 %0 = lshr i64 %X, 32437 %1 = trunc i64 %0 to i32438 %2 = trunc i64 %X to i32439 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 31)440 %4 = extractvalue { i32, i32 } %3, 1441 %5 = zext i32 %4 to i64442 %6 = shl nuw i64 %5, 32443 %7 = extractvalue { i32, i32 } %3, 0444 %8 = zext i32 %7 to i64445 %shr = or i64 %6, %8446 %sm = lshr i64 %shr, 32447 %t = trunc i64 %sm to i32448 ret i32 %t449}450 451define i32 @lsll_demand_top31(i64 %X) {452; CHECK-LABEL: lsll_demand_top31:453; CHECK: @ %bb.0: @ %entry454; CHECK-NEXT: lsll r0, r1, #31455; CHECK-NEXT: mov r0, r1456; CHECK-NEXT: bx lr457entry:458 %0 = lshr i64 %X, 32459 %1 = trunc i64 %0 to i32460 %2 = trunc i64 %X to i32461 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 31)462 %4 = extractvalue { i32, i32 } %3, 1463 %5 = zext i32 %4 to i64464 %6 = shl nuw i64 %5, 32465 %7 = extractvalue { i32, i32 } %3, 0466 %8 = zext i32 %7 to i64467 %shr = or i64 %6, %8468 %sm = lshr i64 %shr, 32469 %t = trunc i64 %sm to i32470 ret i32 %t471}472 473define i32 @ashr_demand_topm31(i64 %X) {474; CHECK-LABEL: ashr_demand_topm31:475; CHECK: @ %bb.0: @ %entry476; CHECK-NEXT: lsll r0, r1, #31477; CHECK-NEXT: mov r0, r1478; CHECK-NEXT: bx lr479entry:480 %0 = lshr i64 %X, 32481 %1 = trunc i64 %0 to i32482 %2 = trunc i64 %X to i32483 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -31)484 %4 = extractvalue { i32, i32 } %3, 1485 %5 = zext i32 %4 to i64486 %6 = shl nuw i64 %5, 32487 %7 = extractvalue { i32, i32 } %3, 0488 %8 = zext i32 %7 to i64489 %shr = or i64 %6, %8490 %sm = lshr i64 %shr, 32491 %t = trunc i64 %sm to i32492 ret i32 %t493}494 495define i32 @lsll_demand_topm31(i64 %X) {496; CHECK-LABEL: lsll_demand_topm31:497; CHECK: @ %bb.0: @ %entry498; CHECK-NEXT: lsrl r0, r1, #31499; CHECK-NEXT: mov r0, r1500; CHECK-NEXT: bx lr501entry:502 %0 = lshr i64 %X, 32503 %1 = trunc i64 %0 to i32504 %2 = trunc i64 %X to i32505 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -31)506 %4 = extractvalue { i32, i32 } %3, 1507 %5 = zext i32 %4 to i64508 %6 = shl nuw i64 %5, 32509 %7 = extractvalue { i32, i32 } %3, 0510 %8 = zext i32 %7 to i64511 %shr = or i64 %6, %8512 %sm = lshr i64 %shr, 32513 %t = trunc i64 %sm to i32514 ret i32 %t515}516 517 518define i32 @ashr_demand_top32(i64 %X) {519; CHECK-LABEL: ashr_demand_top32:520; CHECK: @ %bb.0: @ %entry521; CHECK-NEXT: asrl r0, r1, #32522; CHECK-NEXT: mov r0, r1523; CHECK-NEXT: bx lr524entry:525 %0 = lshr i64 %X, 32526 %1 = trunc i64 %0 to i32527 %2 = trunc i64 %X to i32528 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 32)529 %4 = extractvalue { i32, i32 } %3, 1530 %5 = zext i32 %4 to i64531 %6 = shl nuw i64 %5, 32532 %7 = extractvalue { i32, i32 } %3, 0533 %8 = zext i32 %7 to i64534 %shr = or i64 %6, %8535 %sm = lshr i64 %shr, 32536 %t = trunc i64 %sm to i32537 ret i32 %t538}539 540define i32 @lsll_demand_top32(i64 %X) {541; CHECK-LABEL: lsll_demand_top32:542; CHECK: @ %bb.0: @ %entry543; CHECK-NEXT: lsll r0, r1, #32544; CHECK-NEXT: mov r0, r1545; CHECK-NEXT: bx lr546entry:547 %0 = lshr i64 %X, 32548 %1 = trunc i64 %0 to i32549 %2 = trunc i64 %X to i32550 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 32)551 %4 = extractvalue { i32, i32 } %3, 1552 %5 = zext i32 %4 to i64553 %6 = shl nuw i64 %5, 32554 %7 = extractvalue { i32, i32 } %3, 0555 %8 = zext i32 %7 to i64556 %shr = or i64 %6, %8557 %sm = lshr i64 %shr, 32558 %t = trunc i64 %sm to i32559 ret i32 %t560}561 562define i32 @ashr_demand_topm32(i64 %X) {563; CHECK-LABEL: ashr_demand_topm32:564; CHECK: @ %bb.0: @ %entry565; CHECK-NEXT: lsll r0, r1, #32566; CHECK-NEXT: mov r0, r1567; CHECK-NEXT: bx lr568entry:569 %0 = lshr i64 %X, 32570 %1 = trunc i64 %0 to i32571 %2 = trunc i64 %X to i32572 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -32)573 %4 = extractvalue { i32, i32 } %3, 1574 %5 = zext i32 %4 to i64575 %6 = shl nuw i64 %5, 32576 %7 = extractvalue { i32, i32 } %3, 0577 %8 = zext i32 %7 to i64578 %shr = or i64 %6, %8579 %sm = lshr i64 %shr, 32580 %t = trunc i64 %sm to i32581 ret i32 %t582}583 584define i32 @lsll_demand_topm32(i64 %X) {585; CHECK-LABEL: lsll_demand_topm32:586; CHECK: @ %bb.0: @ %entry587; CHECK-NEXT: lsrl r0, r1, #32588; CHECK-NEXT: mov r0, r1589; CHECK-NEXT: bx lr590entry:591 %0 = lshr i64 %X, 32592 %1 = trunc i64 %0 to i32593 %2 = trunc i64 %X to i32594 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -32)595 %4 = extractvalue { i32, i32 } %3, 1596 %5 = zext i32 %4 to i64597 %6 = shl nuw i64 %5, 32598 %7 = extractvalue { i32, i32 } %3, 0599 %8 = zext i32 %7 to i64600 %shr = or i64 %6, %8601 %sm = lshr i64 %shr, 32602 %t = trunc i64 %sm to i32603 ret i32 %t604}605 606 607define i32 @ashr_demand_top44(i64 %X) {608; CHECK-LABEL: ashr_demand_top44:609; CHECK: @ %bb.0: @ %entry610; CHECK-NEXT: movs r2, #44611; CHECK-NEXT: asrl r0, r1, r2612; CHECK-NEXT: mov r0, r1613; CHECK-NEXT: bx lr614entry:615 %0 = lshr i64 %X, 32616 %1 = trunc i64 %0 to i32617 %2 = trunc i64 %X to i32618 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 44)619 %4 = extractvalue { i32, i32 } %3, 1620 %5 = zext i32 %4 to i64621 %6 = shl nuw i64 %5, 32622 %7 = extractvalue { i32, i32 } %3, 0623 %8 = zext i32 %7 to i64624 %shr = or i64 %6, %8625 %sm = lshr i64 %shr, 32626 %t = trunc i64 %sm to i32627 ret i32 %t628}629 630define i32 @lsll_demand_top44(i64 %X) {631; CHECK-LABEL: lsll_demand_top44:632; CHECK: @ %bb.0: @ %entry633; CHECK-NEXT: movs r2, #44634; CHECK-NEXT: lsll r0, r1, r2635; CHECK-NEXT: mov r0, r1636; CHECK-NEXT: bx lr637entry:638 %0 = lshr i64 %X, 32639 %1 = trunc i64 %0 to i32640 %2 = trunc i64 %X to i32641 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 44)642 %4 = extractvalue { i32, i32 } %3, 1643 %5 = zext i32 %4 to i64644 %6 = shl nuw i64 %5, 32645 %7 = extractvalue { i32, i32 } %3, 0646 %8 = zext i32 %7 to i64647 %shr = or i64 %6, %8648 %sm = lshr i64 %shr, 32649 %t = trunc i64 %sm to i32650 ret i32 %t651}652 653define i32 @ashr_demand_topm44(i64 %X) {654; CHECK-LABEL: ashr_demand_topm44:655; CHECK: @ %bb.0: @ %entry656; CHECK-NEXT: mvn r2, #43657; CHECK-NEXT: asrl r0, r1, r2658; CHECK-NEXT: mov r0, r1659; CHECK-NEXT: bx lr660entry:661 %0 = lshr i64 %X, 32662 %1 = trunc i64 %0 to i32663 %2 = trunc i64 %X to i32664 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -44)665 %4 = extractvalue { i32, i32 } %3, 1666 %5 = zext i32 %4 to i64667 %6 = shl nuw i64 %5, 32668 %7 = extractvalue { i32, i32 } %3, 0669 %8 = zext i32 %7 to i64670 %shr = or i64 %6, %8671 %sm = lshr i64 %shr, 32672 %t = trunc i64 %sm to i32673 ret i32 %t674}675 676define i32 @lsll_demand_topm44(i64 %X) {677; CHECK-LABEL: lsll_demand_topm44:678; CHECK: @ %bb.0: @ %entry679; CHECK-NEXT: mvn r2, #43680; CHECK-NEXT: lsll r0, r1, r2681; CHECK-NEXT: mov r0, r1682; CHECK-NEXT: bx lr683entry:684 %0 = lshr i64 %X, 32685 %1 = trunc i64 %0 to i32686 %2 = trunc i64 %X to i32687 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -44)688 %4 = extractvalue { i32, i32 } %3, 1689 %5 = zext i32 %4 to i64690 %6 = shl nuw i64 %5, 32691 %7 = extractvalue { i32, i32 } %3, 0692 %8 = zext i32 %7 to i64693 %shr = or i64 %6, %8694 %sm = lshr i64 %shr, 32695 %t = trunc i64 %sm to i32696 ret i32 %t697}698 699 700 701define i32 @ashr_demand_bottommask3(i64 %X) {702; CHECK-LABEL: ashr_demand_bottommask3:703; CHECK: @ %bb.0: @ %entry704; CHECK-NEXT: asrl r0, r1, #3705; CHECK-NEXT: bic r0, r0, #1706; CHECK-NEXT: bx lr707entry:708 %0 = lshr i64 %X, 32709 %1 = trunc i64 %0 to i32710 %2 = trunc i64 %X to i32711 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 3)712 %4 = extractvalue { i32, i32 } %3, 1713 %5 = zext i32 %4 to i64714 %6 = shl nuw i64 %5, 32715 %7 = extractvalue { i32, i32 } %3, 0716 %8 = zext i32 %7 to i64717 %shr = or i64 %6, %8718 %t = trunc i64 %shr to i32719 %a = and i32 %t, -2720 ret i32 %a721}722 723define i32 @lsll_demand_bottommask3(i64 %X) {724; CHECK-LABEL: lsll_demand_bottommask3:725; CHECK: @ %bb.0: @ %entry726; CHECK-NEXT: lsll r0, r1, #3727; CHECK-NEXT: bic r0, r0, #1728; CHECK-NEXT: bx lr729entry:730 %0 = lshr i64 %X, 32731 %1 = trunc i64 %0 to i32732 %2 = trunc i64 %X to i32733 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 3)734 %4 = extractvalue { i32, i32 } %3, 1735 %5 = zext i32 %4 to i64736 %6 = shl nuw i64 %5, 32737 %7 = extractvalue { i32, i32 } %3, 0738 %8 = zext i32 %7 to i64739 %shr = or i64 %6, %8740 %t = trunc i64 %shr to i32741 %a = and i32 %t, -2742 ret i32 %a743}744 745define i32 @ashr_demand_bottommaskm3(i64 %X) {746; CHECK-LABEL: ashr_demand_bottommaskm3:747; CHECK: @ %bb.0: @ %entry748; CHECK-NEXT: lsll r0, r1, #3749; CHECK-NEXT: bic r0, r0, #1750; CHECK-NEXT: bx lr751entry:752 %0 = lshr i64 %X, 32753 %1 = trunc i64 %0 to i32754 %2 = trunc i64 %X to i32755 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -3)756 %4 = extractvalue { i32, i32 } %3, 1757 %5 = zext i32 %4 to i64758 %6 = shl nuw i64 %5, 32759 %7 = extractvalue { i32, i32 } %3, 0760 %8 = zext i32 %7 to i64761 %shr = or i64 %6, %8762 %t = trunc i64 %shr to i32763 %a = and i32 %t, -2764 ret i32 %a765}766 767define i32 @lsll_demand_bottommaskm3(i64 %X) {768; CHECK-LABEL: lsll_demand_bottommaskm3:769; CHECK: @ %bb.0: @ %entry770; CHECK-NEXT: lsrl r0, r1, #3771; CHECK-NEXT: bic r0, r0, #1772; CHECK-NEXT: bx lr773entry:774 %0 = lshr i64 %X, 32775 %1 = trunc i64 %0 to i32776 %2 = trunc i64 %X to i32777 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -3)778 %4 = extractvalue { i32, i32 } %3, 1779 %5 = zext i32 %4 to i64780 %6 = shl nuw i64 %5, 32781 %7 = extractvalue { i32, i32 } %3, 0782 %8 = zext i32 %7 to i64783 %shr = or i64 %6, %8784 %t = trunc i64 %shr to i32785 %a = and i32 %t, -2786 ret i32 %a787}788 789 790define i32 @ashr_demand_bottommask32(i64 %X) {791; CHECK-LABEL: ashr_demand_bottommask32:792; CHECK: @ %bb.0: @ %entry793; CHECK-NEXT: asrl r0, r1, #32794; CHECK-NEXT: bic r0, r0, #1795; CHECK-NEXT: bx lr796entry:797 %0 = lshr i64 %X, 32798 %1 = trunc i64 %0 to i32799 %2 = trunc i64 %X to i32800 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 32)801 %4 = extractvalue { i32, i32 } %3, 1802 %5 = zext i32 %4 to i64803 %6 = shl nuw i64 %5, 32804 %7 = extractvalue { i32, i32 } %3, 0805 %8 = zext i32 %7 to i64806 %shr = or i64 %6, %8807 %t = trunc i64 %shr to i32808 %a = and i32 %t, -2809 ret i32 %a810}811 812define i32 @lsll_demand_bottommask32(i64 %X) {813; CHECK-LABEL: lsll_demand_bottommask32:814; CHECK: @ %bb.0: @ %entry815; CHECK-NEXT: lsll r0, r1, #32816; CHECK-NEXT: bic r0, r0, #1817; CHECK-NEXT: bx lr818entry:819 %0 = lshr i64 %X, 32820 %1 = trunc i64 %0 to i32821 %2 = trunc i64 %X to i32822 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 32)823 %4 = extractvalue { i32, i32 } %3, 1824 %5 = zext i32 %4 to i64825 %6 = shl nuw i64 %5, 32826 %7 = extractvalue { i32, i32 } %3, 0827 %8 = zext i32 %7 to i64828 %shr = or i64 %6, %8829 %t = trunc i64 %shr to i32830 %a = and i32 %t, -2831 ret i32 %a832}833 834define i32 @ashr_demand_bottommaskm32(i64 %X) {835; CHECK-LABEL: ashr_demand_bottommaskm32:836; CHECK: @ %bb.0: @ %entry837; CHECK-NEXT: lsll r0, r1, #32838; CHECK-NEXT: bic r0, r0, #1839; CHECK-NEXT: bx lr840entry:841 %0 = lshr i64 %X, 32842 %1 = trunc i64 %0 to i32843 %2 = trunc i64 %X to i32844 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -32)845 %4 = extractvalue { i32, i32 } %3, 1846 %5 = zext i32 %4 to i64847 %6 = shl nuw i64 %5, 32848 %7 = extractvalue { i32, i32 } %3, 0849 %8 = zext i32 %7 to i64850 %shr = or i64 %6, %8851 %t = trunc i64 %shr to i32852 %a = and i32 %t, -2853 ret i32 %a854}855 856define i32 @lsll_demand_bottommaskm32(i64 %X) {857; CHECK-LABEL: lsll_demand_bottommaskm32:858; CHECK: @ %bb.0: @ %entry859; CHECK-NEXT: lsrl r0, r1, #32860; CHECK-NEXT: bic r0, r0, #1861; CHECK-NEXT: bx lr862entry:863 %0 = lshr i64 %X, 32864 %1 = trunc i64 %0 to i32865 %2 = trunc i64 %X to i32866 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -32)867 %4 = extractvalue { i32, i32 } %3, 1868 %5 = zext i32 %4 to i64869 %6 = shl nuw i64 %5, 32870 %7 = extractvalue { i32, i32 } %3, 0871 %8 = zext i32 %7 to i64872 %shr = or i64 %6, %8873 %t = trunc i64 %shr to i32874 %a = and i32 %t, -2875 ret i32 %a876}877