summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2005-10-25 15:15:28 +0000
committerJim Laskey <jlaskey@mac.com>2005-10-25 15:15:28 +0000
commit34bd5d5d876212611d8b66a18f4c8604b342c6eb (patch)
treeb65e1b0e1660aa3cdbbc7b1639fce08b82eb411c /lib
parente9c6d3637752b940a3c280196b0f594b65725e54 (diff)
downloadexternal_llvm-34bd5d5d876212611d8b66a18f4c8604b342c6eb.zip
external_llvm-34bd5d5d876212611d8b66a18f4c8604b342c6eb.tar.gz
external_llvm-34bd5d5d876212611d8b66a18f4c8604b342c6eb.tar.bz2
Preparation of supporting scheduling info. Need to find info based on selected
CPU. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23974 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/Alpha/AlphaSubtarget.cpp8
-rw-r--r--lib/Target/PowerPC/PPCSubtarget.cpp7
-rw-r--r--lib/Target/SubtargetFeature.cpp67
3 files changed, 54 insertions, 28 deletions
diff --git a/lib/Target/Alpha/AlphaSubtarget.cpp b/lib/Target/Alpha/AlphaSubtarget.cpp
index 570f680..cc3a6b1 100644
--- a/lib/Target/Alpha/AlphaSubtarget.cpp
+++ b/lib/Target/Alpha/AlphaSubtarget.cpp
@@ -19,10 +19,10 @@ using namespace llvm;
AlphaSubtarget::AlphaSubtarget(const Module &M, const std::string &FS)
: HasF2I(false), HasCT(false) {
std::string CPU = "generic";
- uint32_t Bits =
- SubtargetFeatures::Parse(FS, CPU,
- SubTypeKV, SubTypeKVSize,
- FeatureKV, FeatureKVSize);
+ SubtargetFeatures Features(FS);
+ Features.setCPUIfNone(CPU);
+ uint32_t Bits =Features.getBits(SubTypeKV, SubTypeKVSize,
+ FeatureKV, FeatureKVSize);
HasF2I = (Bits & FeatureFIX) != 0;
HasCT = (Bits & FeatureCIX) != 0;
}
diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp
index fca1f36..1995e1c 100644
--- a/lib/Target/PowerPC/PPCSubtarget.cpp
+++ b/lib/Target/PowerPC/PPCSubtarget.cpp
@@ -76,9 +76,10 @@ PPCSubtarget::PPCSubtarget(const Module &M, const std::string &FS)
#if defined(__APPLE__)
CPU = GetCurrentPowerPCCPU();
#endif
- uint32_t Bits =
- SubtargetFeatures::Parse(FS, CPU,
- SubTypeKV, SubTypeKVSize, FeatureKV, FeatureKVSize);
+ SubtargetFeatures Features(FS);
+ Features.setCPUIfNone(CPU);
+ uint32_t Bits = Features.getBits(SubTypeKV, SubTypeKVSize,
+ FeatureKV, FeatureKVSize);
IsGigaProcessor = (Bits & FeatureGPUL ) != 0;
Is64Bit = (Bits & Feature64Bit) != 0;
HasFSQRT = (Bits & FeatureFSqrt) != 0;
diff --git a/lib/Target/SubtargetFeature.cpp b/lib/Target/SubtargetFeature.cpp
index 93d1925..c9ddaf7 100644
--- a/lib/Target/SubtargetFeature.cpp
+++ b/lib/Target/SubtargetFeature.cpp
@@ -110,13 +110,12 @@ void SubtargetFeatures::AddFeature(const std::string &String,
}
}
-/// Find item in array using binary search.
-static const SubtargetFeatureKV *Find(const std::string &S,
- const SubtargetFeatureKV *A, size_t L) {
+/// Find KV in array using binary search.
+template<typename T> const T *Find(const std::string &S, const T *A, size_t L) {
// Determine the end of the array
- const SubtargetFeatureKV *Hi = A + L;
+ const T *Hi = A + L;
// Binary search the array
- const SubtargetFeatureKV *F = std::lower_bound(A, Hi, S);
+ const T *F = std::lower_bound(A, Hi, S);
// If not found then return NULL
if (F == Hi || std::string(F->Key) != S) return NULL;
// Return the found array item
@@ -182,6 +181,7 @@ void SubtargetFeatures::setString(const std::string &Initial) {
Split(Features, LowercaseString(Initial));
}
+
/// setCPU - Set the CPU string. Replaces previous setting. Setting to ""
/// clears CPU.
void SubtargetFeatures::setCPU(const std::string &String) {
@@ -189,15 +189,19 @@ void SubtargetFeatures::setCPU(const std::string &String) {
}
+/// setCPUIfNone - Setting CPU string only if no string is set.
+///
+void SubtargetFeatures::setCPUIfNone(const std::string &String) {
+ if (Features[0].empty()) setCPU(String);
+}
-/// Parse feature string for quick usage.
+
+/// getBits - Get feature bits.
///
-uint32_t SubtargetFeatures::Parse(const std::string &String,
- const std::string &DefaultCPU,
- const SubtargetFeatureKV *CPUTable,
- size_t CPUTableSize,
- const SubtargetFeatureKV *FeatureTable,
- size_t FeatureTableSize) {
+uint32_t SubtargetFeatures::getBits(const SubtargetFeatureKV *CPUTable,
+ size_t CPUTableSize,
+ const SubtargetFeatureKV *FeatureTable,
+ size_t FeatureTableSize) {
assert(CPUTable && "missing CPU table");
assert(FeatureTable && "missing features table");
#ifndef NDEBUG
@@ -210,15 +214,10 @@ uint32_t SubtargetFeatures::Parse(const std::string &String,
"CPU features table is not sorted");
}
#endif
- std::vector<std::string> Features; // Subtarget features as a vector
uint32_t Bits = 0; // Resulting bits
- // Split up features
- Split(Features, String);
- // Check if default is needed
- if (Features[0].empty())
- Features[0] = DefaultCPU;
- else if (Features[0] == "help")
+ // Check if help is needed
+ if (Features[0] == "help")
Help(CPUTable, CPUTableSize, FeatureTable, FeatureTableSize);
// Find CPU entry
@@ -260,7 +259,32 @@ uint32_t SubtargetFeatures::Parse(const std::string &String,
return Bits;
}
-/// Print feature string.
+/// Get info pointer
+void *SubtargetFeatures::getInfo(const SubtargetInfoKV *Table,
+ size_t TableSize) {
+ assert(Table && "missing table");
+#ifndef NDEBUG
+ for (size_t i = 1; i < TableSize; i++) {
+ assert(strcmp(Table[i - 1].Key, Table[i].Key) < 0 && "Table is not sorted");
+ }
+#endif
+
+ // Find entry
+ const SubtargetInfoKV *Entry = Find(Features[0], Table, TableSize);
+
+ if (Entry) {
+ return Entry->Value;
+ } else {
+ std::cerr << "'" << Features[0]
+ << "' is not a recognized processor for this target"
+ << " (ignoring processor)"
+ << "\n";
+ return NULL;
+ }
+}
+
+/// print - Print feature string.
+///
void SubtargetFeatures::print(std::ostream &OS) const {
for (size_t i = 0; i < Features.size(); i++) {
OS << Features[i] << " ";
@@ -268,7 +292,8 @@ void SubtargetFeatures::print(std::ostream &OS) const {
OS << "\n";
}
-/// Dump feature info.
+/// dump - Dump feature info.
+///
void SubtargetFeatures::dump() const {
print(std::cerr);
}