; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32) declare { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>) declare { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>) declare { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>) declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>, <8 x i1>) declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>) declare { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>) define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { ; CHECK-LABEL: test_vmlaldavaq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vmlaldavaq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalva.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u16(i64 %a, <8 x i16> %b, <8 x i16> %c) { ; CHECK-LABEL: test_vmlaldavaq_u16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalva.u16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vmlaldavaq_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalva.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { ; CHECK-LABEL: test_vmlaldavaxq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlaldavax.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vmlaldavaxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlaldavax.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { ; CHECK-LABEL: test_vmlsldavaq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldava.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vmlsldavaq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldava.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { ; CHECK-LABEL: test_vmlsldaxvaq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldavax.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vmlsldavaxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldavax.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vrmlaldavhaq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlalvha.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vrmlaldavhaq_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlalvha.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vrmlaldavhaxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlaldavhax.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vrmlsldavhaq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlsldavha.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { ; CHECK-LABEL: test_vrmlsldavhaxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlsldavhax.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %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) %4 = extractvalue { i32, i32 } %3, 1 %5 = zext i32 %4 to i64 %6 = shl i64 %5, 32 %7 = extractvalue { i32, i32 } %3, 0 %8 = zext i32 %7 to i64 %9 = or i64 %6, %8 ret i64 %9 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavaq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvat.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavaq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvat.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavaq_p_u16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvat.u16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavaq_p_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvat.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavaxq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlaldavaxt.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavaxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlaldavaxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldavaq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavat.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldavaq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavat.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldaxvaq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavaxt.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldavaxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavaxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlaldavhaq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlalvhat.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlaldavhaq_p_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlalvhat.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlaldavhaxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlaldavhaxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlsldavhaq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlsldavhat.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlsldavhaxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r2 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlsldavhaxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = lshr i64 %a, 32 %1 = trunc i64 %0 to i32 %2 = trunc i64 %a to i32 %3 = zext i16 %p to i32 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) %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) %6 = extractvalue { i32, i32 } %5, 1 %7 = zext i32 %6 to i64 %8 = shl i64 %7, 32 %9 = extractvalue { i32, i32 } %5, 0 %10 = zext i32 %9 to i64 %11 = or i64 %8, %10 ret i64 %11 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_s16(<8 x i16> %a, <8 x i16> %b) { ; CHECK-LABEL: test_vmlaldavq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vmlaldavq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_u16(<8 x i16> %a, <8 x i16> %b) { ; CHECK-LABEL: test_vmlaldavq_u16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_u32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vmlaldavq_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s16(<8 x i16> %a, <8 x i16> %b) { ; CHECK-LABEL: test_vmlaldavxq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlaldavx.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vmlaldavxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlaldavx.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlsldavq_s16(<8 x i16> %a, <8 x i16> %b) { ; CHECK-LABEL: test_vmlsldavq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldav.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlsldavq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vmlsldavq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldav.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlsldavxvq_s16(<8 x i16> %a, <8 x i16> %b) { ; CHECK-LABEL: test_vmlsldavxvq_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldavx.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlsldavxq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vmlsldavxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmlsldavx.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vrmlaldavhq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlalvh.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_u32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vrmlaldavhq_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlalvh.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vrmlaldavhxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlaldavhx.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vrmlsldavhq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlsldavh.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_s32(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: test_vrmlsldavhxq_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vrmlsldavhx.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %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) %1 = extractvalue { i32, i32 } %0, 1 %2 = zext i32 %1 to i64 %3 = shl i64 %2, 32 %4 = extractvalue { i32, i32 } %0, 0 %5 = zext i32 %4 to i64 %6 = or i64 %3, %5 ret i64 %6 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvt.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavq_p_u16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvt.u16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavq_p_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlalvt.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavxq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlaldavxt.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlaldavxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlaldavxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldavq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavt.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldavq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlsldaxvq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldaxvq_p_s16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavxt.s16 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vmlsldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vmlsldavxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vmlsldavxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlaldavhq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlalvht.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlaldavhq_p_u32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlalvht.u32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlaldavhxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlaldavhxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlsldavhq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlsldavht.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 } define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { ; CHECK-LABEL: test_vrmlsldavhxq_p_s32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vmsr p0, r0 ; CHECK-NEXT: vpst ; CHECK-NEXT: vrmlsldavhxt.s32 r0, r1, q0, q1 ; CHECK-NEXT: bx lr entry: %0 = zext i16 %p to i32 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) %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) %3 = extractvalue { i32, i32 } %2, 1 %4 = zext i32 %3 to i64 %5 = shl i64 %4, 32 %6 = extractvalue { i32, i32 } %2, 0 %7 = zext i32 %6 to i64 %8 = or i64 %5, %7 ret i64 %8 }