blob: 3caac417caeb112c8d8db833aaba2567bdb9fff1 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
Misha Brukman7ae7f842002-10-28 00:28:31 +000010#include "llvm/CodeGen/MachineFunction.h"
Chris Lattnerd47aac92002-12-28 20:21:29 +000011#include "llvm/CodeGen/MachineFunctionInfo.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adveaee67012002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerd5a84702002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattnerf9986852002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Vikram S. Advea6d94c92002-04-25 04:42:21 +000023#include <values.h>
Chris Lattner7f74a562002-01-20 22:54:45 +000024using std::cerr;
Anand Shukla458496c2002-06-25 20:55:50 +000025using std::vector;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000026
Chris Lattner5216cc52002-02-04 05:59:25 +000027UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Vikram S. Adve879eac92002-10-13 00:05:30 +000028 : MachineRegInfo(tgt), NumOfIntArgRegs(6),
Chris Lattner5216cc52002-02-04 05:59:25 +000029 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
30
31 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
32 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
33 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
34 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000035
Chris Lattner56e91662002-08-12 21:25:05 +000036 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000037 "32 Float regs are used for float arg passing");
38}
39
40
Vikram S. Advedb1435f2002-03-18 03:12:16 +000041// getZeroRegNum - returns the register that contains always zero.
42// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000043//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000044int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000045 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
46 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000047}
Chris Lattner5216cc52002-02-04 05:59:25 +000048
49// getCallAddressReg - returns the reg used for pushing the address when a
50// method is called. This can be used for other purposes between calls
51//
52unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000053 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
54 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000055}
56
57// Returns the register containing the return address.
58// It should be made sure that this register contains the return
59// value when a return instruction is reached.
60//
61unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000062 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
63 SparcIntRegClass::i7);
64}
65
66// Register get name implementations...
67
68// Int register names in same order as enum in class SparcIntRegClass
69static const char * const IntRegNames[] = {
70 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
71 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
72 "i0", "i1", "i2", "i3", "i4", "i5",
73 "i6", "i7",
74 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
75 "o6"
76};
77
78const char * const SparcIntRegClass::getRegName(unsigned reg) {
79 assert(reg < NumOfAllRegs);
80 return IntRegNames[reg];
81}
82
83static const char * const FloatRegNames[] = {
84 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
85 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
86 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
87 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
88 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
89 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
90 "f60", "f61", "f62", "f63"
91};
92
93const char * const SparcFloatRegClass::getRegName(unsigned reg) {
94 assert (reg < NumOfAllRegs);
95 return FloatRegNames[reg];
96}
97
98
99static const char * const IntCCRegNames[] = {
100 "xcc", "ccr"
101};
102
103const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
104 assert(reg < 2);
105 return IntCCRegNames[reg];
106}
107
108static const char * const FloatCCRegNames[] = {
109 "fcc0", "fcc1", "fcc2", "fcc3"
110};
111
112const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
113 assert (reg < 4);
114 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000115}
116
117// given the unified register number, this gives the name
118// for generating assembly code or debugging.
119//
Chris Lattner56e91662002-08-12 21:25:05 +0000120const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000121 if( reg < 32 )
Chris Lattner56e91662002-08-12 21:25:05 +0000122 return SparcIntRegClass::getRegName(reg);
Chris Lattner5216cc52002-02-04 05:59:25 +0000123 else if ( reg < (64 + 32) )
Chris Lattner56e91662002-08-12 21:25:05 +0000124 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner5216cc52002-02-04 05:59:25 +0000125 else if( reg < (64+32+4) )
Chris Lattner56e91662002-08-12 21:25:05 +0000126 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner5216cc52002-02-04 05:59:25 +0000127 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner56e91662002-08-12 21:25:05 +0000128 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner5216cc52002-02-04 05:59:25 +0000129 else if (reg== InvalidRegNum) //****** TODO: Remove */
130 return "<*NoReg*>";
131 else
132 assert(0 && "Invalid register number");
133 return "";
134}
135
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000136// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000137unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000138 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
139 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000140}
141
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000142// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000143unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000144 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
145 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000146}
147
148
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000149//---------------------------------------------------------------------------
150// Finds whether a call is an indirect call
151//---------------------------------------------------------------------------
152
153inline bool
154isVarArgsFunction(const Type *funcType) {
155 return cast<FunctionType>(cast<PointerType>(funcType)
156 ->getElementType())->isVarArg();
157}
158
159inline bool
160isVarArgsCall(const MachineInstr *CallMI) {
161 Value* callee = CallMI->getOperand(0).getVRegValue();
162 // const Type* funcType = isa<Function>(callee)? callee->getType()
163 // : cast<PointerType>(callee->getType())->getElementType();
164 const Type* funcType = callee->getType();
165 return isVarArgsFunction(funcType);
166}
167
168
169// Get the register number for the specified integer arg#,
170// assuming there are argNum total args, intArgNum int args,
171// and fpArgNum FP args preceding (and not including) this one.
172// Use INT regs for FP args if this is a varargs call.
173//
174// Return value:
175// InvalidRegNum, if there is no int register available for the arg.
176// regNum, otherwise (this is NOT the unified reg. num).
177//
178inline int
179UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
180 unsigned argNo,
181 unsigned intArgNo, unsigned fpArgNo,
182 unsigned& regClassId) const
183{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000184 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000185 if (argNo >= NumOfIntArgRegs)
186 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000187 else
Chris Lattner56e91662002-08-12 21:25:05 +0000188 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000189}
190
191// Get the register number for the specified FP arg#,
192// assuming there are argNum total args, intArgNum int args,
193// and fpArgNum FP args preceding (and not including) this one.
194// Use INT regs for FP args if this is a varargs call.
195//
196// Return value:
197// InvalidRegNum, if there is no int register available for the arg.
198// regNum, otherwise (this is NOT the unified reg. num).
199//
200inline int
201UltraSparcRegInfo::regNumForFPArg(unsigned regType,
202 bool inCallee, bool isVarArgsCall,
203 unsigned argNo,
204 unsigned intArgNo, unsigned fpArgNo,
205 unsigned& regClassId) const
206{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000207 if (isVarArgsCall)
208 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
209 regClassId);
210 else
211 {
212 regClassId = FloatRegClassID;
213 if (regType == FPSingleRegType)
214 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000215 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000216 else if (regType == FPDoubleRegType)
217 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000218 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000219 else
220 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000221 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000222 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000223}
224
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000225
226//---------------------------------------------------------------------------
227// Finds the return address of a call sparc specific call instruction
228//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000229
Vikram S. Adveaee67012002-07-08 23:23:12 +0000230// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000231// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000232//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000233int UltraSparcRegInfo::getRegType(unsigned regClassID,
234 const Type* type) const {
235 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000236 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000237 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000238 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000239 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000240 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000241 return FPDoubleRegType;
242 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000243 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000244 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000245 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000246 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000247 }
248}
249
Vikram S. Advee9327f02002-05-19 15:25:51 +0000250int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
251 return getRegType(LR->getRegClass()->getID(), LR->getType());
252}
253
Chris Lattner5216cc52002-02-04 05:59:25 +0000254int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000255 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000256}
257
Vikram S. Adveaee67012002-07-08 23:23:12 +0000258int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
259 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000260 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000261 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000262 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000263 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000264 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000265 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000266 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000267 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000268 return IntCCRegType;
269 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000270 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000271 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000272}
273
274
Vikram S. Adveaee67012002-07-08 23:23:12 +0000275// To find the register class used for a specified Type
276//
277unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000278 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000279 Type::PrimitiveID ty = type->getPrimitiveID();
280 unsigned res;
281
282 // FIXME: Comparing types like this isn't very safe...
283 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
284 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
285 res = IntRegClassID; // sparc int reg (ty=0: void)
286 else if (ty <= Type::DoubleTyID)
287 res = FloatRegClassID; // sparc float reg class
288 else {
289 //std::cerr << "TypeID: " << ty << "\n";
290 assert(0 && "Cannot resolve register class for type");
291 return 0;
292 }
293
294 if(isCCReg)
295 return res + 2; // corresponidng condition code regiser
296 else
297 return res;
298}
299
300// To find the register class to which a specified register belongs
301//
302unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
303 unsigned classId = 0;
304 (void) getClassRegNum(unifiedRegNum, classId);
305 return classId;
306}
307
308unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
309 switch(regType) {
310 case IntRegType: return IntRegClassID;
311 case FPSingleRegType:
312 case FPDoubleRegType: return FloatRegClassID;
313 case IntCCRegType: return IntCCRegClassID;
314 case FloatCCRegType: return FloatCCRegClassID;
315 default:
316 assert(0 && "Invalid register type in getRegClassIDOfRegType");
317 return 0;
318 }
319}
320
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000321//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000322// Suggests a register for the ret address in the RET machine instruction.
323// We always suggest %i7 by convention.
324//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000325void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000326 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000327
Vikram S. Adveaee67012002-07-08 23:23:12 +0000328 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000329
Vikram S. Adveaee67012002-07-08 23:23:12 +0000330 // return address is always mapped to i7 so set it immediately
331 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000332 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000333
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000334 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000335 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000336 // we have to test later whether it received the suggested color.
337 // In that case, a LR has to be created at the start of method.
338 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000339
Vikram S. Adveaee67012002-07-08 23:23:12 +0000340 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000341 // const Value *RetAddrVal = MO.getVRegValue();
342 // assert( RetAddrVal && "LR for ret address must be created at start");
343 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
344 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000345 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000346}
347
348
349//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000350// Suggests a register for the ret address in the JMPL/CALL machine instr.
351// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000352//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000353void
354UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
355 LiveRangeInfo& LRI) const
356{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000357 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
358 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000359 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000360
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000361 // A LR must already exist for the return address.
362 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
363 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
364
365 unsigned RegClassID = RetAddrLR->getRegClass()->getID();
366 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
367}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000368
369
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000370
371//---------------------------------------------------------------------------
372// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000373// According to the Sparc ABI, the first 6 incoming args are in
374// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000375// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000376// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000377//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000378void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000379 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000380{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000381 // check if this is a varArgs function. needed for choosing regs.
382 bool isVarArgs = isVarArgsFunction(Meth->getType());
383
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000384 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000385 unsigned argNo=0, intArgNo=0, fpArgNo=0;
386 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
387 I != E; ++I, ++argNo) {
388 // get the LR of arg
389 LiveRange *LR = LRI.getLiveRangeForValue(I);
390 assert(LR && "No live range found for method arg");
391
392 unsigned regType = getRegType(LR);
393 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
394
395 int regNum = (regType == IntRegType)
396 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
397 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
398 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
399 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
400
401 if(regNum != InvalidRegNum)
402 LR->setSuggestedColor(regNum);
403 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000404}
405
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000406
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000407//---------------------------------------------------------------------------
408// This method is called after graph coloring to move incoming args to
409// the correct hardware registers if they did not receive the correct
410// (suggested) color through graph coloring.
411//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000412void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000413 LiveRangeInfo &LRI,
414 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000415
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000416 // check if this is a varArgs function. needed for choosing regs.
417 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000418 MachineInstr *AdMI;
419
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000420 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000421 // for each argument. count INT and FP arguments separately.
422 unsigned argNo=0, intArgNo=0, fpArgNo=0;
423 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
424 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000425 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000426 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000427 assert( LR && "No live range found for method arg");
428
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000429 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000430 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000431
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000432 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000433 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000434 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000435 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000436 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000437 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
438
439 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000440 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
441 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
442 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
443 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000444
445 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000446 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000447 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000448 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000450 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000452 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
453
454 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000455 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000456 if( UniLRReg == UniArgReg )
457 continue;
458
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000459 // We are here because the LR did not receive the suggested
460 // but LR received another register.
461 // Now we have to copy the %i reg (or stack pos of arg)
462 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000463
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000464 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000465 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000466 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000467 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000468 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000469 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000470
471 // It is a variable argument call: the float reg must go in a %o reg.
472 // We have to move an int reg to a float reg via memory.
473 //
474 assert(isVarArgs &&
475 RegClassID == FloatRegClassID &&
476 regClassIDOfArgReg == IntRegClassID &&
477 "This should only be an Int register for an FP argument");
478
Chris Lattnerd47aac92002-12-28 20:21:29 +0000479 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000480 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000481 cpReg2MemMI(FirstAI->InstrnsBefore,
482 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000483
Vikram S. Adveaee67012002-07-08 23:23:12 +0000484 cpMem2RegMI(FirstAI->InstrnsBefore,
485 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000486 }
487 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000488 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000489 }
490 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000491 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000492
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000493 // Now the arg is coming on stack. Since the LR recieved a register,
494 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000495 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000496 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000497 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000498 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000499 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000500
Vikram S. Adveaee67012002-07-08 23:23:12 +0000501 cpMem2RegMI(FirstAI->InstrnsBefore,
502 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000503 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000504
505 } // if LR received a color
506
507 else {
508
509 // Now, the LR did not receive a color. But it has a stack offset for
510 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000511 // So, if the arg is coming in UniArgReg register, we can just move
512 // that on to the stack pos of LR
513
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000514 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000515
516 if( regClassIDOfArgReg != RegClassID ) {
517 assert(0 &&
518 "FP arguments to a varargs function should be explicitly "
519 "copied to/from int registers by instruction selection!");
520
521 // It must be a float arg for a variable argument call, which
522 // must come in a %o reg. Move the int reg to the stack.
523 //
524 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
525 "This should only be an Int register for an FP argument");
526
Vikram S. Adveaee67012002-07-08 23:23:12 +0000527 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
528 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000529 }
530 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000531 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
532 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000533 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000534 }
535
536 else {
537
538 // Now the arg is coming on stack. Since the LR did NOT
539 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000540 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000541 // since this method is called before any other method that makes
542 // uses of the stack pos of the LR (e.g., updateMachineInstr)
543
Chris Lattnerd47aac92002-12-28 20:21:29 +0000544 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000545 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000546 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000547 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000548
549 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000550 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000551
552 }
553
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000554 } // for each incoming argument
555
556}
557
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000558
559
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000560//---------------------------------------------------------------------------
561// This method is called before graph coloring to suggest colors to the
562// outgoing call args and the return value of the call.
563//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000564void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000565 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000566 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000567
Vikram S. Advee9327f02002-05-19 15:25:51 +0000568 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000569
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000570 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000571
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000572 // First color the return value of the call instruction, if any.
573 // The return value will be in %o0 if the value is an integer type,
574 // or in %f0 if the value is a float type.
575 //
576 if (const Value *RetVal = argDesc->getReturnValue()) {
577 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
578 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000579
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000580 unsigned RegClassID = RetValLR->getRegClass()->getID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000581
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000582 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000583 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000584 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000585 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000586 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000587 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000588 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000589
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000590 // Now suggest colors for arguments (operands) of the call instruction.
591 // Colors are suggested only if the arg number is smaller than the
592 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000593 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000594
Vikram S. Advee9327f02002-05-19 15:25:51 +0000595 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000596
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000597 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
598 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000599
Vikram S. Advee9327f02002-05-19 15:25:51 +0000600 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000601
602 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000603 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000604 assert (LR && "Must have a LR for all arguments since "
605 "all args (even consts) must be defined before");
606
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000607 unsigned regType = getRegType( LR );
608 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000609
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000610 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000611 // an INT or FP value. Here we ignore whether or not it is a
612 // varargs calls, because FP arguments will be explicitly copied
613 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000614 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000615 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
616 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
617 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
618 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000619
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000620 // If a register could be allocated, use it.
621 // If not, do NOTHING as this will be colored as a normal value.
622 if(regNum != InvalidRegNum)
623 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000624
Vikram S. Advee9327f02002-05-19 15:25:51 +0000625 // Repeat for the second copy of the argument, which would be
626 // an FP argument being passed to a function with no prototype
627 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
628 if (argCopy != NULL)
629 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000630 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000631 && "Must be passing copy of FP argument in int register");
632 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
633 argNo, intArgNo, fpArgNo-1,
634 regClassIDOfArgReg);
635 assert(copyRegNum != InvalidRegNum);
636 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
637 copyLR->setSuggestedColor(copyRegNum);
638 }
639
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000640 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000641
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000642}
643
644
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000645//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000646// Helper method for UltraSparcRegInfo::colorCallArgs().
647//---------------------------------------------------------------------------
648
649void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000650UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000651 AddedInstrns *CallAI,
652 PhyRegAlloc &PRA, LiveRange* LR,
653 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000654 int UniArgRegOrNone, unsigned argNo,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000655 std::vector<MachineInstr *>& AddedInstrnsBefore)
656 const
657{
658 MachineInstr *AdMI;
659 bool isArgInReg = false;
660 unsigned UniArgReg = MAXINT; // unused unless initialized below
661 if (UniArgRegOrNone != InvalidRegNum)
662 {
663 isArgInReg = true;
664 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000665 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000666 }
667
668 if (LR->hasColor()) {
669 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
670
671 // if LR received the correct color, nothing to do
672 if( isArgInReg && UniArgReg == UniLRReg )
673 return;
674
675 // The LR is allocated to a register UniLRReg and must be copied
676 // to UniArgReg or to the stack slot.
677 //
678 if( isArgInReg ) {
679 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000680 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000681 }
682 else {
683 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000684 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000685 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000686 cpReg2MemMI(CallAI->InstrnsBefore,
687 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000688 }
689
690 } else { // LR is not colored (i.e., spilled)
691
692 if( isArgInReg ) {
693 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000694 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
695 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000696 // Now add the instruction
697 }
698
699 else {
700 // Now, we have to pass the arg on stack. Since LR also did NOT
701 // receive a register we have to move an argument in memory to
702 // outgoing parameter on stack.
703 // Use TReg to load and store the value.
704 // Use TmpOff to save TReg, since that may have a live value.
705 //
706 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Chris Lattnerd47aac92002-12-28 20:21:29 +0000707 int TmpOff = PRA.MF.getInfo()->
708 pushTempValue(getSpilledRegSize(getRegType(LR)));
709 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000710 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000711
712 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
713
714 // Sequence:
715 // (1) Save TReg on stack
716 // (2) Load LR value into TReg from stack pos of LR
717 // (3) Store Treg on outgoing Arg pos on stack
718 // (4) Load the old value of TReg from stack to TReg (restore it)
719 //
720 // OPTIMIZE THIS:
721 // When reverse pointers in MahineInstr are introduced:
722 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
723 // needed only if this fails. Currently, we cannot call the
724 // above method since we cannot find LVSetBefore without the BB
725 //
726 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
727 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000728 cpReg2MemMI(CallAI->InstrnsBefore,
729 TReg, getFramePointer(), TmpOff, regType);
730 cpMem2RegMI(CallAI->InstrnsBefore,
731 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
732 cpReg2MemMI(CallAI->InstrnsBefore,
733 TReg, getStackPointer(), argOffset, regType);
734 cpMem2RegMI(CallAI->InstrnsBefore,
735 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000736 }
737 }
738}
739
740//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000741// After graph coloring, we have call this method to see whehter the return
742// value and the call args received the correct colors. If not, we have
743// to instert copy instructions.
744//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000745
Vikram S. Adveaee67012002-07-08 23:23:12 +0000746void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000747 LiveRangeInfo &LRI,
748 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000749 PhyRegAlloc &PRA,
750 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000751
Vikram S. Adve879eac92002-10-13 00:05:30 +0000752 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000753
Vikram S. Advee9327f02002-05-19 15:25:51 +0000754 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
755
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000756 // First color the return value of the call.
757 // If there is a LR for the return value, it means this
758 // method returns a value
759
760 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000761
Vikram S. Advee9327f02002-05-19 15:25:51 +0000762 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000763
Chris Lattner30e8fb62002-02-05 01:43:49 +0000764 if (RetVal) {
765 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000766
Chris Lattner30e8fb62002-02-05 01:43:49 +0000767 if (!RetValLR) {
768 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000769 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000770 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000771
772 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000773 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000774 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000775 unsigned UniRetReg; // unified number for CorrectCol
776
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000777 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000778 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000779 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000780 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000781 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000782 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000783 return;
784 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000785
786 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000787 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000788
Vikram S. Adveaee67012002-07-08 23:23:12 +0000789 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000790 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000791
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000792 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000793 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
794 : false;
795
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000796 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000797 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000798 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000799
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000800 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000801
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000802 if( RetValLR->hasColor() ) {
803
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000804 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000805
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000806 // the return value is coming in UniRetReg but has to go into
807 // the UniRetLRReg
808
Vikram S. Adveaee67012002-07-08 23:23:12 +0000809 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000810
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000811 } // if LR has color
812 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000813
814 // if the LR did NOT receive a color, we have to move the return
815 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000816
Vikram S. Adveaee67012002-07-08 23:23:12 +0000817 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
818 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000819 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000820
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000821 } // the LR didn't receive the suggested color
822
823 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000824
825
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000826 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000827 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000828 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000829
Chris Lattner7f74a562002-01-20 22:54:45 +0000830 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000831
832 unsigned NumOfCallArgs = argDesc->getNumArgs();
833
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000834 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
835 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000836
Vikram S. Advee9327f02002-05-19 15:25:51 +0000837 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
838
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000839 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000840 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000841
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000842 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000843 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000844
Vikram S. Advee9327f02002-05-19 15:25:51 +0000845 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000846 // Also find the correct register the argument must use (UniArgReg)
847 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000848 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000849 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000850 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
851
Vikram S. Advee9327f02002-05-19 15:25:51 +0000852 // Find the register that must be used for this arg, depending on
853 // whether it is an INT or FP value. Here we ignore whether or not it
854 // is a varargs calls, because FP arguments will be explicitly copied
855 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000856 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000857 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
858 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
859 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
860 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000861
862 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000863 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000864 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000865 assert(regClassIDOfArgReg == RegClassID &&
866 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000867 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000868
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000869 // not possible to have a null LR since all args (even consts)
870 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000871 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000872 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000873 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000874 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000875
876 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
877 UniArgReg, argNo, AddedInstrnsBefore);
878
879 // Repeat for the second copy of the argument, which would be
880 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000881 // It may either be passed as a copy in an integer register
882 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000883 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
884 if (argCopy != NULL)
885 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000886 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000887 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000888
Vikram S. Advee9327f02002-05-19 15:25:51 +0000889 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
890 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
891
892 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
893 argNo, intArgNo, fpArgNo-1,
894 regClassIDOfArgReg);
895 assert(copyRegNum != InvalidRegNum);
896 assert(regClassIDOfArgReg == copyRegClassID &&
897 "Moving values between reg classes must happen during selection");
898
899 InitializeOutgoingArg(CallMI, CallAI, PRA,
900 LRI.getLiveRangeForValue(argCopy), copyRegType,
901 copyRegClassID, copyRegNum, argNo,
902 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000903 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000904
905 if (regNum != InvalidRegNum &&
906 argDesc->getArgInfo(i).usesStackSlot())
907 {
908 // Pass the argument via the stack in addition to regNum
909 assert(regType != IntRegType && "Passing an integer arg. twice?");
910 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
911 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
912 InvalidRegNum, argNo, AddedInstrnsBefore);
913 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000914 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000915
Vikram S. Advee9327f02002-05-19 15:25:51 +0000916 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000917 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000918 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000919 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000920 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000921
Chris Lattner5216cc52002-02-04 05:59:25 +0000922 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000923 cerr << "\nCalling reorder with instrns: \n";
924 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
925 cerr << *(AddedInstrnsBefore[i]);
926 }
927
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000928 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
929 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
930 && "Dropped some instructions when reordering!");
931
Chris Lattner5216cc52002-02-04 05:59:25 +0000932 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000933 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000934 for(unsigned i = 0; i < ReorderedVec.size(); i++)
935 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000936 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000937 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000938
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000939 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000940 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000941 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
942 CallMI, BB, PRA);
943
944 // Then insert the final reordered code for the call arguments.
945 //
946 for(unsigned i=0; i < ReorderedVec.size(); i++)
947 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000948}
949
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000950//---------------------------------------------------------------------------
951// This method is called for an LLVM return instruction to identify which
952// values will be returned from this method and to suggest colors.
953//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000954void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000955 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000956
Vikram S. Adve879eac92002-10-13 00:05:30 +0000957 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000958
Vikram S. Adveaee67012002-07-08 23:23:12 +0000959 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000960
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000961 // if there is an implicit ref, that has to be the ret value
962 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000963
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000964 // The first implicit operand is the return value of a return instr
965 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000966
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000967 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000968
Chris Lattner30e8fb62002-02-05 01:43:49 +0000969 if (!LR) {
970 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
971 assert(0 && "No LR for return value of non-void method");
972 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000973
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000974 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000975
Chris Lattner5216cc52002-02-04 05:59:25 +0000976 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000977 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000978 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000979 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000980 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000981}
982
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000983
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000984
985//---------------------------------------------------------------------------
986// Colors the return value of a method to %i0 or %f0, if possible. If it is
987// not possilbe to directly color the LR, insert a copy instruction to move
988// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
989// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000990//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000991void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000992 LiveRangeInfo &LRI,
993 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000994
Vikram S. Adve879eac92002-10-13 00:05:30 +0000995 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000997 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000998 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000999
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001000 // The first implicit operand is the return value of a return instr
1001 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001002
Chris Lattner5216cc52002-02-04 05:59:25 +00001003 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004
Chris Lattner30e8fb62002-02-05 01:43:49 +00001005 if (!LR) {
1006 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1007 // assert( LR && "No LR for return value of non-void method");
1008 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001009 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001010
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001011 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001012 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001013
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001014 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001015 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001016 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001017 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001018 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001019 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001020 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001021 return;
1022 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001023
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001024 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001025 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001026
Vikram S. Adveaee67012002-07-08 23:23:12 +00001027 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001028 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001029
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001030 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001031
Chris Lattner5216cc52002-02-04 05:59:25 +00001032 if (LR->hasColor() && LR->getColor() == CorrectCol)
1033 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001034
Chris Lattner5216cc52002-02-04 05:59:25 +00001035 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001036
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001037 // We are here because the LR was allocted a regiter
1038 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001039
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001040 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001041
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001042 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001043
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001044 // the LR received UniLRReg but must be colored with UniRetReg
1045 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001046 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001047 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001048 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001049 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1050 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001051 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001052 }
1053
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001054 } // if there is a return value
1055
1056}
1057
Vikram S. Adveaee67012002-07-08 23:23:12 +00001058//---------------------------------------------------------------------------
1059// Check if a specified register type needs a scratch register to be
1060// copied to/from memory. If it does, the reg. type that must be used
1061// for scratch registers is returned in scratchRegType.
1062//
1063// Only the int CC register needs such a scratch register.
1064// The FP CC registers can (and must) be copied directly to/from memory.
1065//---------------------------------------------------------------------------
1066
1067bool
1068UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1069 int& scratchRegType) const
1070{
1071 if (RegType == IntCCRegType)
1072 {
1073 scratchRegType = IntRegType;
1074 return true;
1075 }
1076 return false;
1077}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001078
1079//---------------------------------------------------------------------------
1080// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001081// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001082//---------------------------------------------------------------------------
1083
Vikram S. Advee9327f02002-05-19 15:25:51 +00001084void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001085UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1086 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001087 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001088 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001089 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001090 "Invalid Register");
1091
1092 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001093
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001094 switch( RegType ) {
1095
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001096 case IntCCRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001097 if (getRegType(DestReg) == IntRegType)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001098 { // copy intCC reg to int reg
1099 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1100 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1101 }
1102 else
1103 { // copy int reg to intCC reg
1104 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner56e91662002-08-12 21:25:05 +00001105 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adveaee67012002-07-08 23:23:12 +00001106 && "Can only copy CC reg to/from integer reg");
1107 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1108 }
1109 break;
1110
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001111 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001112 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001113 break;
1114
1115 case IntRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001116 MI = Create3OperandInstr_Reg(ADD, SrcReg, getZeroRegNum(), DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001117 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001118
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001119 case FPSingleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001120 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001121 break;
1122
1123 case FPDoubleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001124 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001125 break;
1126
1127 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001128 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001129 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001130 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001131
1132 if (MI)
1133 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001134}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001135
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001136//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001137// Copy from a register to memory (i.e., Store). Register number must
1138// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001139//---------------------------------------------------------------------------
1140
1141
Vikram S. Advee9327f02002-05-19 15:25:51 +00001142void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001143UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1144 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001145 unsigned DestPtrReg,
1146 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001147 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001148 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001149 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001150 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001151 assert(target.getInstrInfo().constantFitsInImmedField(STX, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001152 MI = new MachineInstr(STX, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001153 MI->SetMachineOperandReg(0, SrcReg);
1154 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001155 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1156 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001157 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001158 break;
1159
1160 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001161 assert(target.getInstrInfo().constantFitsInImmedField(ST, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001162 MI = new MachineInstr(ST, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001163 MI->SetMachineOperandReg(0, SrcReg);
1164 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001165 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1166 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001167 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001168 break;
1169
1170 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001171 assert(target.getInstrInfo().constantFitsInImmedField(STD, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001172 MI = new MachineInstr(STD, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001173 MI->SetMachineOperandReg(0, SrcReg);
1174 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001175 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1176 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001177 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001178 break;
1179
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001180 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001181 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001182 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001183
1184 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1185 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1186 mvec.push_back(MI);
1187
Chris Lattner56e91662002-08-12 21:25:05 +00001188 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001189 break;
1190
1191 case FloatCCRegType:
1192 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001193 assert(target.getInstrInfo().constantFitsInImmedField(STXFSR, Offset));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001194 MI = new MachineInstr(STXFSR, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001195 MI->SetMachineOperandReg(0, SrcReg);
1196 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001197 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1198 (int64_t) Offset);
1199 mvec.push_back(MI);
1200 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001201
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001202 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001203 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001204 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001205}
1206
1207
1208//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001209// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001210// register number
1211//---------------------------------------------------------------------------
1212
1213
Vikram S. Advee9327f02002-05-19 15:25:51 +00001214void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001215UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1216 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001217 int Offset,
1218 unsigned DestReg,
1219 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001220 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001221 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001222 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001223 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001224 assert(target.getInstrInfo().constantFitsInImmedField(LDX, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001225 MI = new MachineInstr(LDX, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001226 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001227 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1228 (int64_t) Offset);
1229 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001230 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001231 break;
1232
1233 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001234 assert(target.getInstrInfo().constantFitsInImmedField(LD, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001235 MI = new MachineInstr(LD, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001236 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001237 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1238 (int64_t) Offset);
1239 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001240 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001241 break;
1242
1243 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001244 assert(target.getInstrInfo().constantFitsInImmedField(LDD, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001245 MI = new MachineInstr(LDD, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001246 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001247 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1248 (int64_t) Offset);
1249 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001250 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001251 break;
1252
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001253 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001254 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001255 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1256 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001257
1258 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1259 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1260 mvec.push_back(MI);
1261
1262 break;
1263
1264 case FloatCCRegType:
1265 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001266 assert(target.getInstrInfo().constantFitsInImmedField(LDXFSR, Offset));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001267 MI = new MachineInstr(LDXFSR, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001268 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001269 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1270 (int64_t) Offset);
1271 MI->SetMachineOperandReg(2, DestReg, true);
1272 mvec.push_back(MI);
1273 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001274
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001275 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001276 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001277 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001278}
1279
1280
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001281//---------------------------------------------------------------------------
1282// Generate a copy instruction to copy a value to another. Temporarily
1283// used by PhiElimination code.
1284//---------------------------------------------------------------------------
1285
1286
Vikram S. Advee9327f02002-05-19 15:25:51 +00001287void
1288UltraSparcRegInfo::cpValue2Value(Value *Src,
1289 Value *Dest,
1290 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001291 int RegType = getRegType( Src );
1292
1293 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001294
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001295 MachineInstr * MI = NULL;
1296
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001297 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001298 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001299 MI = new MachineInstr(ADD, 3);
Chris Lattner9bebf832002-10-28 20:10:56 +00001300 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
Chris Lattner780090b2002-10-28 19:46:25 +00001301 MI->SetMachineOperandReg(1, getZeroRegNum());
Chris Lattner9bebf832002-10-28 20:10:56 +00001302 MI->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001303 break;
1304
1305 case FPSingleRegType:
1306 MI = new MachineInstr(FMOVS, 2);
Chris Lattner9bebf832002-10-28 20:10:56 +00001307 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
1308 MI->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001309 break;
1310
1311
1312 case FPDoubleRegType:
1313 MI = new MachineInstr(FMOVD, 2);
Chris Lattner9bebf832002-10-28 20:10:56 +00001314 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
1315 MI->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001316 break;
1317
1318 default:
1319 assert(0 && "Unknow RegType in CpValu2Value");
1320 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001321
Chris Lattner9bebf832002-10-28 20:10:56 +00001322 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001323}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001324
1325
1326
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001327
1328
1329
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001330//----------------------------------------------------------------------------
1331// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001332// a call machine instruction. The caller saving/restoring instructions are
1333// inserted like:
1334//
1335// ** caller saving instructions
1336// other instructions inserted for the call by ColorCallArg
1337// CALL instruction
1338// other instructions inserted for the call ColorCallArg
1339// ** caller restoring instructions
1340//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001341//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001342
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001343
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001344void
1345UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1346 vector<MachineInstr*>& instrnsAfter,
1347 MachineInstr *CallMI,
1348 const BasicBlock *BB,
1349 PhyRegAlloc &PRA) const
1350{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001351 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001352
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001353 // has set to record which registers were saved/restored
1354 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001355 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001356
Vikram S. Advee9327f02002-05-19 15:25:51 +00001357 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1358
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001359 // Now find the LR of the return value of the call
1360 // The last *implicit operand* is the return value of a call
1361 // Insert it to to he PushedRegSet since we must not save that register
1362 // and restore it after the call.
1363 // We do this because, we look at the LV set *after* the instruction
1364 // to determine, which LRs must be saved across calls. The return value
1365 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001366
Vikram S. Advee9327f02002-05-19 15:25:51 +00001367 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001368
Chris Lattner5216cc52002-02-04 05:59:25 +00001369 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001370 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001371 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001372
Chris Lattner5216cc52002-02-04 05:59:25 +00001373 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001374 PushedRegSet.insert(
1375 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001376 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001377 }
1378
Vikram S. Advee9327f02002-05-19 15:25:51 +00001379 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001380 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001381
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001382 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001383 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001384
1385 // get the live range corresponding to live var
1386 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1387
1388 // LR can be null if it is a const since a const
1389 // doesn't have a dominating def - see Assumptions above
1390 if( LR ) {
1391
1392 if( LR->hasColor() ) {
1393
1394 unsigned RCID = (LR->getRegClass())->getID();
1395 unsigned Color = LR->getColor();
1396
1397 if ( isRegVolatile(RCID, Color) ) {
1398
1399 // if the value is in both LV sets (i.e., live before and after
1400 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001401
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001402 unsigned Reg = getUnifiedRegNum(RCID, Color);
1403
1404 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1405
1406 // if we haven't already pushed that register
1407
1408 unsigned RegType = getRegType( LR );
1409
1410 // Now get two instructions - to push on stack and pop from stack
1411 // and add them to InstrnsBefore and InstrnsAfter of the
1412 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001413 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001414 int StackOff =
1415 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001416
Vikram S. Adveaee67012002-07-08 23:23:12 +00001417 vector<MachineInstr*> AdIBef, AdIAft;
1418
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001419 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001420
1421 // We may need a scratch register to copy the saved value
1422 // to/from memory. This may itself have to insert code to
1423 // free up a scratch register. Any such code should go before
1424 // the save code.
1425 int scratchRegType = -1;
1426 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001427 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001428 { // Find a register not live in the LVSet before CallMI
1429 const ValueSet &LVSetBef =
1430 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1431 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1432 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001433 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001434 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001435 }
1436
1437 if (AdIBef.size() > 0)
1438 instrnsBefore.insert(instrnsBefore.end(),
1439 AdIBef.begin(), AdIBef.end());
1440
1441 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1442 scratchReg);
1443
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001444 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001445 instrnsBefore.insert(instrnsBefore.end(),
1446 AdIAft.begin(), AdIAft.end());
1447
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001448 //---- Insert code for popping the reg from the stack ----------
1449
Vikram S. Adveaee67012002-07-08 23:23:12 +00001450 // We may need a scratch register to copy the saved value
1451 // from memory. This may itself have to insert code to
1452 // free up a scratch register. Any such code should go
1453 // after the save code.
1454 //
1455 scratchRegType = -1;
1456 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001457 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001458 { // Find a register not live in the LVSet after CallMI
1459 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1460 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001461 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001462 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001463 }
1464
1465 if (AdIBef.size() > 0)
1466 instrnsAfter.insert(instrnsAfter.end(),
1467 AdIBef.begin(), AdIBef.end());
1468
1469 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1470 scratchReg);
1471
1472 if (AdIAft.size() > 0)
1473 instrnsAfter.insert(instrnsAfter.end(),
1474 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001475
Chris Lattner7e5ee422002-02-05 04:20:12 +00001476 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001477
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001478 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001479 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001480 cerr << " -inserted caller saving instrs: Before:\n\t ";
1481 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001482 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001483 cerr << " -and After:\n\t ";
1484 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001485 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001486 }
1487 } // if not already pushed
1488
1489 } // if LR has a volatile color
1490
1491 } // if LR has color
1492
1493 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001494
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001495 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001496}
1497
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001498
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001499//---------------------------------------------------------------------------
1500// Print the register assigned to a LR
1501//---------------------------------------------------------------------------
1502
Chris Lattner5216cc52002-02-04 05:59:25 +00001503void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001504 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001505 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001506
Chris Lattner5216cc52002-02-04 05:59:25 +00001507 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001508 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001509 return;
1510 }
1511
1512 // if a color is found
1513
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001514 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001515
Chris Lattner5216cc52002-02-04 05:59:25 +00001516 if (RegClassID == IntRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001517 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001518
Chris Lattner5216cc52002-02-04 05:59:25 +00001519 } else if (RegClassID == FloatRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001520 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001521 if( LR->getType() == Type::DoubleTy)
Chris Lattner56e91662002-08-12 21:25:05 +00001522 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001523 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001524 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001525}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001526
1527//---------------------------------------------------------------------------
1528// This method examines instructions inserted by RegAlloc code before a
1529// machine instruction to detect invalid orders that destroy values before
1530// they are used. If it detects such conditions, it reorders the instructions.
1531//
1532// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001533// instructions inserted by RegAlloc. All such instruction MUST have
1534// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001535//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001536// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1537// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001538//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001539// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001540//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001541// Since instructions are inserted in RegAlloc, this assumes that the
1542// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001543// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001544//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001545// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001546//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001547
1548void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1549 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001550 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001551
1552 /*
1553 Problem: We can have instructions inserted by RegAlloc like
1554 1. add %ox %g0 %oy
1555 2. add %oy %g0 %oz, where z!=x or z==x
1556
1557 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001558
1559 Solution:
1560 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001561
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001562 Algorithm:
1563
1564 do
1565 for each instruction 'DefInst' in the UnOrdVec
1566 for each instruction 'UseInst' that follows the DefInst
1567 if the reg defined by DefInst is used by UseInst
1568 mark DefInst as not movable in this iteration
1569 If DefInst is not marked as not-movable, move DefInst to OrdVec
1570 while all instructions in DefInst are moved to OrdVec
1571
1572 For moving, we call the move2OrdVec(). It checks whether there is a def
1573 in it for the uses in the instruction to be added to OrdVec. If there
1574 are no preceding defs, it just appends the instruction. If there is a
1575 preceding def, it puts two instructions to save the reg on stack before
1576 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001577
1578 */
1579
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001580 bool CouldMoveAll;
1581 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001582
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001583 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001584 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001585 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001586
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001587 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001588
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001589 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001590
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001591 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001592
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001593 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001595 //cerr << "\nInst in UnordVec = " << *DefInst;
1596
1597 // last operand is the def (unless for a store which has no def reg)
1598 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1599
Chris Lattner6a30b022002-10-28 04:45:29 +00001600 if (DefOp.opIsDef() &&
1601 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001602
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001603 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001604 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001605
Chris Lattner7f74a562002-01-20 22:54:45 +00001606 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001607 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001608
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001609 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1610
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001611 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001612 if( UseInst == NULL) continue;
1613
1614 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001615 MachineOperand& UseOp = UseInst->getOperand(0);
1616
Chris Lattner6a30b022002-10-28 04:45:29 +00001617 if (!UseOp.opIsDef() &&
1618 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001619
1620 // if use is a register ...
1621
1622 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1623
1624 // if Def and this use are the same, it means that this use
1625 // is destroyed by a def before it is used
1626
1627 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001628
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001629 DefEqUse = true;
1630 CouldMoveAll = false;
1631 DebugPrint = true;
1632 break;
1633 } // if two registers are equal
1634
1635 } // if use is a register
1636
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001637 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001638
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001639 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001640
1641 // after examining all the instructions that follow the DefInst
1642 // if there are no dependencies, we can move it to the OrdVec
1643
1644 // cerr << "Moved to Ord: " << *DefInst;
1645
1646 moveInst2OrdVec(OrdVec, DefInst, PRA);
1647
1648 //OrdVec.push_back(DefInst);
1649
1650 // mark the pos of DefInst with NULL to indicate that it is
1651 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001652 *DefIt = NULL;
1653 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001654
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001655 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001656
1657 } // for all instructions in the UnordVec
1658
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001659
Chris Lattner5216cc52002-02-04 05:59:25 +00001660 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001661
Chris Lattner070cf772002-06-04 03:09:57 +00001662 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001663 cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001664 for(unsigned i=0; i < OrdVec.size(); i++)
1665 cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001666 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001667}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001668
1669
1670
1671
1672
Chris Lattner7f74a562002-01-20 22:54:45 +00001673void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001674 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001675 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001676 MachineOperand& UseOp = UnordInst->getOperand(0);
1677
Chris Lattner6a30b022002-10-28 04:45:29 +00001678 if (!UseOp.opIsDef() &&
1679 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001680
1681 // for the use of UnordInst, see whether there is a defining instr
1682 // before in the OrdVec
1683 bool DefEqUse = false;
1684
Chris Lattner7f74a562002-01-20 22:54:45 +00001685 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001686
1687 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1688
1689 MachineInstr *OrdInst = *OrdIt ;
1690
1691 MachineOperand& DefOp =
1692 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1693
1694 if( DefOp.opIsDef() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001695 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001696
1697 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1698
1699 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1700
1701 // we are here because there is a preceding def in the OrdVec
1702 // for the use in this intr we are going to insert. This
1703 // happened because the original code was like:
1704 // 1. add %ox %g0 %oy
1705 // 2. add %oy %g0 %ox
1706 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1707 // Now we are processing %ox of 1.
1708 // We have to
1709
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001710 int UReg = DefOp.getMachineRegNum();
1711 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001712 MachineInstr *AdIBef, *AdIAft;
1713
Chris Lattnerd47aac92002-12-28 20:21:29 +00001714 int StackOff =
1715 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001716
1717 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001718 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001719 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Chris Lattnerd47aac92002-12-28 20:21:29 +00001720 for (vector<MachineInstr*>::iterator MI=mvec.begin();
1721 MI != mvec.end(); ++MI)
1722 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001723
1724 // Load directly into DReg (%oy)
1725 MachineOperand& DOp=
1726 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1727 assert(DOp.opIsDef() && "Last operand is not the def");
1728 const int DReg = DOp.getMachineRegNum();
1729
Vikram S. Adveaee67012002-07-08 23:23:12 +00001730 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001731
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001732 if( DEBUG_RA ) {
Vikram S. Adve92ccbb92002-10-14 16:32:49 +00001733 cerr << "\nFixed CIRCULAR references by reordering:";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001734 cerr << "\nBefore CIRCULAR Reordering:\n";
1735 cerr << *UnordInst;
1736 cerr << *OrdInst;
1737
1738 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1739 for(unsigned i=0; i < OrdVec.size(); i++)
1740 cerr << *(OrdVec[i]);
1741 }
1742
1743 // Do not copy the UseInst to OrdVec
1744 DefEqUse = true;
1745 break;
1746
1747 }// if two registers are equal
1748
1749 } // if Def is a register
1750
1751 } // for each instr in OrdVec
1752
Chris Lattner5216cc52002-02-04 05:59:25 +00001753 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001754
1755 // We didn't find a def in the OrdVec, so just append this inst
1756 OrdVec.push_back( UnordInst );
1757 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1758 }
1759
1760 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001761}