mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Add initial support for vector widening. Logic is set to widen for X86.
One will only see an effect if legalizetype is not active. Will move support to LegalizeType soon. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58426 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1eb4df6481
commit
0c39719bfc
@ -164,7 +164,10 @@ public:
|
||||
|
||||
LegalizeAction getTypeAction(MVT VT) const {
|
||||
if (VT.isExtended()) {
|
||||
if (VT.isVector()) return Expand;
|
||||
if (VT.isVector()) {
|
||||
// First try vector widening
|
||||
return Promote;
|
||||
}
|
||||
if (VT.isInteger())
|
||||
// First promote to a power-of-two size, then expand if necessary.
|
||||
return VT == VT.getRoundIntegerType() ? Expand : Promote;
|
||||
@ -261,6 +264,13 @@ public:
|
||||
unsigned &NumIntermediates,
|
||||
MVT &RegisterVT) const;
|
||||
|
||||
/// getWidenVectorType: given a vector type, returns the type to widen to
|
||||
/// (e.g., v7i8 to v8i8). If the vector type is legal, it returns itself.
|
||||
/// If there is no vector type that we want to widen to, returns MVT::Other
|
||||
/// When and were to widen is target dependent based on the cost of
|
||||
/// scalarizing vs using the wider vector type.
|
||||
virtual MVT getWidenVectorType(MVT VT);
|
||||
|
||||
typedef std::vector<APFloat>::const_iterator legal_fpimm_iterator;
|
||||
legal_fpimm_iterator legal_fpimm_begin() const {
|
||||
return LegalFPImmediates.begin();
|
||||
@ -1455,7 +1465,7 @@ private:
|
||||
MVT TransformToType[MVT::LAST_VALUETYPE];
|
||||
|
||||
// Defines the capacity of the TargetLowering::OpActions table
|
||||
static const int OpActionsCapacity = 212;
|
||||
static const int OpActionsCapacity = 218;
|
||||
|
||||
/// OpActions - For each operation and each value type, keep a LegalizeAction
|
||||
/// that indicates how instruction selection should deal with the operation.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -79,7 +79,20 @@ private:
|
||||
case TargetLowering::Legal:
|
||||
return Legal;
|
||||
case TargetLowering::Promote:
|
||||
return PromoteInteger;
|
||||
// Promote can mean
|
||||
// 1) On integers, it means to promote type (e.g., i8 to i32)
|
||||
// 2) For vectors, it means try to widen (e.g., v3i32 to v4i32)
|
||||
if (!VT.isVector()) {
|
||||
return PromoteInteger;
|
||||
}
|
||||
else {
|
||||
// TODO: move widen code to LegalizeType
|
||||
if (VT.getVectorNumElements() == 1) {
|
||||
return ScalarizeVector;
|
||||
} else {
|
||||
return SplitVector;
|
||||
}
|
||||
}
|
||||
case TargetLowering::Expand:
|
||||
// Expand can mean
|
||||
// 1) split scalar in half, 2) convert a float to an integer,
|
||||
|
@ -573,7 +573,7 @@ void TargetLowering::computeRegisterProperties() {
|
||||
RegisterVT);
|
||||
RegisterTypeForVT[i] = RegisterVT;
|
||||
TransformToType[i] = MVT::Other; // this isn't actually used
|
||||
ValueTypeActions.setTypeAction(VT, Expand);
|
||||
ValueTypeActions.setTypeAction(VT, Promote);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -642,6 +642,20 @@ unsigned TargetLowering::getVectorTypeBreakdown(MVT VT,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/// getWidenVectorType: given a vector type, returns the type to widen to
|
||||
/// (e.g., v7i8 to v8i8). If the vector type is legal, it returns itself.
|
||||
/// If there is no vector type that we want to widen to, returns MVT::Other
|
||||
/// When and were to widen is target dependent based on the cost of
|
||||
/// scalarizing vs using the wider vector type.
|
||||
MVT TargetLowering::getWidenVectorType(MVT VT) {
|
||||
assert(VT.isVector());
|
||||
if (isTypeLegal(VT))
|
||||
return VT;
|
||||
|
||||
// Default is not to widen until moved to LegalizeTypes
|
||||
return MVT::Other;
|
||||
}
|
||||
|
||||
/// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
|
||||
/// function arguments in the caller parameter area. This is the actual
|
||||
/// alignment, not its logarithm.
|
||||
|
@ -523,8 +523,9 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FEXP, MVT::f80, Expand);
|
||||
setOperationAction(ISD::FEXP2, MVT::f80, Expand);
|
||||
|
||||
// First set operation action for all vector types to expand. Then we
|
||||
// will selectively turn on ones that can be effectively codegen'd.
|
||||
// First set operation action for all vector types to either to promote
|
||||
// (for widening) or expand (for scalarization). Then we will selectively
|
||||
// turn on ones that can be effectively codegen'd.
|
||||
for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
|
||||
VT <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++VT) {
|
||||
setOperationAction(ISD::ADD , (MVT::SimpleValueType)VT, Expand);
|
||||
@ -543,6 +544,8 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::EXTRACT_VECTOR_ELT,(MVT::SimpleValueType)VT,Expand);
|
||||
setOperationAction(ISD::INSERT_VECTOR_ELT,(MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::EXTRACT_SUBVECTOR,(MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::CONCAT_VECTORS,(MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::FABS, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::FSIN, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::FCOS, (MVT::SimpleValueType)VT, Expand);
|
||||
@ -7837,3 +7840,41 @@ X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
|
||||
return Res;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// X86 Widen vector type
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// getWidenVectorType: given a vector type, returns the type to widen
|
||||
/// to (e.g., v7i8 to v8i8). If the vector type is legal, it returns itself.
|
||||
/// If there is no vector type that we want to widen to, returns MVT::Other
|
||||
/// When and were to widen is target dependent based on the cost of
|
||||
/// scalarizing vs using the wider vector type.
|
||||
|
||||
MVT X86TargetLowering::getWidenVectorType(MVT VT) {
|
||||
assert(VT.isVector());
|
||||
if (isTypeLegal(VT))
|
||||
return VT;
|
||||
|
||||
// TODO: In computeRegisterProperty, we can compute the list of legal vector
|
||||
// type based on element type. This would speed up our search (though
|
||||
// it may not be worth it since the size of the list is relatively
|
||||
// small).
|
||||
MVT EltVT = VT.getVectorElementType();
|
||||
unsigned NElts = VT.getVectorNumElements();
|
||||
|
||||
// On X86, it make sense to widen any vector wider than 1
|
||||
if (NElts <= 1)
|
||||
return MVT::Other;
|
||||
|
||||
for (unsigned nVT = MVT::FIRST_VECTOR_VALUETYPE;
|
||||
nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) {
|
||||
MVT SVT = (MVT::SimpleValueType)nVT;
|
||||
|
||||
if (isTypeLegal(SVT) &&
|
||||
SVT.getVectorElementType() == EltVT &&
|
||||
SVT.getVectorNumElements() > NElts)
|
||||
return SVT;
|
||||
}
|
||||
return MVT::Other;
|
||||
}
|
||||
|
@ -486,6 +486,13 @@ namespace llvm {
|
||||
(VT == MVT::f32 && X86ScalarSSEf32); // f32 is when SSE1
|
||||
}
|
||||
|
||||
/// getWidenVectorType: given a vector type, returns the type to widen
|
||||
/// to (e.g., v7i8 to v8i8). If the vector type is legal, it returns itself.
|
||||
/// If there is no vector type that we want to widen to, returns MVT::Other
|
||||
/// When and were to widen is target dependent based on the cost of
|
||||
/// scalarizing vs using the wider vector type.
|
||||
virtual MVT getWidenVectorType(MVT VT);
|
||||
|
||||
/// createFastISel - This method returns a target specific FastISel object,
|
||||
/// or null if the target does not support "fast" ISel.
|
||||
virtual FastISel *
|
||||
|
Loading…
Reference in New Issue
Block a user