blob: 1e5c09e56cff748e9887f4bcb871ded76a7d06ba [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"
Chris Lattner1ebaa902003-01-15 17:47:49 +000014#include "llvm/CodeGen/MachineInstrBuilder.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000015#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattner24c1d5e2003-01-14 23:05:08 +000016#include "llvm/CodeGen/FunctionLiveVarInfo.h" // FIXME: Remove
Chris Lattner90fc6652003-01-15 19:50:44 +000017#include "../../CodeGen/RegAlloc/RegAllocCommon.h" // FIXME!
Chris Lattner5216cc52002-02-04 05:59:25 +000018#include "llvm/iTerminators.h"
19#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000020#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000021#include "llvm/DerivedTypes.h"
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000022
Chris Lattner24c1d5e2003-01-14 23:05:08 +000023enum {
24 BadRegClass = ~0
25};
26
Chris Lattner5216cc52002-02-04 05:59:25 +000027UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Chris Lattnerf9781b52002-12-29 03:13:05 +000028 : TargetRegInfo(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//
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000233int UltraSparcRegInfo::getRegType(const Type* type) const {
234 unsigned regClassID = getRegClassIDOfType(type);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000235 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 {
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000251 const Type* type = LR->getType();
252
253 unsigned regClassID = LR->getRegClassID();
254 switch (regClassID) {
Chris Lattner4f596d72003-01-15 21:36:30 +0000255 default: assert( 0 && "Unknown reg class ID");
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000256 case IntRegClassID: return IntRegType;
257 case FloatRegClassID:
258 if (type == Type::FloatTy)
259 return FPSingleRegType;
260 else if (type == Type::DoubleTy)
261 return FPDoubleRegType;
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000262 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner4f596d72003-01-15 21:36:30 +0000263 case IntCCRegClassID: return IntCCRegType;
264 case FloatCCRegClassID: return FloatCCRegType;
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000265 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000266}
267
Chris Lattner5216cc52002-02-04 05:59:25 +0000268
Vikram S. Adveaee67012002-07-08 23:23:12 +0000269int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
270 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000271 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000272 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000273 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000274 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000275 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000276 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000277 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000278 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000279 return IntCCRegType;
280 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000281 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000282 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000283}
284
285
Vikram S. Adveaee67012002-07-08 23:23:12 +0000286// To find the register class used for a specified Type
287//
288unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000289 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000290 Type::PrimitiveID ty = type->getPrimitiveID();
291 unsigned res;
292
293 // FIXME: Comparing types like this isn't very safe...
294 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
295 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
296 res = IntRegClassID; // sparc int reg (ty=0: void)
297 else if (ty <= Type::DoubleTyID)
298 res = FloatRegClassID; // sparc float reg class
299 else {
300 //std::cerr << "TypeID: " << ty << "\n";
301 assert(0 && "Cannot resolve register class for type");
302 return 0;
303 }
304
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000305 if (isCCReg)
306 return res + 2; // corresponding condition code register
Vikram S. Adveaee67012002-07-08 23:23:12 +0000307 else
308 return res;
309}
310
311// To find the register class to which a specified register belongs
312//
313unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
314 unsigned classId = 0;
315 (void) getClassRegNum(unifiedRegNum, classId);
316 return classId;
317}
318
319unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
320 switch(regType) {
321 case IntRegType: return IntRegClassID;
322 case FPSingleRegType:
323 case FPDoubleRegType: return FloatRegClassID;
324 case IntCCRegType: return IntCCRegClassID;
325 case FloatCCRegType: return FloatCCRegClassID;
326 default:
327 assert(0 && "Invalid register type in getRegClassIDOfRegType");
328 return 0;
329 }
330}
331
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000332//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000333// Suggests a register for the ret address in the RET machine instruction.
334// We always suggest %i7 by convention.
335//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000336void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000337 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000338
Vikram S. Adveaee67012002-07-08 23:23:12 +0000339 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000340
Vikram S. Adveaee67012002-07-08 23:23:12 +0000341 // return address is always mapped to i7 so set it immediately
342 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000343 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000344
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000345 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000346 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000347 // we have to test later whether it received the suggested color.
348 // In that case, a LR has to be created at the start of method.
349 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000350
Vikram S. Adveaee67012002-07-08 23:23:12 +0000351 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000352 // const Value *RetAddrVal = MO.getVRegValue();
353 // assert( RetAddrVal && "LR for ret address must be created at start");
354 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
355 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000356 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000357}
358
359
360//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000361// Suggests a register for the ret address in the JMPL/CALL machine instr.
362// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000363//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000364void
365UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
366 LiveRangeInfo& LRI) const
367{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000368 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
369 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000370 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000371
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000372 // A LR must already exist for the return address.
373 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
374 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
375
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000376 unsigned RegClassID = RetAddrLR->getRegClassID();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000377 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
378}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000379
380
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000381
382//---------------------------------------------------------------------------
383// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000384// According to the Sparc ABI, the first 6 incoming args are in
385// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000386// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000387// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000388//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000389void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000390 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000391{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000392 // check if this is a varArgs function. needed for choosing regs.
393 bool isVarArgs = isVarArgsFunction(Meth->getType());
394
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000395 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000396 unsigned argNo=0, intArgNo=0, fpArgNo=0;
397 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
398 I != E; ++I, ++argNo) {
399 // get the LR of arg
400 LiveRange *LR = LRI.getLiveRangeForValue(I);
401 assert(LR && "No live range found for method arg");
402
403 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000404 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000405
406 int regNum = (regType == IntRegType)
407 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
408 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
409 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
410 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
411
412 if(regNum != InvalidRegNum)
413 LR->setSuggestedColor(regNum);
414 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000415}
416
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000417
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000418//---------------------------------------------------------------------------
419// This method is called after graph coloring to move incoming args to
420// the correct hardware registers if they did not receive the correct
421// (suggested) color through graph coloring.
422//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000423void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000424 LiveRangeInfo &LRI,
425 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000426
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000427 // check if this is a varArgs function. needed for choosing regs.
428 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000429 MachineInstr *AdMI;
430
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000431 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000432 // for each argument. count INT and FP arguments separately.
433 unsigned argNo=0, intArgNo=0, fpArgNo=0;
434 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
435 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000436 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000437 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000438 assert( LR && "No live range found for method arg");
439
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000440 unsigned regType = getRegType(LR);
441 unsigned RegClassID = LR->getRegClassID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000442
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000443 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000444 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000445 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000446 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000447 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000448 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000449
450 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000451 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
452 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
453 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
454 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000455
456 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000457 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000458 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000459 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000460
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000461 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000462
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000463 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
464
465 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000466 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000467 if( UniLRReg == UniArgReg )
468 continue;
469
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000470 // We are here because the LR did not receive the suggested
471 // but LR received another register.
472 // Now we have to copy the %i reg (or stack pos of arg)
473 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000474
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000475 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000476 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000477 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000478 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000479 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000480 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000481
482 // It is a variable argument call: the float reg must go in a %o reg.
483 // We have to move an int reg to a float reg via memory.
484 //
485 assert(isVarArgs &&
486 RegClassID == FloatRegClassID &&
487 regClassIDOfArgReg == IntRegClassID &&
488 "This should only be an Int register for an FP argument");
489
Chris Lattnerd47aac92002-12-28 20:21:29 +0000490 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000491 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000492 cpReg2MemMI(FirstAI->InstrnsBefore,
493 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000494
Vikram S. Adveaee67012002-07-08 23:23:12 +0000495 cpMem2RegMI(FirstAI->InstrnsBefore,
496 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000497 }
498 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000499 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000500 }
501 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000502 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000503
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000504 // Now the arg is coming on stack. Since the LR recieved a register,
505 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000506 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000507 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000508 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000509 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000510 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000511
Vikram S. Adveaee67012002-07-08 23:23:12 +0000512 cpMem2RegMI(FirstAI->InstrnsBefore,
513 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000514 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000515
516 } // if LR received a color
517
518 else {
519
520 // Now, the LR did not receive a color. But it has a stack offset for
521 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000522 // So, if the arg is coming in UniArgReg register, we can just move
523 // that on to the stack pos of LR
524
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000525 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000526
527 if( regClassIDOfArgReg != RegClassID ) {
528 assert(0 &&
529 "FP arguments to a varargs function should be explicitly "
530 "copied to/from int registers by instruction selection!");
531
532 // It must be a float arg for a variable argument call, which
533 // must come in a %o reg. Move the int reg to the stack.
534 //
535 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
536 "This should only be an Int register for an FP argument");
537
Vikram S. Adveaee67012002-07-08 23:23:12 +0000538 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
539 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000540 }
541 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000542 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
543 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000544 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000545 }
546
547 else {
548
549 // Now the arg is coming on stack. Since the LR did NOT
550 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000551 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000552 // since this method is called before any other method that makes
553 // uses of the stack pos of the LR (e.g., updateMachineInstr)
554
Chris Lattnerd47aac92002-12-28 20:21:29 +0000555 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000556 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000557 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000558 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000559
560 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000561 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000562
563 }
564
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000565 } // for each incoming argument
566
567}
568
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000569
570
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000571//---------------------------------------------------------------------------
572// This method is called before graph coloring to suggest colors to the
573// outgoing call args and the return value of the call.
574//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000575void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000576 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000577 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000578
Vikram S. Advee9327f02002-05-19 15:25:51 +0000579 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000580
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000581 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000582
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000583 // First color the return value of the call instruction, if any.
584 // The return value will be in %o0 if the value is an integer type,
585 // or in %f0 if the value is a float type.
586 //
587 if (const Value *RetVal = argDesc->getReturnValue()) {
588 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
589 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000590
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000591 unsigned RegClassID = RetValLR->getRegClassID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000592
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000593 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000594 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000595 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000596 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000597 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000598 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000599 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000600
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000601 // Now suggest colors for arguments (operands) of the call instruction.
602 // Colors are suggested only if the arg number is smaller than the
603 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000604 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000605
Vikram S. Advee9327f02002-05-19 15:25:51 +0000606 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000607
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000608 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
609 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000610
Vikram S. Advee9327f02002-05-19 15:25:51 +0000611 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000612
613 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000614 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000615 assert (LR && "Must have a LR for all arguments since "
616 "all args (even consts) must be defined before");
617
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000618 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000619 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000620
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000621 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000622 // an INT or FP value. Here we ignore whether or not it is a
623 // varargs calls, because FP arguments will be explicitly copied
624 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000625 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000626 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
627 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
628 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
629 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000630
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000631 // If a register could be allocated, use it.
632 // If not, do NOTHING as this will be colored as a normal value.
633 if(regNum != InvalidRegNum)
634 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000635
Vikram S. Advee9327f02002-05-19 15:25:51 +0000636 // Repeat for the second copy of the argument, which would be
637 // an FP argument being passed to a function with no prototype
638 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
639 if (argCopy != NULL)
640 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000641 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000642 && "Must be passing copy of FP argument in int register");
643 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
644 argNo, intArgNo, fpArgNo-1,
645 regClassIDOfArgReg);
646 assert(copyRegNum != InvalidRegNum);
647 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
648 copyLR->setSuggestedColor(copyRegNum);
649 }
650
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000651 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000652
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000653}
654
655
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000656//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000657// Helper method for UltraSparcRegInfo::colorCallArgs().
658//---------------------------------------------------------------------------
659
660void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000661UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000662 AddedInstrns *CallAI,
663 PhyRegAlloc &PRA, LiveRange* LR,
664 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000665 int UniArgRegOrNone, unsigned argNo,
Misha Brukman352f7ac2003-05-21 17:59:06 +0000666 std::vector<MachineInstr*> &AddedInstrnsBefore)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000667 const
668{
669 MachineInstr *AdMI;
670 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000671 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000672 if (UniArgRegOrNone != InvalidRegNum)
673 {
674 isArgInReg = true;
675 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000676 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000677 }
678
679 if (LR->hasColor()) {
680 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
681
682 // if LR received the correct color, nothing to do
683 if( isArgInReg && UniArgReg == UniLRReg )
684 return;
685
686 // The LR is allocated to a register UniLRReg and must be copied
687 // to UniArgReg or to the stack slot.
688 //
689 if( isArgInReg ) {
690 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000691 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000692 }
693 else {
694 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000695 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000696 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000697 cpReg2MemMI(CallAI->InstrnsBefore,
698 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000699 }
700
701 } else { // LR is not colored (i.e., spilled)
702
703 if( isArgInReg ) {
704 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000705 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
706 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000707 // Now add the instruction
708 }
709
710 else {
711 // Now, we have to pass the arg on stack. Since LR also did NOT
712 // receive a register we have to move an argument in memory to
713 // outgoing parameter on stack.
714 // Use TReg to load and store the value.
715 // Use TmpOff to save TReg, since that may have a live value.
716 //
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000717 int TReg = PRA.getUniRegNotUsedByThisInst(LR->getRegClass(), CallMI);
Chris Lattnerd47aac92002-12-28 20:21:29 +0000718 int TmpOff = PRA.MF.getInfo()->
719 pushTempValue(getSpilledRegSize(getRegType(LR)));
720 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000721 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000722
723 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
724
725 // Sequence:
726 // (1) Save TReg on stack
727 // (2) Load LR value into TReg from stack pos of LR
728 // (3) Store Treg on outgoing Arg pos on stack
729 // (4) Load the old value of TReg from stack to TReg (restore it)
730 //
731 // OPTIMIZE THIS:
732 // When reverse pointers in MahineInstr are introduced:
733 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
734 // needed only if this fails. Currently, we cannot call the
735 // above method since we cannot find LVSetBefore without the BB
736 //
737 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
738 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000739 cpReg2MemMI(CallAI->InstrnsBefore,
740 TReg, getFramePointer(), TmpOff, regType);
741 cpMem2RegMI(CallAI->InstrnsBefore,
742 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
743 cpReg2MemMI(CallAI->InstrnsBefore,
744 TReg, getStackPointer(), argOffset, regType);
745 cpMem2RegMI(CallAI->InstrnsBefore,
746 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000747 }
748 }
749}
750
751//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000752// After graph coloring, we have call this method to see whehter the return
753// value and the call args received the correct colors. If not, we have
754// to instert copy instructions.
755//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000756
Vikram S. Adveaee67012002-07-08 23:23:12 +0000757void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000758 LiveRangeInfo &LRI,
759 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000760 PhyRegAlloc &PRA,
761 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000762
Vikram S. Adve879eac92002-10-13 00:05:30 +0000763 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000764
Vikram S. Advee9327f02002-05-19 15:25:51 +0000765 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
766
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000767 // First color the return value of the call.
768 // If there is a LR for the return value, it means this
769 // method returns a value
770
771 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000772
Vikram S. Advee9327f02002-05-19 15:25:51 +0000773 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000774
Chris Lattner30e8fb62002-02-05 01:43:49 +0000775 if (RetVal) {
776 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000777
Chris Lattner30e8fb62002-02-05 01:43:49 +0000778 if (!RetValLR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000779 std::cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000780 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000781 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000782
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000783 unsigned RegClassID = RetValLR->getRegClassID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000784 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000785 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000786 unsigned UniRetReg; // unified number for CorrectCol
787
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000788 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000789 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000790 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000791 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000792 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000793 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000794 return;
795 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000796
797 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000798 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000799
Vikram S. Adveaee67012002-07-08 23:23:12 +0000800 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000801 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000802
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000803 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000804 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
805 : false;
806
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000807 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000808 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000809 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000810
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000811 unsigned regType = getRegType(RetValLR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000812
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000813 if( RetValLR->hasColor() ) {
814
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000815 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000816
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000817 // the return value is coming in UniRetReg but has to go into
818 // the UniRetLRReg
819
Vikram S. Adveaee67012002-07-08 23:23:12 +0000820 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000821
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000822 } // if LR has color
823 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000824
825 // if the LR did NOT receive a color, we have to move the return
826 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000827
Vikram S. Adveaee67012002-07-08 23:23:12 +0000828 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
829 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000830 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000831
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000832 } // the LR didn't receive the suggested color
833
834 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000835
836
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000837 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000838 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000839 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000840
Misha Brukman352f7ac2003-05-21 17:59:06 +0000841 std::vector<MachineInstr*> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000842
843 unsigned NumOfCallArgs = argDesc->getNumArgs();
844
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000845 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
846 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000847
Vikram S. Advee9327f02002-05-19 15:25:51 +0000848 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
849
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000850 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000851 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000852
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000853 unsigned RegClassID = getRegClassIDOfType(CallArg->getType());
854 unsigned regType = getRegType(CallArg->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000855
Vikram S. Advee9327f02002-05-19 15:25:51 +0000856 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000857 // Also find the correct register the argument must use (UniArgReg)
858 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000859 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000860 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000861 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000862
Vikram S. Advee9327f02002-05-19 15:25:51 +0000863 // Find the register that must be used for this arg, depending on
864 // whether it is an INT or FP value. Here we ignore whether or not it
865 // is a varargs calls, because FP arguments will be explicitly copied
866 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000867 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000868 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
869 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
870 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
871 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000872
873 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000874 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000875 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000876 assert(regClassIDOfArgReg == RegClassID &&
877 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000878 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000879
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000880 // not possible to have a null LR since all args (even consts)
881 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000882 if (!LR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000883 std::cerr <<" ERROR: In call instr, no LR for arg: " <<RAV(CallArg)<<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000884 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000885 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000886
887 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
888 UniArgReg, argNo, AddedInstrnsBefore);
889
890 // Repeat for the second copy of the argument, which would be
891 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000892 // It may either be passed as a copy in an integer register
893 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000894 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
895 if (argCopy != NULL)
896 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000897 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000898 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000899
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000900 unsigned copyRegClassID = getRegClassIDOfType(argCopy->getType());
901 unsigned copyRegType = getRegType(argCopy->getType());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000902
903 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
904 argNo, intArgNo, fpArgNo-1,
905 regClassIDOfArgReg);
906 assert(copyRegNum != InvalidRegNum);
907 assert(regClassIDOfArgReg == copyRegClassID &&
908 "Moving values between reg classes must happen during selection");
909
910 InitializeOutgoingArg(CallMI, CallAI, PRA,
911 LRI.getLiveRangeForValue(argCopy), copyRegType,
912 copyRegClassID, copyRegNum, argNo,
913 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000914 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000915
916 if (regNum != InvalidRegNum &&
917 argDesc->getArgInfo(i).usesStackSlot())
918 {
919 // Pass the argument via the stack in addition to regNum
920 assert(regType != IntRegType && "Passing an integer arg. twice?");
921 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
922 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
923 InvalidRegNum, argNo, AddedInstrnsBefore);
924 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000925 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000926
Vikram S. Advee9327f02002-05-19 15:25:51 +0000927 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000928 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000929 //
Misha Brukman352f7ac2003-05-21 17:59:06 +0000930 std::vector<MachineInstr*> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000931 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000932
Chris Lattner5216cc52002-02-04 05:59:25 +0000933 if (DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000934 std::cerr << "\nCalling reorder with instrns: \n";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000935 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +0000936 std::cerr << *(AddedInstrnsBefore[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000937 }
938
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000939 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
940 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
941 && "Dropped some instructions when reordering!");
942
Chris Lattner5216cc52002-02-04 05:59:25 +0000943 if (DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000944 std::cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000945 for(unsigned i = 0; i < ReorderedVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +0000946 std::cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000947 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000948 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000949
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000950 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000951 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000952 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
953 CallMI, BB, PRA);
954
955 // Then insert the final reordered code for the call arguments.
956 //
957 for(unsigned i=0; i < ReorderedVec.size(); i++)
958 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000959}
960
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000961//---------------------------------------------------------------------------
962// This method is called for an LLVM return instruction to identify which
963// values will be returned from this method and to suggest colors.
964//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000965void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000966 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000967
Vikram S. Adve879eac92002-10-13 00:05:30 +0000968 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000969
Vikram S. Adveaee67012002-07-08 23:23:12 +0000970 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000971
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000972 // if there is an implicit ref, that has to be the ret value
973 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000974
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000975 // The first implicit operand is the return value of a return instr
976 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000977
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000978 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000979
Chris Lattner30e8fb62002-02-05 01:43:49 +0000980 if (!LR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000981 std::cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Chris Lattner30e8fb62002-02-05 01:43:49 +0000982 assert(0 && "No LR for return value of non-void method");
983 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000984
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000985 unsigned RegClassID = LR->getRegClassID();
Chris Lattner5216cc52002-02-04 05:59:25 +0000986 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000987 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000988 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000989 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000990 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000991}
992
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000993
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000994
995//---------------------------------------------------------------------------
996// Colors the return value of a method to %i0 or %f0, if possible. If it is
997// not possilbe to directly color the LR, insert a copy instruction to move
998// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
999// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001000//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001001void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +00001002 LiveRangeInfo &LRI,
1003 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004
Vikram S. Adve879eac92002-10-13 00:05:30 +00001005 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001006
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001007 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001008 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001009
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001010 // The first implicit operand is the return value of a return instr
1011 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001012
Chris Lattner5216cc52002-02-04 05:59:25 +00001013 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014
Chris Lattner30e8fb62002-02-05 01:43:49 +00001015 if (!LR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001016 std::cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Chris Lattner30e8fb62002-02-05 01:43:49 +00001017 // assert( LR && "No LR for return value of non-void method");
1018 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001019 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001020
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001021 unsigned RegClassID = getRegClassIDOfType(RetVal->getType());
1022 unsigned regType = getRegType(RetVal->getType());
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001023
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001024 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001025 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001026 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001027 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001028 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001029 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001030 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001031 return;
1032 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001033
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001034 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001035 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001036
Vikram S. Adveaee67012002-07-08 23:23:12 +00001037 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001038 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001039
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001040 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001041
Chris Lattner5216cc52002-02-04 05:59:25 +00001042 if (LR->hasColor() && LR->getColor() == CorrectCol)
1043 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001044
Chris Lattner5216cc52002-02-04 05:59:25 +00001045 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001046
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001047 // We are here because the LR was allocted a regiter
1048 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001049
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001050 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001051
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001052 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001053
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001054 // the LR received UniLRReg but must be colored with UniRetReg
1055 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001056 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001057 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001058 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001059 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1060 LR->getSpillOffFromFP(), UniRetReg, regType);
Misha Brukman352f7ac2003-05-21 17:59:06 +00001061 //std::cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001062 }
1063
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001064 } // if there is a return value
1065
1066}
1067
Vikram S. Adveaee67012002-07-08 23:23:12 +00001068//---------------------------------------------------------------------------
1069// Check if a specified register type needs a scratch register to be
1070// copied to/from memory. If it does, the reg. type that must be used
1071// for scratch registers is returned in scratchRegType.
1072//
1073// Only the int CC register needs such a scratch register.
1074// The FP CC registers can (and must) be copied directly to/from memory.
1075//---------------------------------------------------------------------------
1076
1077bool
1078UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1079 int& scratchRegType) const
1080{
1081 if (RegType == IntCCRegType)
1082 {
1083 scratchRegType = IntRegType;
1084 return true;
1085 }
1086 return false;
1087}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001088
1089//---------------------------------------------------------------------------
1090// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001091// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001092//---------------------------------------------------------------------------
1093
Vikram S. Advee9327f02002-05-19 15:25:51 +00001094void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001095UltraSparcRegInfo::cpReg2RegMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001096 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001097 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001098 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001099 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001100 "Invalid Register");
1101
1102 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001103
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001104 switch( RegType ) {
1105
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001106 case IntCCRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001107 if (getRegType(DestReg) == IntRegType) {
1108 // copy intCC reg to int reg
1109 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1110 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg,MOTy::Def);
1111 } else {
1112 // copy int reg to intCC reg
1113 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1114 assert(getRegType(SrcReg) == IntRegType
1115 && "Can only copy CC reg to/from integer reg");
1116 MI = BuildMI(V9::WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
1117 }
Vikram S. Adveaee67012002-07-08 23:23:12 +00001118 break;
1119
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001120 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001121 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001122 break;
1123
1124 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001125 MI = BuildMI(V9::ADD, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
1126 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001127 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001128
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001129 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001130 MI = BuildMI(V9::FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001131 break;
1132
1133 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001134 MI = BuildMI(V9::FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001135 break;
1136
1137 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001138 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001139 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001140 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001141
1142 if (MI)
1143 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001144}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001145
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001146//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001147// Copy from a register to memory (i.e., Store). Register number must
1148// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001149//---------------------------------------------------------------------------
1150
1151
Vikram S. Advee9327f02002-05-19 15:25:51 +00001152void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001153UltraSparcRegInfo::cpReg2MemMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001154 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001155 unsigned DestPtrReg,
1156 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001157 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001158 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001159 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001160 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001161 assert(target.getInstrInfo().constantFitsInImmedField(V9::STX, Offset));
1162 MI = BuildMI(V9::STX,3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001163 break;
1164
1165 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001166 assert(target.getInstrInfo().constantFitsInImmedField(V9::ST, Offset));
1167 MI = BuildMI(V9::ST, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001168 break;
1169
1170 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001171 assert(target.getInstrInfo().constantFitsInImmedField(V9::STD, Offset));
1172 MI = BuildMI(V9::STD,3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001173 break;
1174
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001175 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001176 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001177 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001178
1179 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001180 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001181 mvec.push_back(MI);
1182
Chris Lattner56e91662002-08-12 21:25:05 +00001183 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001184 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001185
1186 case FloatCCRegType:
1187 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Misha Brukman56f4fa12003-05-20 20:32:24 +00001188 assert(target.getInstrInfo().constantFitsInImmedField(V9::STXFSR, Offset));
1189 MI = BuildMI(V9::STXFSR, 3).addMReg(SrcReg).addMReg(DestPtrReg)
1190 .addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001191 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001192
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001193 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001194 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001195 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001196 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001197}
1198
1199
1200//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001201// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001202// register number
1203//---------------------------------------------------------------------------
1204
1205
Vikram S. Advee9327f02002-05-19 15:25:51 +00001206void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001207UltraSparcRegInfo::cpMem2RegMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001208 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001209 int Offset,
1210 unsigned DestReg,
1211 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001212 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001213 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001214 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001215 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001216 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDX, Offset));
1217 MI = BuildMI(V9::LDX, 3).addMReg(SrcPtrReg).addSImm(Offset)
1218 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001219 break;
1220
1221 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001222 assert(target.getInstrInfo().constantFitsInImmedField(V9::LD, Offset));
1223 MI = BuildMI(V9::LD, 3).addMReg(SrcPtrReg).addSImm(Offset)
1224 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001225 break;
1226
1227 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001228 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDD, Offset));
1229 MI = BuildMI(V9::LDD, 3).addMReg(SrcPtrReg).addSImm(Offset).addMReg(DestReg,
Chris Lattner1ebaa902003-01-15 17:47:49 +00001230 MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001231 break;
1232
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001233 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001234 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001235 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1236 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001237
1238 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001239 MI = BuildMI(V9::WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1,MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001240 break;
1241
1242 case FloatCCRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001243 assert(0 && "Tell Vikram if this assertion fails: we may have to mask "
1244 "out the other bits here");
Misha Brukman56f4fa12003-05-20 20:32:24 +00001245 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDXFSR, Offset));
1246 MI = BuildMI(V9::LDXFSR, 3).addMReg(SrcPtrReg).addSImm(Offset)
1247 .addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001248 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001249
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001250 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001251 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001252 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001253 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001254}
1255
1256
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001257//---------------------------------------------------------------------------
1258// Generate a copy instruction to copy a value to another. Temporarily
1259// used by PhiElimination code.
1260//---------------------------------------------------------------------------
1261
1262
Vikram S. Advee9327f02002-05-19 15:25:51 +00001263void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001264UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Misha Brukman352f7ac2003-05-21 17:59:06 +00001265 std::vector<MachineInstr*>& mvec) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001266 int RegType = getRegType(Src->getType());
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001267 MachineInstr * MI = NULL;
1268
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001269 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001270 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001271 MI = BuildMI(V9::ADD, 3).addReg(Src).addMReg(getZeroRegNum())
1272 .addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001273 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001274 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001275 MI = BuildMI(V9::FMOVS, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001276 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001277 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001278 MI = BuildMI(V9::FMOVD, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001279 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001280 default:
1281 assert(0 && "Unknow RegType in CpValu2Value");
1282 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001283
Chris Lattner9bebf832002-10-28 20:10:56 +00001284 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001285}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001286
1287
1288
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001289
1290
1291
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001292//----------------------------------------------------------------------------
1293// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001294// a call machine instruction. The caller saving/restoring instructions are
1295// inserted like:
1296//
1297// ** caller saving instructions
1298// other instructions inserted for the call by ColorCallArg
1299// CALL instruction
1300// other instructions inserted for the call ColorCallArg
1301// ** caller restoring instructions
1302//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001303//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001304
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001305
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001306void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001307UltraSparcRegInfo::insertCallerSavingCode
1308(std::vector<MachineInstr*> &instrnsBefore,
1309 std::vector<MachineInstr*> &instrnsAfter,
1310 MachineInstr *CallMI,
1311 const BasicBlock *BB,
1312 PhyRegAlloc &PRA) const
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001313{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001314 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001315
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001316 // has set to record which registers were saved/restored
1317 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001318 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001319
Vikram S. Advee9327f02002-05-19 15:25:51 +00001320 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1321
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001322 // Now find the LR of the return value of the call
1323 // The last *implicit operand* is the return value of a call
1324 // Insert it to to he PushedRegSet since we must not save that register
1325 // and restore it after the call.
1326 // We do this because, we look at the LV set *after* the instruction
1327 // to determine, which LRs must be saved across calls. The return value
1328 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001329
Vikram S. Advee9327f02002-05-19 15:25:51 +00001330 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001331
Chris Lattner5216cc52002-02-04 05:59:25 +00001332 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001333 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001334 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001335
Chris Lattner5216cc52002-02-04 05:59:25 +00001336 if (RetValLR->hasColor())
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001337 PushedRegSet.insert(getUnifiedRegNum(RetValLR->getRegClassID(),
1338 RetValLR->getColor()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001339 }
1340
Vikram S. Advee9327f02002-05-19 15:25:51 +00001341 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001342 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001343
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001344 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001345 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001346
1347 // get the live range corresponding to live var
1348 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1349
1350 // LR can be null if it is a const since a const
1351 // doesn't have a dominating def - see Assumptions above
1352 if( LR ) {
1353
1354 if( LR->hasColor() ) {
1355
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001356 unsigned RCID = LR->getRegClassID();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001357 unsigned Color = LR->getColor();
1358
1359 if ( isRegVolatile(RCID, Color) ) {
1360
1361 // if the value is in both LV sets (i.e., live before and after
1362 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001363
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001364 unsigned Reg = getUnifiedRegNum(RCID, Color);
1365
1366 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1367
1368 // if we haven't already pushed that register
1369
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001370 unsigned RegType = getRegType(LR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001371
1372 // Now get two instructions - to push on stack and pop from stack
1373 // and add them to InstrnsBefore and InstrnsAfter of the
1374 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001375 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001376 int StackOff =
1377 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001378
Misha Brukman352f7ac2003-05-21 17:59:06 +00001379 std::vector<MachineInstr*> AdIBef, AdIAft;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001380
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001381 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001382
1383 // We may need a scratch register to copy the saved value
1384 // to/from memory. This may itself have to insert code to
1385 // free up a scratch register. Any such code should go before
1386 // the save code.
1387 int scratchRegType = -1;
1388 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001389 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001390 { // Find a register not live in the LVSet before CallMI
1391 const ValueSet &LVSetBef =
1392 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1393 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1394 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001395 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001396 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001397 }
1398
1399 if (AdIBef.size() > 0)
1400 instrnsBefore.insert(instrnsBefore.end(),
1401 AdIBef.begin(), AdIBef.end());
1402
1403 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1404 scratchReg);
1405
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001406 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001407 instrnsBefore.insert(instrnsBefore.end(),
1408 AdIAft.begin(), AdIAft.end());
1409
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001410 //---- Insert code for popping the reg from the stack ----------
1411
Vikram S. Adveaee67012002-07-08 23:23:12 +00001412 // We may need a scratch register to copy the saved value
1413 // from memory. This may itself have to insert code to
1414 // free up a scratch register. Any such code should go
1415 // after the save code.
1416 //
1417 scratchRegType = -1;
1418 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001419 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001420 { // Find a register not live in the LVSet after CallMI
1421 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1422 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001423 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001424 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001425 }
1426
1427 if (AdIBef.size() > 0)
1428 instrnsAfter.insert(instrnsAfter.end(),
1429 AdIBef.begin(), AdIBef.end());
1430
1431 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1432 scratchReg);
1433
1434 if (AdIAft.size() > 0)
1435 instrnsAfter.insert(instrnsAfter.end(),
1436 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001437
Chris Lattner7e5ee422002-02-05 04:20:12 +00001438 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001439
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001440 if(DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001441 std::cerr << "\nFor call inst:" << *CallMI;
1442 std::cerr << " -inserted caller saving instrs: Before:\n\t ";
Vikram S. Adveaee67012002-07-08 23:23:12 +00001443 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001444 std::mem_fun(&MachineInstr::dump));
Misha Brukman352f7ac2003-05-21 17:59:06 +00001445 std::cerr << " -and After:\n\t ";
Vikram S. Adveaee67012002-07-08 23:23:12 +00001446 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001447 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001448 }
1449 } // if not already pushed
1450
1451 } // if LR has a volatile color
1452
1453 } // if LR has color
1454
1455 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001456
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001457 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001458}
1459
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001460
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001461//---------------------------------------------------------------------------
1462// Print the register assigned to a LR
1463//---------------------------------------------------------------------------
1464
Chris Lattner5216cc52002-02-04 05:59:25 +00001465void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001466 unsigned RegClassID = LR->getRegClassID();
Misha Brukman352f7ac2003-05-21 17:59:06 +00001467 std::cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001468
Chris Lattner5216cc52002-02-04 05:59:25 +00001469 if (!LR->hasColor()) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001470 std::cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001471 return;
1472 }
1473
1474 // if a color is found
1475
Misha Brukman352f7ac2003-05-21 17:59:06 +00001476 std::cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001477
Chris Lattner5216cc52002-02-04 05:59:25 +00001478 if (RegClassID == IntRegClassID) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001479 std::cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001480
Chris Lattner5216cc52002-02-04 05:59:25 +00001481 } else if (RegClassID == FloatRegClassID) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001482 std::cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001483 if( LR->getType() == Type::DoubleTy)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001484 std::cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
1485 std::cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001486 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001487}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001488
1489//---------------------------------------------------------------------------
1490// This method examines instructions inserted by RegAlloc code before a
1491// machine instruction to detect invalid orders that destroy values before
1492// they are used. If it detects such conditions, it reorders the instructions.
1493//
1494// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001495// instructions inserted by RegAlloc. All such instruction MUST have
1496// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001497//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001498// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1499// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001500//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001501// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001502//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001503// Since instructions are inserted in RegAlloc, this assumes that the
1504// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001505// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001506//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001507// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001508//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001509
1510void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1511 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001512 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001513
1514 /*
1515 Problem: We can have instructions inserted by RegAlloc like
1516 1. add %ox %g0 %oy
1517 2. add %oy %g0 %oz, where z!=x or z==x
1518
1519 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001520
1521 Solution:
1522 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001523
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001524 Algorithm:
1525
1526 do
1527 for each instruction 'DefInst' in the UnOrdVec
1528 for each instruction 'UseInst' that follows the DefInst
1529 if the reg defined by DefInst is used by UseInst
1530 mark DefInst as not movable in this iteration
1531 If DefInst is not marked as not-movable, move DefInst to OrdVec
1532 while all instructions in DefInst are moved to OrdVec
1533
1534 For moving, we call the move2OrdVec(). It checks whether there is a def
1535 in it for the uses in the instruction to be added to OrdVec. If there
1536 are no preceding defs, it just appends the instruction. If there is a
1537 preceding def, it puts two instructions to save the reg on stack before
1538 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001539
1540 */
1541
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001542 bool CouldMoveAll;
1543 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001544
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001545 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001546 CouldMoveAll = true;
Misha Brukman352f7ac2003-05-21 17:59:06 +00001547 std::vector<MachineInstr*>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001548
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001549 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001550
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001551 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001552
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001553 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001554
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001555 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001556
Misha Brukman352f7ac2003-05-21 17:59:06 +00001557 //std::cerr << "\nInst in UnordVec = " << *DefInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001558
1559 // last operand is the def (unless for a store which has no def reg)
1560 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1561
Chris Lattner6a30b022002-10-28 04:45:29 +00001562 if (DefOp.opIsDef() &&
1563 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001564
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001565 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001566 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001567
Misha Brukman352f7ac2003-05-21 17:59:06 +00001568 std::vector<MachineInstr*>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001569 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001570
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001571 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1572
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001573 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001574 if( UseInst == NULL) continue;
1575
1576 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001577 MachineOperand& UseOp = UseInst->getOperand(0);
1578
Chris Lattner6a30b022002-10-28 04:45:29 +00001579 if (!UseOp.opIsDef() &&
1580 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001581
1582 // if use is a register ...
1583
1584 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1585
1586 // if Def and this use are the same, it means that this use
1587 // is destroyed by a def before it is used
1588
Misha Brukman352f7ac2003-05-21 17:59:06 +00001589 // std::cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001590
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001591 DefEqUse = true;
1592 CouldMoveAll = false;
1593 DebugPrint = true;
1594 break;
1595 } // if two registers are equal
1596
1597 } // if use is a register
1598
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001599 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001600
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001601 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001602
1603 // after examining all the instructions that follow the DefInst
1604 // if there are no dependencies, we can move it to the OrdVec
1605
Misha Brukman352f7ac2003-05-21 17:59:06 +00001606 // std::cerr << "Moved to Ord: " << *DefInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001607
1608 moveInst2OrdVec(OrdVec, DefInst, PRA);
1609
1610 //OrdVec.push_back(DefInst);
1611
1612 // mark the pos of DefInst with NULL to indicate that it is
1613 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001614 *DefIt = NULL;
1615 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001616
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001617 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001618
1619 } // for all instructions in the UnordVec
1620
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001621
Chris Lattner5216cc52002-02-04 05:59:25 +00001622 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001623
Chris Lattner070cf772002-06-04 03:09:57 +00001624 if (DebugPrint && DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001625 std::cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001626 for(unsigned i=0; i < OrdVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001627 std::cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001628 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001629}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001630
1631
1632
1633
1634
Misha Brukman352f7ac2003-05-21 17:59:06 +00001635void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr*> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001636 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001637 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001638 MachineOperand& UseOp = UnordInst->getOperand(0);
1639
Chris Lattner6a30b022002-10-28 04:45:29 +00001640 if (!UseOp.opIsDef() &&
1641 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001642
1643 // for the use of UnordInst, see whether there is a defining instr
1644 // before in the OrdVec
1645 bool DefEqUse = false;
1646
Misha Brukman352f7ac2003-05-21 17:59:06 +00001647 std::vector<MachineInstr*>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001648
1649 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1650
1651 MachineInstr *OrdInst = *OrdIt ;
1652
1653 MachineOperand& DefOp =
1654 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1655
1656 if( DefOp.opIsDef() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001657 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001658
Misha Brukman352f7ac2003-05-21 17:59:06 +00001659 //std::cerr << "\nDefining Ord Inst: " << *OrdInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001660
1661 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1662
1663 // we are here because there is a preceding def in the OrdVec
1664 // for the use in this intr we are going to insert. This
1665 // happened because the original code was like:
1666 // 1. add %ox %g0 %oy
1667 // 2. add %oy %g0 %ox
1668 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1669 // Now we are processing %ox of 1.
1670 // We have to
1671
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001672 int UReg = DefOp.getMachineRegNum();
1673 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001674 MachineInstr *AdIBef, *AdIAft;
1675
Chris Lattnerd47aac92002-12-28 20:21:29 +00001676 int StackOff =
1677 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001678
1679 // Save the UReg (%ox) on stack before it's destroyed
Misha Brukman352f7ac2003-05-21 17:59:06 +00001680 std::vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001681 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Misha Brukman352f7ac2003-05-21 17:59:06 +00001682 for (std::vector<MachineInstr*>::iterator MI=mvec.begin();
Chris Lattnerd47aac92002-12-28 20:21:29 +00001683 MI != mvec.end(); ++MI)
1684 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001685
1686 // Load directly into DReg (%oy)
1687 MachineOperand& DOp=
1688 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1689 assert(DOp.opIsDef() && "Last operand is not the def");
1690 const int DReg = DOp.getMachineRegNum();
1691
Vikram S. Adveaee67012002-07-08 23:23:12 +00001692 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001693
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001694 if( DEBUG_RA ) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001695 std::cerr << "\nFixed CIRCULAR references by reordering:";
1696 std::cerr << "\nBefore CIRCULAR Reordering:\n";
1697 std::cerr << *UnordInst;
1698 std::cerr << *OrdInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001699
Misha Brukman352f7ac2003-05-21 17:59:06 +00001700 std::cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001701 for(unsigned i=0; i < OrdVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001702 std::cerr << *(OrdVec[i]);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001703 }
1704
1705 // Do not copy the UseInst to OrdVec
1706 DefEqUse = true;
1707 break;
1708
1709 }// if two registers are equal
1710
1711 } // if Def is a register
1712
1713 } // for each instr in OrdVec
1714
Chris Lattner5216cc52002-02-04 05:59:25 +00001715 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001716
1717 // We didn't find a def in the OrdVec, so just append this inst
1718 OrdVec.push_back( UnordInst );
Misha Brukman352f7ac2003-05-21 17:59:06 +00001719 //std::cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001720 }
1721
1722 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001723}