1fc3417cbSMark Murray; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2fc3417cbSMark Murray; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s 3fc3417cbSMark Murray 4a2cd4600SMark Murraydefine arm_aapcs_vfpcc <16 x i8> @test_vqdmulhq_s8(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 { 5a2cd4600SMark Murray; CHECK-LABEL: test_vqdmulhq_s8: 6fc3417cbSMark Murray; CHECK: @ %bb.0: @ %entry 7fc3417cbSMark Murray; CHECK-NEXT: vqdmulh.s8 q0, q0, q1 8fc3417cbSMark Murray; CHECK-NEXT: bx lr 9fc3417cbSMark Murrayentry: 10fc3417cbSMark Murray %0 = tail call <16 x i8> @llvm.arm.mve.vqdmulh.v16i8(<16 x i8> %a, <16 x i8> %b) 11fc3417cbSMark Murray ret <16 x i8> %0 12fc3417cbSMark Murray} 13fc3417cbSMark Murray 14fc3417cbSMark Murraydeclare <16 x i8> @llvm.arm.mve.vqdmulh.v16i8(<16 x i8>, <16 x i8>) #1 15fc3417cbSMark Murray 16fc3417cbSMark Murraydefine arm_aapcs_vfpcc <8 x i16> @test_vqdmulhq_s16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 { 17fc3417cbSMark Murray; CHECK-LABEL: test_vqdmulhq_s16: 18fc3417cbSMark Murray; CHECK: @ %bb.0: @ %entry 19fc3417cbSMark Murray; CHECK-NEXT: vqdmulh.s16 q0, q0, q1 20fc3417cbSMark Murray; CHECK-NEXT: bx lr 21fc3417cbSMark Murrayentry: 22fc3417cbSMark Murray %0 = tail call <8 x i16> @llvm.arm.mve.vqdmulh.v8i16(<8 x i16> %a, <8 x i16> %b) 23fc3417cbSMark Murray ret <8 x i16> %0 24fc3417cbSMark Murray} 25fc3417cbSMark Murray 26fc3417cbSMark Murraydeclare <8 x i16> @llvm.arm.mve.vqdmulh.v8i16(<8 x i16>, <8 x i16>) #1 27fc3417cbSMark Murray 28a2cd4600SMark Murraydefine arm_aapcs_vfpcc <4 x i32> @test_vqdmulhq_s32(<4 x i32> %a, <4 x i32> %b) local_unnamed_addr #0 { 29a2cd4600SMark Murray; CHECK-LABEL: test_vqdmulhq_s32: 30fc3417cbSMark Murray; CHECK: @ %bb.0: @ %entry 31fc3417cbSMark Murray; CHECK-NEXT: vqdmulh.s32 q0, q0, q1 32fc3417cbSMark Murray; CHECK-NEXT: bx lr 33fc3417cbSMark Murrayentry: 34fc3417cbSMark Murray %0 = tail call <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32> %a, <4 x i32> %b) 35fc3417cbSMark Murray ret <4 x i32> %0 36fc3417cbSMark Murray} 37fc3417cbSMark Murray 38fc3417cbSMark Murraydeclare <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32>, <4 x i32>) #1 39fc3417cbSMark Murray 40fc3417cbSMark Murraydefine arm_aapcs_vfpcc <16 x i8> @test_vqdmulhq_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) local_unnamed_addr #0 { 41fc3417cbSMark Murray; CHECK-LABEL: test_vqdmulhq_m_s8: 42fc3417cbSMark Murray; CHECK: @ %bb.0: @ %entry 43fc3417cbSMark Murray; CHECK-NEXT: vmsr p0, r0 44fc3417cbSMark Murray; CHECK-NEXT: vpst 45fc3417cbSMark Murray; CHECK-NEXT: vqdmulht.s8 q0, q1, q2 46fc3417cbSMark Murray; CHECK-NEXT: bx lr 47fc3417cbSMark Murrayentry: 48fc3417cbSMark Murray %0 = zext i16 %p to i32 49fc3417cbSMark Murray %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0) 50fc3417cbSMark Murray %2 = tail call <16 x i8> @llvm.arm.mve.qdmulh.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i1> %1, <16 x i8> %inactive) 51fc3417cbSMark Murray ret <16 x i8> %2 52fc3417cbSMark Murray} 53fc3417cbSMark Murray 54fc3417cbSMark Murraydeclare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32) #1 55fc3417cbSMark Murray 56fc3417cbSMark Murraydeclare <16 x i8> @llvm.arm.mve.qdmulh.predicated.v16i8.v16i1(<16 x i8>, <16 x i8>, <16 x i1>, <16 x i8>) #1 57fc3417cbSMark Murray 58a2cd4600SMark Murraydefine arm_aapcs_vfpcc <8 x i16> @test_vqdmulhq_m_s16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) local_unnamed_addr #0 { 59a2cd4600SMark Murray; CHECK-LABEL: test_vqdmulhq_m_s16: 60fc3417cbSMark Murray; CHECK: @ %bb.0: @ %entry 61fc3417cbSMark Murray; CHECK-NEXT: vmsr p0, r0 62fc3417cbSMark Murray; CHECK-NEXT: vpst 63fc3417cbSMark Murray; CHECK-NEXT: vqdmulht.s16 q0, q1, q2 64fc3417cbSMark Murray; CHECK-NEXT: bx lr 65fc3417cbSMark Murrayentry: 66fc3417cbSMark Murray %0 = zext i16 %p to i32 67fc3417cbSMark Murray %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 68fc3417cbSMark Murray %2 = tail call <8 x i16> @llvm.arm.mve.qdmulh.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i1> %1, <8 x i16> %inactive) 69fc3417cbSMark Murray ret <8 x i16> %2 70fc3417cbSMark Murray} 71fc3417cbSMark Murray 72fc3417cbSMark Murraydeclare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) #1 73fc3417cbSMark Murray 74fc3417cbSMark Murraydeclare <8 x i16> @llvm.arm.mve.qdmulh.predicated.v8i16.v8i1(<8 x i16>, <8 x i16>, <8 x i1>, <8 x i16>) #1 75fc3417cbSMark Murray 76fc3417cbSMark Murraydefine arm_aapcs_vfpcc <4 x i32> @test_vqdmulhq_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) local_unnamed_addr #0 { 77fc3417cbSMark Murray; CHECK-LABEL: test_vqdmulhq_m_s32: 78fc3417cbSMark Murray; CHECK: @ %bb.0: @ %entry 79fc3417cbSMark Murray; CHECK-NEXT: vmsr p0, r0 80fc3417cbSMark Murray; CHECK-NEXT: vpst 81fc3417cbSMark Murray; CHECK-NEXT: vqdmulht.s32 q0, q1, q2 82fc3417cbSMark Murray; CHECK-NEXT: bx lr 83fc3417cbSMark Murrayentry: 84fc3417cbSMark Murray %0 = zext i16 %p to i32 85fc3417cbSMark Murray %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 86fc3417cbSMark Murray %2 = tail call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i1> %1, <4 x i32> %inactive) 87fc3417cbSMark Murray ret <4 x i32> %2 88fc3417cbSMark Murray} 89fc3417cbSMark Murray 90fc3417cbSMark Murraydeclare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32) #1 91fc3417cbSMark Murray 92fc3417cbSMark Murraydeclare <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>) #1 93*489f62e8SMikhail Maltsev 94*489f62e8SMikhail Maltsevdefine arm_aapcs_vfpcc <16 x i8> @test_vqdmulhq_n_s8(<16 x i8> %a, i8 signext %b) { 95*489f62e8SMikhail Maltsev; CHECK-LABEL: test_vqdmulhq_n_s8: 96*489f62e8SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 97*489f62e8SMikhail Maltsev; CHECK-NEXT: vqdmulh.s8 q0, q0, r0 98*489f62e8SMikhail Maltsev; CHECK-NEXT: bx lr 99*489f62e8SMikhail Maltseventry: 100*489f62e8SMikhail Maltsev %.splatinsert = insertelement <16 x i8> undef, i8 %b, i32 0 101*489f62e8SMikhail Maltsev %.splat = shufflevector <16 x i8> %.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer 102*489f62e8SMikhail Maltsev %0 = call <16 x i8> @llvm.arm.mve.vqdmulh.v16i8(<16 x i8> %a, <16 x i8> %.splat) 103*489f62e8SMikhail Maltsev ret <16 x i8> %0 104*489f62e8SMikhail Maltsev} 105*489f62e8SMikhail Maltsev 106*489f62e8SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x i16> @test_vqdmulhq_n_s16(<8 x i16> %a, i16 signext %b) { 107*489f62e8SMikhail Maltsev; CHECK-LABEL: test_vqdmulhq_n_s16: 108*489f62e8SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 109*489f62e8SMikhail Maltsev; CHECK-NEXT: vqdmulh.s16 q0, q0, r0 110*489f62e8SMikhail Maltsev; CHECK-NEXT: bx lr 111*489f62e8SMikhail Maltseventry: 112*489f62e8SMikhail Maltsev %.splatinsert = insertelement <8 x i16> undef, i16 %b, i32 0 113*489f62e8SMikhail Maltsev %.splat = shufflevector <8 x i16> %.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer 114*489f62e8SMikhail Maltsev %0 = call <8 x i16> @llvm.arm.mve.vqdmulh.v8i16(<8 x i16> %a, <8 x i16> %.splat) 115*489f62e8SMikhail Maltsev ret <8 x i16> %0 116*489f62e8SMikhail Maltsev} 117*489f62e8SMikhail Maltsev 118*489f62e8SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x i32> @test_vqdmulhq_n_s32(<4 x i32> %a, i32 %b) { 119*489f62e8SMikhail Maltsev; CHECK-LABEL: test_vqdmulhq_n_s32: 120*489f62e8SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 121*489f62e8SMikhail Maltsev; CHECK-NEXT: vqdmulh.s32 q0, q0, r0 122*489f62e8SMikhail Maltsev; CHECK-NEXT: bx lr 123*489f62e8SMikhail Maltseventry: 124*489f62e8SMikhail Maltsev %.splatinsert = insertelement <4 x i32> undef, i32 %b, i32 0 125*489f62e8SMikhail Maltsev %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer 126*489f62e8SMikhail Maltsev %0 = call <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32> %a, <4 x i32> %.splat) 127*489f62e8SMikhail Maltsev ret <4 x i32> %0 128*489f62e8SMikhail Maltsev} 129*489f62e8SMikhail Maltsev 130*489f62e8SMikhail Maltsevdefine arm_aapcs_vfpcc <16 x i8> @test_vqdmulhq_m_n_s8(<16 x i8> %inactive, <16 x i8> %a, i8 signext %b, i16 zeroext %p) { 131*489f62e8SMikhail Maltsev; CHECK-LABEL: test_vqdmulhq_m_n_s8: 132*489f62e8SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 133*489f62e8SMikhail Maltsev; CHECK-NEXT: vmsr p0, r1 134*489f62e8SMikhail Maltsev; CHECK-NEXT: vpst 135*489f62e8SMikhail Maltsev; CHECK-NEXT: vqdmulht.s8 q0, q1, r0 136*489f62e8SMikhail Maltsev; CHECK-NEXT: bx lr 137*489f62e8SMikhail Maltseventry: 138*489f62e8SMikhail Maltsev %.splatinsert = insertelement <16 x i8> undef, i8 %b, i32 0 139*489f62e8SMikhail Maltsev %.splat = shufflevector <16 x i8> %.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer 140*489f62e8SMikhail Maltsev %0 = zext i16 %p to i32 141*489f62e8SMikhail Maltsev %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0) 142*489f62e8SMikhail Maltsev %2 = call <16 x i8> @llvm.arm.mve.qdmulh.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i8> %.splat, <16 x i1> %1, <16 x i8> %inactive) 143*489f62e8SMikhail Maltsev ret <16 x i8> %2 144*489f62e8SMikhail Maltsev} 145*489f62e8SMikhail Maltsev 146*489f62e8SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x i16> @test_vqdmulhq_m_n_s16(<8 x i16> %inactive, <8 x i16> %a, i16 signext %b, i16 zeroext %p) { 147*489f62e8SMikhail Maltsev; CHECK-LABEL: test_vqdmulhq_m_n_s16: 148*489f62e8SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 149*489f62e8SMikhail Maltsev; CHECK-NEXT: vmsr p0, r1 150*489f62e8SMikhail Maltsev; CHECK-NEXT: vpst 151*489f62e8SMikhail Maltsev; CHECK-NEXT: vqdmulht.s16 q0, q1, r0 152*489f62e8SMikhail Maltsev; CHECK-NEXT: bx lr 153*489f62e8SMikhail Maltseventry: 154*489f62e8SMikhail Maltsev %.splatinsert = insertelement <8 x i16> undef, i16 %b, i32 0 155*489f62e8SMikhail Maltsev %.splat = shufflevector <8 x i16> %.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer 156*489f62e8SMikhail Maltsev %0 = zext i16 %p to i32 157*489f62e8SMikhail Maltsev %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 158*489f62e8SMikhail Maltsev %2 = call <8 x i16> @llvm.arm.mve.qdmulh.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i16> %.splat, <8 x i1> %1, <8 x i16> %inactive) 159*489f62e8SMikhail Maltsev ret <8 x i16> %2 160*489f62e8SMikhail Maltsev} 161*489f62e8SMikhail Maltsev 162*489f62e8SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x i32> @test_vqdmulhq_m_n_s32(<4 x i32> %inactive, <4 x i32> %a, i32 %b, i16 zeroext %p) { 163*489f62e8SMikhail Maltsev; CHECK-LABEL: test_vqdmulhq_m_n_s32: 164*489f62e8SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 165*489f62e8SMikhail Maltsev; CHECK-NEXT: vmsr p0, r1 166*489f62e8SMikhail Maltsev; CHECK-NEXT: vpst 167*489f62e8SMikhail Maltsev; CHECK-NEXT: vqdmulht.s32 q0, q1, r0 168*489f62e8SMikhail Maltsev; CHECK-NEXT: bx lr 169*489f62e8SMikhail Maltseventry: 170*489f62e8SMikhail Maltsev %.splatinsert = insertelement <4 x i32> undef, i32 %b, i32 0 171*489f62e8SMikhail Maltsev %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer 172*489f62e8SMikhail Maltsev %0 = zext i16 %p to i32 173*489f62e8SMikhail Maltsev %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 174*489f62e8SMikhail Maltsev %2 = call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i32> %.splat, <4 x i1> %1, <4 x i32> %inactive) 175*489f62e8SMikhail Maltsev ret <4 x i32> %2 176*489f62e8SMikhail Maltsev} 177