@@ -90,6 +90,64 @@ define {<2 x i64>, <2 x i64>} @vector_deinterleave_v2i64_v4i64(<4 x i64> %vec) {
90
90
ret {<2 x i64 >, <2 x i64 >} %retval
91
91
}
92
92
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
+
93
151
declare {<16 x i1 >, <16 x i1 >} @llvm.vector.deinterleave2.v32i1 (<32 x i1 >)
94
152
declare {<16 x i8 >, <16 x i8 >} @llvm.vector.deinterleave2.v32i8 (<32 x i8 >)
95
153
declare {<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
176
234
ret {<2 x double >, <2 x double >} %retval
177
235
}
178
236
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
+
179
266
declare {<2 x half >,<2 x half >} @llvm.vector.deinterleave2.v4f16 (<4 x half >)
180
267
declare {<4 x half >, <4 x half >} @llvm.vector.deinterleave2.v8f16 (<8 x half >)
181
268
declare {<2 x float >, <2 x float >} @llvm.vector.deinterleave2.v4f32 (<4 x float >)
182
269
declare {<8 x half >, <8 x half >} @llvm.vector.deinterleave2.v16f16 (<16 x half >)
183
270
declare {<4 x float >, <4 x float >} @llvm.vector.deinterleave2.v8f32 (<8 x float >)
184
271
declare {<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