xref: /llvm-project/llvm/test/CodeGen/Thumb2/mve-vidup.ll (revision 8de7d8b2c289acfb866248b798bea9a755b198d7)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
3
4define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_1(i32 %index) {
5; CHECK-LABEL: vidup_v4i32_1:
6; CHECK:       @ %bb.0:
7; CHECK-NEXT:    vidup.u32 q0, r0, #1
8; CHECK-NEXT:    bx lr
9  %a1 = add i32 %index, 1
10  %a2 = add i32 %index, 2
11  %a3 = add i32 %index, 3
12  %a4 = add i32 %index, 4
13  %v1  = insertelement <4 x i32> poison, i32 %index, i32 0
14  %v2  = insertelement <4 x i32> %v1, i32 %a1, i32 1
15  %v3  = insertelement <4 x i32> %v2, i32 %a2, i32 2
16  %v4  = insertelement <4 x i32> %v3, i32 %a3, i32 3
17  ret <4 x i32> %v4
18}
19
20define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_2(i32 %index) {
21; CHECK-LABEL: vidup_v4i32_2:
22; CHECK:       @ %bb.0:
23; CHECK-NEXT:    vidup.u32 q0, r0, #2
24; CHECK-NEXT:    bx lr
25  %a1 = add i32 %index, 2
26  %a2 = add i32 %index, 4
27  %a3 = add i32 %index, 6
28  %a4 = add i32 %index, 8
29  %v1  = insertelement <4 x i32> poison, i32 %index, i32 0
30  %v2  = insertelement <4 x i32> %v1, i32 %a1, i32 1
31  %v3  = insertelement <4 x i32> %v2, i32 %a2, i32 2
32  %v4  = insertelement <4 x i32> %v3, i32 %a3, i32 3
33  ret <4 x i32> %v4
34}
35
36define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_3(i32 %index) {
37; CHECK-LABEL: vidup_v4i32_3:
38; CHECK:       @ %bb.0:
39; CHECK-NEXT:    adds r1, r0, #6
40; CHECK-NEXT:    vmov q0[2], q0[0], r0, r1
41; CHECK-NEXT:    add.w r1, r0, #9
42; CHECK-NEXT:    adds r0, #3
43; CHECK-NEXT:    vmov q0[3], q0[1], r0, r1
44; CHECK-NEXT:    bx lr
45  %a1 = add i32 %index, 3
46  %a2 = add i32 %index, 6
47  %a3 = add i32 %index, 9
48  %a4 = add i32 %index, 12
49  %v1  = insertelement <4 x i32> poison, i32 %index, i32 0
50  %v2  = insertelement <4 x i32> %v1, i32 %a1, i32 1
51  %v3  = insertelement <4 x i32> %v2, i32 %a2, i32 2
52  %v4  = insertelement <4 x i32> %v3, i32 %a3, i32 3
53  ret <4 x i32> %v4
54}
55
56define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_4(i32 %index) {
57; CHECK-LABEL: vidup_v4i32_4:
58; CHECK:       @ %bb.0:
59; CHECK-NEXT:    vidup.u32 q0, r0, #4
60; CHECK-NEXT:    bx lr
61  %a1 = add i32 %index, 4
62  %a2 = add i32 %index, 8
63  %a3 = add i32 %index, 12
64  %a4 = add i32 %index, 16
65  %v1  = insertelement <4 x i32> poison, i32 %index, i32 0
66  %v2  = insertelement <4 x i32> %v1, i32 %a1, i32 1
67  %v3  = insertelement <4 x i32> %v2, i32 %a2, i32 2
68  %v4  = insertelement <4 x i32> %v3, i32 %a3, i32 3
69  ret <4 x i32> %v4
70}
71
72define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_8(i32 %index) {
73; CHECK-LABEL: vidup_v4i32_8:
74; CHECK:       @ %bb.0:
75; CHECK-NEXT:    vidup.u32 q0, r0, #8
76; CHECK-NEXT:    bx lr
77  %a1 = add i32 %index, 8
78  %a2 = add i32 %index, 16
79  %a3 = add i32 %index, 24
80  %a4 = add i32 %index, 32
81  %v1  = insertelement <4 x i32> poison, i32 %index, i32 0
82  %v2  = insertelement <4 x i32> %v1, i32 %a1, i32 1
83  %v3  = insertelement <4 x i32> %v2, i32 %a2, i32 2
84  %v4  = insertelement <4 x i32> %v3, i32 %a3, i32 3
85  ret <4 x i32> %v4
86}
87
88define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_1_i(i32 %index) {
89; CHECK-LABEL: vidup_v4i32_1_i:
90; CHECK:       @ %bb.0:
91; CHECK-NEXT:    adds r1, r0, #3
92; CHECK-NEXT:    adds r2, r0, #1
93; CHECK-NEXT:    vmov q0[2], q0[0], r2, r1
94; CHECK-NEXT:    adds r1, r0, #4
95; CHECK-NEXT:    adds r0, #2
96; CHECK-NEXT:    vmov q0[3], q0[1], r0, r1
97; CHECK-NEXT:    bx lr
98  %a1 = add i32 %index, 1
99  %a2 = add i32 %index, 2
100  %a3 = add i32 %index, 3
101  %a4 = add i32 %index, 4
102  %v1  = insertelement <4 x i32> poison, i32 %a1, i32 0
103  %v2  = insertelement <4 x i32> %v1, i32 %a2, i32 1
104  %v3  = insertelement <4 x i32> %v2, i32 %a3, i32 2
105  %v4  = insertelement <4 x i32> %v3, i32 %a4, i32 3
106  ret <4 x i32> %v4
107}
108
109define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_1(i16 %index) {
110; CHECK-LABEL: vidup_v8i16_1:
111; CHECK:       @ %bb.0:
112; CHECK-NEXT:    vidup.u16 q0, r0, #1
113; CHECK-NEXT:    bx lr
114  %a1 = add i16 %index, 1
115  %a2 = add i16 %index, 2
116  %a3 = add i16 %index, 3
117  %a4 = add i16 %index, 4
118  %a5 = add i16 %index, 5
119  %a6 = add i16 %index, 6
120  %a7 = add i16 %index, 7
121  %a8 = add i16 %index, 8
122  %v1  = insertelement <8 x i16> poison, i16 %index, i32 0
123  %v2  = insertelement <8 x i16> %v1, i16 %a1, i32 1
124  %v3  = insertelement <8 x i16> %v2, i16 %a2, i32 2
125  %v4  = insertelement <8 x i16> %v3, i16 %a3, i32 3
126  %v5  = insertelement <8 x i16> %v4, i16 %a4, i32 4
127  %v6  = insertelement <8 x i16> %v5, i16 %a5, i32 5
128  %v7  = insertelement <8 x i16> %v6, i16 %a6, i32 6
129  %v8  = insertelement <8 x i16> %v7, i16 %a7, i32 7
130  ret <8 x i16> %v8
131}
132
133define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_2(i16 %index) {
134; CHECK-LABEL: vidup_v8i16_2:
135; CHECK:       @ %bb.0:
136; CHECK-NEXT:    vidup.u16 q0, r0, #2
137; CHECK-NEXT:    bx lr
138  %a1 = add i16 %index, 2
139  %a2 = add i16 %index, 4
140  %a3 = add i16 %index, 6
141  %a4 = add i16 %index, 8
142  %a5 = add i16 %index, 10
143  %a6 = add i16 %index, 12
144  %a7 = add i16 %index, 14
145  %a8 = add i16 %index, 16
146  %v1  = insertelement <8 x i16> poison, i16 %index, i32 0
147  %v2  = insertelement <8 x i16> %v1, i16 %a1, i32 1
148  %v3  = insertelement <8 x i16> %v2, i16 %a2, i32 2
149  %v4  = insertelement <8 x i16> %v3, i16 %a3, i32 3
150  %v5  = insertelement <8 x i16> %v4, i16 %a4, i32 4
151  %v6  = insertelement <8 x i16> %v5, i16 %a5, i32 5
152  %v7  = insertelement <8 x i16> %v6, i16 %a6, i32 6
153  %v8  = insertelement <8 x i16> %v7, i16 %a7, i32 7
154  ret <8 x i16> %v8
155}
156
157define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_4(i16 %index) {
158; CHECK-LABEL: vidup_v8i16_4:
159; CHECK:       @ %bb.0:
160; CHECK-NEXT:    vidup.u16 q0, r0, #4
161; CHECK-NEXT:    bx lr
162  %a1 = add i16 %index, 4
163  %a2 = add i16 %index, 8
164  %a3 = add i16 %index, 12
165  %a4 = add i16 %index, 16
166  %a5 = add i16 %index, 20
167  %a6 = add i16 %index, 24
168  %a7 = add i16 %index, 28
169  %a8 = add i16 %index, 32
170  %v1  = insertelement <8 x i16> poison, i16 %index, i32 0
171  %v2  = insertelement <8 x i16> %v1, i16 %a1, i32 1
172  %v3  = insertelement <8 x i16> %v2, i16 %a2, i32 2
173  %v4  = insertelement <8 x i16> %v3, i16 %a3, i32 3
174  %v5  = insertelement <8 x i16> %v4, i16 %a4, i32 4
175  %v6  = insertelement <8 x i16> %v5, i16 %a5, i32 5
176  %v7  = insertelement <8 x i16> %v6, i16 %a6, i32 6
177  %v8  = insertelement <8 x i16> %v7, i16 %a7, i32 7
178  ret <8 x i16> %v8
179}
180
181define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_8(i16 %index) {
182; CHECK-LABEL: vidup_v8i16_8:
183; CHECK:       @ %bb.0:
184; CHECK-NEXT:    vidup.u16 q0, r0, #8
185; CHECK-NEXT:    bx lr
186  %a1 = add i16 %index, 8
187  %a2 = add i16 %index, 16
188  %a3 = add i16 %index, 24
189  %a4 = add i16 %index, 32
190  %a5 = add i16 %index, 40
191  %a6 = add i16 %index, 48
192  %a7 = add i16 %index, 56
193  %a8 = add i16 %index, 64
194  %v1  = insertelement <8 x i16> poison, i16 %index, i32 0
195  %v2  = insertelement <8 x i16> %v1, i16 %a1, i32 1
196  %v3  = insertelement <8 x i16> %v2, i16 %a2, i32 2
197  %v4  = insertelement <8 x i16> %v3, i16 %a3, i32 3
198  %v5  = insertelement <8 x i16> %v4, i16 %a4, i32 4
199  %v6  = insertelement <8 x i16> %v5, i16 %a5, i32 5
200  %v7  = insertelement <8 x i16> %v6, i16 %a6, i32 6
201  %v8  = insertelement <8 x i16> %v7, i16 %a7, i32 7
202  ret <8 x i16> %v8
203}
204
205define arm_aapcs_vfpcc <16 x i8> @vidup_v16i8_1(i8 %index) {
206; CHECK-LABEL: vidup_v16i8_1:
207; CHECK:       @ %bb.0:
208; CHECK-NEXT:    vidup.u8 q0, r0, #1
209; CHECK-NEXT:    bx lr
210  %a1 = add i8 %index, 1
211  %a2 = add i8 %index, 2
212  %a3 = add i8 %index, 3
213  %a4 = add i8 %index, 4
214  %a5 = add i8 %index, 5
215  %a6 = add i8 %index, 6
216  %a7 = add i8 %index, 7
217  %a8 = add i8 %index, 8
218  %a9 = add i8 %index, 9
219  %a10 = add i8 %index, 10
220  %a11 = add i8 %index, 11
221  %a12 = add i8 %index, 12
222  %a13 = add i8 %index, 13
223  %a14 = add i8 %index, 14
224  %a15 = add i8 %index, 15
225  %a16 = add i8 %index, 16
226  %v1  = insertelement <16 x i8> poison, i8 %index, i32 0
227  %v2  = insertelement <16 x i8> %v1, i8 %a1, i32 1
228  %v3  = insertelement <16 x i8> %v2, i8 %a2, i32 2
229  %v4  = insertelement <16 x i8> %v3, i8 %a3, i32 3
230  %v5  = insertelement <16 x i8> %v4, i8 %a4, i32 4
231  %v6  = insertelement <16 x i8> %v5, i8 %a5, i32 5
232  %v7  = insertelement <16 x i8> %v6, i8 %a6, i32 6
233  %v8  = insertelement <16 x i8> %v7, i8 %a7, i32 7
234  %v9  = insertelement <16 x i8> %v8, i8 %a8, i32 8
235  %v10 = insertelement <16 x i8> %v9, i8 %a9, i32 9
236  %v11 = insertelement <16 x i8> %v10, i8 %a10, i32 10
237  %v12 = insertelement <16 x i8> %v11, i8 %a11, i32 11
238  %v13 = insertelement <16 x i8> %v12, i8 %a12, i32 12
239  %v14 = insertelement <16 x i8> %v13, i8 %a13, i32 13
240  %v15 = insertelement <16 x i8> %v14, i8 %a14, i32 14
241  %v16 = insertelement <16 x i8> %v15, i8 %a15, i32 15
242  ret <16 x i8> %v16
243}
244
245define arm_aapcs_vfpcc <16 x i8> @vidup_v16i8_4(i8 %index) {
246; CHECK-LABEL: vidup_v16i8_4:
247; CHECK:       @ %bb.0:
248; CHECK-NEXT:    vidup.u8 q0, r0, #4
249; CHECK-NEXT:    bx lr
250  %a1 = add i8 %index, 4
251  %a2 = add i8 %index, 8
252  %a3 = add i8 %index, 12
253  %a4 = add i8 %index, 16
254  %a5 = add i8 %index, 20
255  %a6 = add i8 %index, 24
256  %a7 = add i8 %index, 28
257  %a8 = add i8 %index, 32
258  %a9 = add i8 %index, 36
259  %a10 = add i8 %index, 40
260  %a11 = add i8 %index, 44
261  %a12 = add i8 %index, 48
262  %a13 = add i8 %index, 52
263  %a14 = add i8 %index, 56
264  %a15 = add i8 %index, 60
265  %a16 = add i8 %index, 64
266  %v1  = insertelement <16 x i8> poison, i8 %index, i32 0
267  %v2  = insertelement <16 x i8> %v1, i8 %a1, i32 1
268  %v3  = insertelement <16 x i8> %v2, i8 %a2, i32 2
269  %v4  = insertelement <16 x i8> %v3, i8 %a3, i32 3
270  %v5  = insertelement <16 x i8> %v4, i8 %a4, i32 4
271  %v6  = insertelement <16 x i8> %v5, i8 %a5, i32 5
272  %v7  = insertelement <16 x i8> %v6, i8 %a6, i32 6
273  %v8  = insertelement <16 x i8> %v7, i8 %a7, i32 7
274  %v9  = insertelement <16 x i8> %v8, i8 %a8, i32 8
275  %v10 = insertelement <16 x i8> %v9, i8 %a9, i32 9
276  %v11 = insertelement <16 x i8> %v10, i8 %a10, i32 10
277  %v12 = insertelement <16 x i8> %v11, i8 %a11, i32 11
278  %v13 = insertelement <16 x i8> %v12, i8 %a12, i32 12
279  %v14 = insertelement <16 x i8> %v13, i8 %a13, i32 13
280  %v15 = insertelement <16 x i8> %v14, i8 %a14, i32 14
281  %v16 = insertelement <16 x i8> %v15, i8 %a15, i32 15
282  ret <16 x i8> %v16
283}
284
285
286