blob: 6101ffc7b25f52993ee2aa04a597da8382c2158c [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
Misha Brukman7ae7f842002-10-28 00:28:31 +000010#include "llvm/CodeGen/MachineFunction.h"
Chris Lattnerd47aac92002-12-28 20:21:29 +000011#include "llvm/CodeGen/MachineFunctionInfo.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adveaee67012002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerd5a84702002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner24c1d5e2003-01-14 23:05:08 +000018#include "llvm/CodeGen/FunctionLiveVarInfo.h" // FIXME: Remove
Chris Lattner5216cc52002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000023using std::cerr;
Anand Shukla458496c2002-06-25 20:55:50 +000024using std::vector;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000025
Chris Lattner24c1d5e2003-01-14 23:05:08 +000026enum {
27 BadRegClass = ~0
28};
29
Chris Lattner5216cc52002-02-04 05:59:25 +000030UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Chris Lattnerf9781b52002-12-29 03:13:05 +000031 : TargetRegInfo(tgt), NumOfIntArgRegs(6),
Chris Lattner5216cc52002-02-04 05:59:25 +000032 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
33
34 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
35 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
36 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
37 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000038
Chris Lattner56e91662002-08-12 21:25:05 +000039 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000040 "32 Float regs are used for float arg passing");
41}
42
43
Vikram S. Advedb1435f2002-03-18 03:12:16 +000044// getZeroRegNum - returns the register that contains always zero.
45// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000046//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000047int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000048 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
49 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000050}
Chris Lattner5216cc52002-02-04 05:59:25 +000051
52// getCallAddressReg - returns the reg used for pushing the address when a
53// method is called. This can be used for other purposes between calls
54//
55unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000056 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
57 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000058}
59
60// Returns the register containing the return address.
61// It should be made sure that this register contains the return
62// value when a return instruction is reached.
63//
64unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000065 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
66 SparcIntRegClass::i7);
67}
68
69// Register get name implementations...
70
71// Int register names in same order as enum in class SparcIntRegClass
72static const char * const IntRegNames[] = {
73 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
74 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
75 "i0", "i1", "i2", "i3", "i4", "i5",
76 "i6", "i7",
77 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
78 "o6"
79};
80
81const char * const SparcIntRegClass::getRegName(unsigned reg) {
82 assert(reg < NumOfAllRegs);
83 return IntRegNames[reg];
84}
85
86static const char * const FloatRegNames[] = {
87 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
88 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
89 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
90 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
91 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
92 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
93 "f60", "f61", "f62", "f63"
94};
95
96const char * const SparcFloatRegClass::getRegName(unsigned reg) {
97 assert (reg < NumOfAllRegs);
98 return FloatRegNames[reg];
99}
100
101
102static const char * const IntCCRegNames[] = {
103 "xcc", "ccr"
104};
105
106const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
107 assert(reg < 2);
108 return IntCCRegNames[reg];
109}
110
111static const char * const FloatCCRegNames[] = {
112 "fcc0", "fcc1", "fcc2", "fcc3"
113};
114
115const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
116 assert (reg < 4);
117 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000118}
119
120// given the unified register number, this gives the name
121// for generating assembly code or debugging.
122//
Chris Lattner56e91662002-08-12 21:25:05 +0000123const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000124 if( reg < 32 )
Chris Lattner56e91662002-08-12 21:25:05 +0000125 return SparcIntRegClass::getRegName(reg);
Chris Lattner5216cc52002-02-04 05:59:25 +0000126 else if ( reg < (64 + 32) )
Chris Lattner56e91662002-08-12 21:25:05 +0000127 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner5216cc52002-02-04 05:59:25 +0000128 else if( reg < (64+32+4) )
Chris Lattner56e91662002-08-12 21:25:05 +0000129 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner5216cc52002-02-04 05:59:25 +0000130 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner56e91662002-08-12 21:25:05 +0000131 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner5216cc52002-02-04 05:59:25 +0000132 else if (reg== InvalidRegNum) //****** TODO: Remove */
133 return "<*NoReg*>";
134 else
135 assert(0 && "Invalid register number");
136 return "";
137}
138
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000139// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000140unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000141 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
142 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000143}
144
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000145// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000146unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000147 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
148 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000149}
150
151
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000152//---------------------------------------------------------------------------
153// Finds whether a call is an indirect call
154//---------------------------------------------------------------------------
155
156inline bool
157isVarArgsFunction(const Type *funcType) {
158 return cast<FunctionType>(cast<PointerType>(funcType)
159 ->getElementType())->isVarArg();
160}
161
162inline bool
163isVarArgsCall(const MachineInstr *CallMI) {
164 Value* callee = CallMI->getOperand(0).getVRegValue();
165 // const Type* funcType = isa<Function>(callee)? callee->getType()
166 // : cast<PointerType>(callee->getType())->getElementType();
167 const Type* funcType = callee->getType();
168 return isVarArgsFunction(funcType);
169}
170
171
172// Get the register number for the specified integer arg#,
173// assuming there are argNum total args, intArgNum int args,
174// and fpArgNum FP args preceding (and not including) this one.
175// Use INT regs for FP args if this is a varargs call.
176//
177// Return value:
178// InvalidRegNum, if there is no int register available for the arg.
179// regNum, otherwise (this is NOT the unified reg. num).
180//
181inline int
182UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
183 unsigned argNo,
184 unsigned intArgNo, unsigned fpArgNo,
185 unsigned& regClassId) const
186{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000187 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000188 if (argNo >= NumOfIntArgRegs)
189 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000190 else
Chris Lattner56e91662002-08-12 21:25:05 +0000191 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000192}
193
194// Get the register number for the specified FP arg#,
195// assuming there are argNum total args, intArgNum int args,
196// and fpArgNum FP args preceding (and not including) this one.
197// Use INT regs for FP args if this is a varargs call.
198//
199// Return value:
200// InvalidRegNum, if there is no int register available for the arg.
201// regNum, otherwise (this is NOT the unified reg. num).
202//
203inline int
204UltraSparcRegInfo::regNumForFPArg(unsigned regType,
205 bool inCallee, bool isVarArgsCall,
206 unsigned argNo,
207 unsigned intArgNo, unsigned fpArgNo,
208 unsigned& regClassId) const
209{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000210 if (isVarArgsCall)
211 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
212 regClassId);
213 else
214 {
215 regClassId = FloatRegClassID;
216 if (regType == FPSingleRegType)
217 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000218 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000219 else if (regType == FPDoubleRegType)
220 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000221 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000222 else
223 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000224 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000225 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000226}
227
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000228
229//---------------------------------------------------------------------------
230// Finds the return address of a call sparc specific call instruction
231//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000232
Vikram S. Adveaee67012002-07-08 23:23:12 +0000233// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000234// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000235//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000236int UltraSparcRegInfo::getRegType(unsigned regClassID,
237 const Type* type) const {
238 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000239 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000240 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000241 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000242 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000243 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000244 return FPDoubleRegType;
245 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000246 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000247 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000248 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000249 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000250 }
251}
252
Vikram S. Advee9327f02002-05-19 15:25:51 +0000253int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
254 return getRegType(LR->getRegClass()->getID(), LR->getType());
255}
256
Chris Lattner5216cc52002-02-04 05:59:25 +0000257int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000258 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000259}
260
Vikram S. Adveaee67012002-07-08 23:23:12 +0000261int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
262 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000263 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000264 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000265 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000266 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000267 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000268 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000269 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000270 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000271 return IntCCRegType;
272 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000273 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000274 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000275}
276
277
Vikram S. Adveaee67012002-07-08 23:23:12 +0000278// To find the register class used for a specified Type
279//
280unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000281 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000282 Type::PrimitiveID ty = type->getPrimitiveID();
283 unsigned res;
284
285 // FIXME: Comparing types like this isn't very safe...
286 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
287 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
288 res = IntRegClassID; // sparc int reg (ty=0: void)
289 else if (ty <= Type::DoubleTyID)
290 res = FloatRegClassID; // sparc float reg class
291 else {
292 //std::cerr << "TypeID: " << ty << "\n";
293 assert(0 && "Cannot resolve register class for type");
294 return 0;
295 }
296
297 if(isCCReg)
298 return res + 2; // corresponidng condition code regiser
299 else
300 return res;
301}
302
303// To find the register class to which a specified register belongs
304//
305unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
306 unsigned classId = 0;
307 (void) getClassRegNum(unifiedRegNum, classId);
308 return classId;
309}
310
311unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
312 switch(regType) {
313 case IntRegType: return IntRegClassID;
314 case FPSingleRegType:
315 case FPDoubleRegType: return FloatRegClassID;
316 case IntCCRegType: return IntCCRegClassID;
317 case FloatCCRegType: return FloatCCRegClassID;
318 default:
319 assert(0 && "Invalid register type in getRegClassIDOfRegType");
320 return 0;
321 }
322}
323
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000324//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000325// Suggests a register for the ret address in the RET machine instruction.
326// We always suggest %i7 by convention.
327//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000328void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000329 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000330
Vikram S. Adveaee67012002-07-08 23:23:12 +0000331 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000332
Vikram S. Adveaee67012002-07-08 23:23:12 +0000333 // return address is always mapped to i7 so set it immediately
334 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000335 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000336
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000337 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000338 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000339 // we have to test later whether it received the suggested color.
340 // In that case, a LR has to be created at the start of method.
341 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000342
Vikram S. Adveaee67012002-07-08 23:23:12 +0000343 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000344 // const Value *RetAddrVal = MO.getVRegValue();
345 // assert( RetAddrVal && "LR for ret address must be created at start");
346 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
347 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000348 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000349}
350
351
352//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000353// Suggests a register for the ret address in the JMPL/CALL machine instr.
354// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000355//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000356void
357UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
358 LiveRangeInfo& LRI) const
359{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000360 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
361 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000362 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000363
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000364 // A LR must already exist for the return address.
365 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
366 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
367
368 unsigned RegClassID = RetAddrLR->getRegClass()->getID();
369 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
370}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000371
372
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000373
374//---------------------------------------------------------------------------
375// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000376// According to the Sparc ABI, the first 6 incoming args are in
377// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000378// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000379// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000380//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000381void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000382 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000383{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000384 // check if this is a varArgs function. needed for choosing regs.
385 bool isVarArgs = isVarArgsFunction(Meth->getType());
386
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000387 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000388 unsigned argNo=0, intArgNo=0, fpArgNo=0;
389 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
390 I != E; ++I, ++argNo) {
391 // get the LR of arg
392 LiveRange *LR = LRI.getLiveRangeForValue(I);
393 assert(LR && "No live range found for method arg");
394
395 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000396 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000397
398 int regNum = (regType == IntRegType)
399 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
400 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
401 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
402 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
403
404 if(regNum != InvalidRegNum)
405 LR->setSuggestedColor(regNum);
406 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000407}
408
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000409
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000410//---------------------------------------------------------------------------
411// This method is called after graph coloring to move incoming args to
412// the correct hardware registers if they did not receive the correct
413// (suggested) color through graph coloring.
414//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000415void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000416 LiveRangeInfo &LRI,
417 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000418
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000419 // check if this is a varArgs function. needed for choosing regs.
420 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000421 MachineInstr *AdMI;
422
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000423 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000424 // for each argument. count INT and FP arguments separately.
425 unsigned argNo=0, intArgNo=0, fpArgNo=0;
426 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
427 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000428 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000429 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000430 assert( LR && "No live range found for method arg");
431
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000432 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000433 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000434
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000435 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000436 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000437 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000438 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000439 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000440 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000441
442 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000443 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
444 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
445 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
446 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000447
448 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000450 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000452
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000453 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000454
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000455 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
456
457 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000458 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000459 if( UniLRReg == UniArgReg )
460 continue;
461
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000462 // We are here because the LR did not receive the suggested
463 // but LR received another register.
464 // Now we have to copy the %i reg (or stack pos of arg)
465 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000466
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000467 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000468 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000469 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000470 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000471 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000472 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000473
474 // It is a variable argument call: the float reg must go in a %o reg.
475 // We have to move an int reg to a float reg via memory.
476 //
477 assert(isVarArgs &&
478 RegClassID == FloatRegClassID &&
479 regClassIDOfArgReg == IntRegClassID &&
480 "This should only be an Int register for an FP argument");
481
Chris Lattnerd47aac92002-12-28 20:21:29 +0000482 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000483 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000484 cpReg2MemMI(FirstAI->InstrnsBefore,
485 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000486
Vikram S. Adveaee67012002-07-08 23:23:12 +0000487 cpMem2RegMI(FirstAI->InstrnsBefore,
488 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000489 }
490 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000491 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000492 }
493 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000494 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000495
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000496 // Now the arg is coming on stack. Since the LR recieved a register,
497 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000498 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000499 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000500 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000501 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000502 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000503
Vikram S. Adveaee67012002-07-08 23:23:12 +0000504 cpMem2RegMI(FirstAI->InstrnsBefore,
505 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000506 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000507
508 } // if LR received a color
509
510 else {
511
512 // Now, the LR did not receive a color. But it has a stack offset for
513 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000514 // So, if the arg is coming in UniArgReg register, we can just move
515 // that on to the stack pos of LR
516
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000517 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000518
519 if( regClassIDOfArgReg != RegClassID ) {
520 assert(0 &&
521 "FP arguments to a varargs function should be explicitly "
522 "copied to/from int registers by instruction selection!");
523
524 // It must be a float arg for a variable argument call, which
525 // must come in a %o reg. Move the int reg to the stack.
526 //
527 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
528 "This should only be an Int register for an FP argument");
529
Vikram S. Adveaee67012002-07-08 23:23:12 +0000530 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
531 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000532 }
533 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000534 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
535 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000536 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000537 }
538
539 else {
540
541 // Now the arg is coming on stack. Since the LR did NOT
542 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000543 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000544 // since this method is called before any other method that makes
545 // uses of the stack pos of the LR (e.g., updateMachineInstr)
546
Chris Lattnerd47aac92002-12-28 20:21:29 +0000547 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000548 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000549 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000550 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000551
552 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000553 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000554
555 }
556
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000557 } // for each incoming argument
558
559}
560
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000561
562
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000563//---------------------------------------------------------------------------
564// This method is called before graph coloring to suggest colors to the
565// outgoing call args and the return value of the call.
566//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000567void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000568 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000569 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000570
Vikram S. Advee9327f02002-05-19 15:25:51 +0000571 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000572
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000573 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000574
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000575 // First color the return value of the call instruction, if any.
576 // The return value will be in %o0 if the value is an integer type,
577 // or in %f0 if the value is a float type.
578 //
579 if (const Value *RetVal = argDesc->getReturnValue()) {
580 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
581 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000582
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000583 unsigned RegClassID = RetValLR->getRegClass()->getID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000584
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000585 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000586 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000587 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000588 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000589 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000590 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000591 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000592
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000593 // Now suggest colors for arguments (operands) of the call instruction.
594 // Colors are suggested only if the arg number is smaller than the
595 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000596 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000597
Vikram S. Advee9327f02002-05-19 15:25:51 +0000598 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000599
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000600 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
601 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000602
Vikram S. Advee9327f02002-05-19 15:25:51 +0000603 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000604
605 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000606 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000607 assert (LR && "Must have a LR for all arguments since "
608 "all args (even consts) must be defined before");
609
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000610 unsigned regType = getRegType( LR );
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000611 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000612
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000613 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000614 // an INT or FP value. Here we ignore whether or not it is a
615 // varargs calls, because FP arguments will be explicitly copied
616 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000617 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000618 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
619 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
620 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
621 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000622
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000623 // If a register could be allocated, use it.
624 // If not, do NOTHING as this will be colored as a normal value.
625 if(regNum != InvalidRegNum)
626 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000627
Vikram S. Advee9327f02002-05-19 15:25:51 +0000628 // Repeat for the second copy of the argument, which would be
629 // an FP argument being passed to a function with no prototype
630 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
631 if (argCopy != NULL)
632 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000633 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000634 && "Must be passing copy of FP argument in int register");
635 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
636 argNo, intArgNo, fpArgNo-1,
637 regClassIDOfArgReg);
638 assert(copyRegNum != InvalidRegNum);
639 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
640 copyLR->setSuggestedColor(copyRegNum);
641 }
642
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000643 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000644
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000645}
646
647
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000648//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000649// Helper method for UltraSparcRegInfo::colorCallArgs().
650//---------------------------------------------------------------------------
651
652void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000653UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000654 AddedInstrns *CallAI,
655 PhyRegAlloc &PRA, LiveRange* LR,
656 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000657 int UniArgRegOrNone, unsigned argNo,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000658 std::vector<MachineInstr *>& AddedInstrnsBefore)
659 const
660{
661 MachineInstr *AdMI;
662 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000663 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000664 if (UniArgRegOrNone != InvalidRegNum)
665 {
666 isArgInReg = true;
667 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000668 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000669 }
670
671 if (LR->hasColor()) {
672 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
673
674 // if LR received the correct color, nothing to do
675 if( isArgInReg && UniArgReg == UniLRReg )
676 return;
677
678 // The LR is allocated to a register UniLRReg and must be copied
679 // to UniArgReg or to the stack slot.
680 //
681 if( isArgInReg ) {
682 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000683 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000684 }
685 else {
686 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000687 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000688 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000689 cpReg2MemMI(CallAI->InstrnsBefore,
690 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000691 }
692
693 } else { // LR is not colored (i.e., spilled)
694
695 if( isArgInReg ) {
696 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000697 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
698 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000699 // Now add the instruction
700 }
701
702 else {
703 // Now, we have to pass the arg on stack. Since LR also did NOT
704 // receive a register we have to move an argument in memory to
705 // outgoing parameter on stack.
706 // Use TReg to load and store the value.
707 // Use TmpOff to save TReg, since that may have a live value.
708 //
709 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Chris Lattnerd47aac92002-12-28 20:21:29 +0000710 int TmpOff = PRA.MF.getInfo()->
711 pushTempValue(getSpilledRegSize(getRegType(LR)));
712 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000713 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000714
715 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
716
717 // Sequence:
718 // (1) Save TReg on stack
719 // (2) Load LR value into TReg from stack pos of LR
720 // (3) Store Treg on outgoing Arg pos on stack
721 // (4) Load the old value of TReg from stack to TReg (restore it)
722 //
723 // OPTIMIZE THIS:
724 // When reverse pointers in MahineInstr are introduced:
725 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
726 // needed only if this fails. Currently, we cannot call the
727 // above method since we cannot find LVSetBefore without the BB
728 //
729 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
730 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000731 cpReg2MemMI(CallAI->InstrnsBefore,
732 TReg, getFramePointer(), TmpOff, regType);
733 cpMem2RegMI(CallAI->InstrnsBefore,
734 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
735 cpReg2MemMI(CallAI->InstrnsBefore,
736 TReg, getStackPointer(), argOffset, regType);
737 cpMem2RegMI(CallAI->InstrnsBefore,
738 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000739 }
740 }
741}
742
743//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000744// After graph coloring, we have call this method to see whehter the return
745// value and the call args received the correct colors. If not, we have
746// to instert copy instructions.
747//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000748
Vikram S. Adveaee67012002-07-08 23:23:12 +0000749void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000750 LiveRangeInfo &LRI,
751 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000752 PhyRegAlloc &PRA,
753 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000754
Vikram S. Adve879eac92002-10-13 00:05:30 +0000755 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000756
Vikram S. Advee9327f02002-05-19 15:25:51 +0000757 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
758
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000759 // First color the return value of the call.
760 // If there is a LR for the return value, it means this
761 // method returns a value
762
763 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000764
Vikram S. Advee9327f02002-05-19 15:25:51 +0000765 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000766
Chris Lattner30e8fb62002-02-05 01:43:49 +0000767 if (RetVal) {
768 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000769
Chris Lattner30e8fb62002-02-05 01:43:49 +0000770 if (!RetValLR) {
771 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000772 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000773 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000774
775 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000776 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000777 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000778 unsigned UniRetReg; // unified number for CorrectCol
779
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000780 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000781 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000782 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000783 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000784 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000785 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000786 return;
787 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000788
789 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000790 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000791
Vikram S. Adveaee67012002-07-08 23:23:12 +0000792 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000793 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000794
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000795 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000796 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
797 : false;
798
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000799 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000800 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000801 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000802
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000803 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000804
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000805 if( RetValLR->hasColor() ) {
806
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000807 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000808
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000809 // the return value is coming in UniRetReg but has to go into
810 // the UniRetLRReg
811
Vikram S. Adveaee67012002-07-08 23:23:12 +0000812 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000813
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000814 } // if LR has color
815 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000816
817 // if the LR did NOT receive a color, we have to move the return
818 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000819
Vikram S. Adveaee67012002-07-08 23:23:12 +0000820 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
821 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000822 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000823
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000824 } // the LR didn't receive the suggested color
825
826 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000827
828
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000829 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000830 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000831 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000832
Chris Lattner7f74a562002-01-20 22:54:45 +0000833 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000834
835 unsigned NumOfCallArgs = argDesc->getNumArgs();
836
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000837 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
838 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000839
Vikram S. Advee9327f02002-05-19 15:25:51 +0000840 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
841
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000842 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000843 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000844
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000845 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000846 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000847
Vikram S. Advee9327f02002-05-19 15:25:51 +0000848 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000849 // Also find the correct register the argument must use (UniArgReg)
850 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000851 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000852 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000853 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000854
Vikram S. Advee9327f02002-05-19 15:25:51 +0000855 // Find the register that must be used for this arg, depending on
856 // whether it is an INT or FP value. Here we ignore whether or not it
857 // is a varargs calls, because FP arguments will be explicitly copied
858 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000859 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000860 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
861 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
862 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
863 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000864
865 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000866 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000867 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000868 assert(regClassIDOfArgReg == RegClassID &&
869 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000870 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000871
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000872 // not possible to have a null LR since all args (even consts)
873 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000874 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000875 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000876 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000878
879 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
880 UniArgReg, argNo, AddedInstrnsBefore);
881
882 // Repeat for the second copy of the argument, which would be
883 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000884 // It may either be passed as a copy in an integer register
885 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000886 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
887 if (argCopy != NULL)
888 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000889 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000890 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000891
Vikram S. Advee9327f02002-05-19 15:25:51 +0000892 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
893 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
894
895 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
896 argNo, intArgNo, fpArgNo-1,
897 regClassIDOfArgReg);
898 assert(copyRegNum != InvalidRegNum);
899 assert(regClassIDOfArgReg == copyRegClassID &&
900 "Moving values between reg classes must happen during selection");
901
902 InitializeOutgoingArg(CallMI, CallAI, PRA,
903 LRI.getLiveRangeForValue(argCopy), copyRegType,
904 copyRegClassID, copyRegNum, argNo,
905 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000906 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000907
908 if (regNum != InvalidRegNum &&
909 argDesc->getArgInfo(i).usesStackSlot())
910 {
911 // Pass the argument via the stack in addition to regNum
912 assert(regType != IntRegType && "Passing an integer arg. twice?");
913 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
914 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
915 InvalidRegNum, argNo, AddedInstrnsBefore);
916 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000917 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000918
Vikram S. Advee9327f02002-05-19 15:25:51 +0000919 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000920 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000921 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000922 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000923 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000924
Chris Lattner5216cc52002-02-04 05:59:25 +0000925 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000926 cerr << "\nCalling reorder with instrns: \n";
927 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
928 cerr << *(AddedInstrnsBefore[i]);
929 }
930
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000931 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
932 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
933 && "Dropped some instructions when reordering!");
934
Chris Lattner5216cc52002-02-04 05:59:25 +0000935 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000936 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000937 for(unsigned i = 0; i < ReorderedVec.size(); i++)
938 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000939 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000940 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000941
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000942 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000943 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000944 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
945 CallMI, BB, PRA);
946
947 // Then insert the final reordered code for the call arguments.
948 //
949 for(unsigned i=0; i < ReorderedVec.size(); i++)
950 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000951}
952
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000953//---------------------------------------------------------------------------
954// This method is called for an LLVM return instruction to identify which
955// values will be returned from this method and to suggest colors.
956//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000957void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000958 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000959
Vikram S. Adve879eac92002-10-13 00:05:30 +0000960 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000961
Vikram S. Adveaee67012002-07-08 23:23:12 +0000962 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000963
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000964 // if there is an implicit ref, that has to be the ret value
965 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000966
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000967 // The first implicit operand is the return value of a return instr
968 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000969
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000970 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000971
Chris Lattner30e8fb62002-02-05 01:43:49 +0000972 if (!LR) {
973 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
974 assert(0 && "No LR for return value of non-void method");
975 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000976
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000977 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000978
Chris Lattner5216cc52002-02-04 05:59:25 +0000979 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000980 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000981 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000982 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000983 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000984}
985
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000986
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000987
988//---------------------------------------------------------------------------
989// Colors the return value of a method to %i0 or %f0, if possible. If it is
990// not possilbe to directly color the LR, insert a copy instruction to move
991// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
992// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000993//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000994void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000995 LiveRangeInfo &LRI,
996 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000997
Vikram S. Adve879eac92002-10-13 00:05:30 +0000998 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000999
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001000 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001001 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001002
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001003 // The first implicit operand is the return value of a return instr
1004 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001005
Chris Lattner5216cc52002-02-04 05:59:25 +00001006 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001007
Chris Lattner30e8fb62002-02-05 01:43:49 +00001008 if (!LR) {
1009 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1010 // assert( LR && "No LR for return value of non-void method");
1011 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001012 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001013
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001015 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001016
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001017 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001018 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001019 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001020 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001021 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001022 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001023 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001024 return;
1025 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001026
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001027 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001028 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001029
Vikram S. Adveaee67012002-07-08 23:23:12 +00001030 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001031 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001032
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001033 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001034
Chris Lattner5216cc52002-02-04 05:59:25 +00001035 if (LR->hasColor() && LR->getColor() == CorrectCol)
1036 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001037
Chris Lattner5216cc52002-02-04 05:59:25 +00001038 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001039
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001040 // We are here because the LR was allocted a regiter
1041 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001042
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001043 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001044
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001045 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001046
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001047 // the LR received UniLRReg but must be colored with UniRetReg
1048 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001049 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001050 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001051 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001052 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1053 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001054 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001055 }
1056
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001057 } // if there is a return value
1058
1059}
1060
Vikram S. Adveaee67012002-07-08 23:23:12 +00001061//---------------------------------------------------------------------------
1062// Check if a specified register type needs a scratch register to be
1063// copied to/from memory. If it does, the reg. type that must be used
1064// for scratch registers is returned in scratchRegType.
1065//
1066// Only the int CC register needs such a scratch register.
1067// The FP CC registers can (and must) be copied directly to/from memory.
1068//---------------------------------------------------------------------------
1069
1070bool
1071UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1072 int& scratchRegType) const
1073{
1074 if (RegType == IntCCRegType)
1075 {
1076 scratchRegType = IntRegType;
1077 return true;
1078 }
1079 return false;
1080}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001081
1082//---------------------------------------------------------------------------
1083// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001084// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001085//---------------------------------------------------------------------------
1086
Vikram S. Advee9327f02002-05-19 15:25:51 +00001087void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001088UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1089 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001090 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001091 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001092 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001093 "Invalid Register");
1094
1095 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001096
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001097 switch( RegType ) {
1098
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001099 case IntCCRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001100 if (getRegType(DestReg) == IntRegType)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001101 { // copy intCC reg to int reg
1102 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1103 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1104 }
1105 else
1106 { // copy int reg to intCC reg
1107 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner56e91662002-08-12 21:25:05 +00001108 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adveaee67012002-07-08 23:23:12 +00001109 && "Can only copy CC reg to/from integer reg");
1110 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1111 }
1112 break;
1113
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001114 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001115 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001116 break;
1117
1118 case IntRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001119 MI = Create3OperandInstr_Reg(ADD, SrcReg, getZeroRegNum(), DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001120 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001121
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001122 case FPSingleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001123 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001124 break;
1125
1126 case FPDoubleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001127 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001128 break;
1129
1130 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001131 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001132 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001133 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001134
1135 if (MI)
1136 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001137}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001138
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001139//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001140// Copy from a register to memory (i.e., Store). Register number must
1141// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001142//---------------------------------------------------------------------------
1143
1144
Vikram S. Advee9327f02002-05-19 15:25:51 +00001145void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001146UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1147 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001148 unsigned DestPtrReg,
1149 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001150 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001151 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001152 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001153 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001154 assert(target.getInstrInfo().constantFitsInImmedField(STX, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001155 MI = new MachineInstr(STX, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001156 MI->SetMachineOperandReg(0, SrcReg);
1157 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001158 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1159 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001160 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001161 break;
1162
1163 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001164 assert(target.getInstrInfo().constantFitsInImmedField(ST, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001165 MI = new MachineInstr(ST, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001166 MI->SetMachineOperandReg(0, SrcReg);
1167 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001168 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1169 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001170 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001171 break;
1172
1173 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001174 assert(target.getInstrInfo().constantFitsInImmedField(STD, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001175 MI = new MachineInstr(STD, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001176 MI->SetMachineOperandReg(0, SrcReg);
1177 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001178 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1179 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001180 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001181 break;
1182
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001183 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001184 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001185 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001186
1187 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1188 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1189 mvec.push_back(MI);
1190
Chris Lattner56e91662002-08-12 21:25:05 +00001191 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001192 break;
1193
1194 case FloatCCRegType:
1195 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001196 assert(target.getInstrInfo().constantFitsInImmedField(STXFSR, Offset));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001197 MI = new MachineInstr(STXFSR, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001198 MI->SetMachineOperandReg(0, SrcReg);
1199 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001200 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1201 (int64_t) Offset);
1202 mvec.push_back(MI);
1203 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001204
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001205 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001206 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001207 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001208}
1209
1210
1211//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001212// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001213// register number
1214//---------------------------------------------------------------------------
1215
1216
Vikram S. Advee9327f02002-05-19 15:25:51 +00001217void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001218UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1219 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001220 int Offset,
1221 unsigned DestReg,
1222 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001223 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001224 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001225 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001226 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001227 assert(target.getInstrInfo().constantFitsInImmedField(LDX, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001228 MI = new MachineInstr(LDX, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001229 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001230 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1231 (int64_t) Offset);
1232 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001233 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001234 break;
1235
1236 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001237 assert(target.getInstrInfo().constantFitsInImmedField(LD, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001238 MI = new MachineInstr(LD, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001239 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001240 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1241 (int64_t) Offset);
1242 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001243 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001244 break;
1245
1246 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001247 assert(target.getInstrInfo().constantFitsInImmedField(LDD, Offset));
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001248 MI = new MachineInstr(LDD, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001249 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001250 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1251 (int64_t) Offset);
1252 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001253 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001254 break;
1255
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001256 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001257 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001258 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1259 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001260
1261 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1262 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1263 mvec.push_back(MI);
1264
1265 break;
1266
1267 case FloatCCRegType:
1268 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001269 assert(target.getInstrInfo().constantFitsInImmedField(LDXFSR, Offset));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001270 MI = new MachineInstr(LDXFSR, 3);
Chris Lattner780090b2002-10-28 19:46:25 +00001271 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001272 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1273 (int64_t) Offset);
1274 MI->SetMachineOperandReg(2, DestReg, true);
1275 mvec.push_back(MI);
1276 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001277
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001278 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001279 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001280 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001281}
1282
1283
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001284//---------------------------------------------------------------------------
1285// Generate a copy instruction to copy a value to another. Temporarily
1286// used by PhiElimination code.
1287//---------------------------------------------------------------------------
1288
1289
Vikram S. Advee9327f02002-05-19 15:25:51 +00001290void
1291UltraSparcRegInfo::cpValue2Value(Value *Src,
1292 Value *Dest,
1293 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001294 int RegType = getRegType( Src );
1295
1296 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001297
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001298 MachineInstr * MI = NULL;
1299
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001300 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001301 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001302 MI = new MachineInstr(ADD, 3);
Chris Lattner9bebf832002-10-28 20:10:56 +00001303 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
Chris Lattner780090b2002-10-28 19:46:25 +00001304 MI->SetMachineOperandReg(1, getZeroRegNum());
Chris Lattner9bebf832002-10-28 20:10:56 +00001305 MI->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001306 break;
1307
1308 case FPSingleRegType:
1309 MI = new MachineInstr(FMOVS, 2);
Chris Lattner9bebf832002-10-28 20:10:56 +00001310 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
1311 MI->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001312 break;
1313
1314
1315 case FPDoubleRegType:
1316 MI = new MachineInstr(FMOVD, 2);
Chris Lattner9bebf832002-10-28 20:10:56 +00001317 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
1318 MI->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001319 break;
1320
1321 default:
1322 assert(0 && "Unknow RegType in CpValu2Value");
1323 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001324
Chris Lattner9bebf832002-10-28 20:10:56 +00001325 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001326}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001327
1328
1329
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001330
1331
1332
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001333//----------------------------------------------------------------------------
1334// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001335// a call machine instruction. The caller saving/restoring instructions are
1336// inserted like:
1337//
1338// ** caller saving instructions
1339// other instructions inserted for the call by ColorCallArg
1340// CALL instruction
1341// other instructions inserted for the call ColorCallArg
1342// ** caller restoring instructions
1343//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001344//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001345
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001346
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001347void
1348UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1349 vector<MachineInstr*>& instrnsAfter,
1350 MachineInstr *CallMI,
1351 const BasicBlock *BB,
1352 PhyRegAlloc &PRA) const
1353{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001354 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001355
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001356 // has set to record which registers were saved/restored
1357 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001358 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001359
Vikram S. Advee9327f02002-05-19 15:25:51 +00001360 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1361
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001362 // Now find the LR of the return value of the call
1363 // The last *implicit operand* is the return value of a call
1364 // Insert it to to he PushedRegSet since we must not save that register
1365 // and restore it after the call.
1366 // We do this because, we look at the LV set *after* the instruction
1367 // to determine, which LRs must be saved across calls. The return value
1368 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001369
Vikram S. Advee9327f02002-05-19 15:25:51 +00001370 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001371
Chris Lattner5216cc52002-02-04 05:59:25 +00001372 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001373 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001374 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001375
Chris Lattner5216cc52002-02-04 05:59:25 +00001376 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001377 PushedRegSet.insert(
1378 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001379 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001380 }
1381
Vikram S. Advee9327f02002-05-19 15:25:51 +00001382 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001383 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001384
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001385 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001386 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001387
1388 // get the live range corresponding to live var
1389 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1390
1391 // LR can be null if it is a const since a const
1392 // doesn't have a dominating def - see Assumptions above
1393 if( LR ) {
1394
1395 if( LR->hasColor() ) {
1396
1397 unsigned RCID = (LR->getRegClass())->getID();
1398 unsigned Color = LR->getColor();
1399
1400 if ( isRegVolatile(RCID, Color) ) {
1401
1402 // if the value is in both LV sets (i.e., live before and after
1403 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001404
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001405 unsigned Reg = getUnifiedRegNum(RCID, Color);
1406
1407 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1408
1409 // if we haven't already pushed that register
1410
1411 unsigned RegType = getRegType( LR );
1412
1413 // Now get two instructions - to push on stack and pop from stack
1414 // and add them to InstrnsBefore and InstrnsAfter of the
1415 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001416 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001417 int StackOff =
1418 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001419
Vikram S. Adveaee67012002-07-08 23:23:12 +00001420 vector<MachineInstr*> AdIBef, AdIAft;
1421
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001422 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001423
1424 // We may need a scratch register to copy the saved value
1425 // to/from memory. This may itself have to insert code to
1426 // free up a scratch register. Any such code should go before
1427 // the save code.
1428 int scratchRegType = -1;
1429 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001430 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001431 { // Find a register not live in the LVSet before CallMI
1432 const ValueSet &LVSetBef =
1433 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1434 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1435 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001436 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001437 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001438 }
1439
1440 if (AdIBef.size() > 0)
1441 instrnsBefore.insert(instrnsBefore.end(),
1442 AdIBef.begin(), AdIBef.end());
1443
1444 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1445 scratchReg);
1446
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001447 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001448 instrnsBefore.insert(instrnsBefore.end(),
1449 AdIAft.begin(), AdIAft.end());
1450
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001451 //---- Insert code for popping the reg from the stack ----------
1452
Vikram S. Adveaee67012002-07-08 23:23:12 +00001453 // We may need a scratch register to copy the saved value
1454 // from memory. This may itself have to insert code to
1455 // free up a scratch register. Any such code should go
1456 // after the save code.
1457 //
1458 scratchRegType = -1;
1459 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001460 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001461 { // Find a register not live in the LVSet after CallMI
1462 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1463 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001464 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001465 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001466 }
1467
1468 if (AdIBef.size() > 0)
1469 instrnsAfter.insert(instrnsAfter.end(),
1470 AdIBef.begin(), AdIBef.end());
1471
1472 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1473 scratchReg);
1474
1475 if (AdIAft.size() > 0)
1476 instrnsAfter.insert(instrnsAfter.end(),
1477 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001478
Chris Lattner7e5ee422002-02-05 04:20:12 +00001479 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001480
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001481 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001482 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001483 cerr << " -inserted caller saving instrs: Before:\n\t ";
1484 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001485 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001486 cerr << " -and After:\n\t ";
1487 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001488 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001489 }
1490 } // if not already pushed
1491
1492 } // if LR has a volatile color
1493
1494 } // if LR has color
1495
1496 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001497
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001498 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001499}
1500
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001501
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001502//---------------------------------------------------------------------------
1503// Print the register assigned to a LR
1504//---------------------------------------------------------------------------
1505
Chris Lattner5216cc52002-02-04 05:59:25 +00001506void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001507 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001508 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001509
Chris Lattner5216cc52002-02-04 05:59:25 +00001510 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001511 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001512 return;
1513 }
1514
1515 // if a color is found
1516
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001517 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001518
Chris Lattner5216cc52002-02-04 05:59:25 +00001519 if (RegClassID == IntRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001520 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001521
Chris Lattner5216cc52002-02-04 05:59:25 +00001522 } else if (RegClassID == FloatRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001523 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001524 if( LR->getType() == Type::DoubleTy)
Chris Lattner56e91662002-08-12 21:25:05 +00001525 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001526 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001527 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001528}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001529
1530//---------------------------------------------------------------------------
1531// This method examines instructions inserted by RegAlloc code before a
1532// machine instruction to detect invalid orders that destroy values before
1533// they are used. If it detects such conditions, it reorders the instructions.
1534//
1535// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001536// instructions inserted by RegAlloc. All such instruction MUST have
1537// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001538//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001539// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1540// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001541//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001542// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001543//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001544// Since instructions are inserted in RegAlloc, this assumes that the
1545// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001546// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001547//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001548// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001549//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001550
1551void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1552 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001553 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001554
1555 /*
1556 Problem: We can have instructions inserted by RegAlloc like
1557 1. add %ox %g0 %oy
1558 2. add %oy %g0 %oz, where z!=x or z==x
1559
1560 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561
1562 Solution:
1563 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001564
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565 Algorithm:
1566
1567 do
1568 for each instruction 'DefInst' in the UnOrdVec
1569 for each instruction 'UseInst' that follows the DefInst
1570 if the reg defined by DefInst is used by UseInst
1571 mark DefInst as not movable in this iteration
1572 If DefInst is not marked as not-movable, move DefInst to OrdVec
1573 while all instructions in DefInst are moved to OrdVec
1574
1575 For moving, we call the move2OrdVec(). It checks whether there is a def
1576 in it for the uses in the instruction to be added to OrdVec. If there
1577 are no preceding defs, it just appends the instruction. If there is a
1578 preceding def, it puts two instructions to save the reg on stack before
1579 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001580
1581 */
1582
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001583 bool CouldMoveAll;
1584 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001585
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001586 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001587 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001588 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001589
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001590 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001591
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001592 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001593
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001594 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001595
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001596 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001597
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001598 //cerr << "\nInst in UnordVec = " << *DefInst;
1599
1600 // last operand is the def (unless for a store which has no def reg)
1601 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1602
Chris Lattner6a30b022002-10-28 04:45:29 +00001603 if (DefOp.opIsDef() &&
1604 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001605
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001606 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001607 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001608
Chris Lattner7f74a562002-01-20 22:54:45 +00001609 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001610 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001611
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001612 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1613
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001614 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001615 if( UseInst == NULL) continue;
1616
1617 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001618 MachineOperand& UseOp = UseInst->getOperand(0);
1619
Chris Lattner6a30b022002-10-28 04:45:29 +00001620 if (!UseOp.opIsDef() &&
1621 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001622
1623 // if use is a register ...
1624
1625 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1626
1627 // if Def and this use are the same, it means that this use
1628 // is destroyed by a def before it is used
1629
1630 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001631
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001632 DefEqUse = true;
1633 CouldMoveAll = false;
1634 DebugPrint = true;
1635 break;
1636 } // if two registers are equal
1637
1638 } // if use is a register
1639
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001640 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001641
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001642 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001643
1644 // after examining all the instructions that follow the DefInst
1645 // if there are no dependencies, we can move it to the OrdVec
1646
1647 // cerr << "Moved to Ord: " << *DefInst;
1648
1649 moveInst2OrdVec(OrdVec, DefInst, PRA);
1650
1651 //OrdVec.push_back(DefInst);
1652
1653 // mark the pos of DefInst with NULL to indicate that it is
1654 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001655 *DefIt = NULL;
1656 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001657
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001658 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001659
1660 } // for all instructions in the UnordVec
1661
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001662
Chris Lattner5216cc52002-02-04 05:59:25 +00001663 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001664
Chris Lattner070cf772002-06-04 03:09:57 +00001665 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001666 cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001667 for(unsigned i=0; i < OrdVec.size(); i++)
1668 cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001669 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001670}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001671
1672
1673
1674
1675
Chris Lattner7f74a562002-01-20 22:54:45 +00001676void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001677 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001678 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001679 MachineOperand& UseOp = UnordInst->getOperand(0);
1680
Chris Lattner6a30b022002-10-28 04:45:29 +00001681 if (!UseOp.opIsDef() &&
1682 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001683
1684 // for the use of UnordInst, see whether there is a defining instr
1685 // before in the OrdVec
1686 bool DefEqUse = false;
1687
Chris Lattner7f74a562002-01-20 22:54:45 +00001688 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001689
1690 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1691
1692 MachineInstr *OrdInst = *OrdIt ;
1693
1694 MachineOperand& DefOp =
1695 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1696
1697 if( DefOp.opIsDef() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001698 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001699
1700 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1701
1702 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1703
1704 // we are here because there is a preceding def in the OrdVec
1705 // for the use in this intr we are going to insert. This
1706 // happened because the original code was like:
1707 // 1. add %ox %g0 %oy
1708 // 2. add %oy %g0 %ox
1709 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1710 // Now we are processing %ox of 1.
1711 // We have to
1712
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001713 int UReg = DefOp.getMachineRegNum();
1714 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001715 MachineInstr *AdIBef, *AdIAft;
1716
Chris Lattnerd47aac92002-12-28 20:21:29 +00001717 int StackOff =
1718 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001719
1720 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001721 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001722 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Chris Lattnerd47aac92002-12-28 20:21:29 +00001723 for (vector<MachineInstr*>::iterator MI=mvec.begin();
1724 MI != mvec.end(); ++MI)
1725 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001726
1727 // Load directly into DReg (%oy)
1728 MachineOperand& DOp=
1729 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1730 assert(DOp.opIsDef() && "Last operand is not the def");
1731 const int DReg = DOp.getMachineRegNum();
1732
Vikram S. Adveaee67012002-07-08 23:23:12 +00001733 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001734
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001735 if( DEBUG_RA ) {
Vikram S. Adve92ccbb92002-10-14 16:32:49 +00001736 cerr << "\nFixed CIRCULAR references by reordering:";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001737 cerr << "\nBefore CIRCULAR Reordering:\n";
1738 cerr << *UnordInst;
1739 cerr << *OrdInst;
1740
1741 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1742 for(unsigned i=0; i < OrdVec.size(); i++)
1743 cerr << *(OrdVec[i]);
1744 }
1745
1746 // Do not copy the UseInst to OrdVec
1747 DefEqUse = true;
1748 break;
1749
1750 }// if two registers are equal
1751
1752 } // if Def is a register
1753
1754 } // for each instr in OrdVec
1755
Chris Lattner5216cc52002-02-04 05:59:25 +00001756 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001757
1758 // We didn't find a def in the OrdVec, so just append this inst
1759 OrdVec.push_back( UnordInst );
1760 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1761 }
1762
1763 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001764}