diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-08-13 16:09:07 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-08-13 16:09:07 +0000 |
commit | 690645bda08835abd0263f4e81113a31b3a9c52b (patch) | |
tree | 4a7276dd2a030bf542325cfcf3bdd03b441ae1f2 /llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | |
parent | 52a34a78d9aff1bb5e66e7c32490229ea177e075 (diff) | |
download | bcm5719-llvm-690645bda08835abd0263f4e81113a31b3a9c52b.tar.gz bcm5719-llvm-690645bda08835abd0263f4e81113a31b3a9c52b.zip |
GlobalISel: Implement lower for G_SHUFFLE_VECTOR
llvm-svn: 368709
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index e2b5082503c..a96d74898cd 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -2096,6 +2096,8 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) { MI.eraseFromParent(); return Legalized; } + case G_SHUFFLE_VECTOR: + return lowerShuffleVector(MI); } } @@ -3751,3 +3753,41 @@ LegalizerHelper::lowerUnmergeValues(MachineInstr &MI) { return UnableToLegalize; } + +LegalizerHelper::LegalizeResult +LegalizerHelper::lowerShuffleVector(MachineInstr &MI) { + Register DstReg = MI.getOperand(0).getReg(); + Register Src0Reg = MI.getOperand(1).getReg(); + Register Src1Reg = MI.getOperand(2).getReg(); + LLT DstTy = MRI.getType(DstReg); + LLT EltTy = DstTy.getElementType(); + int NumElts = DstTy.getNumElements(); + LLT IdxTy = LLT::scalar(32); + + const Constant *ShufMask = MI.getOperand(3).getShuffleMask(); + + SmallVector<int, 32> Mask; + ShuffleVectorInst::getShuffleMask(ShufMask, Mask); + + Register Undef; + SmallVector<Register, 32> BuildVec; + + for (int Idx : Mask) { + if (Idx < 0) { + if (!Undef.isValid()) + Undef = MIRBuilder.buildUndef(EltTy).getReg(0); + BuildVec.push_back(Undef); + continue; + } + + Register SrcVec = Idx < NumElts ? Src0Reg : Src1Reg; + int ExtractIdx = Idx < NumElts ? Idx : Idx - NumElts; + auto IdxK = MIRBuilder.buildConstant(IdxTy, ExtractIdx); + auto Extract = MIRBuilder.buildExtractVectorElement(EltTy, SrcVec, IdxK); + BuildVec.push_back(Extract.getReg(0)); + } + + MIRBuilder.buildBuildVector(DstReg, BuildVec); + MI.eraseFromParent(); + return Legalized; +} |