Added support for caller saving
llvm-svn: 847
diff --git a/llvm/lib/Target/Sparc/SparcRegInfo.cpp b/llvm/lib/Target/Sparc/SparcRegInfo.cpp
index 9d49f9c..5756dc3 100644
--- a/llvm/lib/Target/Sparc/SparcRegInfo.cpp
+++ b/llvm/lib/Target/Sparc/SparcRegInfo.cpp
@@ -29,7 +29,7 @@
// TODO (Optimize):
- //Instead of setting the color, we can suggest one. In that case,
+ // Instead of setting the color, we can suggest one. In that case,
// we have to test later whether it received the suggested color.
// In that case, a LR has to be created at the start of method.
// It has to be done as follows (remove the setRegVal above):
@@ -393,7 +393,7 @@
UniRetReg = getUnifiedRegNum( RegClassID, SparcFloatRegOrder::f0);
- AdMI = cpReg2RegMI(UniRetLRReg, UniRetReg, RegType );
+ AdMI = cpReg2RegMI(UniRetReg, UniRetLRReg, RegType );
CallAI->InstrnsAfter.push_back( AdMI );
@@ -613,7 +613,7 @@
const unsigned DestReg,
const int RegType) const {
- assert( (SrcReg != InvalidRegNum) && (DestReg != InvalidRegNum) &&
+ assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
"Invalid Register");
MachineInstr * MI = NULL;
@@ -647,6 +647,107 @@
}
+//---------------------------------------------------------------------------
+// Copy from a register to memory. Register number must be the unified
+// register number
+//---------------------------------------------------------------------------
+
+
+MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
+ const unsigned DestPtrReg,
+ const int Offset,
+ const int RegType) const {
+
+
+ MachineInstr * MI = NULL;
+
+ switch( RegType ) {
+
+ case IntRegType:
+ MI = new MachineInstr(STX, 3);
+ MI->SetMachineOperand(0, DestPtrReg, false);
+ MI->SetMachineOperand(1, SrcReg, false);
+ MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
+ (int64_t) Offset, false);
+ break;
+
+ case FPSingleRegType:
+ MI = new MachineInstr(ST, 3);
+ MI->SetMachineOperand(0, DestPtrReg, false);
+ MI->SetMachineOperand(1, SrcReg, false);
+ MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
+ (int64_t) Offset, false);
+ break;
+
+ case FPDoubleRegType:
+ MI = new MachineInstr(STD, 3);
+ MI->SetMachineOperand(0, DestPtrReg, false);
+ MI->SetMachineOperand(1, SrcReg, false);
+ MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
+ (int64_t) Offset, false);
+ break;
+
+ default:
+ assert(0 && "Unknow RegType");
+ }
+
+ return MI;
+}
+
+
+//---------------------------------------------------------------------------
+// Copy from memory to a reg. Register number must be the unified
+// register number
+//---------------------------------------------------------------------------
+
+
+MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
+ const int Offset,
+ const unsigned DestReg,
+ const int RegType) const {
+
+ MachineInstr * MI = NULL;
+
+ switch( RegType ) {
+
+ case IntRegType:
+ MI = new MachineInstr(LDX, 3);
+ MI->SetMachineOperand(0, SrcPtrReg, false);
+ MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
+ (int64_t) Offset, false);
+ MI->SetMachineOperand(2, DestReg, false);
+ break;
+
+ case FPSingleRegType:
+ MI = new MachineInstr(LD, 3);
+ MI->SetMachineOperand(0, SrcPtrReg, false);
+ MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
+ (int64_t) Offset, false);
+ MI->SetMachineOperand(2, DestReg, false);
+
+ break;
+
+ case FPDoubleRegType:
+ MI = new MachineInstr(LDD, 3);
+ MI->SetMachineOperand(0, SrcPtrReg, false);
+ MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
+ (int64_t) Offset, false);
+ MI->SetMachineOperand(2, DestReg, false);
+ break;
+
+ default:
+ assert(0 && "Unknow RegType");
+ }
+
+ return MI;
+}
+
+
+
+
+
+
+
//---------------------------------------------------------------------------
@@ -659,7 +760,7 @@
const unsigned DestReg,
const int RegType) const {
- assert( (DestReg != InvalidRegNum) && "Invalid Register");
+ assert( ((int)DestReg != InvalidRegNum) && "Invalid Register");
/*
unsigned MReg;