Fixed X86 encoding error CVTPS2PD and CVTPD2PS when the source operand
[oota-llvm.git] / lib / Target / TargetRegisterInfo.cpp
index 11f1b3d070f48d40f1fa9e1c628ca6f4e2deaa0c..9c8de12108ce11fde07f79eaa90b4e6a0521118e 100644 (file)
@@ -33,21 +33,45 @@ TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
 
 TargetRegisterInfo::~TargetRegisterInfo() {}
 
+namespace {
+  // Sort according to super- / sub- class relations.
+  // i.e. super- register class < sub- register class.
+  struct RCCompare {
+    bool operator()(const TargetRegisterClass* const &LHS,
+                    const TargetRegisterClass* const &RHS) {
+      return RHS->hasSuperClass(LHS);
+    }
+  };
+}
+
 /// getPhysicalRegisterRegClass - Returns the Register Class of a physical
-/// register.
+/// register of the given type. If type is MVT::Other, then just return any
+/// register class the register belongs to.
 const TargetRegisterClass *
-TargetRegisterInfo::getPhysicalRegisterRegClass(MVT::ValueType VT,
-                                           unsigned reg) const {
+TargetRegisterInfo::getPhysicalRegisterRegClass(unsigned reg,
+                                                MVT::ValueType VT) const {
   assert(isPhysicalRegister(reg) && "reg must be a physical register");
+
   // Pick the register class of the right type that contains this physreg.
-  for (regclass_iterator I = regclass_begin(), E = regclass_end(); I != E; ++I)
-    if ((*I)->hasType(VT) && (*I)->contains(reg))
-      return *I;
+  SmallVector<const TargetRegisterClass*, 4> RCs;
+  for (regclass_iterator I = regclass_begin(), E = regclass_end(); I != E; ++I){
+    if ((VT == MVT::Other || (*I)->hasType(VT)) && (*I)->contains(reg))
+      RCs.push_back(*I);
+  }
+
+  if (RCs.size() == 1)
+    return RCs[0];
+
+  if (RCs.size()) {
+    // Multiple compatible register classes. Get the super- class.
+    std::stable_sort(RCs.begin(), RCs.end(), RCCompare());
+    return RCs[0];
+  }
+
   assert(false && "Couldn't find the register class");
   return 0;
 }
 
-
 /// getAllocatableSetForRC - Toggle the bits that represent allocatable
 /// registers for the specific register class.
 static void getAllocatableSetForRC(MachineFunction &MF,