brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.1 KiB · 03da112 Raw
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