@@ -178,11 +178,51 @@ CombinerHelper::GeneratorType sectionGenerator(const int32_t From,
178
178
179
179
bool AIE2PreLegalizerCombinerImpl::tryCombineShuffleVector (
180
180
MachineInstr &MI) const {
181
+ const Register DstReg = MI.getOperand (0 ).getReg ();
182
+ const LLT DstTy = MRI.getType (DstReg);
183
+ const LLT SrcTy = MRI.getType (MI.getOperand (1 ).getReg ());
184
+ const unsigned DstNumElts = DstTy.isVector () ? DstTy.getNumElements () : 1 ;
185
+ const unsigned SrcNumElts = SrcTy.isVector () ? SrcTy.getNumElements () : 1 ;
186
+ MachineIRBuilder MIB (MI);
187
+ MachineRegisterInfo &MRI = *MIB.getMRI ();
188
+
181
189
if (Helper.tryCombineShuffleVector (MI))
182
190
return true ;
183
191
192
+ const LLT V64S8 = LLT::fixed_vector (64 , 8 );
193
+ CombinerHelper::GeneratorType FourPartitions =
194
+ sectionGenerator (0 , DstNumElts, 4 , 1 );
195
+ if (Helper.matchCombineShuffleVector (MI, FourPartitions, DstNumElts)) {
196
+ if (DstTy != V64S8)
197
+ return false ;
198
+
199
+ const Register Src1 = MI.getOperand (1 ).getReg ();
200
+ const Register Src2 = MI.getOperand (2 ).getReg ();
201
+ const Register ShuffleModeReg =
202
+ MRI.createGenericVirtualRegister (LLT::scalar (32 ));
203
+
204
+ // This combiner only cares about the lower bits, so we can pad the
205
+ // vector to cover the case where two separate vectors are shuffled.
206
+ // together
207
+ MIB.buildConstant (ShuffleModeReg, 35 );
208
+
209
+ if (SrcTy == V64S8) {
210
+ MIB.buildInstr (AIE2::G_AIE_VSHUFFLE, {DstReg},
211
+ {Src1, Src2, ShuffleModeReg});
212
+ } else {
213
+ // We reuse the same register since we ignore the high part of the vector
214
+ const Register TmpRegister = MRI.createGenericVirtualRegister (V64S8);
215
+ MIB.buildConcatVectors (TmpRegister, {Src1, Src2});
216
+ MIB.buildInstr (AIE2::G_AIE_VSHUFFLE, {DstReg},
217
+ {TmpRegister, TmpRegister, ShuffleModeReg});
218
+ }
219
+
220
+ MI.eraseFromParent ();
221
+ return true ;
222
+ }
184
223
return false ;
185
224
}
225
+
186
226
bool AIE2PreLegalizerCombinerImpl::tryCombineAll (MachineInstr &MI) const {
187
227
if (tryCombineAllImpl (MI))
188
228
return true ;
0 commit comments