xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vqdmul.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mattr=+neon < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
3*9880d681SAndroid Build Coastguard Workertarget triple = "thumbv7-elf"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vqdmulhs16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
6*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmulhs16:
7*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmulh.s16
8*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
9*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i16>, <4 x i16>* %B
10*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i16> @llvm.arm.neon.vqdmulh.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
11*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp3
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vqdmulhs32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
15*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmulhs32:
16*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmulh.s32
17*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
18*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x i32>, <2 x i32>* %B
19*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i32> @llvm.arm.neon.vqdmulh.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
20*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp3
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vqdmulhQs16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
24*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmulhQs16:
25*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmulh.s16
26*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i16>, <8 x i16>* %A
27*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <8 x i16>, <8 x i16>* %B
28*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <8 x i16> @llvm.arm.neon.vqdmulh.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
29*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp3
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vqdmulhQs32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
33*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmulhQs32:
34*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmulh.s32
35*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i32>, <4 x i32>* %A
36*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i32>, <4 x i32>* %B
37*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i32> @llvm.arm.neon.vqdmulh.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
38*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <8 x i16> @test_vqdmulhQ_lanes16(<8 x i16> %arg0_int16x8_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqdmulhQ_lanes16
44*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmulh.s16 q0, q0, d2[1]
45*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> ; <<8 x i16>> [#uses=1]
46*9880d681SAndroid Build Coastguard Worker  %1 = tail call <8 x i16> @llvm.arm.neon.vqdmulh.v8i16(<8 x i16> %arg0_int16x8_t, <8 x i16> %0) ; <<8 x i16>> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %1
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i32> @test_vqdmulhQ_lanes32(<4 x i32> %arg0_int32x4_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqdmulhQ_lanes32
53*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmulh.s32 q0, q0, d2[1]
54*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses=1]
55*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmulh.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i32> %0) ; <<4 x i32>> [#uses=1]
56*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %1
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i16> @test_vqdmulh_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqdmulh_lanes16
62*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmulh.s16 d0, d0, d1[1]
63*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i16> @llvm.arm.neon.vqdmulh.v4i16(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i16>> [#uses=1]
65*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %1
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <2 x i32> @test_vqdmulh_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
69*9880d681SAndroid Build Coastguard Workerentry:
70*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqdmulh_lanes32
71*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmulh.s32 d0, d0, d1[1]
72*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
73*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i32> @llvm.arm.neon.vqdmulh.v2i32(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i32>> [#uses=1]
74*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %1
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.arm.neon.vqdmulh.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
78*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.arm.neon.vqdmulh.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.arm.neon.vqdmulh.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
81*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vqdmulh.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vqrdmulhs16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
84*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqrdmulhs16:
85*9880d681SAndroid Build Coastguard Worker;CHECK: vqrdmulh.s16
86*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
87*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i16>, <4 x i16>* %B
88*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
89*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp3
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vqrdmulhs32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
93*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqrdmulhs32:
94*9880d681SAndroid Build Coastguard Worker;CHECK: vqrdmulh.s32
95*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
96*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x i32>, <2 x i32>* %B
97*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
98*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp3
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vqrdmulhQs16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
102*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqrdmulhQs16:
103*9880d681SAndroid Build Coastguard Worker;CHECK: vqrdmulh.s16
104*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i16>, <8 x i16>* %A
105*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <8 x i16>, <8 x i16>* %B
106*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
107*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp3
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vqrdmulhQs32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
111*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqrdmulhQs32:
112*9880d681SAndroid Build Coastguard Worker;CHECK: vqrdmulh.s32
113*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i32>, <4 x i32>* %A
114*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i32>, <4 x i32>* %B
115*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
116*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <8 x i16> @test_vqRdmulhQ_lanes16(<8 x i16> %arg0_int16x8_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqRdmulhQ_lanes16
122*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmulh.s16 q0, q0, d2[1]
123*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> ; <<8 x i16>> [#uses=1]
124*9880d681SAndroid Build Coastguard Worker  %1 = tail call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %arg0_int16x8_t, <8 x i16> %0) ; <<8 x i16>> [#uses=1]
125*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %1
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i32> @test_vqRdmulhQ_lanes32(<4 x i32> %arg0_int32x4_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
129*9880d681SAndroid Build Coastguard Workerentry:
130*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqRdmulhQ_lanes32
131*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmulh.s32 q0, q0, d2[1]
132*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses=1]
133*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i32> %0) ; <<4 x i32>> [#uses=1]
134*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %1
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i16> @test_vqRdmulh_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
138*9880d681SAndroid Build Coastguard Workerentry:
139*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqRdmulh_lanes16
140*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmulh.s16 d0, d0, d1[1]
141*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
142*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i16>> [#uses=1]
143*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %1
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <2 x i32> @test_vqRdmulh_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
147*9880d681SAndroid Build Coastguard Workerentry:
148*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqRdmulh_lanes32
149*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmulh.s32 d0, d0, d1[1]
150*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
151*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i32>> [#uses=1]
152*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %1
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
156*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
159*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vqdmulls16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
162*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmulls16:
163*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmull.s16
164*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
165*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i16>, <4 x i16>* %B
166*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %tmp1, <4 x i16> %tmp2)
167*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vqdmulls32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
171*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmulls32:
172*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmull.s32
173*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
174*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x i32>, <2 x i32>* %B
175*9880d681SAndroid Build Coastguard Worker	%tmp3 = call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %tmp1, <2 x i32> %tmp2)
176*9880d681SAndroid Build Coastguard Worker	ret <2 x i64> %tmp3
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i32> @test_vqdmull_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
180*9880d681SAndroid Build Coastguard Workerentry:
181*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqdmull_lanes16
182*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmull.s16 q0, d0, d1[1]
183*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
184*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
185*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %1
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <2 x i64> @test_vqdmull_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
189*9880d681SAndroid Build Coastguard Workerentry:
190*9880d681SAndroid Build Coastguard Worker; CHECK: test_vqdmull_lanes32
191*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmull.s32 q0, d0, d1[1]
192*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
193*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
194*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32>  @llvm.arm.neon.vqdmull.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
198*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64>  @llvm.arm.neon.vqdmull.v2i64(<2 x i32>, <2 x i32>) nounwind readnone
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vqdmlals16_natural(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
201*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmlals16_natural:
202*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmlal.s16
203*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
204*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i16>, <4 x i16>* %B
205*9880d681SAndroid Build Coastguard Worker        %tmp3 = load <4 x i16>, <4 x i16>* %C
206*9880d681SAndroid Build Coastguard Worker        %tmp4 = call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %tmp2, <4 x i16> %tmp3)
207*9880d681SAndroid Build Coastguard Worker        %tmp5 = call <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp4)
208*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %tmp5
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vqdmlals32_natural(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
212*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmlals32_natural:
213*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmlal.s32
214*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
215*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i32>, <2 x i32>* %B
216*9880d681SAndroid Build Coastguard Worker        %tmp3 = load <2 x i32>, <2 x i32>* %C
217*9880d681SAndroid Build Coastguard Worker        %tmp4 = call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %tmp2, <2 x i32> %tmp3)
218*9880d681SAndroid Build Coastguard Worker        %tmp5 = call <2 x i64> @llvm.arm.neon.vqadds.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp4)
219*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %tmp5
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i32> @test_vqdmlal_lanes16_natural(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone {
223*9880d681SAndroid Build Coastguard Workerentry:
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlal_lanes16_natural:
225*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmlal.s16 q0, d2, d3[1]
226*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
227*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %arg1_int16x4_t, <4 x i16> %0)
228*9880d681SAndroid Build Coastguard Worker  %2 = tail call <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i32> %1)
229*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <2 x i64> @test_vqdmlal_lanes32_natural(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone {
233*9880d681SAndroid Build Coastguard Workerentry:
234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlal_lanes32_natural:
235*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmlal.s32 q0, d2, d3[1]
236*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
237*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %arg1_int32x2_t, <2 x i32> %0)
238*9880d681SAndroid Build Coastguard Worker  %2 = call <2 x i64> @llvm.arm.neon.vqadds.v2i64(<2 x i64> %arg0_int64x2_t, <2 x i64> %1)
239*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
240*9880d681SAndroid Build Coastguard Worker}
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32>  @llvm.arm.neon.vqadds.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
243*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64>  @llvm.arm.neon.vqadds.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vqdmlsls16_natural(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
246*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmlsls16_natural:
247*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmlsl.s16
248*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
249*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i16>, <4 x i16>* %B
250*9880d681SAndroid Build Coastguard Worker        %tmp3 = load <4 x i16>, <4 x i16>* %C
251*9880d681SAndroid Build Coastguard Worker        %tmp4 = call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %tmp2, <4 x i16> %tmp3)
252*9880d681SAndroid Build Coastguard Worker        %tmp5 = call <4 x i32> @llvm.arm.neon.vqsubs.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp4)
253*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %tmp5
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vqdmlsls32_natural(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
257*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vqdmlsls32_natural:
258*9880d681SAndroid Build Coastguard Worker;CHECK: vqdmlsl.s32
259*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
260*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i32>, <2 x i32>* %B
261*9880d681SAndroid Build Coastguard Worker        %tmp3 = load <2 x i32>, <2 x i32>* %C
262*9880d681SAndroid Build Coastguard Worker        %tmp4 = call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %tmp2, <2 x i32> %tmp3)
263*9880d681SAndroid Build Coastguard Worker        %tmp5 = call <2 x i64> @llvm.arm.neon.vqsubs.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp4)
264*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %tmp5
265*9880d681SAndroid Build Coastguard Worker}
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <4 x i32> @test_vqdmlsl_lanes16_natural(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone {
268*9880d681SAndroid Build Coastguard Workerentry:
269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlsl_lanes16_natural:
270*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmlsl.s16 q0, d2, d3[1]
271*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
272*9880d681SAndroid Build Coastguard Worker  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %arg1_int16x4_t, <4 x i16> %0)
273*9880d681SAndroid Build Coastguard Worker  %2 = tail call <4 x i32> @llvm.arm.neon.vqsubs.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i32> %1)
274*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc <2 x i64> @test_vqdmlsl_lanes32_natural(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone {
278*9880d681SAndroid Build Coastguard Workerentry:
279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlsl_lanes32_natural:
280*9880d681SAndroid Build Coastguard Worker; CHECK: vqdmlsl.s32 q0, d2, d3[1]
281*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
282*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %arg1_int32x2_t, <2 x i32> %0)
283*9880d681SAndroid Build Coastguard Worker  %2 = call <2 x i64> @llvm.arm.neon.vqsubs.v2i64(<2 x i64> %arg0_int64x2_t, <2 x i64> %1)
284*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
285*9880d681SAndroid Build Coastguard Worker}
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32>  @llvm.arm.neon.vqsubs.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
288*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64>  @llvm.arm.neon.vqsubs.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
289