@@ -90,6 +90,64 @@ define {<2 x i64>, <2 x i64>} @vector_deinterleave_v2i64_v4i64(<4 x i64> %vec) {
9090ret {<2 x i64 >, <2 x i64 >} %retval
9191}
9292
93+ define {<4 x i64 >, <4 x i64 >} @vector_deinterleave_v4i64_v8i64 (<8 x i64 > %vec ) {
94+ ; CHECK-LABEL: vector_deinterleave_v4i64_v8i64:
95+ ; CHECK: # %bb.0:
96+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
97+ ; CHECK-NEXT: vid.v v12
98+ ; CHECK-NEXT: vadd.vv v14, v12, v12
99+ ; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
100+ ; CHECK-NEXT: vrgatherei16.vv v12, v8, v14
101+ ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
102+ ; CHECK-NEXT: vadd.vi v15, v14, -4
103+ ; CHECK-NEXT: vmv.v.i v0, 12
104+ ; CHECK-NEXT: vsetivli zero, 4, e64, m4, ta, ma
105+ ; CHECK-NEXT: vslidedown.vi v16, v8, 4
106+ ; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, mu
107+ ; CHECK-NEXT: vrgatherei16.vv v12, v16, v15, v0.t
108+ ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
109+ ; CHECK-NEXT: vadd.vi v15, v14, 1
110+ ; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
111+ ; CHECK-NEXT: vrgatherei16.vv v10, v8, v15
112+ ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
113+ ; CHECK-NEXT: vadd.vi v8, v14, -3
114+ ; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu
115+ ; CHECK-NEXT: vrgatherei16.vv v10, v16, v8, v0.t
116+ ; CHECK-NEXT: vmv.v.v v8, v12
117+ ; CHECK-NEXT: ret
118+ %retval = call {<4 x i64 >, <4 x i64 >} @llvm.vector.deinterleave2.v8i64 (<8 x i64 > %vec )
119+ ret {<4 x i64 >, <4 x i64 >} %retval
120+ }
121+
122+ define {<8 x i64 >, <8 x i64 >} @vector_deinterleave_v8i64_v16i64 (<16 x i64 > %vec ) {
123+ ; CHECK-LABEL: vector_deinterleave_v8i64_v16i64:
124+ ; CHECK: # %bb.0:
125+ ; CHECK-NEXT: vmv8r.v v16, v8
126+ ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
127+ ; CHECK-NEXT: vid.v v8
128+ ; CHECK-NEXT: vadd.vv v7, v8, v8
129+ ; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma
130+ ; CHECK-NEXT: vrgatherei16.vv v8, v16, v7
131+ ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
132+ ; CHECK-NEXT: vmv.v.i v0, -16
133+ ; CHECK-NEXT: vadd.vi v12, v7, -8
134+ ; CHECK-NEXT: vsetivli zero, 8, e64, m8, ta, ma
135+ ; CHECK-NEXT: vslidedown.vi v24, v16, 8
136+ ; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, mu
137+ ; CHECK-NEXT: vrgatherei16.vv v8, v24, v12, v0.t
138+ ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma
139+ ; CHECK-NEXT: vadd.vi v20, v7, 1
140+ ; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma
141+ ; CHECK-NEXT: vrgatherei16.vv v12, v16, v20
142+ ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma
143+ ; CHECK-NEXT: vadd.vi v16, v7, -7
144+ ; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, mu
145+ ; CHECK-NEXT: vrgatherei16.vv v12, v24, v16, v0.t
146+ ; CHECK-NEXT: ret
147+ %retval = call {<8 x i64 >, <8 x i64 >} @llvm.vector.deinterleave2.v16i64 (<16 x i64 > %vec )
148+ ret {<8 x i64 >, <8 x i64 >} %retval
149+ }
150+
93151declare {<16 x i1 >, <16 x i1 >} @llvm.vector.deinterleave2.v32i1 (<32 x i1 >)
94152declare {<16 x i8 >, <16 x i8 >} @llvm.vector.deinterleave2.v32i8 (<32 x i8 >)
95153declare {<8 x i16 >, <8 x i16 >} @llvm.vector.deinterleave2.v16i16 (<16 x i16 >)
@@ -176,9 +234,41 @@ define {<2 x double>, <2 x double>} @vector_deinterleave_v2f64_v4f64(<4 x double
176234ret {<2 x double >, <2 x double >} %retval
177235}
178236
237+ define {<4 x double >, <4 x double >} @vector_deinterleave_v4f64_v8f64 (<8 x double > %vec ) {
238+ ; CHECK-LABEL: vector_deinterleave_v4f64_v8f64:
239+ ; CHECK: # %bb.0:
240+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
241+ ; CHECK-NEXT: vid.v v12
242+ ; CHECK-NEXT: vadd.vv v14, v12, v12
243+ ; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
244+ ; CHECK-NEXT: vrgatherei16.vv v12, v8, v14
245+ ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
246+ ; CHECK-NEXT: vadd.vi v15, v14, -4
247+ ; CHECK-NEXT: vmv.v.i v0, 12
248+ ; CHECK-NEXT: vsetivli zero, 4, e64, m4, ta, ma
249+ ; CHECK-NEXT: vslidedown.vi v16, v8, 4
250+ ; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, mu
251+ ; CHECK-NEXT: vrgatherei16.vv v12, v16, v15, v0.t
252+ ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
253+ ; CHECK-NEXT: vadd.vi v15, v14, 1
254+ ; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
255+ ; CHECK-NEXT: vrgatherei16.vv v10, v8, v15
256+ ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
257+ ; CHECK-NEXT: vadd.vi v8, v14, -3
258+ ; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu
259+ ; CHECK-NEXT: vrgatherei16.vv v10, v16, v8, v0.t
260+ ; CHECK-NEXT: vmv.v.v v8, v12
261+ ; CHECK-NEXT: ret
262+ %retval = call {<4 x double >, <4 x double >} @llvm.vector.deinterleave2.v8f64 (<8 x double > %vec )
263+ ret {<4 x double >, <4 x double >} %retval
264+ }
265+
179266declare {<2 x half >,<2 x half >} @llvm.vector.deinterleave2.v4f16 (<4 x half >)
180267declare {<4 x half >, <4 x half >} @llvm.vector.deinterleave2.v8f16 (<8 x half >)
181268declare {<2 x float >, <2 x float >} @llvm.vector.deinterleave2.v4f32 (<4 x float >)
182269declare {<8 x half >, <8 x half >} @llvm.vector.deinterleave2.v16f16 (<16 x half >)
183270declare {<4 x float >, <4 x float >} @llvm.vector.deinterleave2.v8f32 (<8 x float >)
184271declare {<2 x double >, <2 x double >} @llvm.vector.deinterleave2.v4f64 (<4 x double >)
272+ ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
273+ ; RV32: {{.*}}
274+ ; RV64: {{.*}}
0 commit comments