Preparation of supporting scheduling info. Need to find info based on selected
authorJim Laskey <jlaskey@mac.com>
Tue, 25 Oct 2005 15:15:28 +0000 (15:15 +0000)
committerJim Laskey <jlaskey@mac.com>
Tue, 25 Oct 2005 15:15:28 +0000 (15:15 +0000)
CPU.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23974 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/SubtargetFeature.h
lib/Target/Alpha/AlphaSubtarget.cpp
lib/Target/PowerPC/PPCSubtarget.cpp
lib/Target/SubtargetFeature.cpp

index 590a6dbab78204535248a66107f91740da54c61b..aab86885888de4199db9127ad4038fb3d50dc7ae 100644 (file)
@@ -41,6 +41,21 @@ struct SubtargetFeatureKV {
   }
 };
   
+//===----------------------------------------------------------------------===//
+///
+/// SubtargetInfoKV - Used to provide key value pairs for CPU and arbitrary
+/// pointers.
+//
+struct SubtargetInfoKV {
+  const char *Key;                      // K-V key string
+  void *Value;                          // K-V pointer value
+  
+  // Compare routine for std binary search
+  bool operator<(const std::string &S) const {
+    return strcmp(Key, S.c_str()) < 0;
+  }
+};
+  
 //===----------------------------------------------------------------------===//
 ///
 /// SubtargetFeatures - Manages the enabling and disabling of subtarget 
@@ -63,20 +78,23 @@ public:
   std::string getString() const;
   void setString(const std::string &Initial);
 
-  /// Setting CPU string.  Replaces previous setting.  Setting to "" clears CPU.
-  ///
+  /// Set the CPU string.  Replaces previous setting.  Setting to "" clears CPU.
   void setCPU(const std::string &String);
   
+  /// Setting CPU string only if no string is set.
+  void setCPUIfNone(const std::string &String);
+  
   /// Adding Features.
   void AddFeature(const std::string &String, bool IsEnabled = true);
            
-  /// Parse feature string for quick usage.
-  static uint32_t Parse(const std::string &String,
-                        const std::string &DefaultCPU,
-                        const SubtargetFeatureKV *CPUTable,
-                        size_t CPUTableSize,
-                        const SubtargetFeatureKV *FeatureTable,
-                        size_t FeatureTableSize);
+  /// Get feature bits.
+  uint32_t getBits(const SubtargetFeatureKV *CPUTable,
+                         size_t CPUTableSize,
+                   const SubtargetFeatureKV *FeatureTable,
+                         size_t FeatureTableSize);
+                         
+  /// Get info pointer
+  void *getInfo(const SubtargetInfoKV *Table, size_t TableSize);
   
   /// Print feature string.
   void print(std::ostream &OS) const;
index 570f68018e8f676e692763d6216945c1762ddde3..cc3a6b11f9359eafcc6328a81f2b489959420f41 100644 (file)
@@ -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;
 }
index fca1f36ae7fbdba2fbbdd088d785a4439d2e3b4c..1995e1ceb077461a7189b4161a437930f834da64 100644 (file)
@@ -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;
index 93d19250f3da4502f8e7bf971cf4f90ee26b2618..c9ddaf74b8ba540dc2f46d382f88cbaa68e23806 100644 (file)
@@ -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);
 }