mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-29 13:54:57 +00:00
Implement vector expand support for shuffle_vector. This fixes PR1811.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44242 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
50cdabcfd5
commit
6c9c6800b8
@ -6286,6 +6286,41 @@ void SelectionDAGLegalize::SplitVectorOp(SDOperand Op, SDOperand &Lo,
|
|||||||
TLI.getPointerTy()));
|
TLI.getPointerTy()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ISD::VECTOR_SHUFFLE: {
|
||||||
|
// Build the low part.
|
||||||
|
SDOperand Mask = Node->getOperand(2);
|
||||||
|
SmallVector<SDOperand, 8> Ops;
|
||||||
|
MVT::ValueType PtrVT = TLI.getPointerTy();
|
||||||
|
|
||||||
|
// Insert all of the elements from the input that are needed. We use
|
||||||
|
// buildvector of extractelement here because the input vectors will have
|
||||||
|
// to be legalized, so this makes the code simpler.
|
||||||
|
for (unsigned i = 0; i != NewNumElts_Lo; ++i) {
|
||||||
|
unsigned Idx = cast<ConstantSDNode>(Mask.getOperand(i))->getValue();
|
||||||
|
SDOperand InVec = Node->getOperand(0);
|
||||||
|
if (Idx >= NumElements) {
|
||||||
|
InVec = Node->getOperand(1);
|
||||||
|
Idx -= NumElements;
|
||||||
|
}
|
||||||
|
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, NewEltVT, InVec,
|
||||||
|
DAG.getConstant(Idx, PtrVT)));
|
||||||
|
}
|
||||||
|
Lo = DAG.getNode(ISD::BUILD_VECTOR, NewVT_Lo, &Ops[0], Ops.size());
|
||||||
|
Ops.clear();
|
||||||
|
|
||||||
|
for (unsigned i = NewNumElts_Lo; i != NumElements; ++i) {
|
||||||
|
unsigned Idx = cast<ConstantSDNode>(Mask.getOperand(i))->getValue();
|
||||||
|
SDOperand InVec = Node->getOperand(0);
|
||||||
|
if (Idx >= NumElements) {
|
||||||
|
InVec = Node->getOperand(1);
|
||||||
|
Idx -= NumElements;
|
||||||
|
}
|
||||||
|
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, NewEltVT, InVec,
|
||||||
|
DAG.getConstant(Idx, PtrVT)));
|
||||||
|
}
|
||||||
|
Hi = DAG.getNode(ISD::BUILD_VECTOR, NewVT_Lo, &Ops[0], Ops.size());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ISD::BUILD_VECTOR: {
|
case ISD::BUILD_VECTOR: {
|
||||||
SmallVector<SDOperand, 8> LoOps(Node->op_begin(),
|
SmallVector<SDOperand, 8> LoOps(Node->op_begin(),
|
||||||
Node->op_begin()+NewNumElts_Lo);
|
Node->op_begin()+NewNumElts_Lo);
|
||||||
|
Loading…
Reference in New Issue
Block a user