@@ -33,6 +33,16 @@ define <vscale x 16 x i8> @splice_nxv16i8_last_idx(<vscale x 16 x i8> %a, <vscal
3333 ret <vscale x 16 x i8 > %res
3434}
3535
36+ define <vscale x 16 x i8 > @splice_nxv16i8_first_idx_unary (<vscale x 16 x i8 > %a , <vscale x 16 x i8 > %b ) #0 {
37+ ; CHECK-LABEL: splice_nxv16i8_first_idx_unary:
38+ ; CHECK: // %bb.0:
39+ ; CHECK-NEXT: mov z0.d, z1.d
40+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #1
41+ ; CHECK-NEXT: ret
42+ %res = call <vscale x 16 x i8 > @llvm.vector.splice.nxv16i8 (<vscale x 16 x i8 > %b , <vscale x 16 x i8 > %b , i32 1 )
43+ ret <vscale x 16 x i8 > %res
44+ }
45+
3646define <vscale x 8 x i16 > @splice_nxv8i16_first_idx (<vscale x 8 x i16 > %a , <vscale x 8 x i16 > %b ) #0 {
3747; CHECK-LABEL: splice_nxv8i16_first_idx:
3848; CHECK: // %bb.0:
@@ -42,6 +52,16 @@ define <vscale x 8 x i16> @splice_nxv8i16_first_idx(<vscale x 8 x i16> %a, <vsca
4252 ret <vscale x 8 x i16 > %res
4353}
4454
55+ define <vscale x 8 x i16 > @splice_nxv8i16_first_idx_unary (<vscale x 8 x i16 > %a , <vscale x 8 x i16 > %b ) #0 {
56+ ; CHECK-LABEL: splice_nxv8i16_first_idx_unary:
57+ ; CHECK: // %bb.0:
58+ ; CHECK-NEXT: mov z0.d, z1.d
59+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #2
60+ ; CHECK-NEXT: ret
61+ %res = call <vscale x 8 x i16 > @llvm.vector.splice.nxv8i16 (<vscale x 8 x i16 > %b , <vscale x 8 x i16 > %b , i32 1 )
62+ ret <vscale x 8 x i16 > %res
63+ }
64+
4565define <vscale x 4 x i32 > @splice_nxv4i32_first_idx (<vscale x 4 x i32 > %a , <vscale x 4 x i32 > %b ) #0 {
4666; CHECK-LABEL: splice_nxv4i32_first_idx:
4767; CHECK: // %bb.0:
@@ -60,6 +80,16 @@ define <vscale x 4 x i32> @splice_nxv4i32_last_idx(<vscale x 4 x i32> %a, <vscal
6080 ret <vscale x 4 x i32 > %res
6181}
6282
83+ define <vscale x 4 x i32 > @splice_nxv4i32_first_idx_unary (<vscale x 4 x i32 > %a , <vscale x 4 x i32 > %b ) #0 {
84+ ; CHECK-LABEL: splice_nxv4i32_first_idx_unary:
85+ ; CHECK: // %bb.0:
86+ ; CHECK-NEXT: mov z0.d, z1.d
87+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
88+ ; CHECK-NEXT: ret
89+ %res = call <vscale x 4 x i32 > @llvm.vector.splice.nxv4i32 (<vscale x 4 x i32 > %b , <vscale x 4 x i32 > %b , i32 1 )
90+ ret <vscale x 4 x i32 > %res
91+ }
92+
6393define <vscale x 2 x i64 > @splice_nxv2i64_first_idx (<vscale x 2 x i64 > %a , <vscale x 2 x i64 > %b ) #0 {
6494; CHECK-LABEL: splice_nxv2i64_first_idx:
6595; CHECK: // %bb.0:
@@ -78,6 +108,16 @@ define <vscale x 2 x i64> @splice_nxv2i64_last_idx(<vscale x 2 x i64> %a, <vscal
78108 ret <vscale x 2 x i64 > %res
79109}
80110
111+ define <vscale x 2 x i64 > @splice_nxv2i64_first_idx_unary (<vscale x 2 x i64 > %a , <vscale x 2 x i64 > %b ) #0 {
112+ ; CHECK-LABEL: splice_nxv2i64_first_idx_unary:
113+ ; CHECK: // %bb.0:
114+ ; CHECK-NEXT: mov z0.d, z1.d
115+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
116+ ; CHECK-NEXT: ret
117+ %res = call <vscale x 2 x i64 > @llvm.vector.splice.nxv2i64 (<vscale x 2 x i64 > %b , <vscale x 2 x i64 > %b , i32 1 )
118+ ret <vscale x 2 x i64 > %res
119+ }
120+
81121define <vscale x 2 x half > @splice_nxv2f16_neg_idx (<vscale x 2 x half > %a , <vscale x 2 x half > %b ) #0 {
82122; CHECK-LABEL: splice_nxv2f16_neg_idx:
83123; CHECK: // %bb.0:
@@ -100,6 +140,18 @@ define <vscale x 2 x half> @splice_nxv2f16_neg2_idx(<vscale x 2 x half> %a, <vsc
100140 ret <vscale x 2 x half > %res
101141}
102142
143+ define <vscale x 2 x half > @splice_nxv2f16_neg_idx_unary (<vscale x 2 x half > %a , <vscale x 2 x half > %b ) #0 {
144+ ; CHECK-LABEL: splice_nxv2f16_neg_idx_unary:
145+ ; CHECK: // %bb.0:
146+ ; CHECK-NEXT: ptrue p0.d, vl1
147+ ; CHECK-NEXT: mov z0.d, z1.d
148+ ; CHECK-NEXT: rev p0.d, p0.d
149+ ; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d
150+ ; CHECK-NEXT: ret
151+ %res = call <vscale x 2 x half > @llvm.vector.splice.nxv2f16 (<vscale x 2 x half > %b , <vscale x 2 x half > %b , i32 -1 )
152+ ret <vscale x 2 x half > %res
153+ }
154+
103155define <vscale x 2 x half > @splice_nxv2f16_first_idx (<vscale x 2 x half > %a , <vscale x 2 x half > %b ) #0 {
104156; CHECK-LABEL: splice_nxv2f16_first_idx:
105157; CHECK: // %bb.0:
@@ -118,6 +170,16 @@ define <vscale x 2 x half> @splice_nxv2f16_last_idx(<vscale x 2 x half> %a, <vsc
118170 ret <vscale x 2 x half > %res
119171}
120172
173+ define <vscale x 2 x half > @splice_nxv2f16_first_idx_unary (<vscale x 2 x half > %a , <vscale x 2 x half > %b ) #0 {
174+ ; CHECK-LABEL: splice_nxv2f16_first_idx_unary:
175+ ; CHECK: // %bb.0:
176+ ; CHECK-NEXT: mov z0.d, z1.d
177+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
178+ ; CHECK-NEXT: ret
179+ %res = call <vscale x 2 x half > @llvm.vector.splice.nxv2f16 (<vscale x 2 x half > %b , <vscale x 2 x half > %b , i32 1 )
180+ ret <vscale x 2 x half > %res
181+ }
182+
121183define <vscale x 4 x half > @splice_nxv4f16_neg_idx (<vscale x 4 x half > %a , <vscale x 4 x half > %b ) #0 {
122184; CHECK-LABEL: splice_nxv4f16_neg_idx:
123185; CHECK: // %bb.0:
@@ -140,6 +202,18 @@ define <vscale x 4 x half> @splice_nxv4f16_neg3_idx(<vscale x 4 x half> %a, <vsc
140202 ret <vscale x 4 x half > %res
141203}
142204
205+ define <vscale x 4 x half > @splice_nxv4f16_neg_idx_unary (<vscale x 4 x half > %a , <vscale x 4 x half > %b ) #0 {
206+ ; CHECK-LABEL: splice_nxv4f16_neg_idx_unary:
207+ ; CHECK: // %bb.0:
208+ ; CHECK-NEXT: ptrue p0.s, vl1
209+ ; CHECK-NEXT: mov z0.d, z1.d
210+ ; CHECK-NEXT: rev p0.s, p0.s
211+ ; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s
212+ ; CHECK-NEXT: ret
213+ %res = call <vscale x 4 x half > @llvm.vector.splice.nxv4f16 (<vscale x 4 x half > %b , <vscale x 4 x half > %b , i32 -1 )
214+ ret <vscale x 4 x half > %res
215+ }
216+
143217define <vscale x 4 x half > @splice_nxv4f16_first_idx (<vscale x 4 x half > %a , <vscale x 4 x half > %b ) #0 {
144218; CHECK-LABEL: splice_nxv4f16_first_idx:
145219; CHECK: // %bb.0:
@@ -158,6 +232,16 @@ define <vscale x 4 x half> @splice_nxv4f16_last_idx(<vscale x 4 x half> %a, <vsc
158232 ret <vscale x 4 x half > %res
159233}
160234
235+ define <vscale x 4 x half > @splice_nxv4f16_first_idx_unary (<vscale x 4 x half > %a , <vscale x 4 x half > %b ) #0 {
236+ ; CHECK-LABEL: splice_nxv4f16_first_idx_unary:
237+ ; CHECK: // %bb.0:
238+ ; CHECK-NEXT: mov z0.d, z1.d
239+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
240+ ; CHECK-NEXT: ret
241+ %res = call <vscale x 4 x half > @llvm.vector.splice.nxv4f16 (<vscale x 4 x half > %b , <vscale x 4 x half > %b , i32 1 )
242+ ret <vscale x 4 x half > %res
243+ }
244+
161245define <vscale x 8 x half > @splice_nxv8f16_first_idx (<vscale x 8 x half > %a , <vscale x 8 x half > %b ) #0 {
162246; CHECK-LABEL: splice_nxv8f16_first_idx:
163247; CHECK: // %bb.0:
@@ -176,6 +260,16 @@ define <vscale x 8 x half> @splice_nxv8f16_last_idx(<vscale x 8 x half> %a, <vsc
176260 ret <vscale x 8 x half > %res
177261}
178262
263+ define <vscale x 8 x half > @splice_nxv8f16_first_idx_unary (<vscale x 8 x half > %a , <vscale x 8 x half > %b ) #0 {
264+ ; CHECK-LABEL: splice_nxv8f16_first_idx_unary:
265+ ; CHECK: // %bb.0:
266+ ; CHECK-NEXT: mov z0.d, z1.d
267+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #2
268+ ; CHECK-NEXT: ret
269+ %res = call <vscale x 8 x half > @llvm.vector.splice.nxv8f16 (<vscale x 8 x half > %b , <vscale x 8 x half > %b , i32 1 )
270+ ret <vscale x 8 x half > %res
271+ }
272+
179273define <vscale x 2 x float > @splice_nxv2f32_neg_idx (<vscale x 2 x float > %a , <vscale x 2 x float > %b ) #0 {
180274; CHECK-LABEL: splice_nxv2f32_neg_idx:
181275; CHECK: // %bb.0:
@@ -198,6 +292,18 @@ define <vscale x 2 x float> @splice_nxv2f32_neg2_idx(<vscale x 2 x float> %a, <v
198292 ret <vscale x 2 x float > %res
199293}
200294
295+ define <vscale x 2 x float > @splice_nxv2f32_neg_idx_unary (<vscale x 2 x float > %a , <vscale x 2 x float > %b ) #0 {
296+ ; CHECK-LABEL: splice_nxv2f32_neg_idx_unary:
297+ ; CHECK: // %bb.0:
298+ ; CHECK-NEXT: ptrue p0.d, vl1
299+ ; CHECK-NEXT: mov z0.d, z1.d
300+ ; CHECK-NEXT: rev p0.d, p0.d
301+ ; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d
302+ ; CHECK-NEXT: ret
303+ %res = call <vscale x 2 x float > @llvm.vector.splice.nxv2f32 (<vscale x 2 x float > %b , <vscale x 2 x float > %b , i32 -1 )
304+ ret <vscale x 2 x float > %res
305+ }
306+
201307define <vscale x 2 x float > @splice_nxv2f32_first_idx (<vscale x 2 x float > %a , <vscale x 2 x float > %b ) #0 {
202308; CHECK-LABEL: splice_nxv2f32_first_idx:
203309; CHECK: // %bb.0:
@@ -216,6 +322,16 @@ define <vscale x 2 x float> @splice_nxv2f32_last_idx(<vscale x 2 x float> %a, <v
216322 ret <vscale x 2 x float > %res
217323}
218324
325+ define <vscale x 2 x float > @splice_nxv2f32_first_idx_unary (<vscale x 2 x float > %a , <vscale x 2 x float > %b ) #0 {
326+ ; CHECK-LABEL: splice_nxv2f32_first_idx_unary:
327+ ; CHECK: // %bb.0:
328+ ; CHECK-NEXT: mov z0.d, z1.d
329+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
330+ ; CHECK-NEXT: ret
331+ %res = call <vscale x 2 x float > @llvm.vector.splice.nxv2f32 (<vscale x 2 x float > %b , <vscale x 2 x float > %b , i32 1 )
332+ ret <vscale x 2 x float > %res
333+ }
334+
219335define <vscale x 4 x float > @splice_nxv4f32_first_idx (<vscale x 4 x float > %a , <vscale x 4 x float > %b ) #0 {
220336; CHECK-LABEL: splice_nxv4f32_first_idx:
221337; CHECK: // %bb.0:
@@ -234,6 +350,16 @@ define <vscale x 4 x float> @splice_nxv4f32_last_idx(<vscale x 4 x float> %a, <v
234350 ret <vscale x 4 x float > %res
235351}
236352
353+ define <vscale x 4 x float > @splice_nxv4f32_first_idx_unary (<vscale x 4 x float > %a , <vscale x 4 x float > %b ) #0 {
354+ ; CHECK-LABEL: splice_nxv4f32_first_idx_unary:
355+ ; CHECK: // %bb.0:
356+ ; CHECK-NEXT: mov z0.d, z1.d
357+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
358+ ; CHECK-NEXT: ret
359+ %res = call <vscale x 4 x float > @llvm.vector.splice.nxv4f32 (<vscale x 4 x float > %b , <vscale x 4 x float > %b , i32 1 )
360+ ret <vscale x 4 x float > %res
361+ }
362+
237363define <vscale x 2 x double > @splice_nxv2f64_first_idx (<vscale x 2 x double > %a , <vscale x 2 x double > %b ) #0 {
238364; CHECK-LABEL: splice_nxv2f64_first_idx:
239365; CHECK: // %bb.0:
@@ -252,6 +378,16 @@ define <vscale x 2 x double> @splice_nxv2f64_last_idx(<vscale x 2 x double> %a,
252378 ret <vscale x 2 x double > %res
253379}
254380
381+ define <vscale x 2 x double > @splice_nxv2f64_first_idx_unary (<vscale x 2 x double > %a , <vscale x 2 x double > %b ) #0 {
382+ ; CHECK-LABEL: splice_nxv2f64_first_idx_unary:
383+ ; CHECK: // %bb.0:
384+ ; CHECK-NEXT: mov z0.d, z1.d
385+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
386+ ; CHECK-NEXT: ret
387+ %res = call <vscale x 2 x double > @llvm.vector.splice.nxv2f64 (<vscale x 2 x double > %b , <vscale x 2 x double > %b , i32 1 )
388+ ret <vscale x 2 x double > %res
389+ }
390+
255391; Ensure predicate based splice is promoted to use ZPRs.
256392define <vscale x 2 x i1 > @splice_nxv2i1_idx (<vscale x 2 x i1 > %a , <vscale x 2 x i1 > %b ) #0 {
257393; CHECK-LABEL: splice_nxv2i1_idx:
@@ -710,6 +846,18 @@ define <vscale x 2 x bfloat> @splice_nxv2bf16_neg2_idx(<vscale x 2 x bfloat> %a,
710846 ret <vscale x 2 x bfloat> %res
711847}
712848
849+ define <vscale x 2 x bfloat> @splice_nxv2bf16_neg_idx_unary (<vscale x 2 x bfloat> %a , <vscale x 2 x bfloat> %b ) #0 {
850+ ; CHECK-LABEL: splice_nxv2bf16_neg_idx_unary:
851+ ; CHECK: // %bb.0:
852+ ; CHECK-NEXT: ptrue p0.d, vl1
853+ ; CHECK-NEXT: mov z0.d, z1.d
854+ ; CHECK-NEXT: rev p0.d, p0.d
855+ ; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d
856+ ; CHECK-NEXT: ret
857+ %res = call <vscale x 2 x bfloat> @llvm.vector.splice.nxv2bf16 (<vscale x 2 x bfloat> %b , <vscale x 2 x bfloat> %b , i32 -1 )
858+ ret <vscale x 2 x bfloat> %res
859+ }
860+
713861define <vscale x 2 x bfloat> @splice_nxv2bf16_first_idx (<vscale x 2 x bfloat> %a , <vscale x 2 x bfloat> %b ) #0 {
714862; CHECK-LABEL: splice_nxv2bf16_first_idx:
715863; CHECK: // %bb.0:
@@ -728,6 +876,16 @@ define <vscale x 2 x bfloat> @splice_nxv2bf16_last_idx(<vscale x 2 x bfloat> %a,
728876 ret <vscale x 2 x bfloat> %res
729877}
730878
879+ define <vscale x 2 x bfloat> @splice_nxv2bf16_first_idx_unary (<vscale x 2 x bfloat> %a , <vscale x 2 x bfloat> %b ) #0 {
880+ ; CHECK-LABEL: splice_nxv2bf16_first_idx_unary:
881+ ; CHECK: // %bb.0:
882+ ; CHECK-NEXT: mov z0.d, z1.d
883+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
884+ ; CHECK-NEXT: ret
885+ %res = call <vscale x 2 x bfloat> @llvm.vector.splice.nxv2bf16 (<vscale x 2 x bfloat> %b , <vscale x 2 x bfloat> %b , i32 1 )
886+ ret <vscale x 2 x bfloat> %res
887+ }
888+
731889define <vscale x 4 x bfloat> @splice_nxv4bf16_neg_idx (<vscale x 4 x bfloat> %a , <vscale x 4 x bfloat> %b ) #0 {
732890; CHECK-LABEL: splice_nxv4bf16_neg_idx:
733891; CHECK: // %bb.0:
@@ -750,6 +908,18 @@ define <vscale x 4 x bfloat> @splice_nxv4bf16_neg3_idx(<vscale x 4 x bfloat> %a,
750908 ret <vscale x 4 x bfloat> %res
751909}
752910
911+ define <vscale x 4 x bfloat> @splice_nxv4bf16_neg_idx_unary (<vscale x 4 x bfloat> %a , <vscale x 4 x bfloat> %b ) #0 {
912+ ; CHECK-LABEL: splice_nxv4bf16_neg_idx_unary:
913+ ; CHECK: // %bb.0:
914+ ; CHECK-NEXT: ptrue p0.s, vl1
915+ ; CHECK-NEXT: mov z0.d, z1.d
916+ ; CHECK-NEXT: rev p0.s, p0.s
917+ ; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s
918+ ; CHECK-NEXT: ret
919+ %res = call <vscale x 4 x bfloat> @llvm.vector.splice.nxv4bf16 (<vscale x 4 x bfloat> %b , <vscale x 4 x bfloat> %b , i32 -1 )
920+ ret <vscale x 4 x bfloat> %res
921+ }
922+
753923define <vscale x 4 x bfloat> @splice_nxv4bf16_first_idx (<vscale x 4 x bfloat> %a , <vscale x 4 x bfloat> %b ) #0 {
754924; CHECK-LABEL: splice_nxv4bf16_first_idx:
755925; CHECK: // %bb.0:
@@ -768,6 +938,16 @@ define <vscale x 4 x bfloat> @splice_nxv4bf16_last_idx(<vscale x 4 x bfloat> %a,
768938 ret <vscale x 4 x bfloat> %res
769939}
770940
941+ define <vscale x 4 x bfloat> @splice_nxv4bf16_first_idx_unary (<vscale x 4 x bfloat> %a , <vscale x 4 x bfloat> %b ) #0 {
942+ ; CHECK-LABEL: splice_nxv4bf16_first_idx_unary:
943+ ; CHECK: // %bb.0:
944+ ; CHECK-NEXT: mov z0.d, z1.d
945+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
946+ ; CHECK-NEXT: ret
947+ %res = call <vscale x 4 x bfloat> @llvm.vector.splice.nxv4bf16 (<vscale x 4 x bfloat> %b , <vscale x 4 x bfloat> %b , i32 1 )
948+ ret <vscale x 4 x bfloat> %res
949+ }
950+
771951define <vscale x 8 x bfloat> @splice_nxv8bf16_first_idx (<vscale x 8 x bfloat> %a , <vscale x 8 x bfloat> %b ) #0 {
772952; CHECK-LABEL: splice_nxv8bf16_first_idx:
773953; CHECK: // %bb.0:
@@ -786,6 +966,16 @@ define <vscale x 8 x bfloat> @splice_nxv8bf16_last_idx(<vscale x 8 x bfloat> %a,
786966 ret <vscale x 8 x bfloat> %res
787967}
788968
969+ define <vscale x 8 x bfloat> @splice_nxv8bf16_first_idx_unary (<vscale x 8 x bfloat> %a , <vscale x 8 x bfloat> %b ) #0 {
970+ ; CHECK-LABEL: splice_nxv8bf16_first_idx_unary:
971+ ; CHECK: // %bb.0:
972+ ; CHECK-NEXT: mov z0.d, z1.d
973+ ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #2
974+ ; CHECK-NEXT: ret
975+ %res = call <vscale x 8 x bfloat> @llvm.vector.splice.nxv8bf16 (<vscale x 8 x bfloat> %b , <vscale x 8 x bfloat> %b , i32 1 )
976+ ret <vscale x 8 x bfloat> %res
977+ }
978+
789979; Ensure predicate based splice is promoted to use ZPRs.
790980define <vscale x 2 x i1 > @splice_nxv2i1 (<vscale x 2 x i1 > %a , <vscale x 2 x i1 > %b ) #0 {
791981; CHECK-LABEL: splice_nxv2i1:
0 commit comments