aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-04-04 00:25:10 +0000
committerChris Lattner <sabre@nondot.org>2006-04-04 00:25:10 +0000
commite6bfffbae26a3593531d0f6b78ae2b8125244c38 (patch)
tree5b2b995bd236fcc3be3c8125293554b99b8ae23d /include
parent6e96740c6c8f83d9f376b4e4557281a9b1f66de8 (diff)
Allow targets to have fine grained control over which types various ops get
promoted to, if they desire. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27389 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Target/TargetLowering.h34
1 files changed, 29 insertions, 5 deletions
diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h
index 303c415d2e..6035191f5f 100644
--- a/include/llvm/Target/TargetLowering.h
+++ b/include/llvm/Target/TargetLowering.h
@@ -24,9 +24,7 @@
#include "llvm/Type.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
-#include "llvm/CodeGen/ValueTypes.h"
-#include "llvm/Support/DataTypes.h"
-#include <vector>
+#include <map>
namespace llvm {
class Value;
@@ -172,7 +170,7 @@ public:
MVT::ValueType getTypeToTransformTo(MVT::ValueType VT) const {
return TransformToType[VT];
}
-
+
/// getPackedTypeBreakdown - Packed types are broken down into some number of
/// legal scalar types. For example, <8 x float> maps to 2 MVT::v2f32 values
/// with Altivec or SSE1, or 8 promoted MVT::f64 values with the X86 FP stack.
@@ -223,6 +221,16 @@ public:
MVT::ValueType getTypeToPromoteTo(unsigned Op, MVT::ValueType VT) const {
assert(getOperationAction(Op, VT) == Promote &&
"This operation isn't promoted!");
+
+ // See if this has an explicit type specified.
+ std::map<std::pair<unsigned, MVT::ValueType>,
+ MVT::ValueType>::const_iterator PTTI =
+ PromoteToType.find(std::make_pair(Op, VT));
+ if (PTTI != PromoteToType.end()) return PTTI->second;
+
+ assert((MVT::isInteger(VT) || MVT::isFloatingPoint(VT)) &&
+ "Cannot autopromote this type, add it with AddPromotedToType.");
+
MVT::ValueType NVT = VT;
do {
NVT = (MVT::ValueType)(NVT+1);
@@ -484,6 +492,15 @@ protected:
OpActions[Op] &= ~(3ULL << VT*2);
OpActions[Op] |= (uint64_t)Action << VT*2;
}
+
+ /// AddPromotedToType - If Opc/OrigVT is specified as being promoted, the
+ /// promotion code defaults to trying a larger integer/fp until it can find
+ /// one that works. If that default is insufficient, this method can be used
+ /// by the target to override the default.
+ void AddPromotedToType(unsigned Opc, MVT::ValueType OrigVT,
+ MVT::ValueType DestVT) {
+ PromoteToType[std::make_pair(Opc, OrigVT)] = DestVT;
+ }
/// addLegalFPImmediate - Indicate that this target can instruction select
/// the specified FP immediate natively.
@@ -629,7 +646,6 @@ protected:
private:
std::vector<unsigned> LegalAddressScales;
-private:
TargetMachine &TM;
const TargetData &TD;
@@ -715,6 +731,14 @@ private:
/// which sets a bit in this array.
unsigned char TargetDAGCombineArray[156/(sizeof(unsigned char)*8)];
+ /// PromoteToType - For operations that must be promoted to a specific type,
+ /// this holds the destination type. This map should be sparse, so don't hold
+ /// it as an array.
+ ///
+ /// Targets add entries to this map with AddPromotedToType(..), clients access
+ /// this with getTypeToPromoteTo(..).
+ std::map<std::pair<unsigned, MVT::ValueType>, MVT::ValueType> PromoteToType;
+
protected:
/// When lowering %llvm.memset this field specifies the maximum number of
/// store operations that may be substituted for the call to memset. Targets