1184 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s3 4declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32)5declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32)6 7declare { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>)8declare { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>)9declare { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>)10 11declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>, <8 x i1>)12declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>)13declare { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>)14 15define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {16; CHECK-LABEL: test_vmlaldavaq_s16:17; CHECK: @ %bb.0: @ %entry18; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q119; CHECK-NEXT: bx lr20entry:21 %0 = lshr i64 %a, 3222 %1 = trunc i64 %0 to i3223 %2 = trunc i64 %a to i3224 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)25 %4 = extractvalue { i32, i32 } %3, 126 %5 = zext i32 %4 to i6427 %6 = shl i64 %5, 3228 %7 = extractvalue { i32, i32 } %3, 029 %8 = zext i32 %7 to i6430 %9 = or i64 %6, %831 ret i64 %932}33 34define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {35; CHECK-LABEL: test_vmlaldavaq_s32:36; CHECK: @ %bb.0: @ %entry37; CHECK-NEXT: vmlalva.s32 r0, r1, q0, q138; CHECK-NEXT: bx lr39entry:40 %0 = lshr i64 %a, 3241 %1 = trunc i64 %0 to i3242 %2 = trunc i64 %a to i3243 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)44 %4 = extractvalue { i32, i32 } %3, 145 %5 = zext i32 %4 to i6446 %6 = shl i64 %5, 3247 %7 = extractvalue { i32, i32 } %3, 048 %8 = zext i32 %7 to i6449 %9 = or i64 %6, %850 ret i64 %951}52 53define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u16(i64 %a, <8 x i16> %b, <8 x i16> %c) {54; CHECK-LABEL: test_vmlaldavaq_u16:55; CHECK: @ %bb.0: @ %entry56; CHECK-NEXT: vmlalva.u16 r0, r1, q0, q157; CHECK-NEXT: bx lr58entry:59 %0 = lshr i64 %a, 3260 %1 = trunc i64 %0 to i3261 %2 = trunc i64 %a to i3262 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 1, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)63 %4 = extractvalue { i32, i32 } %3, 164 %5 = zext i32 %4 to i6465 %6 = shl i64 %5, 3266 %7 = extractvalue { i32, i32 } %3, 067 %8 = zext i32 %7 to i6468 %9 = or i64 %6, %869 ret i64 %970}71 72define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) {73; CHECK-LABEL: test_vmlaldavaq_u32:74; CHECK: @ %bb.0: @ %entry75; CHECK-NEXT: vmlalva.u32 r0, r1, q0, q176; CHECK-NEXT: bx lr77entry:78 %0 = lshr i64 %a, 3279 %1 = trunc i64 %0 to i3280 %2 = trunc i64 %a to i3281 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)82 %4 = extractvalue { i32, i32 } %3, 183 %5 = zext i32 %4 to i6484 %6 = shl i64 %5, 3285 %7 = extractvalue { i32, i32 } %3, 086 %8 = zext i32 %7 to i6487 %9 = or i64 %6, %888 ret i64 %989}90 91define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {92; CHECK-LABEL: test_vmlaldavaxq_s16:93; CHECK: @ %bb.0: @ %entry94; CHECK-NEXT: vmlaldavax.s16 r0, r1, q0, q195; CHECK-NEXT: bx lr96entry:97 %0 = lshr i64 %a, 3298 %1 = trunc i64 %0 to i3299 %2 = trunc i64 %a to i32100 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)101 %4 = extractvalue { i32, i32 } %3, 1102 %5 = zext i32 %4 to i64103 %6 = shl i64 %5, 32104 %7 = extractvalue { i32, i32 } %3, 0105 %8 = zext i32 %7 to i64106 %9 = or i64 %6, %8107 ret i64 %9108}109 110define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {111; CHECK-LABEL: test_vmlaldavaxq_s32:112; CHECK: @ %bb.0: @ %entry113; CHECK-NEXT: vmlaldavax.s32 r0, r1, q0, q1114; CHECK-NEXT: bx lr115entry:116 %0 = lshr i64 %a, 32117 %1 = trunc i64 %0 to i32118 %2 = trunc i64 %a to i32119 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)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 129define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {130; CHECK-LABEL: test_vmlsldavaq_s16:131; CHECK: @ %bb.0: @ %entry132; CHECK-NEXT: vmlsldava.s16 r0, r1, q0, q1133; CHECK-NEXT: bx lr134entry:135 %0 = lshr i64 %a, 32136 %1 = trunc i64 %0 to i32137 %2 = trunc i64 %a to i32138 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)139 %4 = extractvalue { i32, i32 } %3, 1140 %5 = zext i32 %4 to i64141 %6 = shl i64 %5, 32142 %7 = extractvalue { i32, i32 } %3, 0143 %8 = zext i32 %7 to i64144 %9 = or i64 %6, %8145 ret i64 %9146}147 148define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {149; CHECK-LABEL: test_vmlsldavaq_s32:150; CHECK: @ %bb.0: @ %entry151; CHECK-NEXT: vmlsldava.s32 r0, r1, q0, q1152; CHECK-NEXT: bx lr153entry:154 %0 = lshr i64 %a, 32155 %1 = trunc i64 %0 to i32156 %2 = trunc i64 %a to i32157 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)158 %4 = extractvalue { i32, i32 } %3, 1159 %5 = zext i32 %4 to i64160 %6 = shl i64 %5, 32161 %7 = extractvalue { i32, i32 } %3, 0162 %8 = zext i32 %7 to i64163 %9 = or i64 %6, %8164 ret i64 %9165}166 167define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {168; CHECK-LABEL: test_vmlsldaxvaq_s16:169; CHECK: @ %bb.0: @ %entry170; CHECK-NEXT: vmlsldavax.s16 r0, r1, q0, q1171; CHECK-NEXT: bx lr172entry:173 %0 = lshr i64 %a, 32174 %1 = trunc i64 %0 to i32175 %2 = trunc i64 %a to i32176 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)177 %4 = extractvalue { i32, i32 } %3, 1178 %5 = zext i32 %4 to i64179 %6 = shl i64 %5, 32180 %7 = extractvalue { i32, i32 } %3, 0181 %8 = zext i32 %7 to i64182 %9 = or i64 %6, %8183 ret i64 %9184}185 186define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {187; CHECK-LABEL: test_vmlsldavaxq_s32:188; CHECK: @ %bb.0: @ %entry189; CHECK-NEXT: vmlsldavax.s32 r0, r1, q0, q1190; CHECK-NEXT: bx lr191entry:192 %0 = lshr i64 %a, 32193 %1 = trunc i64 %0 to i32194 %2 = trunc i64 %a to i32195 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)196 %4 = extractvalue { i32, i32 } %3, 1197 %5 = zext i32 %4 to i64198 %6 = shl i64 %5, 32199 %7 = extractvalue { i32, i32 } %3, 0200 %8 = zext i32 %7 to i64201 %9 = or i64 %6, %8202 ret i64 %9203}204 205define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {206; CHECK-LABEL: test_vrmlaldavhaq_s32:207; CHECK: @ %bb.0: @ %entry208; CHECK-NEXT: vrmlalvha.s32 r0, r1, q0, q1209; CHECK-NEXT: bx lr210entry:211 %0 = lshr i64 %a, 32212 %1 = trunc i64 %0 to i32213 %2 = trunc i64 %a to i32214 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)215 %4 = extractvalue { i32, i32 } %3, 1216 %5 = zext i32 %4 to i64217 %6 = shl i64 %5, 32218 %7 = extractvalue { i32, i32 } %3, 0219 %8 = zext i32 %7 to i64220 %9 = or i64 %6, %8221 ret i64 %9222}223 224define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) {225; CHECK-LABEL: test_vrmlaldavhaq_u32:226; CHECK: @ %bb.0: @ %entry227; CHECK-NEXT: vrmlalvha.u32 r0, r1, q0, q1228; CHECK-NEXT: bx lr229entry:230 %0 = lshr i64 %a, 32231 %1 = trunc i64 %0 to i32232 %2 = trunc i64 %a to i32233 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)234 %4 = extractvalue { i32, i32 } %3, 1235 %5 = zext i32 %4 to i64236 %6 = shl i64 %5, 32237 %7 = extractvalue { i32, i32 } %3, 0238 %8 = zext i32 %7 to i64239 %9 = or i64 %6, %8240 ret i64 %9241}242 243define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {244; CHECK-LABEL: test_vrmlaldavhaxq_s32:245; CHECK: @ %bb.0: @ %entry246; CHECK-NEXT: vrmlaldavhax.s32 r0, r1, q0, q1247; CHECK-NEXT: bx lr248entry:249 %0 = lshr i64 %a, 32250 %1 = trunc i64 %0 to i32251 %2 = trunc i64 %a to i32252 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)253 %4 = extractvalue { i32, i32 } %3, 1254 %5 = zext i32 %4 to i64255 %6 = shl i64 %5, 32256 %7 = extractvalue { i32, i32 } %3, 0257 %8 = zext i32 %7 to i64258 %9 = or i64 %6, %8259 ret i64 %9260}261 262define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {263; CHECK-LABEL: test_vrmlsldavhaq_s32:264; CHECK: @ %bb.0: @ %entry265; CHECK-NEXT: vrmlsldavha.s32 r0, r1, q0, q1266; CHECK-NEXT: bx lr267entry:268 %0 = lshr i64 %a, 32269 %1 = trunc i64 %0 to i32270 %2 = trunc i64 %a to i32271 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)272 %4 = extractvalue { i32, i32 } %3, 1273 %5 = zext i32 %4 to i64274 %6 = shl i64 %5, 32275 %7 = extractvalue { i32, i32 } %3, 0276 %8 = zext i32 %7 to i64277 %9 = or i64 %6, %8278 ret i64 %9279}280 281define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {282; CHECK-LABEL: test_vrmlsldavhaxq_s32:283; CHECK: @ %bb.0: @ %entry284; CHECK-NEXT: vrmlsldavhax.s32 r0, r1, q0, q1285; CHECK-NEXT: bx lr286entry:287 %0 = lshr i64 %a, 32288 %1 = trunc i64 %0 to i32289 %2 = trunc i64 %a to i32290 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)291 %4 = extractvalue { i32, i32 } %3, 1292 %5 = zext i32 %4 to i64293 %6 = shl 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 arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {301; CHECK-LABEL: test_vmlaldavaq_p_s16:302; CHECK: @ %bb.0: @ %entry303; CHECK-NEXT: vmsr p0, r2304; CHECK-NEXT: vpst305; CHECK-NEXT: vmlalvat.s16 r0, r1, q0, q1306; CHECK-NEXT: bx lr307entry:308 %0 = lshr i64 %a, 32309 %1 = trunc i64 %0 to i32310 %2 = trunc i64 %a to i32311 %3 = zext i16 %p to i32312 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)313 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)314 %6 = extractvalue { i32, i32 } %5, 1315 %7 = zext i32 %6 to i64316 %8 = shl i64 %7, 32317 %9 = extractvalue { i32, i32 } %5, 0318 %10 = zext i32 %9 to i64319 %11 = or i64 %8, %10320 ret i64 %11321}322 323define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {324; CHECK-LABEL: test_vmlaldavaq_p_s32:325; CHECK: @ %bb.0: @ %entry326; CHECK-NEXT: vmsr p0, r2327; CHECK-NEXT: vpst328; CHECK-NEXT: vmlalvat.s32 r0, r1, q0, q1329; CHECK-NEXT: bx lr330entry:331 %0 = lshr i64 %a, 32332 %1 = trunc i64 %0 to i32333 %2 = trunc i64 %a to i32334 %3 = zext i16 %p to i32335 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)336 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)337 %6 = extractvalue { i32, i32 } %5, 1338 %7 = zext i32 %6 to i64339 %8 = shl i64 %7, 32340 %9 = extractvalue { i32, i32 } %5, 0341 %10 = zext i32 %9 to i64342 %11 = or i64 %8, %10343 ret i64 %11344}345 346define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {347; CHECK-LABEL: test_vmlaldavaq_p_u16:348; CHECK: @ %bb.0: @ %entry349; CHECK-NEXT: vmsr p0, r2350; CHECK-NEXT: vpst351; CHECK-NEXT: vmlalvat.u16 r0, r1, q0, q1352; CHECK-NEXT: bx lr353entry:354 %0 = lshr i64 %a, 32355 %1 = trunc i64 %0 to i32356 %2 = trunc i64 %a to i32357 %3 = zext i16 %p to i32358 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)359 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)360 %6 = extractvalue { i32, i32 } %5, 1361 %7 = zext i32 %6 to i64362 %8 = shl i64 %7, 32363 %9 = extractvalue { i32, i32 } %5, 0364 %10 = zext i32 %9 to i64365 %11 = or i64 %8, %10366 ret i64 %11367}368 369define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {370; CHECK-LABEL: test_vmlaldavaq_p_u32:371; CHECK: @ %bb.0: @ %entry372; CHECK-NEXT: vmsr p0, r2373; CHECK-NEXT: vpst374; CHECK-NEXT: vmlalvat.u32 r0, r1, q0, q1375; CHECK-NEXT: bx lr376entry:377 %0 = lshr i64 %a, 32378 %1 = trunc i64 %0 to i32379 %2 = trunc i64 %a to i32380 %3 = zext i16 %p to i32381 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)382 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)383 %6 = extractvalue { i32, i32 } %5, 1384 %7 = zext i32 %6 to i64385 %8 = shl i64 %7, 32386 %9 = extractvalue { i32, i32 } %5, 0387 %10 = zext i32 %9 to i64388 %11 = or i64 %8, %10389 ret i64 %11390}391 392define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {393; CHECK-LABEL: test_vmlaldavaxq_p_s16:394; CHECK: @ %bb.0: @ %entry395; CHECK-NEXT: vmsr p0, r2396; CHECK-NEXT: vpst397; CHECK-NEXT: vmlaldavaxt.s16 r0, r1, q0, q1398; CHECK-NEXT: bx lr399entry:400 %0 = lshr i64 %a, 32401 %1 = trunc i64 %0 to i32402 %2 = trunc i64 %a to i32403 %3 = zext i16 %p to i32404 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)405 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)406 %6 = extractvalue { i32, i32 } %5, 1407 %7 = zext i32 %6 to i64408 %8 = shl i64 %7, 32409 %9 = extractvalue { i32, i32 } %5, 0410 %10 = zext i32 %9 to i64411 %11 = or i64 %8, %10412 ret i64 %11413}414 415define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {416; CHECK-LABEL: test_vmlaldavaxq_p_s32:417; CHECK: @ %bb.0: @ %entry418; CHECK-NEXT: vmsr p0, r2419; CHECK-NEXT: vpst420; CHECK-NEXT: vmlaldavaxt.s32 r0, r1, q0, q1421; CHECK-NEXT: bx lr422entry:423 %0 = lshr i64 %a, 32424 %1 = trunc i64 %0 to i32425 %2 = trunc i64 %a to i32426 %3 = zext i16 %p to i32427 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)428 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)429 %6 = extractvalue { i32, i32 } %5, 1430 %7 = zext i32 %6 to i64431 %8 = shl i64 %7, 32432 %9 = extractvalue { i32, i32 } %5, 0433 %10 = zext i32 %9 to i64434 %11 = or i64 %8, %10435 ret i64 %11436}437 438define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {439; CHECK-LABEL: test_vmlsldavaq_p_s16:440; CHECK: @ %bb.0: @ %entry441; CHECK-NEXT: vmsr p0, r2442; CHECK-NEXT: vpst443; CHECK-NEXT: vmlsldavat.s16 r0, r1, q0, q1444; CHECK-NEXT: bx lr445entry:446 %0 = lshr i64 %a, 32447 %1 = trunc i64 %0 to i32448 %2 = trunc i64 %a to i32449 %3 = zext i16 %p to i32450 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)451 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)452 %6 = extractvalue { i32, i32 } %5, 1453 %7 = zext i32 %6 to i64454 %8 = shl i64 %7, 32455 %9 = extractvalue { i32, i32 } %5, 0456 %10 = zext i32 %9 to i64457 %11 = or i64 %8, %10458 ret i64 %11459}460 461define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {462; CHECK-LABEL: test_vmlsldavaq_p_s32:463; CHECK: @ %bb.0: @ %entry464; CHECK-NEXT: vmsr p0, r2465; CHECK-NEXT: vpst466; CHECK-NEXT: vmlsldavat.s32 r0, r1, q0, q1467; CHECK-NEXT: bx lr468entry:469 %0 = lshr i64 %a, 32470 %1 = trunc i64 %0 to i32471 %2 = trunc i64 %a to i32472 %3 = zext i16 %p to i32473 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)474 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)475 %6 = extractvalue { i32, i32 } %5, 1476 %7 = zext i32 %6 to i64477 %8 = shl i64 %7, 32478 %9 = extractvalue { i32, i32 } %5, 0479 %10 = zext i32 %9 to i64480 %11 = or i64 %8, %10481 ret i64 %11482}483 484define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {485; CHECK-LABEL: test_vmlsldaxvaq_p_s16:486; CHECK: @ %bb.0: @ %entry487; CHECK-NEXT: vmsr p0, r2488; CHECK-NEXT: vpst489; CHECK-NEXT: vmlsldavaxt.s16 r0, r1, q0, q1490; CHECK-NEXT: bx lr491entry:492 %0 = lshr i64 %a, 32493 %1 = trunc i64 %0 to i32494 %2 = trunc i64 %a to i32495 %3 = zext i16 %p to i32496 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)497 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)498 %6 = extractvalue { i32, i32 } %5, 1499 %7 = zext i32 %6 to i64500 %8 = shl i64 %7, 32501 %9 = extractvalue { i32, i32 } %5, 0502 %10 = zext i32 %9 to i64503 %11 = or i64 %8, %10504 ret i64 %11505}506 507define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {508; CHECK-LABEL: test_vmlsldavaxq_p_s32:509; CHECK: @ %bb.0: @ %entry510; CHECK-NEXT: vmsr p0, r2511; CHECK-NEXT: vpst512; CHECK-NEXT: vmlsldavaxt.s32 r0, r1, q0, q1513; CHECK-NEXT: bx lr514entry:515 %0 = lshr i64 %a, 32516 %1 = trunc i64 %0 to i32517 %2 = trunc i64 %a to i32518 %3 = zext i16 %p to i32519 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)520 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)521 %6 = extractvalue { i32, i32 } %5, 1522 %7 = zext i32 %6 to i64523 %8 = shl i64 %7, 32524 %9 = extractvalue { i32, i32 } %5, 0525 %10 = zext i32 %9 to i64526 %11 = or i64 %8, %10527 ret i64 %11528}529 530define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {531; CHECK-LABEL: test_vrmlaldavhaq_p_s32:532; CHECK: @ %bb.0: @ %entry533; CHECK-NEXT: vmsr p0, r2534; CHECK-NEXT: vpst535; CHECK-NEXT: vrmlalvhat.s32 r0, r1, q0, q1536; CHECK-NEXT: bx lr537entry:538 %0 = lshr i64 %a, 32539 %1 = trunc i64 %0 to i32540 %2 = trunc i64 %a to i32541 %3 = zext i16 %p to i32542 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)543 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)544 %6 = extractvalue { i32, i32 } %5, 1545 %7 = zext i32 %6 to i64546 %8 = shl i64 %7, 32547 %9 = extractvalue { i32, i32 } %5, 0548 %10 = zext i32 %9 to i64549 %11 = or i64 %8, %10550 ret i64 %11551}552 553define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {554; CHECK-LABEL: test_vrmlaldavhaq_p_u32:555; CHECK: @ %bb.0: @ %entry556; CHECK-NEXT: vmsr p0, r2557; CHECK-NEXT: vpst558; CHECK-NEXT: vrmlalvhat.u32 r0, r1, q0, q1559; CHECK-NEXT: bx lr560entry:561 %0 = lshr i64 %a, 32562 %1 = trunc i64 %0 to i32563 %2 = trunc i64 %a to i32564 %3 = zext i16 %p to i32565 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)566 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)567 %6 = extractvalue { i32, i32 } %5, 1568 %7 = zext i32 %6 to i64569 %8 = shl i64 %7, 32570 %9 = extractvalue { i32, i32 } %5, 0571 %10 = zext i32 %9 to i64572 %11 = or i64 %8, %10573 ret i64 %11574}575 576define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {577; CHECK-LABEL: test_vrmlaldavhaxq_p_s32:578; CHECK: @ %bb.0: @ %entry579; CHECK-NEXT: vmsr p0, r2580; CHECK-NEXT: vpst581; CHECK-NEXT: vrmlaldavhaxt.s32 r0, r1, q0, q1582; CHECK-NEXT: bx lr583entry:584 %0 = lshr i64 %a, 32585 %1 = trunc i64 %0 to i32586 %2 = trunc i64 %a to i32587 %3 = zext i16 %p to i32588 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)589 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)590 %6 = extractvalue { i32, i32 } %5, 1591 %7 = zext i32 %6 to i64592 %8 = shl i64 %7, 32593 %9 = extractvalue { i32, i32 } %5, 0594 %10 = zext i32 %9 to i64595 %11 = or i64 %8, %10596 ret i64 %11597}598 599define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {600; CHECK-LABEL: test_vrmlsldavhaq_p_s32:601; CHECK: @ %bb.0: @ %entry602; CHECK-NEXT: vmsr p0, r2603; CHECK-NEXT: vpst604; CHECK-NEXT: vrmlsldavhat.s32 r0, r1, q0, q1605; CHECK-NEXT: bx lr606entry:607 %0 = lshr i64 %a, 32608 %1 = trunc i64 %0 to i32609 %2 = trunc i64 %a to i32610 %3 = zext i16 %p to i32611 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)612 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)613 %6 = extractvalue { i32, i32 } %5, 1614 %7 = zext i32 %6 to i64615 %8 = shl i64 %7, 32616 %9 = extractvalue { i32, i32 } %5, 0617 %10 = zext i32 %9 to i64618 %11 = or i64 %8, %10619 ret i64 %11620}621 622define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {623; CHECK-LABEL: test_vrmlsldavhaxq_p_s32:624; CHECK: @ %bb.0: @ %entry625; CHECK-NEXT: vmsr p0, r2626; CHECK-NEXT: vpst627; CHECK-NEXT: vrmlsldavhaxt.s32 r0, r1, q0, q1628; CHECK-NEXT: bx lr629entry:630 %0 = lshr i64 %a, 32631 %1 = trunc i64 %0 to i32632 %2 = trunc i64 %a to i32633 %3 = zext i16 %p to i32634 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)635 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)636 %6 = extractvalue { i32, i32 } %5, 1637 %7 = zext i32 %6 to i64638 %8 = shl i64 %7, 32639 %9 = extractvalue { i32, i32 } %5, 0640 %10 = zext i32 %9 to i64641 %11 = or i64 %8, %10642 ret i64 %11643}644 645define arm_aapcs_vfpcc i64 @test_vmlaldavq_s16(<8 x i16> %a, <8 x i16> %b) {646; CHECK-LABEL: test_vmlaldavq_s16:647; CHECK: @ %bb.0: @ %entry648; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1649; CHECK-NEXT: bx lr650entry:651 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)652 %1 = extractvalue { i32, i32 } %0, 1653 %2 = zext i32 %1 to i64654 %3 = shl i64 %2, 32655 %4 = extractvalue { i32, i32 } %0, 0656 %5 = zext i32 %4 to i64657 %6 = or i64 %3, %5658 ret i64 %6659}660 661define arm_aapcs_vfpcc i64 @test_vmlaldavq_s32(<4 x i32> %a, <4 x i32> %b) {662; CHECK-LABEL: test_vmlaldavq_s32:663; CHECK: @ %bb.0: @ %entry664; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1665; CHECK-NEXT: bx lr666entry:667 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)668 %1 = extractvalue { i32, i32 } %0, 1669 %2 = zext i32 %1 to i64670 %3 = shl i64 %2, 32671 %4 = extractvalue { i32, i32 } %0, 0672 %5 = zext i32 %4 to i64673 %6 = or i64 %3, %5674 ret i64 %6675}676 677define arm_aapcs_vfpcc i64 @test_vmlaldavq_u16(<8 x i16> %a, <8 x i16> %b) {678; CHECK-LABEL: test_vmlaldavq_u16:679; CHECK: @ %bb.0: @ %entry680; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1681; CHECK-NEXT: bx lr682entry:683 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)684 %1 = extractvalue { i32, i32 } %0, 1685 %2 = zext i32 %1 to i64686 %3 = shl i64 %2, 32687 %4 = extractvalue { i32, i32 } %0, 0688 %5 = zext i32 %4 to i64689 %6 = or i64 %3, %5690 ret i64 %6691}692 693define arm_aapcs_vfpcc i64 @test_vmlaldavq_u32(<4 x i32> %a, <4 x i32> %b) {694; CHECK-LABEL: test_vmlaldavq_u32:695; CHECK: @ %bb.0: @ %entry696; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1697; CHECK-NEXT: bx lr698entry:699 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)700 %1 = extractvalue { i32, i32 } %0, 1701 %2 = zext i32 %1 to i64702 %3 = shl i64 %2, 32703 %4 = extractvalue { i32, i32 } %0, 0704 %5 = zext i32 %4 to i64705 %6 = or i64 %3, %5706 ret i64 %6707}708 709define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s16(<8 x i16> %a, <8 x i16> %b) {710; CHECK-LABEL: test_vmlaldavxq_s16:711; CHECK: @ %bb.0: @ %entry712; CHECK-NEXT: vmlaldavx.s16 r0, r1, q0, q1713; CHECK-NEXT: bx lr714entry:715 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)716 %1 = extractvalue { i32, i32 } %0, 1717 %2 = zext i32 %1 to i64718 %3 = shl i64 %2, 32719 %4 = extractvalue { i32, i32 } %0, 0720 %5 = zext i32 %4 to i64721 %6 = or i64 %3, %5722 ret i64 %6723}724 725define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s32(<4 x i32> %a, <4 x i32> %b) {726; CHECK-LABEL: test_vmlaldavxq_s32:727; CHECK: @ %bb.0: @ %entry728; CHECK-NEXT: vmlaldavx.s32 r0, r1, q0, q1729; CHECK-NEXT: bx lr730entry:731 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)732 %1 = extractvalue { i32, i32 } %0, 1733 %2 = zext i32 %1 to i64734 %3 = shl i64 %2, 32735 %4 = extractvalue { i32, i32 } %0, 0736 %5 = zext i32 %4 to i64737 %6 = or i64 %3, %5738 ret i64 %6739}740 741define arm_aapcs_vfpcc i64 @test_vmlsldavq_s16(<8 x i16> %a, <8 x i16> %b) {742; CHECK-LABEL: test_vmlsldavq_s16:743; CHECK: @ %bb.0: @ %entry744; CHECK-NEXT: vmlsldav.s16 r0, r1, q0, q1745; CHECK-NEXT: bx lr746entry:747 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)748 %1 = extractvalue { i32, i32 } %0, 1749 %2 = zext i32 %1 to i64750 %3 = shl i64 %2, 32751 %4 = extractvalue { i32, i32 } %0, 0752 %5 = zext i32 %4 to i64753 %6 = or i64 %3, %5754 ret i64 %6755}756 757define arm_aapcs_vfpcc i64 @test_vmlsldavq_s32(<4 x i32> %a, <4 x i32> %b) {758; CHECK-LABEL: test_vmlsldavq_s32:759; CHECK: @ %bb.0: @ %entry760; CHECK-NEXT: vmlsldav.s32 r0, r1, q0, q1761; CHECK-NEXT: bx lr762entry:763 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)764 %1 = extractvalue { i32, i32 } %0, 1765 %2 = zext i32 %1 to i64766 %3 = shl i64 %2, 32767 %4 = extractvalue { i32, i32 } %0, 0768 %5 = zext i32 %4 to i64769 %6 = or i64 %3, %5770 ret i64 %6771}772 773define arm_aapcs_vfpcc i64 @test_vmlsldavxvq_s16(<8 x i16> %a, <8 x i16> %b) {774; CHECK-LABEL: test_vmlsldavxvq_s16:775; CHECK: @ %bb.0: @ %entry776; CHECK-NEXT: vmlsldavx.s16 r0, r1, q0, q1777; CHECK-NEXT: bx lr778entry:779 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)780 %1 = extractvalue { i32, i32 } %0, 1781 %2 = zext i32 %1 to i64782 %3 = shl i64 %2, 32783 %4 = extractvalue { i32, i32 } %0, 0784 %5 = zext i32 %4 to i64785 %6 = or i64 %3, %5786 ret i64 %6787}788 789define arm_aapcs_vfpcc i64 @test_vmlsldavxq_s32(<4 x i32> %a, <4 x i32> %b) {790; CHECK-LABEL: test_vmlsldavxq_s32:791; CHECK: @ %bb.0: @ %entry792; CHECK-NEXT: vmlsldavx.s32 r0, r1, q0, q1793; CHECK-NEXT: bx lr794entry:795 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)796 %1 = extractvalue { i32, i32 } %0, 1797 %2 = zext i32 %1 to i64798 %3 = shl i64 %2, 32799 %4 = extractvalue { i32, i32 } %0, 0800 %5 = zext i32 %4 to i64801 %6 = or i64 %3, %5802 ret i64 %6803}804 805define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_s32(<4 x i32> %a, <4 x i32> %b) {806; CHECK-LABEL: test_vrmlaldavhq_s32:807; CHECK: @ %bb.0: @ %entry808; CHECK-NEXT: vrmlalvh.s32 r0, r1, q0, q1809; CHECK-NEXT: bx lr810entry:811 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)812 %1 = extractvalue { i32, i32 } %0, 1813 %2 = zext i32 %1 to i64814 %3 = shl i64 %2, 32815 %4 = extractvalue { i32, i32 } %0, 0816 %5 = zext i32 %4 to i64817 %6 = or i64 %3, %5818 ret i64 %6819}820 821define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_u32(<4 x i32> %a, <4 x i32> %b) {822; CHECK-LABEL: test_vrmlaldavhq_u32:823; CHECK: @ %bb.0: @ %entry824; CHECK-NEXT: vrmlalvh.u32 r0, r1, q0, q1825; CHECK-NEXT: bx lr826entry:827 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)828 %1 = extractvalue { i32, i32 } %0, 1829 %2 = zext i32 %1 to i64830 %3 = shl i64 %2, 32831 %4 = extractvalue { i32, i32 } %0, 0832 %5 = zext i32 %4 to i64833 %6 = or i64 %3, %5834 ret i64 %6835}836 837define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_s32(<4 x i32> %a, <4 x i32> %b) {838; CHECK-LABEL: test_vrmlaldavhxq_s32:839; CHECK: @ %bb.0: @ %entry840; CHECK-NEXT: vrmlaldavhx.s32 r0, r1, q0, q1841; CHECK-NEXT: bx lr842entry:843 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)844 %1 = extractvalue { i32, i32 } %0, 1845 %2 = zext i32 %1 to i64846 %3 = shl i64 %2, 32847 %4 = extractvalue { i32, i32 } %0, 0848 %5 = zext i32 %4 to i64849 %6 = or i64 %3, %5850 ret i64 %6851}852 853define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_s32(<4 x i32> %a, <4 x i32> %b) {854; CHECK-LABEL: test_vrmlsldavhq_s32:855; CHECK: @ %bb.0: @ %entry856; CHECK-NEXT: vrmlsldavh.s32 r0, r1, q0, q1857; CHECK-NEXT: bx lr858entry:859 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)860 %1 = extractvalue { i32, i32 } %0, 1861 %2 = zext i32 %1 to i64862 %3 = shl i64 %2, 32863 %4 = extractvalue { i32, i32 } %0, 0864 %5 = zext i32 %4 to i64865 %6 = or i64 %3, %5866 ret i64 %6867}868 869define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_s32(<4 x i32> %a, <4 x i32> %b) {870; CHECK-LABEL: test_vrmlsldavhxq_s32:871; CHECK: @ %bb.0: @ %entry872; CHECK-NEXT: vrmlsldavhx.s32 r0, r1, q0, q1873; CHECK-NEXT: bx lr874entry:875 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)876 %1 = extractvalue { i32, i32 } %0, 1877 %2 = zext i32 %1 to i64878 %3 = shl i64 %2, 32879 %4 = extractvalue { i32, i32 } %0, 0880 %5 = zext i32 %4 to i64881 %6 = or i64 %3, %5882 ret i64 %6883}884 885define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {886; CHECK-LABEL: test_vmlaldavq_p_s16:887; CHECK: @ %bb.0: @ %entry888; CHECK-NEXT: vmsr p0, r0889; CHECK-NEXT: vpst890; CHECK-NEXT: vmlalvt.s16 r0, r1, q0, q1891; CHECK-NEXT: bx lr892entry:893 %0 = zext i16 %p to i32894 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)895 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)896 %3 = extractvalue { i32, i32 } %2, 1897 %4 = zext i32 %3 to i64898 %5 = shl i64 %4, 32899 %6 = extractvalue { i32, i32 } %2, 0900 %7 = zext i32 %6 to i64901 %8 = or i64 %5, %7902 ret i64 %8903}904 905define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {906; CHECK-LABEL: test_vmlaldavq_p_s32:907; CHECK: @ %bb.0: @ %entry908; CHECK-NEXT: vmsr p0, r0909; CHECK-NEXT: vpst910; CHECK-NEXT: vmlalvt.s32 r0, r1, q0, q1911; CHECK-NEXT: bx lr912entry:913 %0 = zext i16 %p to i32914 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)915 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)916 %3 = extractvalue { i32, i32 } %2, 1917 %4 = zext i32 %3 to i64918 %5 = shl i64 %4, 32919 %6 = extractvalue { i32, i32 } %2, 0920 %7 = zext i32 %6 to i64921 %8 = or i64 %5, %7922 ret i64 %8923}924 925define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {926; CHECK-LABEL: test_vmlaldavq_p_u16:927; CHECK: @ %bb.0: @ %entry928; CHECK-NEXT: vmsr p0, r0929; CHECK-NEXT: vpst930; CHECK-NEXT: vmlalvt.u16 r0, r1, q0, q1931; CHECK-NEXT: bx lr932entry:933 %0 = zext i16 %p to i32934 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)935 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)936 %3 = extractvalue { i32, i32 } %2, 1937 %4 = zext i32 %3 to i64938 %5 = shl i64 %4, 32939 %6 = extractvalue { i32, i32 } %2, 0940 %7 = zext i32 %6 to i64941 %8 = or i64 %5, %7942 ret i64 %8943}944 945define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {946; CHECK-LABEL: test_vmlaldavq_p_u32:947; CHECK: @ %bb.0: @ %entry948; CHECK-NEXT: vmsr p0, r0949; CHECK-NEXT: vpst950; CHECK-NEXT: vmlalvt.u32 r0, r1, q0, q1951; CHECK-NEXT: bx lr952entry:953 %0 = zext i16 %p to i32954 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)955 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)956 %3 = extractvalue { i32, i32 } %2, 1957 %4 = zext i32 %3 to i64958 %5 = shl i64 %4, 32959 %6 = extractvalue { i32, i32 } %2, 0960 %7 = zext i32 %6 to i64961 %8 = or i64 %5, %7962 ret i64 %8963}964 965define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {966; CHECK-LABEL: test_vmlaldavxq_p_s16:967; CHECK: @ %bb.0: @ %entry968; CHECK-NEXT: vmsr p0, r0969; CHECK-NEXT: vpst970; CHECK-NEXT: vmlaldavxt.s16 r0, r1, q0, q1971; CHECK-NEXT: bx lr972entry:973 %0 = zext i16 %p to i32974 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)975 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)976 %3 = extractvalue { i32, i32 } %2, 1977 %4 = zext i32 %3 to i64978 %5 = shl i64 %4, 32979 %6 = extractvalue { i32, i32 } %2, 0980 %7 = zext i32 %6 to i64981 %8 = or i64 %5, %7982 ret i64 %8983}984 985define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {986; CHECK-LABEL: test_vmlaldavxq_p_s32:987; CHECK: @ %bb.0: @ %entry988; CHECK-NEXT: vmsr p0, r0989; CHECK-NEXT: vpst990; CHECK-NEXT: vmlaldavxt.s32 r0, r1, q0, q1991; CHECK-NEXT: bx lr992entry:993 %0 = zext i16 %p to i32994 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)995 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)996 %3 = extractvalue { i32, i32 } %2, 1997 %4 = zext i32 %3 to i64998 %5 = shl i64 %4, 32999 %6 = extractvalue { i32, i32 } %2, 01000 %7 = zext i32 %6 to i641001 %8 = or i64 %5, %71002 ret i64 %81003}1004 1005define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {1006; CHECK-LABEL: test_vmlsldavq_p_s16:1007; CHECK: @ %bb.0: @ %entry1008; CHECK-NEXT: vmsr p0, r01009; CHECK-NEXT: vpst1010; CHECK-NEXT: vmlsldavt.s16 r0, r1, q0, q11011; CHECK-NEXT: bx lr1012entry:1013 %0 = zext i16 %p to i321014 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)1015 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)1016 %3 = extractvalue { i32, i32 } %2, 11017 %4 = zext i32 %3 to i641018 %5 = shl i64 %4, 321019 %6 = extractvalue { i32, i32 } %2, 01020 %7 = zext i32 %6 to i641021 %8 = or i64 %5, %71022 ret i64 %81023}1024 1025define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1026; CHECK-LABEL: test_vmlsldavq_p_s32:1027; CHECK: @ %bb.0: @ %entry1028; CHECK-NEXT: vmsr p0, r01029; CHECK-NEXT: vpst1030; CHECK-NEXT: vmlsldavt.s32 r0, r1, q0, q11031; CHECK-NEXT: bx lr1032entry:1033 %0 = zext i16 %p to i321034 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1035 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1036 %3 = extractvalue { i32, i32 } %2, 11037 %4 = zext i32 %3 to i641038 %5 = shl i64 %4, 321039 %6 = extractvalue { i32, i32 } %2, 01040 %7 = zext i32 %6 to i641041 %8 = or i64 %5, %71042 ret i64 %81043}1044 1045define arm_aapcs_vfpcc i64 @test_vmlsldaxvq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {1046; CHECK-LABEL: test_vmlsldaxvq_p_s16:1047; CHECK: @ %bb.0: @ %entry1048; CHECK-NEXT: vmsr p0, r01049; CHECK-NEXT: vpst1050; CHECK-NEXT: vmlsldavxt.s16 r0, r1, q0, q11051; CHECK-NEXT: bx lr1052entry:1053 %0 = zext i16 %p to i321054 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)1055 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)1056 %3 = extractvalue { i32, i32 } %2, 11057 %4 = zext i32 %3 to i641058 %5 = shl i64 %4, 321059 %6 = extractvalue { i32, i32 } %2, 01060 %7 = zext i32 %6 to i641061 %8 = or i64 %5, %71062 ret i64 %81063}1064 1065define arm_aapcs_vfpcc i64 @test_vmlsldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1066; CHECK-LABEL: test_vmlsldavxq_p_s32:1067; CHECK: @ %bb.0: @ %entry1068; CHECK-NEXT: vmsr p0, r01069; CHECK-NEXT: vpst1070; CHECK-NEXT: vmlsldavxt.s32 r0, r1, q0, q11071; CHECK-NEXT: bx lr1072entry:1073 %0 = zext i16 %p to i321074 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1075 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1076 %3 = extractvalue { i32, i32 } %2, 11077 %4 = zext i32 %3 to i641078 %5 = shl i64 %4, 321079 %6 = extractvalue { i32, i32 } %2, 01080 %7 = zext i32 %6 to i641081 %8 = or i64 %5, %71082 ret i64 %81083}1084 1085define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1086; CHECK-LABEL: test_vrmlaldavhq_p_s32:1087; CHECK: @ %bb.0: @ %entry1088; CHECK-NEXT: vmsr p0, r01089; CHECK-NEXT: vpst1090; CHECK-NEXT: vrmlalvht.s32 r0, r1, q0, q11091; CHECK-NEXT: bx lr1092entry:1093 %0 = zext i16 %p to i321094 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1095 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1096 %3 = extractvalue { i32, i32 } %2, 11097 %4 = zext i32 %3 to i641098 %5 = shl i64 %4, 321099 %6 = extractvalue { i32, i32 } %2, 01100 %7 = zext i32 %6 to i641101 %8 = or i64 %5, %71102 ret i64 %81103}1104 1105define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1106; CHECK-LABEL: test_vrmlaldavhq_p_u32:1107; CHECK: @ %bb.0: @ %entry1108; CHECK-NEXT: vmsr p0, r01109; CHECK-NEXT: vpst1110; CHECK-NEXT: vrmlalvht.u32 r0, r1, q0, q11111; CHECK-NEXT: bx lr1112entry:1113 %0 = zext i16 %p to i321114 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1115 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1116 %3 = extractvalue { i32, i32 } %2, 11117 %4 = zext i32 %3 to i641118 %5 = shl i64 %4, 321119 %6 = extractvalue { i32, i32 } %2, 01120 %7 = zext i32 %6 to i641121 %8 = or i64 %5, %71122 ret i64 %81123}1124 1125define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1126; CHECK-LABEL: test_vrmlaldavhxq_p_s32:1127; CHECK: @ %bb.0: @ %entry1128; CHECK-NEXT: vmsr p0, r01129; CHECK-NEXT: vpst1130; CHECK-NEXT: vrmlaldavhxt.s32 r0, r1, q0, q11131; CHECK-NEXT: bx lr1132entry:1133 %0 = zext i16 %p to i321134 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1135 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1136 %3 = extractvalue { i32, i32 } %2, 11137 %4 = zext i32 %3 to i641138 %5 = shl i64 %4, 321139 %6 = extractvalue { i32, i32 } %2, 01140 %7 = zext i32 %6 to i641141 %8 = or i64 %5, %71142 ret i64 %81143}1144 1145define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1146; CHECK-LABEL: test_vrmlsldavhq_p_s32:1147; CHECK: @ %bb.0: @ %entry1148; CHECK-NEXT: vmsr p0, r01149; CHECK-NEXT: vpst1150; CHECK-NEXT: vrmlsldavht.s32 r0, r1, q0, q11151; CHECK-NEXT: bx lr1152entry:1153 %0 = zext i16 %p to i321154 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1155 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1156 %3 = extractvalue { i32, i32 } %2, 11157 %4 = zext i32 %3 to i641158 %5 = shl i64 %4, 321159 %6 = extractvalue { i32, i32 } %2, 01160 %7 = zext i32 %6 to i641161 %8 = or i64 %5, %71162 ret i64 %81163}1164 1165define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {1166; CHECK-LABEL: test_vrmlsldavhxq_p_s32:1167; CHECK: @ %bb.0: @ %entry1168; CHECK-NEXT: vmsr p0, r01169; CHECK-NEXT: vpst1170; CHECK-NEXT: vrmlsldavhxt.s32 r0, r1, q0, q11171; CHECK-NEXT: bx lr1172entry:1173 %0 = zext i16 %p to i321174 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)1175 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)1176 %3 = extractvalue { i32, i32 } %2, 11177 %4 = zext i32 %3 to i641178 %5 = shl i64 %4, 321179 %6 = extractvalue { i32, i32 } %2, 01180 %7 = zext i32 %6 to i641181 %8 = or i64 %5, %71182 ret i64 %81183}1184