xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/neon-v8.1a.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv8 -mattr=+v8.1a | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker;-----------------------------------------------------------------------------
4*9880d681SAndroid Build Coastguard Worker; RDMA Vector
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16>, <4 x i16>)
7*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16>, <8 x i16>)
8*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32>, <2 x i32>)
9*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32>, <4 x i32>)
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.arm.neon.vqadds.v4i16(<4 x i16>, <4 x i16>)
12*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.arm.neon.vqadds.v8i16(<8 x i16>, <8 x i16>)
13*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.arm.neon.vqadds.v2i32(<2 x i32>, <2 x i32>)
14*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32>, <4 x i32>)
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.arm.neon.vqsubs.v4i16(<4 x i16>, <4 x i16>)
17*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.arm.neon.vqsubs.v8i16(<8 x i16>, <8 x i16>)
18*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.arm.neon.vqsubs.v2i32(<2 x i32>, <2 x i32>)
19*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vqsubs.v4i32(<4 x i32>, <4 x i32>)
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vqrdmlah_v4i16(<4 x i16> %acc, <4 x i16> %mhs, <4 x i16> %rhs) {
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlah_v4i16:
23*9880d681SAndroid Build Coastguard Worker   %prod = call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %mhs,  <4 x i16> %rhs)
24*9880d681SAndroid Build Coastguard Worker   %retval =  call <4 x i16> @llvm.arm.neon.vqadds.v4i16(<4 x i16> %acc,  <4 x i16> %prod)
25*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s16 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
26*9880d681SAndroid Build Coastguard Worker   ret <4 x i16> %retval
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vqrdmlah_v8i16(<8 x i16> %acc, <8 x i16> %mhs, <8 x i16> %rhs) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlah_v8i16:
31*9880d681SAndroid Build Coastguard Worker   %prod = call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %mhs, <8 x i16> %rhs)
32*9880d681SAndroid Build Coastguard Worker   %retval =  call <8 x i16> @llvm.arm.neon.vqadds.v8i16(<8 x i16> %acc, <8 x i16> %prod)
33*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s16 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}}
34*9880d681SAndroid Build Coastguard Worker   ret <8 x i16> %retval
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vqrdmlah_v2i32(<2 x i32> %acc, <2 x i32> %mhs, <2 x i32> %rhs) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlah_v2i32:
39*9880d681SAndroid Build Coastguard Worker   %prod = call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %mhs, <2 x i32> %rhs)
40*9880d681SAndroid Build Coastguard Worker   %retval =  call <2 x i32> @llvm.arm.neon.vqadds.v2i32(<2 x i32> %acc, <2 x i32> %prod)
41*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s32 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
42*9880d681SAndroid Build Coastguard Worker   ret <2 x i32> %retval
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqrdmlah_v4i32(<4 x i32> %acc, <4 x i32> %mhs, <4 x i32> %rhs) {
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlah_v4i32:
47*9880d681SAndroid Build Coastguard Worker   %prod = call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %mhs, <4 x i32> %rhs)
48*9880d681SAndroid Build Coastguard Worker   %retval =  call <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32> %acc, <4 x i32> %prod)
49*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s32 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}}
50*9880d681SAndroid Build Coastguard Worker   ret <4 x i32> %retval
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vqrdmlsh_v4i16(<4 x i16> %acc, <4 x i16> %mhs, <4 x i16> %rhs) {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlsh_v4i16:
55*9880d681SAndroid Build Coastguard Worker   %prod = call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %mhs,  <4 x i16> %rhs)
56*9880d681SAndroid Build Coastguard Worker   %retval =  call <4 x i16> @llvm.arm.neon.vqsubs.v4i16(<4 x i16> %acc, <4 x i16> %prod)
57*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s16 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
58*9880d681SAndroid Build Coastguard Worker   ret <4 x i16> %retval
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vqrdmlsh_v8i16(<8 x i16> %acc, <8 x i16> %mhs, <8 x i16> %rhs) {
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlsh_v8i16:
63*9880d681SAndroid Build Coastguard Worker   %prod = call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %mhs, <8 x i16> %rhs)
64*9880d681SAndroid Build Coastguard Worker   %retval =  call <8 x i16> @llvm.arm.neon.vqsubs.v8i16(<8 x i16> %acc, <8 x i16> %prod)
65*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s16 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}}
66*9880d681SAndroid Build Coastguard Worker   ret <8 x i16> %retval
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vqrdmlsh_v2i32(<2 x i32> %acc, <2 x i32> %mhs, <2 x i32> %rhs) {
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlsh_v2i32:
71*9880d681SAndroid Build Coastguard Worker   %prod = call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %mhs, <2 x i32> %rhs)
72*9880d681SAndroid Build Coastguard Worker   %retval =  call <2 x i32> @llvm.arm.neon.vqsubs.v2i32(<2 x i32> %acc, <2 x i32> %prod)
73*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s32 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
74*9880d681SAndroid Build Coastguard Worker   ret <2 x i32> %retval
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqrdmlsh_v4i32(<4 x i32> %acc, <4 x i32> %mhs, <4 x i32> %rhs) {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlsh_v4i32:
79*9880d681SAndroid Build Coastguard Worker   %prod = call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %mhs, <4 x i32> %rhs)
80*9880d681SAndroid Build Coastguard Worker   %retval =  call <4 x i32> @llvm.arm.neon.vqsubs.v4i32(<4 x i32> %acc, <4 x i32> %prod)
81*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s32 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}}
82*9880d681SAndroid Build Coastguard Worker   ret <4 x i32> %retval
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker;-----------------------------------------------------------------------------
86*9880d681SAndroid Build Coastguard Worker; RDMA Scalar
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vqrdmlah_lane_s16(<4 x i16> %acc, <4 x i16> %x, <4 x i16> %v) {
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlah_lane_s16:
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x i16> %v, <4 x i16> undef, <4 x i32> <i32 3, i32 3, i32 3, i32 3>
92*9880d681SAndroid Build Coastguard Worker  %prod = call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %x, <4 x i16> %shuffle)
93*9880d681SAndroid Build Coastguard Worker  %retval =  call <4 x i16> @llvm.arm.neon.vqadds.v4i16(<4 x i16> %acc, <4 x i16> %prod)
94*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s16 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}[3]
95*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %retval
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vqrdmlahq_lane_s16(<8 x i16> %acc, <8 x i16> %x, <4 x i16> %v) {
99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlahq_lane_s16:
100*9880d681SAndroid Build Coastguard Workerentry:
101*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x i16> %v, <4 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
102*9880d681SAndroid Build Coastguard Worker  %prod = call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %x, <8 x i16> %shuffle)
103*9880d681SAndroid Build Coastguard Worker  %retval =  call <8 x i16> @llvm.arm.neon.vqadds.v8i16(<8 x i16> %acc, <8 x i16> %prod)
104*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s16 {{q[0-9]+}}, {{q[0-9]+}}, {{d[0-9]+}}[2]
105*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %retval
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vqrdmlah_lane_s32(<2 x i32> %acc, <2 x i32> %x, <2 x i32> %v) {
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlah_lane_s32:
110*9880d681SAndroid Build Coastguard Workerentry:
111*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <2 x i32> %v, <2 x i32> undef, <2 x i32> <i32 1, i32 1>
112*9880d681SAndroid Build Coastguard Worker  %prod = tail call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %x, <2 x i32> %shuffle)
113*9880d681SAndroid Build Coastguard Worker  %retval =  call <2 x i32> @llvm.arm.neon.vqadds.v2i32(<2 x i32> %acc, <2 x i32> %prod)
114*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s32 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}[1]
115*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %retval
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqrdmlahq_lane_s32(<4 x i32> %acc,<4 x i32> %x, <2 x i32> %v) {
119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlahq_lane_s32:
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <2 x i32> %v, <2 x i32> undef, <4 x i32> zeroinitializer
122*9880d681SAndroid Build Coastguard Worker  %prod = tail call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %x, <4 x i32> %shuffle)
123*9880d681SAndroid Build Coastguard Worker  %retval =  call <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32> %acc, <4 x i32> %prod)
124*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlah.s32 {{q[0-9]+}}, {{q[0-9]+}}, {{d[0-9]+}}[0]
125*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %retval
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vqrdmlsh_lane_s16(<4 x i16> %acc, <4 x i16> %x, <4 x i16> %v) {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlsh_lane_s16:
130*9880d681SAndroid Build Coastguard Workerentry:
131*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x i16> %v, <4 x i16> undef, <4 x i32> <i32 3, i32 3, i32 3, i32 3>
132*9880d681SAndroid Build Coastguard Worker  %prod = call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %x, <4 x i16> %shuffle)
133*9880d681SAndroid Build Coastguard Worker  %retval =  call <4 x i16> @llvm.arm.neon.vqsubs.v4i16(<4 x i16> %acc, <4 x i16> %prod)
134*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s16 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}[3]
135*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %retval
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vqrdmlshq_lane_s16(<8 x i16> %acc, <8 x i16> %x, <4 x i16> %v) {
139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlshq_lane_s16:
140*9880d681SAndroid Build Coastguard Workerentry:
141*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x i16> %v, <4 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
142*9880d681SAndroid Build Coastguard Worker  %prod = call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %x, <8 x i16> %shuffle)
143*9880d681SAndroid Build Coastguard Worker  %retval =  call <8 x i16> @llvm.arm.neon.vqsubs.v8i16(<8 x i16> %acc, <8 x i16> %prod)
144*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s16 {{q[0-9]+}}, {{q[0-9]+}}, {{d[0-9]+}}[2]
145*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %retval
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vqrdmlsh_lane_s32(<2 x i32> %acc, <2 x i32> %x, <2 x i32> %v) {
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlsh_lane_s32:
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <2 x i32> %v, <2 x i32> undef, <2 x i32> <i32 1, i32 1>
152*9880d681SAndroid Build Coastguard Worker  %prod = tail call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %x, <2 x i32> %shuffle)
153*9880d681SAndroid Build Coastguard Worker  %retval =  call <2 x i32> @llvm.arm.neon.vqsubs.v2i32(<2 x i32> %acc, <2 x i32> %prod)
154*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s32  {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}[1]
155*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %retval
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqrdmlshq_lane_s32(<4 x i32> %acc,<4 x i32> %x, <2 x i32> %v) {
159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqrdmlshq_lane_s32:
160*9880d681SAndroid Build Coastguard Workerentry:
161*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <2 x i32> %v, <2 x i32> undef, <4 x i32> zeroinitializer
162*9880d681SAndroid Build Coastguard Worker  %prod = tail call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %x, <4 x i32> %shuffle)
163*9880d681SAndroid Build Coastguard Worker  %retval =  call <4 x i32> @llvm.arm.neon.vqsubs.v4i32(<4 x i32> %acc, <4 x i32> %prod)
164*9880d681SAndroid Build Coastguard Worker; CHECK: vqrdmlsh.s32 {{q[0-9]+}}, {{q[0-9]+}}, {{d[0-9]+}}[0]
165*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %retval
166*9880d681SAndroid Build Coastguard Worker}
167