xref: /llvm-project/llvm/test/CodeGen/Thumb2/mve-intrinsics/vqdmulhq.ll (revision 489f62e8011f54fc94d9c3a4cc2d1d66d3b5bc49)
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