Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-vidup.ll
blob7df5ab5b7b0c5350e0420066e2f19c3a70b7a3f3
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
4 define 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
20 define 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
36 define 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
56 define 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
72 define 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
88 define 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
109 define 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
133 define 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
157 define 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
181 define 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
205 define 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
245 define 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