Added phi elimination code

llvm-svn: 1265
diff --git a/llvm/lib/Target/Sparc/SparcRegInfo.cpp b/llvm/lib/Target/Sparc/SparcRegInfo.cpp
index cb7009d..4040b02 100644
--- a/llvm/lib/Target/Sparc/SparcRegInfo.cpp
+++ b/llvm/lib/Target/Sparc/SparcRegInfo.cpp
@@ -893,7 +893,6 @@
 // register number
 //---------------------------------------------------------------------------
 
-
 MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg, 
 					      const unsigned DestReg,
 					      const int RegType) const {
@@ -1040,24 +1039,56 @@
 
 
 
-// Following method is Not needed now
 
-MachineInstr* UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
+//---------------------------------------------------------------------------
+// Generate a copy instruction to copy a value to another. Temporarily
+// used by PhiElimination code.
+//---------------------------------------------------------------------------
+
+
+MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
+
+  int RegType = getRegType( Src );
+
+  assert( (RegType==getRegType(Src))  && "Src & Dest are diff types");
 
   MachineInstr * MI = NULL;
 
-  MI = new MachineInstr(ADD, 3);
-  MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
-  MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
-  MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
-  
+  switch( RegType ) {
+    
+  case IntRegType:
+
+    MI = new MachineInstr(ADD, 3);
+    MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
+    MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
+    MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
+    break;
+
+  case FPSingleRegType:
+    MI = new MachineInstr(FMOVS, 2);
+    MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
+    MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
+    break;
+
+
+  case FPDoubleRegType:
+    MI = new MachineInstr(FMOVD, 2);
+    MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
+    MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
+    break;
+
+  default:
+    assert(0 && "Unknow RegType in CpValu2Value");
+  }
 
   return MI;
-
 }
 
 
 
+
+
+
 //----------------------------------------------------------------------------
 // This method inserts caller saving/restoring instructons before/after
 // a call machine instruction.