397 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 i64 @asrl_0(i64 %X) {8; CHECK-LABEL: asrl_0:9; CHECK: @ %bb.0: @ %entry10; CHECK-NEXT: bx lr11entry:12 %0 = lshr i64 %X, 3213 %1 = trunc i64 %0 to i3214 %2 = trunc i64 %X to i3215 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 0)16 %4 = extractvalue { i32, i32 } %3, 117 %5 = zext i32 %4 to i6418 %6 = shl nuw i64 %5, 3219 %7 = extractvalue { i32, i32 } %3, 020 %8 = zext i32 %7 to i6421 %9 = or i64 %6, %822 ret i64 %923}24 25define i64 @asrl_23(i64 %X) {26; CHECK-LABEL: asrl_23:27; CHECK: @ %bb.0: @ %entry28; CHECK-NEXT: asrl r0, r1, #2329; CHECK-NEXT: bx lr30entry:31 %0 = lshr i64 %X, 3232 %1 = trunc i64 %0 to i3233 %2 = trunc i64 %X to i3234 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 23)35 %4 = extractvalue { i32, i32 } %3, 136 %5 = zext i32 %4 to i6437 %6 = shl nuw i64 %5, 3238 %7 = extractvalue { i32, i32 } %3, 039 %8 = zext i32 %7 to i6440 %9 = or i64 %6, %841 ret i64 %942}43 44define i64 @asrl_32(i64 %X) {45; CHECK-LABEL: asrl_32:46; CHECK: @ %bb.0: @ %entry47; CHECK-NEXT: asrl r0, r1, #3248; CHECK-NEXT: bx lr49entry:50 %0 = lshr i64 %X, 3251 %1 = trunc i64 %0 to i3252 %2 = trunc i64 %X to i3253 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 32)54 %4 = extractvalue { i32, i32 } %3, 155 %5 = zext i32 %4 to i6456 %6 = shl nuw i64 %5, 3257 %7 = extractvalue { i32, i32 } %3, 058 %8 = zext i32 %7 to i6459 %9 = or i64 %6, %860 ret i64 %961}62 63define i64 @asrl_33(i64 %X) {64; CHECK-LABEL: asrl_33:65; CHECK: @ %bb.0: @ %entry66; CHECK-NEXT: movs r2, #3367; CHECK-NEXT: asrl r0, r1, r268; CHECK-NEXT: bx lr69entry:70 %0 = lshr i64 %X, 3271 %1 = trunc i64 %0 to i3272 %2 = trunc i64 %X to i3273 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 33)74 %4 = extractvalue { i32, i32 } %3, 175 %5 = zext i32 %4 to i6476 %6 = shl nuw i64 %5, 3277 %7 = extractvalue { i32, i32 } %3, 078 %8 = zext i32 %7 to i6479 %9 = or i64 %6, %880 ret i64 %981}82 83define i64 @asrl_63(i64 %X) {84; CHECK-LABEL: asrl_63:85; CHECK: @ %bb.0: @ %entry86; CHECK-NEXT: movs r2, #6387; CHECK-NEXT: asrl r0, r1, r288; CHECK-NEXT: bx lr89entry:90 %0 = lshr i64 %X, 3291 %1 = trunc i64 %0 to i3292 %2 = trunc i64 %X to i3293 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 63)94 %4 = extractvalue { i32, i32 } %3, 195 %5 = zext i32 %4 to i6496 %6 = shl nuw i64 %5, 3297 %7 = extractvalue { i32, i32 } %3, 098 %8 = zext i32 %7 to i6499 %9 = or i64 %6, %8100 ret i64 %9101}102 103define i64 @asrl_64(i64 %X) {104; CHECK-LABEL: asrl_64:105; CHECK: @ %bb.0: @ %entry106; CHECK-NEXT: movs r2, #64107; CHECK-NEXT: asrl r0, r1, r2108; CHECK-NEXT: bx lr109entry:110 %0 = lshr i64 %X, 32111 %1 = trunc i64 %0 to i32112 %2 = trunc i64 %X to i32113 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 64)114 %4 = extractvalue { i32, i32 } %3, 1115 %5 = zext i32 %4 to i64116 %6 = shl nuw i64 %5, 32117 %7 = extractvalue { i32, i32 } %3, 0118 %8 = zext i32 %7 to i64119 %9 = or i64 %6, %8120 ret i64 %9121}122 123define i64 @asrl_m2(i64 %X) {124; CHECK-LABEL: asrl_m2:125; CHECK: @ %bb.0: @ %entry126; CHECK-NEXT: lsll r0, r1, #2127; CHECK-NEXT: bx lr128entry:129 %0 = lshr i64 %X, 32130 %1 = trunc i64 %0 to i32131 %2 = trunc i64 %X to i32132 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -2)133 %4 = extractvalue { i32, i32 } %3, 1134 %5 = zext i32 %4 to i64135 %6 = shl nuw i64 %5, 32136 %7 = extractvalue { i32, i32 } %3, 0137 %8 = zext i32 %7 to i64138 %9 = or i64 %6, %8139 ret i64 %9140}141 142define i64 @asrl_m32(i64 %X) {143; CHECK-LABEL: asrl_m32:144; CHECK: @ %bb.0: @ %entry145; CHECK-NEXT: lsll r0, r1, #32146; CHECK-NEXT: bx lr147entry:148 %0 = lshr i64 %X, 32149 %1 = trunc i64 %0 to i32150 %2 = trunc i64 %X to i32151 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -32)152 %4 = extractvalue { i32, i32 } %3, 1153 %5 = zext i32 %4 to i64154 %6 = shl nuw i64 %5, 32155 %7 = extractvalue { i32, i32 } %3, 0156 %8 = zext i32 %7 to i64157 %9 = or i64 %6, %8158 ret i64 %9159}160 161define i64 @asrl_m33(i64 %X) {162; CHECK-LABEL: asrl_m33:163; CHECK: @ %bb.0: @ %entry164; CHECK-NEXT: mvn r2, #32165; CHECK-NEXT: asrl r0, r1, r2166; CHECK-NEXT: bx lr167entry:168 %0 = lshr i64 %X, 32169 %1 = trunc i64 %0 to i32170 %2 = trunc i64 %X to i32171 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -33)172 %4 = extractvalue { i32, i32 } %3, 1173 %5 = zext i32 %4 to i64174 %6 = shl nuw i64 %5, 32175 %7 = extractvalue { i32, i32 } %3, 0176 %8 = zext i32 %7 to i64177 %9 = or i64 %6, %8178 ret i64 %9179}180 181define i64 @asrl_m64(i64 %X) {182; CHECK-LABEL: asrl_m64:183; CHECK: @ %bb.0: @ %entry184; CHECK-NEXT: mvn r2, #63185; CHECK-NEXT: asrl r0, r1, r2186; CHECK-NEXT: bx lr187entry:188 %0 = lshr i64 %X, 32189 %1 = trunc i64 %0 to i32190 %2 = trunc i64 %X to i32191 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -64)192 %4 = extractvalue { i32, i32 } %3, 1193 %5 = zext i32 %4 to i64194 %6 = shl nuw i64 %5, 32195 %7 = extractvalue { i32, i32 } %3, 0196 %8 = zext i32 %7 to i64197 %9 = or i64 %6, %8198 ret i64 %9199}200 201 202 203 204define i64 @lsll_0(i64 %X) {205; CHECK-LABEL: lsll_0:206; CHECK: @ %bb.0: @ %entry207; CHECK-NEXT: bx lr208entry:209 %0 = lshr i64 %X, 32210 %1 = trunc i64 %0 to i32211 %2 = trunc i64 %X to i32212 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 0)213 %4 = extractvalue { i32, i32 } %3, 1214 %5 = zext i32 %4 to i64215 %6 = shl nuw i64 %5, 32216 %7 = extractvalue { i32, i32 } %3, 0217 %8 = zext i32 %7 to i64218 %9 = or i64 %6, %8219 ret i64 %9220}221 222define i64 @lsll_23(i64 %X) {223; CHECK-LABEL: lsll_23:224; CHECK: @ %bb.0: @ %entry225; CHECK-NEXT: lsll r0, r1, #23226; CHECK-NEXT: bx lr227entry:228 %0 = lshr i64 %X, 32229 %1 = trunc i64 %0 to i32230 %2 = trunc i64 %X to i32231 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 23)232 %4 = extractvalue { i32, i32 } %3, 1233 %5 = zext i32 %4 to i64234 %6 = shl nuw i64 %5, 32235 %7 = extractvalue { i32, i32 } %3, 0236 %8 = zext i32 %7 to i64237 %9 = or i64 %6, %8238 ret i64 %9239}240 241define i64 @lsll_32(i64 %X) {242; CHECK-LABEL: lsll_32:243; CHECK: @ %bb.0: @ %entry244; CHECK-NEXT: lsll r0, r1, #32245; CHECK-NEXT: bx lr246entry:247 %0 = lshr i64 %X, 32248 %1 = trunc i64 %0 to i32249 %2 = trunc i64 %X to i32250 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 32)251 %4 = extractvalue { i32, i32 } %3, 1252 %5 = zext i32 %4 to i64253 %6 = shl nuw i64 %5, 32254 %7 = extractvalue { i32, i32 } %3, 0255 %8 = zext i32 %7 to i64256 %9 = or i64 %6, %8257 ret i64 %9258}259 260define i64 @lsll_33(i64 %X) {261; CHECK-LABEL: lsll_33:262; CHECK: @ %bb.0: @ %entry263; CHECK-NEXT: movs r2, #33264; CHECK-NEXT: lsll r0, r1, r2265; CHECK-NEXT: bx lr266entry:267 %0 = lshr i64 %X, 32268 %1 = trunc i64 %0 to i32269 %2 = trunc i64 %X to i32270 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 33)271 %4 = extractvalue { i32, i32 } %3, 1272 %5 = zext i32 %4 to i64273 %6 = shl nuw i64 %5, 32274 %7 = extractvalue { i32, i32 } %3, 0275 %8 = zext i32 %7 to i64276 %9 = or i64 %6, %8277 ret i64 %9278}279 280define i64 @lsll_63(i64 %X) {281; CHECK-LABEL: lsll_63:282; CHECK: @ %bb.0: @ %entry283; CHECK-NEXT: movs r2, #63284; CHECK-NEXT: lsll r0, r1, r2285; CHECK-NEXT: bx lr286entry:287 %0 = lshr i64 %X, 32288 %1 = trunc i64 %0 to i32289 %2 = trunc i64 %X to i32290 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 63)291 %4 = extractvalue { i32, i32 } %3, 1292 %5 = zext i32 %4 to i64293 %6 = shl nuw i64 %5, 32294 %7 = extractvalue { i32, i32 } %3, 0295 %8 = zext i32 %7 to i64296 %9 = or i64 %6, %8297 ret i64 %9298}299 300define i64 @lsll_64(i64 %X) {301; CHECK-LABEL: lsll_64:302; CHECK: @ %bb.0: @ %entry303; CHECK-NEXT: movs r2, #64304; CHECK-NEXT: lsll r0, r1, r2305; CHECK-NEXT: bx lr306entry:307 %0 = lshr i64 %X, 32308 %1 = trunc i64 %0 to i32309 %2 = trunc i64 %X to i32310 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 64)311 %4 = extractvalue { i32, i32 } %3, 1312 %5 = zext i32 %4 to i64313 %6 = shl nuw i64 %5, 32314 %7 = extractvalue { i32, i32 } %3, 0315 %8 = zext i32 %7 to i64316 %9 = or i64 %6, %8317 ret i64 %9318}319 320define i64 @lsll_m2(i64 %X) {321; CHECK-LABEL: lsll_m2:322; CHECK: @ %bb.0: @ %entry323; CHECK-NEXT: lsrl r0, r1, #2324; CHECK-NEXT: bx lr325entry:326 %0 = lshr i64 %X, 32327 %1 = trunc i64 %0 to i32328 %2 = trunc i64 %X to i32329 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -2)330 %4 = extractvalue { i32, i32 } %3, 1331 %5 = zext i32 %4 to i64332 %6 = shl nuw i64 %5, 32333 %7 = extractvalue { i32, i32 } %3, 0334 %8 = zext i32 %7 to i64335 %9 = or i64 %6, %8336 ret i64 %9337}338 339define i64 @lsll_m32(i64 %X) {340; CHECK-LABEL: lsll_m32:341; CHECK: @ %bb.0: @ %entry342; CHECK-NEXT: lsrl r0, r1, #32343; CHECK-NEXT: bx lr344entry:345 %0 = lshr i64 %X, 32346 %1 = trunc i64 %0 to i32347 %2 = trunc i64 %X to i32348 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -32)349 %4 = extractvalue { i32, i32 } %3, 1350 %5 = zext i32 %4 to i64351 %6 = shl nuw i64 %5, 32352 %7 = extractvalue { i32, i32 } %3, 0353 %8 = zext i32 %7 to i64354 %9 = or i64 %6, %8355 ret i64 %9356}357 358define i64 @lsll_m33(i64 %X) {359; CHECK-LABEL: lsll_m33:360; CHECK: @ %bb.0: @ %entry361; CHECK-NEXT: mvn r2, #32362; CHECK-NEXT: lsll r0, r1, r2363; CHECK-NEXT: bx lr364entry:365 %0 = lshr i64 %X, 32366 %1 = trunc i64 %0 to i32367 %2 = trunc i64 %X to i32368 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -33)369 %4 = extractvalue { i32, i32 } %3, 1370 %5 = zext i32 %4 to i64371 %6 = shl nuw i64 %5, 32372 %7 = extractvalue { i32, i32 } %3, 0373 %8 = zext i32 %7 to i64374 %9 = or i64 %6, %8375 ret i64 %9376}377 378define i64 @lsll_m64(i64 %X) {379; CHECK-LABEL: lsll_m64:380; CHECK: @ %bb.0: @ %entry381; CHECK-NEXT: mvn r2, #63382; CHECK-NEXT: lsll r0, r1, r2383; CHECK-NEXT: bx lr384entry:385 %0 = lshr i64 %X, 32386 %1 = trunc i64 %0 to i32387 %2 = trunc i64 %X to i32388 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -64)389 %4 = extractvalue { i32, i32 } %3, 1390 %5 = zext i32 %4 to i64391 %6 = shl nuw i64 %5, 32392 %7 = extractvalue { i32, i32 } %3, 0393 %8 = zext i32 %7 to i64394 %9 = or i64 %6, %8395 ret i64 %9396}397