mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Rather than attempting to legalize 1 x float, make sure the SD ISel never
generates it. Make MVT::Vector expand-only, and remove the code in Legalize that attempts to legalize it. The plan for supporting N x Type is to continually epxand it in ExpandOp until it gets down to 2 x Type, where it will be scalarized into a pair of scalars. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24482 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ac2902bcb5
commit
4ef3b817fe
@ -925,26 +925,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
|||||||
AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
|
AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
|
||||||
return Result.getValue(Op.ResNo);
|
return Result.getValue(Op.ResNo);
|
||||||
|
|
||||||
case ISD::VLOAD:
|
|
||||||
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
|
|
||||||
Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer.
|
|
||||||
|
|
||||||
// If we just have one element, scalarize the result. Otherwise, check to
|
|
||||||
// see if we support this operation on this type at this width. If not,
|
|
||||||
// split the vector in half and try again.
|
|
||||||
if (1 == cast<ConstantSDNode>(Node->getOperand(2))->getValue()) {
|
|
||||||
MVT::ValueType SVT = cast<VTSDNode>(Node->getOperand(3))->getVT();
|
|
||||||
Result = LegalizeOp(DAG.getLoad(SVT, Tmp1, Tmp2, Node->getOperand(4)));
|
|
||||||
} else {
|
|
||||||
assert(0 && "Expand case for vectors unimplemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since loads produce two values, make sure to remember that we legalized
|
|
||||||
// both of them.
|
|
||||||
AddLegalizedOperand(SDOperand(Node, 0), Result);
|
|
||||||
AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
|
|
||||||
return Result.getValue(Op.ResNo);
|
|
||||||
|
|
||||||
case ISD::EXTLOAD:
|
case ISD::EXTLOAD:
|
||||||
case ISD::SEXTLOAD:
|
case ISD::SEXTLOAD:
|
||||||
case ISD::ZEXTLOAD: {
|
case ISD::ZEXTLOAD: {
|
||||||
@ -1685,28 +1665,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
|||||||
Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2);
|
Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Vector binary operators
|
|
||||||
case ISD::VADD:
|
|
||||||
case ISD::VSUB:
|
|
||||||
case ISD::VMUL: {
|
|
||||||
Tmp1 = Node->getOperand(0); // Element Count
|
|
||||||
Tmp2 = Node->getOperand(1); // Element Type
|
|
||||||
|
|
||||||
// If we just have one element, scalarize the result. Otherwise, check to
|
|
||||||
// see if we support this operation on this type at this width. If not,
|
|
||||||
// split the vector in half and try again.
|
|
||||||
if (1 == cast<ConstantSDNode>(Tmp1)->getValue()) {
|
|
||||||
MVT::ValueType SVT = cast<VTSDNode>(Tmp2)->getVT();
|
|
||||||
|
|
||||||
Result = DAG.getNode(getScalarizedOpcode(Node->getOpcode(), SVT), SVT,
|
|
||||||
LegalizeOp(Node->getOperand(2)),
|
|
||||||
LegalizeOp(Node->getOperand(3)));
|
|
||||||
} else {
|
|
||||||
assert(0 && "Expand case for vectors unimplemented");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ISD::BUILD_PAIR: {
|
case ISD::BUILD_PAIR: {
|
||||||
MVT::ValueType PairTy = Node->getValueType(0);
|
MVT::ValueType PairTy = Node->getValueType(0);
|
||||||
// TODO: handle the case where the Lo and Hi operands are not of legal type
|
// TODO: handle the case where the Lo and Hi operands are not of legal type
|
||||||
|
@ -517,9 +517,19 @@ void SelectionDAGLowering::visitBinary(User &I, unsigned IntOp, unsigned FPOp,
|
|||||||
setValue(&I, DAG.getNode(FPOp, Op1.getValueType(), Op1, Op2));
|
setValue(&I, DAG.getNode(FPOp, Op1.getValueType(), Op1, Op2));
|
||||||
} else {
|
} else {
|
||||||
const PackedType *PTy = cast<PackedType>(Ty);
|
const PackedType *PTy = cast<PackedType>(Ty);
|
||||||
SDOperand Num = DAG.getConstant(PTy->getNumElements(), MVT::i32);
|
unsigned NumElements = PTy->getNumElements();
|
||||||
SDOperand Typ = DAG.getValueType(TLI.getValueType(PTy->getElementType()));
|
MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
|
||||||
setValue(&I, DAG.getNode(VecOp, Op1.getValueType(), Num, Typ, Op1, Op2));
|
|
||||||
|
// Immediately scalarize packed types containing only one element, so that
|
||||||
|
// the Legalize pass does not have to deal with them.
|
||||||
|
if (NumElements == 1) {
|
||||||
|
unsigned Opc = MVT::isFloatingPoint(PVT) ? FPOp : IntOp;
|
||||||
|
setValue(&I, DAG.getNode(Opc, PVT, Op1, Op2));
|
||||||
|
} else {
|
||||||
|
SDOperand Num = DAG.getConstant(NumElements, MVT::i32);
|
||||||
|
SDOperand Typ = DAG.getValueType(PVT);
|
||||||
|
setValue(&I, DAG.getNode(VecOp, Op1.getValueType(), Num, Typ, Op1, Op2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -726,9 +736,17 @@ void SelectionDAGLowering::visitLoad(LoadInst &I) {
|
|||||||
|
|
||||||
if (Type::PackedTyID == Ty->getTypeID()) {
|
if (Type::PackedTyID == Ty->getTypeID()) {
|
||||||
const PackedType *PTy = cast<PackedType>(Ty);
|
const PackedType *PTy = cast<PackedType>(Ty);
|
||||||
L = DAG.getVecLoad(PTy->getNumElements(),
|
unsigned NumElements = PTy->getNumElements();
|
||||||
TLI.getValueType(PTy->getElementType()), Root, Ptr,
|
MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
|
||||||
DAG.getSrcValue(I.getOperand(0)));
|
|
||||||
|
// Immediately scalarize packed types containing only one element, so that
|
||||||
|
// the Legalize pass does not have to deal with them.
|
||||||
|
if (NumElements == 1) {
|
||||||
|
L = DAG.getLoad(PVT, Root, Ptr, DAG.getSrcValue(I.getOperand(0)));
|
||||||
|
} else {
|
||||||
|
L = DAG.getVecLoad(NumElements, PVT, Root, Ptr,
|
||||||
|
DAG.getSrcValue(I.getOperand(0)));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr,
|
L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr,
|
||||||
DAG.getSrcValue(I.getOperand(0)));
|
DAG.getSrcValue(I.getOperand(0)));
|
||||||
|
@ -64,7 +64,7 @@ static void SetValueTypeAction(MVT::ValueType VT,
|
|||||||
assert(VT < PromoteTo && "Must promote to a larger type!");
|
assert(VT < PromoteTo && "Must promote to a larger type!");
|
||||||
TransformToType[VT] = PromoteTo;
|
TransformToType[VT] = PromoteTo;
|
||||||
} else if (Action == TargetLowering::Expand) {
|
} else if (Action == TargetLowering::Expand) {
|
||||||
assert(MVT::isInteger(VT) && VT > MVT::i8 &&
|
assert((VT == MVT::Vector || MVT::isInteger(VT)) && VT > MVT::i8 &&
|
||||||
"Cannot expand this type: target must support SOME integer reg!");
|
"Cannot expand this type: target must support SOME integer reg!");
|
||||||
// Expand to the next smaller integer type!
|
// Expand to the next smaller integer type!
|
||||||
TransformToType[VT] = (MVT::ValueType)(VT-1);
|
TransformToType[VT] = (MVT::ValueType)(VT-1);
|
||||||
@ -114,6 +114,10 @@ void TargetLowering::computeRegisterProperties() {
|
|||||||
else
|
else
|
||||||
TransformToType[MVT::f32] = MVT::f32;
|
TransformToType[MVT::f32] = MVT::f32;
|
||||||
|
|
||||||
|
// Set MVT::Vector to always be Expanded
|
||||||
|
SetValueTypeAction(MVT::Vector, Expand, *this, TransformToType,
|
||||||
|
ValueTypeActions);
|
||||||
|
|
||||||
assert(isTypeLegal(MVT::f64) && "Target does not support FP?");
|
assert(isTypeLegal(MVT::f64) && "Target does not support FP?");
|
||||||
TransformToType[MVT::f64] = MVT::f64;
|
TransformToType[MVT::f64] = MVT::f64;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user