281 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve -verify-machineinstrs -o - %s | FileCheck %s3 4define i64 @test_asrl(i64 %value, i32 %shift) {5; CHECK-LABEL: test_asrl:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: asrl r0, r1, r28; CHECK-NEXT: bx lr9entry:10 %0 = lshr i64 %value, 3211 %1 = trunc i64 %0 to i3212 %2 = trunc i64 %value to i3213 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 %shift)14 %4 = extractvalue { i32, i32 } %3, 115 %5 = zext i32 %4 to i6416 %6 = shl i64 %5, 3217 %7 = extractvalue { i32, i32 } %3, 018 %8 = zext i32 %7 to i6419 %9 = or i64 %6, %820 ret i64 %921}22 23declare { i32, i32 } @llvm.arm.mve.asrl(i32, i32, i32)24 25define i64 @test_lsll(i64 %value, i32 %shift) {26; CHECK-LABEL: test_lsll:27; CHECK: @ %bb.0: @ %entry28; CHECK-NEXT: lsll r0, r1, r229; CHECK-NEXT: bx lr30entry:31 %0 = lshr i64 %value, 3232 %1 = trunc i64 %0 to i3233 %2 = trunc i64 %value to i3234 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 %shift)35 %4 = extractvalue { i32, i32 } %3, 136 %5 = zext i32 %4 to i6437 %6 = shl i64 %5, 3238 %7 = extractvalue { i32, i32 } %3, 039 %8 = zext i32 %7 to i6440 %9 = or i64 %6, %841 ret i64 %942}43 44declare { i32, i32 } @llvm.arm.mve.lsll(i32, i32, i32)45 46define i32 @test_sqrshr(i32 %value, i32 %shift) {47; CHECK-LABEL: test_sqrshr:48; CHECK: @ %bb.0: @ %entry49; CHECK-NEXT: sqrshr r0, r150; CHECK-NEXT: bx lr51entry:52 %0 = call i32 @llvm.arm.mve.sqrshr(i32 %value, i32 %shift)53 ret i32 %054}55 56declare i32 @llvm.arm.mve.sqrshr(i32, i32)57 58define i64 @test_sqrshrl(i64 %value, i32 %shift) {59; CHECK-LABEL: test_sqrshrl:60; CHECK: @ %bb.0: @ %entry61; CHECK-NEXT: sqrshrl r0, r1, #64, r262; CHECK-NEXT: bx lr63entry:64 %0 = lshr i64 %value, 3265 %1 = trunc i64 %0 to i3266 %2 = trunc i64 %value to i3267 %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 64)68 %4 = extractvalue { i32, i32 } %3, 169 %5 = zext i32 %4 to i6470 %6 = shl i64 %5, 3271 %7 = extractvalue { i32, i32 } %3, 072 %8 = zext i32 %7 to i6473 %9 = or i64 %6, %874 ret i64 %975}76 77declare { i32, i32 } @llvm.arm.mve.sqrshrl(i32, i32, i32, i32)78 79define i64 @test_sqrshrl_sat48(i64 %value, i32 %shift) {80; CHECK-LABEL: test_sqrshrl_sat48:81; CHECK: @ %bb.0: @ %entry82; CHECK-NEXT: sqrshrl r0, r1, #48, r283; CHECK-NEXT: bx lr84entry:85 %0 = lshr i64 %value, 3286 %1 = trunc i64 %0 to i3287 %2 = trunc i64 %value to i3288 %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 48)89 %4 = extractvalue { i32, i32 } %3, 190 %5 = zext i32 %4 to i6491 %6 = shl i64 %5, 3292 %7 = extractvalue { i32, i32 } %3, 093 %8 = zext i32 %7 to i6494 %9 = or i64 %6, %895 ret i64 %996}97 98define i32 @test_sqshl(i32 %value) {99; CHECK-LABEL: test_sqshl:100; CHECK: @ %bb.0: @ %entry101; CHECK-NEXT: sqshl r0, #2102; CHECK-NEXT: bx lr103entry:104 %0 = call i32 @llvm.arm.mve.sqshl(i32 %value, i32 2)105 ret i32 %0106}107 108declare i32 @llvm.arm.mve.sqshl(i32, i32)109 110define i64 @test_sqshll(i64 %value) {111; CHECK-LABEL: test_sqshll:112; CHECK: @ %bb.0: @ %entry113; CHECK-NEXT: sqshll r0, r1, #17114; CHECK-NEXT: bx lr115entry:116 %0 = lshr i64 %value, 32117 %1 = trunc i64 %0 to i32118 %2 = trunc i64 %value to i32119 %3 = call { i32, i32 } @llvm.arm.mve.sqshll(i32 %2, i32 %1, i32 17)120 %4 = extractvalue { i32, i32 } %3, 1121 %5 = zext i32 %4 to i64122 %6 = shl i64 %5, 32123 %7 = extractvalue { i32, i32 } %3, 0124 %8 = zext i32 %7 to i64125 %9 = or i64 %6, %8126 ret i64 %9127}128 129declare { i32, i32 } @llvm.arm.mve.sqshll(i32, i32, i32)130 131define i32 @test_srshr(i32 %value) {132; CHECK-LABEL: test_srshr:133; CHECK: @ %bb.0: @ %entry134; CHECK-NEXT: srshr r0, #6135; CHECK-NEXT: bx lr136entry:137 %0 = call i32 @llvm.arm.mve.srshr(i32 %value, i32 6)138 ret i32 %0139}140 141declare i32 @llvm.arm.mve.srshr(i32, i32)142 143define i64 @test_srshrl(i64 %value) {144; CHECK-LABEL: test_srshrl:145; CHECK: @ %bb.0: @ %entry146; CHECK-NEXT: srshrl r0, r1, #26147; CHECK-NEXT: bx lr148entry:149 %0 = lshr i64 %value, 32150 %1 = trunc i64 %0 to i32151 %2 = trunc i64 %value to i32152 %3 = call { i32, i32 } @llvm.arm.mve.srshrl(i32 %2, i32 %1, i32 26)153 %4 = extractvalue { i32, i32 } %3, 1154 %5 = zext i32 %4 to i64155 %6 = shl i64 %5, 32156 %7 = extractvalue { i32, i32 } %3, 0157 %8 = zext i32 %7 to i64158 %9 = or i64 %6, %8159 ret i64 %9160}161 162declare { i32, i32 } @llvm.arm.mve.srshrl(i32, i32, i32)163 164define i32 @test_uqrshl(i32 %value, i32 %shift) {165; CHECK-LABEL: test_uqrshl:166; CHECK: @ %bb.0: @ %entry167; CHECK-NEXT: uqrshl r0, r1168; CHECK-NEXT: bx lr169entry:170 %0 = call i32 @llvm.arm.mve.uqrshl(i32 %value, i32 %shift)171 ret i32 %0172}173 174declare i32 @llvm.arm.mve.uqrshl(i32, i32)175 176define i64 @test_uqrshll(i64 %value, i32 %shift) {177; CHECK-LABEL: test_uqrshll:178; CHECK: @ %bb.0: @ %entry179; CHECK-NEXT: uqrshll r0, r1, #64, r2180; CHECK-NEXT: bx lr181entry:182 %0 = lshr i64 %value, 32183 %1 = trunc i64 %0 to i32184 %2 = trunc i64 %value to i32185 %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 64)186 %4 = extractvalue { i32, i32 } %3, 1187 %5 = zext i32 %4 to i64188 %6 = shl i64 %5, 32189 %7 = extractvalue { i32, i32 } %3, 0190 %8 = zext i32 %7 to i64191 %9 = or i64 %6, %8192 ret i64 %9193}194 195declare { i32, i32 } @llvm.arm.mve.uqrshll(i32, i32, i32, i32)196 197define i64 @test_uqrshll_sat48(i64 %value, i32 %shift) {198; CHECK-LABEL: test_uqrshll_sat48:199; CHECK: @ %bb.0: @ %entry200; CHECK-NEXT: uqrshll r0, r1, #48, r2201; CHECK-NEXT: bx lr202entry:203 %0 = lshr i64 %value, 32204 %1 = trunc i64 %0 to i32205 %2 = trunc i64 %value to i32206 %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 48)207 %4 = extractvalue { i32, i32 } %3, 1208 %5 = zext i32 %4 to i64209 %6 = shl i64 %5, 32210 %7 = extractvalue { i32, i32 } %3, 0211 %8 = zext i32 %7 to i64212 %9 = or i64 %6, %8213 ret i64 %9214}215 216define i32 @test_uqshl(i32 %value) {217; CHECK-LABEL: test_uqshl:218; CHECK: @ %bb.0: @ %entry219; CHECK-NEXT: uqshl r0, #21220; CHECK-NEXT: bx lr221entry:222 %0 = call i32 @llvm.arm.mve.uqshl(i32 %value, i32 21)223 ret i32 %0224}225 226declare i32 @llvm.arm.mve.uqshl(i32, i32)227 228define i64 @test_uqshll(i64 %value) {229; CHECK-LABEL: test_uqshll:230; CHECK: @ %bb.0: @ %entry231; CHECK-NEXT: uqshll r0, r1, #16232; CHECK-NEXT: bx lr233entry:234 %0 = lshr i64 %value, 32235 %1 = trunc i64 %0 to i32236 %2 = trunc i64 %value to i32237 %3 = call { i32, i32 } @llvm.arm.mve.uqshll(i32 %2, i32 %1, i32 16)238 %4 = extractvalue { i32, i32 } %3, 1239 %5 = zext i32 %4 to i64240 %6 = shl i64 %5, 32241 %7 = extractvalue { i32, i32 } %3, 0242 %8 = zext i32 %7 to i64243 %9 = or i64 %6, %8244 ret i64 %9245}246 247declare { i32, i32 } @llvm.arm.mve.uqshll(i32, i32, i32)248 249define i32 @test_urshr(i32 %value) {250; CHECK-LABEL: test_urshr:251; CHECK: @ %bb.0: @ %entry252; CHECK-NEXT: urshr r0, #22253; CHECK-NEXT: bx lr254entry:255 %0 = call i32 @llvm.arm.mve.urshr(i32 %value, i32 22)256 ret i32 %0257}258 259declare i32 @llvm.arm.mve.urshr(i32, i32)260 261define i64 @test_urshrl(i64 %value) {262; CHECK-LABEL: test_urshrl:263; CHECK: @ %bb.0: @ %entry264; CHECK-NEXT: urshrl r0, r1, #6265; CHECK-NEXT: bx lr266entry:267 %0 = lshr i64 %value, 32268 %1 = trunc i64 %0 to i32269 %2 = trunc i64 %value to i32270 %3 = call { i32, i32 } @llvm.arm.mve.urshrl(i32 %2, i32 %1, i32 6)271 %4 = extractvalue { i32, i32 } %3, 1272 %5 = zext i32 %4 to i64273 %6 = shl i64 %5, 32274 %7 = extractvalue { i32, i32 } %3, 0275 %8 = zext i32 %7 to i64276 %9 = or i64 %6, %8277 ret i64 %9278}279 280declare { i32, i32 } @llvm.arm.mve.urshrl(i32, i32, i32)281