blob: b660e89805fb1b218ab16f97b1ff4002381769a7 [file] [log] [blame]
Chris Lattnered5171e2002-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 Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner699683c2002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +000014#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000015#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000016#include "llvm/iTerminators.h"
17#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000018#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000019#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000020#include <iostream>
Vikram S. Adve31f78c42002-04-25 04:42:21 +000021#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000022using std::cerr;
Chris Lattner20b1ea02001-09-14 03:47:57 +000023
Chris Lattner699683c2002-02-04 05:59:25 +000024UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
25 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
26 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
27
28 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
29 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
30 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
31 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
32
33 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
34 "32 Float regs are used for float arg passing");
35}
36
37
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000038// getZeroRegNum - returns the register that contains always zero.
39// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000040//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000041int UltraSparcRegInfo::getZeroRegNum() const {
42 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
43 SparcIntRegOrder::g0);
44}
Chris Lattner699683c2002-02-04 05:59:25 +000045
46// getCallAddressReg - returns the reg used for pushing the address when a
47// method is called. This can be used for other purposes between calls
48//
49unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000050 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
51 SparcIntRegOrder::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000052}
53
54// Returns the register containing the return address.
55// It should be made sure that this register contains the return
56// value when a return instruction is reached.
57//
58unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000059 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
60 SparcIntRegOrder::i7);
Chris Lattner699683c2002-02-04 05:59:25 +000061}
62
63// given the unified register number, this gives the name
64// for generating assembly code or debugging.
65//
66const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
67 if( reg < 32 )
68 return SparcIntRegOrder::getRegName(reg);
69 else if ( reg < (64 + 32) )
70 return SparcFloatRegOrder::getRegName( reg - 32);
71 else if( reg < (64+32+4) )
72 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
73 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
74 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
75 else if (reg== InvalidRegNum) //****** TODO: Remove */
76 return "<*NoReg*>";
77 else
78 assert(0 && "Invalid register number");
79 return "";
80}
81
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000082// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000083unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000084 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
85 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000086}
87
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000088// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000089unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000090 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
91 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000092}
93
94
Vikram S. Adve31f78c42002-04-25 04:42:21 +000095//---------------------------------------------------------------------------
96// Finds whether a call is an indirect call
97//---------------------------------------------------------------------------
98
99inline bool
100isVarArgsFunction(const Type *funcType) {
101 return cast<FunctionType>(cast<PointerType>(funcType)
102 ->getElementType())->isVarArg();
103}
104
105inline bool
106isVarArgsCall(const MachineInstr *CallMI) {
107 Value* callee = CallMI->getOperand(0).getVRegValue();
108 // const Type* funcType = isa<Function>(callee)? callee->getType()
109 // : cast<PointerType>(callee->getType())->getElementType();
110 const Type* funcType = callee->getType();
111 return isVarArgsFunction(funcType);
112}
113
114
115// Get the register number for the specified integer arg#,
116// assuming there are argNum total args, intArgNum int args,
117// and fpArgNum FP args preceding (and not including) this one.
118// Use INT regs for FP args if this is a varargs call.
119//
120// Return value:
121// InvalidRegNum, if there is no int register available for the arg.
122// regNum, otherwise (this is NOT the unified reg. num).
123//
124inline int
125UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
126 unsigned argNo,
127 unsigned intArgNo, unsigned fpArgNo,
128 unsigned& regClassId) const
129{
130 int firstArgReg = inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0;
131 if (argNo >= NumOfIntArgRegs)
132 return InvalidRegNum;
133 else {
134 regClassId = IntRegClassID;
135 return isVarArgsCall? firstArgReg + argNo
136 : firstArgReg + intArgNo;
137 }
138}
139
140// Get the register number for the specified FP arg#,
141// assuming there are argNum total args, intArgNum int args,
142// and fpArgNum FP args preceding (and not including) this one.
143// Use INT regs for FP args if this is a varargs call.
144//
145// Return value:
146// InvalidRegNum, if there is no int register available for the arg.
147// regNum, otherwise (this is NOT the unified reg. num).
148//
149inline int
150UltraSparcRegInfo::regNumForFPArg(unsigned regType,
151 bool inCallee, bool isVarArgsCall,
152 unsigned argNo,
153 unsigned intArgNo, unsigned fpArgNo,
154 unsigned& regClassId) const
155{
156 if (isVarArgsCall) {
157 assert(! isVarArgsCall &&
158 "FP arguments to a varargs function should be explicitly copied "
159 "to/from int registers by instruction selection!");
160 return InvalidRegNum;
161 }
162 else {
163 regClassId = FloatRegClassID;
164 if (regType == FPSingleRegType)
165 return (fpArgNo*2+1 >= NumOfFloatArgRegs)?
166 InvalidRegNum : SparcFloatRegOrder::f0 + (fpArgNo * 2 + 1);
167 else if (regType == FPDoubleRegType)
168 return (fpArgNo*2 >= NumOfFloatArgRegs)?
169 InvalidRegNum : SparcFloatRegOrder::f0 + (fpArgNo * 2);
170 else
171 assert(0 && "Illegal FP register type");
172 }
173}
Chris Lattner699683c2002-02-04 05:59:25 +0000174
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000175//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000176// Finds the return value of a sparc specific call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000177//---------------------------------------------------------------------------
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000178
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000179const Value *
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000180UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000181 unsigned OpCode = CallMI->getOpCode();
Chris Lattner697954c2002-01-20 22:54:45 +0000182 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000183
Chris Lattner697954c2002-01-20 22:54:45 +0000184 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000185
186 // The one before the last implicit operand is the return value of
187 // a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000188 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000189 if( NumOfImpRefs > 1 )
Chris Lattner699683c2002-02-04 05:59:25 +0000190 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
191 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000192
Chris Lattner697954c2002-01-20 22:54:45 +0000193 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000194
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000195 // The last implicit operand is the return value of a JMPL
196 //
Chris Lattner697954c2002-01-20 22:54:45 +0000197 if(NumOfImpRefs > 0)
198 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
199 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner699683c2002-02-04 05:59:25 +0000200 } else
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000201 assert(0 && "OpCode must be CALL/JMPL for a call instr");
202
203 return NULL;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000204}
205
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000206
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000207const Value *
208UltraSparcRegInfo::getCallInstIndirectAddrVal(const MachineInstr *CallMI) const
209{
210 return (CallMI->getOpCode() == JMPLCALL)?
211 CallMI->getOperand(0).getVRegValue() : NULL;
212}
213
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000214
215//---------------------------------------------------------------------------
216// Finds the return address of a call sparc specific call instruction
217//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000218const Value *
Chris Lattner699683c2002-02-04 05:59:25 +0000219UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000220 unsigned OpCode = CallMI->getOpCode();
221
Chris Lattner699683c2002-02-04 05:59:25 +0000222 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000223 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
224
225 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000226
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000227 // The last implicit operand is the return address of a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000228 //
Chris Lattner699683c2002-02-04 05:59:25 +0000229 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000230
Chris Lattner699683c2002-02-04 05:59:25 +0000231 } else if(OpCode == JMPLCALL) {
232 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000233 return MO.getVRegValue();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000234 }
Chris Lattner699683c2002-02-04 05:59:25 +0000235
236 assert(0 && "OpCode must be CALL/JMPL for a call instr");
237 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000238}
239
Chris Lattner699683c2002-02-04 05:59:25 +0000240// The following 3 methods are used to find the RegType (see enum above)
241// of a LiveRange, Value and using the unified RegClassID
242//
243int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
Chris Lattner699683c2002-02-04 05:59:25 +0000244 switch (LR->getRegClass()->getID()) {
245 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000246 case FloatRegClassID: {
247 const Type *Typ = LR->getType();
248 if (Typ == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000249 return FPSingleRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000250 else if (Typ == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000251 return FPDoubleRegType;
252 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000253 }
Chris Lattner699683c2002-02-04 05:59:25 +0000254 case IntCCRegClassID: return IntCCRegType;
255 case FloatCCRegClassID: return FloatCCRegType;
256 default: assert( 0 && "Unknown reg class ID");
257 return 0;
258 }
259}
260
261int UltraSparcRegInfo::getRegType(const Value *Val) const {
262 unsigned Typ;
263
264 switch (getRegClassIDOfValue(Val)) {
265 case IntRegClassID: return IntRegType;
Chris Lattner87e873b2002-04-27 02:24:17 +0000266 case FloatRegClassID:
267 if (Val->getType() == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000268 return FPSingleRegType;
Chris Lattner87e873b2002-04-27 02:24:17 +0000269 else if (Val->getType() == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000270 return FPDoubleRegType;
271 assert(0 && "Unknown type in FloatRegClass");
272
Chris Lattner87e873b2002-04-27 02:24:17 +0000273 case IntCCRegClassID: return IntCCRegType;
274 case FloatCCRegClassID: return FloatCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000275 default: assert(0 && "Unknown reg class ID");
276 return 0;
277 }
278}
279
280int UltraSparcRegInfo::getRegType(int reg) const {
281 if (reg < 32)
282 return IntRegType;
283 else if (reg < (32 + 32))
284 return FPSingleRegType;
285 else if (reg < (64 + 32))
286 return FPDoubleRegType;
287 else if (reg < (64+32+4))
288 return FloatCCRegType;
289 else if (reg < (64+32+4+2))
290 return IntCCRegType;
291 else
292 assert(0 && "Invalid register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000293 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000294}
295
296
297
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000298
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000299
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000300//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +0000301// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000302//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000303unsigned
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000304UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
305
306 unsigned OpCode = CallMI->getOpCode();
Chris Lattner699683c2002-02-04 05:59:25 +0000307 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000308
Chris Lattner699683c2002-02-04 05:59:25 +0000309 if (OpCode == CALL) {
310 switch (NumOfImpRefs) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000311 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner699683c2002-02-04 05:59:25 +0000312 case 1: return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000313 default: // two or more implicit refs
Chris Lattner699683c2002-02-04 05:59:25 +0000314 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
315 return NumOfImpRefs - 2;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000316 else
Chris Lattner699683c2002-02-04 05:59:25 +0000317 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000318 }
Chris Lattner699683c2002-02-04 05:59:25 +0000319 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000320
321 // The last implicit operand is the return value of a JMPL instr
322 if( NumOfImpRefs > 0 ) {
Chris Lattner699683c2002-02-04 05:59:25 +0000323 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
324 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000325 else
Chris Lattner699683c2002-02-04 05:59:25 +0000326 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000327 }
328 else
Chris Lattner699683c2002-02-04 05:59:25 +0000329 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000330 }
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000331
Chris Lattner699683c2002-02-04 05:59:25 +0000332 assert(0 && "OpCode must be CALL/JMPL for a call instr");
333 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000334}
335
336
Vikram S. Adve53fec862001-10-22 13:41:12 +0000337
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000338//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000339// Suggests a register for the ret address in the RET machine instruction.
340// We always suggest %i7 by convention.
341//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000342void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000343 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000344
Vikram S. Adve53fec862001-10-22 13:41:12 +0000345 assert( (RetMI->getNumOperands() >= 2)
346 && "JMPL/RETURN must have 3 and 2 operands respectively");
347
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000348 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
349
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000350 // return address is always mapped to i7
351 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000352 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000353
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000354 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000355 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000356 // we have to test later whether it received the suggested color.
357 // In that case, a LR has to be created at the start of method.
358 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000359
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000360 // const Value *RetAddrVal = MO.getVRegValue();
361 // assert( RetAddrVal && "LR for ret address must be created at start");
362 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
363 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
364 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000365}
366
367
368//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000369// Suggests a register for the ret address in the JMPL/CALL machine instr.
370// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000371//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000372void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
373 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000374 std::vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000375
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000376
377 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
378
379 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
380 // create a new LR for the return address and color it
381
382 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000383 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000384 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
385 RetAddrLR->setRegClass( RCList[RegClassID] );
386 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
387 LRI.addLRToMap( RetAddrVal, RetAddrLR);
388
Ruchira Sasanka91442282001-09-30 23:16:47 +0000389}
390
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000391
392
Ruchira Sasanka91442282001-09-30 23:16:47 +0000393
394//---------------------------------------------------------------------------
395// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000396// According to the Sparc ABI, the first 6 incoming args are in
397// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000398// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000399// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000400//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000401void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000402 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000403{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000404 // check if this is a varArgs function. needed for choosing regs.
405 bool isVarArgs = isVarArgsFunction(Meth->getType());
406
407 // get the argument list
Chris Lattnerb7653df2002-04-08 22:03:57 +0000408 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000409
410 // for each argument. count INT and FP arguments separately.
411 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
412 argNo != ArgList.size(); ++argNo)
413 {
414 // get the LR of arg
415 LiveRange *LR = LRI.getLiveRangeForValue((const Value *)ArgList[argNo]);
416 assert( LR && "No live range found for method arg");
417
418 unsigned regType = getRegType( LR );
419 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
420
421 int regNum = (regType == IntRegType)
422 ? regNumForIntArg(true, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
423 : regNumForFPArg(regType, true, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
424
425 if(regNum != InvalidRegNum)
426 LR->setSuggestedColor(regNum);
Chris Lattner20b1ea02001-09-14 03:47:57 +0000427 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000428}
429
Ruchira Sasanka91442282001-09-30 23:16:47 +0000430
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000431
432//---------------------------------------------------------------------------
433// This method is called after graph coloring to move incoming args to
434// the correct hardware registers if they did not receive the correct
435// (suggested) color through graph coloring.
436//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000437void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000438 LiveRangeInfo &LRI,
439 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000440
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000441 // check if this is a varArgs function. needed for choosing regs.
442 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000443 // get the argument list
Chris Lattnerb7653df2002-04-08 22:03:57 +0000444 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000445 // get an iterator to arg list
Ruchira Sasanka91442282001-09-30 23:16:47 +0000446 MachineInstr *AdMI;
447
Ruchira Sasanka91442282001-09-30 23:16:47 +0000448 // for each argument
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000449 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
450 argNo != ArgList.size(); ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000451 // get the LR of arg
Chris Lattnerb62fc4a2002-04-09 19:46:27 +0000452 LiveRange *LR = LRI.getLiveRangeForValue((Value*)ArgList[argNo]);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000453 assert( LR && "No live range found for method arg");
454
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000455 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000456 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000457
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000458 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000459 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000460 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000461 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000462 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000463 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
464
465 int regNum = (regType == IntRegType)
466 ? regNumForIntArg(true, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
467 : regNumForFPArg(regType, true, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
468
469 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000470 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000471 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000472 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000473
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000474 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000475
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000476 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
477
478 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000479 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000480 if( UniLRReg == UniArgReg )
481 continue;
482
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000483 // We are here because the LR did not receive the suggested
484 // but LR received another register.
485 // Now we have to copy the %i reg (or stack pos of arg)
486 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000487
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000488 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000489 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000490 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000491 if( isArgInReg ) {
492 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, regType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000493
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000494 if( regClassIDOfArgReg != RegClassID ) {
495 assert(0 &&
496 "FP arguments to a varargs function should be explicitly "
497 "copied to/from int registers by instruction selection!");
498
499 // It is a variable argument call: the float reg must go in a %o reg.
500 // We have to move an int reg to a float reg via memory.
501 //
502 assert(isVarArgs &&
503 RegClassID == FloatRegClassID &&
504 regClassIDOfArgReg == IntRegClassID &&
505 "This should only be an Int register for an FP argument");
506
507 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
508 getSpilledRegSize(regType));
509 AdMI = cpReg2MemMI(UniArgReg, getFramePointer(), TmpOff, IntRegType);
510 FirstAI->InstrnsBefore.push_back(AdMI);
511
512 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniLRReg, regType);
513 FirstAI->InstrnsBefore.push_back(AdMI);
514 }
515 else {
516 AdMI = cpReg2RegMI(UniArgReg, UniLRReg, regType );
517 FirstAI->InstrnsBefore.push_back( AdMI );
518 }
519 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000520 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000521
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000522 // Now the arg is coming on stack. Since the LR recieved a register,
523 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000524 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000525 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000526 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000527 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
528 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000529
530 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000531 UniLRReg, regType );
532 FirstAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000533 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000534
535 } // if LR received a color
536
537 else {
538
539 // Now, the LR did not receive a color. But it has a stack offset for
540 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000541 // So, if the arg is coming in UniArgReg register, we can just move
542 // that on to the stack pos of LR
543
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000544 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000545
546 if( regClassIDOfArgReg != RegClassID ) {
547 assert(0 &&
548 "FP arguments to a varargs function should be explicitly "
549 "copied to/from int registers by instruction selection!");
550
551 // It must be a float arg for a variable argument call, which
552 // must come in a %o reg. Move the int reg to the stack.
553 //
554 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
555 "This should only be an Int register for an FP argument");
556
557 AdMI = cpReg2MemMI(UniArgReg, getFramePointer(),
558 LR->getSpillOffFromFP(), IntRegType );
559 }
560 else {
561 AdMI = cpReg2MemMI(UniArgReg, getFramePointer(),
562 LR->getSpillOffFromFP(), regType );
563 }
564
565 FirstAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000566 }
567
568 else {
569
570 // Now the arg is coming on stack. Since the LR did NOT
571 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000572 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000573 // since this method is called before any other method that makes
574 // uses of the stack pos of the LR (e.g., updateMachineInstr)
575
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000576 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000577 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000578 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
579 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000580
581 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000582 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000583
584 }
585
Ruchira Sasanka91442282001-09-30 23:16:47 +0000586 } // for each incoming argument
587
588}
589
Chris Lattner20b1ea02001-09-14 03:47:57 +0000590
591
Ruchira Sasanka91442282001-09-30 23:16:47 +0000592//---------------------------------------------------------------------------
593// This method is called before graph coloring to suggest colors to the
594// outgoing call args and the return value of the call.
595//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000596void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000597 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000598 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000599 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000600
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000601 // check if this is a varArgs function. needed for choosing regs.
602 bool isVarArgs = isVarArgsCall(CallMI);
603
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000604 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000605
Chris Lattner20b1ea02001-09-14 03:47:57 +0000606
Ruchira Sasanka91442282001-09-30 23:16:47 +0000607 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000608 // will be in %o0 if the value is an integer type, or in %f0 if the
609 // value is a float type.
610
Ruchira Sasanka91442282001-09-30 23:16:47 +0000611 // the return value cannot have a LR in machine instruction since it is
612 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000613
Ruchira Sasanka91442282001-09-30 23:16:47 +0000614 // if type is not void, create a new live range and set its
615 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000616
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000617
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000618 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000619
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000620
Chris Lattner699683c2002-02-04 05:59:25 +0000621 if (RetVal) {
622 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000623 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000624
Chris Lattner699683c2002-02-04 05:59:25 +0000625 // create a new LR for the return value
626 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000627 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000628 unsigned RegClassID = getRegClassIDOfValue(RetVal);
629 RetValLR->setRegClass(RCList[RegClassID]);
630 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000631
632 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000633
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000634 if( RegClassID == IntRegClassID )
635 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
636 else if (RegClassID == FloatRegClassID )
637 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
638 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000639 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000640
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000641
Ruchira Sasanka91442282001-09-30 23:16:47 +0000642 // Now suggest colors for arguments (operands) of the call instruction.
643 // Colors are suggested only if the arg number is smaller than the
644 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000645 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000646
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000647 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000648
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000649 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
650 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000651
652 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000653
654 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000655 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000656
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000657 // not possible to have a null LR since all args (even consts)
658 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000659 if (!LR) {
660 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000661 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000662 }
663
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000664 unsigned regType = getRegType( LR );
665 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000666
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000667 // Choose a register for this arg depending on whether it is
668 // an INT or FP value, and if it is a varargs call
669 int regNum = (regType == IntRegType)
670 ? regNumForIntArg(false, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
671 : regNumForFPArg(regType, false, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000672
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000673 // If a register could be allocated, use it.
674 // If not, do NOTHING as this will be colored as a normal value.
675 if(regNum != InvalidRegNum)
676 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000677
Ruchira Sasanka91442282001-09-30 23:16:47 +0000678 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000679
Chris Lattner20b1ea02001-09-14 03:47:57 +0000680}
681
682
Ruchira Sasanka91442282001-09-30 23:16:47 +0000683//---------------------------------------------------------------------------
684// After graph coloring, we have call this method to see whehter the return
685// value and the call args received the correct colors. If not, we have
686// to instert copy instructions.
687//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000688
Chris Lattner699683c2002-02-04 05:59:25 +0000689void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
690 LiveRangeInfo &LRI,
691 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000692 PhyRegAlloc &PRA,
693 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000694
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000695 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
696
Ruchira Sasanka91442282001-09-30 23:16:47 +0000697 // First color the return value of the call.
698 // If there is a LR for the return value, it means this
699 // method returns a value
700
701 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000702
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000703 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000704
Chris Lattner0665a5f2002-02-05 01:43:49 +0000705 if (RetVal) {
706 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000707
Chris Lattner0665a5f2002-02-05 01:43:49 +0000708 if (!RetValLR) {
709 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
710 assert(0 && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000711 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000712
713 unsigned RegClassID = (RetValLR->getRegClass())->getID();
714 bool recvCorrectColor = false;
715
716 unsigned CorrectCol; // correct color for ret value
717 if(RegClassID == IntRegClassID)
718 CorrectCol = SparcIntRegOrder::o0;
719 else if(RegClassID == FloatRegClassID)
720 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000721 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000722 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000723 return;
724 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000725
726 // if the LR received the correct color, NOTHING to do
727
728 if( RetValLR->hasColor() )
729 if( RetValLR->getColor() == CorrectCol )
730 recvCorrectColor = true;
731
732
733 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000734 // put copy instruction
735
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000736 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000737
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000738 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000739
740 // the reg that LR must be colored with
741 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000742
743 if( RetValLR->hasColor() ) {
744
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000745 unsigned
746 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000747
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000748 // the return value is coming in UniRetReg but has to go into
749 // the UniRetLRReg
750
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000751 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, regType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000752
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000753 } // if LR has color
754 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000755
756 // if the LR did NOT receive a color, we have to move the return
757 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000758
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000759 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000760 RetValLR->getSpillOffFromFP(), regType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000761 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000762
763 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000764
765 } // the LR didn't receive the suggested color
766
767 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000768
769
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000770 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000771 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000772 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000773
Chris Lattner697954c2002-01-20 22:54:45 +0000774 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000775
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000776 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000777
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000778 bool isVarArgs = isVarArgsCall(CallMI);
779 if (DEBUG_RA && isVarArgs) cerr << "\nVar arg call found!!\n";
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000780
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000781 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
782 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000783
784 const Value *CallArg = CallMI->getImplicitRef(i);
785
Ruchira Sasanka91442282001-09-30 23:16:47 +0000786 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000787 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000788
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000789 unsigned regType = getRegType( CallArg );
790 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000791
792 // find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000793 // Also find the correct register the argument must use (UniArgReg)
794 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000795 bool isArgInReg = false;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000796 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
797 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
798
799 int regNum = (regType == IntRegType)
800 ? regNumForIntArg(false, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
801 : regNumForFPArg(regType, false, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
802
803 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000804 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000805 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000806 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000807
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000808 // not possible to have a null LR since all args (even consts)
809 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000810 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000811 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000812 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000813 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000814
Chris Lattner699683c2002-02-04 05:59:25 +0000815 if (LR->hasColor()) {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000816 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
817
818 // if LR received the correct color, nothing to do
819 if( UniLRReg == UniArgReg )
820 continue;
821
Ruchira Sasanka91442282001-09-30 23:16:47 +0000822 // We are here because though the LR is allocated a register, it
823 // was not allocated the suggested register. So, we have to copy %ix reg
824 // (or stack pos of arg) to the register it was colored with
825
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000826 // the LR is colored with UniLRReg but has to go into UniArgReg
827 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000828
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000829 if( isArgInReg ) {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000830
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000831 if( regClassIDOfArgReg != RegClassID ) {
832 assert(0 &&
833 "FP arguments to a varargs function should be explicitly "
834 "copied to/from int registers by instruction selection!");
835
836 // It must be a float arg for a variable argument call, which
837 // must come in a %o reg.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000838 // We have to move a float reg to an int reg via memory.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000839 //
840 assert(isVarArgs &&
841 RegClassID == FloatRegClassID &&
842 regClassIDOfArgReg == IntRegClassID &&
843 "This should only be an Int register for an FP argument");
844
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000845 // The store instruction will be directly added to
846 // CallAI->InstrnsBefore since it does not need reordering
847 //
848 int TmpOff = PRA.mcInfo.pushTempValue(target,
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000849 getSpilledRegSize(regType));
850
851 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, regType );
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000852 CallAI->InstrnsBefore.push_back( AdMI );
853
854 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
855 AddedInstrnsBefore.push_back( AdMI );
856 }
857
858 else {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000859 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, regType );
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000860 AddedInstrnsBefore.push_back( AdMI );
861 }
862
Chris Lattner699683c2002-02-04 05:59:25 +0000863 } else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000864 // Now, we have to pass the arg on stack. Since LR received a register
865 // we just have to move that register to the stack position where
866 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000867
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000868 const MachineFrameInfo& frameInfo = target.getFrameInfo();
869 int argOffset =
870 frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
871
872 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, regType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000873
874 // Now add the instruction. We can directly add to
875 // CallAI->InstrnsBefore since we are just saving a reg on stack
876 //
877 CallAI->InstrnsBefore.push_back( AdMI );
878
879 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000880 }
881
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000882
Chris Lattner699683c2002-02-04 05:59:25 +0000883 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000884
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000885 if( isArgInReg ) {
886
887 // Now the LR did NOT recieve a register but has a stack poistion.
888 // Since, the outgoing arg goes in a register we just have to insert
889 // a load instruction to load the LR to outgoing register
890
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000891 if( regClassIDOfArgReg != RegClassID ) {
892 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
893 "This should only be an Int register for an FP argument");
894
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000895 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
896 UniArgReg, IntRegType );
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000897 }
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000898 else
899 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000900 UniArgReg, regType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000901
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000902 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000903 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000904 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000905
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000906 else {
907 // Now, we have to pass the arg on stack. Since LR also did NOT
908 // receive a register we have to move an argument in memory to
909 // outgoing parameter on stack.
910
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000911 // Optimize: Optimize when reverse pointers in MahineInstr are
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000912 // introduced.
913 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
914 // fails, then use the following code. Currently, we cannot call the
915 // above method since we cannot find LVSetBefore without the BB
916
Ruchira Sasanka295264d2001-11-15 20:25:07 +0000917 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000918
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000919 int TmpOff = PRA.mcInfo.pushTempValue(target,
920 getSpilledRegSize(getRegType(LR)) );
921
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000922
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000923 const MachineFrameInfo& frameInfo = target.getFrameInfo();
924 int argOffset =
925 frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000926
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000927 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000928
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000929 // Sequence:
930 // (1) Save TReg on stack
931 // (2) Load LR value into TReg from stack pos of LR
932 // (3) Store Treg on outgoing Arg pos on stack
933 // (4) Load the old value of TReg from stack to TReg (restore it)
934
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000935 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000936 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000937 TReg, regType );
938 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, regType );
939 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000940
941 // We directly add to CallAI->InstrnsBefore instead of adding to
942 // AddedInstrnsBefore since these instructions must not be
943 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000944
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000945 CallAI->InstrnsBefore.push_back( Ad1 );
946 CallAI->InstrnsBefore.push_back( Ad2 );
947 CallAI->InstrnsBefore.push_back( Ad3 );
948 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000949
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000950 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000951 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000952 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000953 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000954
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000955
956 // if we added any instruction before the call instruction, verify
957 // that they are in the proper order and if not, reorder them
958
Chris Lattner699683c2002-02-04 05:59:25 +0000959 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000960
Chris Lattner699683c2002-02-04 05:59:25 +0000961 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000962 cerr << "\nCalling reorder with instrns: \n";
963 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
964 cerr << *(AddedInstrnsBefore[i]);
965 }
966
Chris Lattner697954c2002-01-20 22:54:45 +0000967 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000968 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000969
Chris Lattner699683c2002-02-04 05:59:25 +0000970 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000971 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000972 for(unsigned i = 0; i < TmpVec.size(); i++)
973 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000974 }
975
976 // copy the results back from TmpVec to InstrnsBefore
977 for(unsigned i=0; i < TmpVec.size(); i++)
978 CallAI->InstrnsBefore.push_back( TmpVec[i] );
979 }
980
981
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000982 // now insert caller saving code for this call instruction
983 //
984 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000985}
986
Ruchira Sasanka91442282001-09-30 23:16:47 +0000987//---------------------------------------------------------------------------
988// This method is called for an LLVM return instruction to identify which
989// values will be returned from this method and to suggest colors.
990//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000991void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
992 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000993
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000994 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000995
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000996 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000997
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000998 // if there is an implicit ref, that has to be the ret value
999 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001000
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001001 // The first implicit operand is the return value of a return instr
1002 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001003
Ruchira Sasanka91442282001-09-30 23:16:47 +00001004 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001005
Chris Lattner0665a5f2002-02-05 01:43:49 +00001006 if (!LR) {
1007 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1008 assert(0 && "No LR for return value of non-void method");
1009 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001010
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001011 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001012
Chris Lattner699683c2002-02-04 05:59:25 +00001013 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001014 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +00001015 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001016 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001017 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001018}
1019
Ruchira Sasanka91442282001-09-30 23:16:47 +00001020
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001021
1022//---------------------------------------------------------------------------
1023// Colors the return value of a method to %i0 or %f0, if possible. If it is
1024// not possilbe to directly color the LR, insert a copy instruction to move
1025// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
1026// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001027//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +00001028void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
1029 LiveRangeInfo &LRI,
1030 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001031
Chris Lattner699683c2002-02-04 05:59:25 +00001032 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001033
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001034 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +00001035 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001036
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001037 // The first implicit operand is the return value of a return instr
1038 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001039
Chris Lattner699683c2002-02-04 05:59:25 +00001040 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001041
Chris Lattner0665a5f2002-02-05 01:43:49 +00001042 if (!LR) {
1043 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1044 // assert( LR && "No LR for return value of non-void method");
1045 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001046 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001047
Ruchira Sasanka91442282001-09-30 23:16:47 +00001048 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001049 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001050
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001051 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001052 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001053 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001054 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001055 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001056 else {
Chris Lattner699683c2002-02-04 05:59:25 +00001057 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001058 return;
1059 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001060
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001061 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +00001062
Chris Lattner699683c2002-02-04 05:59:25 +00001063 if (LR->hasColor() && LR->getColor() == CorrectCol)
1064 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001065
Chris Lattner699683c2002-02-04 05:59:25 +00001066 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001067
Chris Lattner699683c2002-02-04 05:59:25 +00001068 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001069
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001070 // We are here because the LR was allocted a regiter
1071 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001072
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001073 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001074
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001075 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001076
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001077 // the LR received UniLRReg but must be colored with UniRetReg
1078 // to pass as the return value
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001079 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, regType));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001080 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001081 else { // if the LR is spilled
Chris Lattner697954c2002-01-20 22:54:45 +00001082 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1083 LR->getSpillOffFromFP(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001084 UniRetReg, regType);
Chris Lattner697954c2002-01-20 22:54:45 +00001085 RetAI->InstrnsBefore.push_back(AdMI);
1086 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001087 }
1088
Ruchira Sasanka91442282001-09-30 23:16:47 +00001089 } // if there is a return value
1090
1091}
1092
1093
1094//---------------------------------------------------------------------------
1095// Copy from a register to register. Register number must be the unified
1096// register number
1097//---------------------------------------------------------------------------
1098
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001099MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
1100 unsigned DestReg,
Chris Lattner699683c2002-02-04 05:59:25 +00001101 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001102 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001103 "Invalid Register");
1104
1105 MachineInstr * MI = NULL;
1106
1107 switch( RegType ) {
1108
1109 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001110 case IntCCRegType:
1111 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +00001112 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001113 MI->SetMachineOperandReg(0, SrcReg, false);
1114 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1115 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001116 break;
1117
1118 case FPSingleRegType:
1119 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001120 MI->SetMachineOperandReg(0, SrcReg, false);
1121 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001122 break;
1123
1124 case FPDoubleRegType:
1125 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001126 MI->SetMachineOperandReg(0, SrcReg, false);
1127 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001128 break;
1129
1130 default:
1131 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001132 }
1133
1134 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001135}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001136
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001137//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001138// Copy from a register to memory (i.e., Store). Register number must
1139// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001140//---------------------------------------------------------------------------
1141
1142
Chris Lattner699683c2002-02-04 05:59:25 +00001143MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1144 unsigned DestPtrReg,
1145 int Offset, int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001146 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001147 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001148 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001149 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001150 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001151 MI->SetMachineOperandReg(0, SrcReg, false);
1152 MI->SetMachineOperandReg(1, DestPtrReg, false);
1153 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1154 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001155 break;
1156
1157 case FPSingleRegType:
1158 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001159 MI->SetMachineOperandReg(0, SrcReg, false);
1160 MI->SetMachineOperandReg(1, DestPtrReg, false);
1161 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1162 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001163 break;
1164
1165 case FPDoubleRegType:
1166 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001167 MI->SetMachineOperandReg(0, SrcReg, false);
1168 MI->SetMachineOperandReg(1, DestPtrReg, false);
1169 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1170 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001171 break;
1172
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001173 case IntCCRegType:
1174 assert( 0 && "Cannot directly store %ccr to memory");
1175
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001176 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001177 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001178 }
1179
1180 return MI;
1181}
1182
1183
1184//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001185// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001186// register number
1187//---------------------------------------------------------------------------
1188
1189
Chris Lattner699683c2002-02-04 05:59:25 +00001190MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1191 int Offset,
1192 unsigned DestReg,
1193 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001194 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001195 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001196 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001197 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001198 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001199 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1200 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1201 (int64_t) Offset);
1202 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001203 break;
1204
1205 case FPSingleRegType:
1206 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001207 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1208 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1209 (int64_t) Offset);
1210 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001211
1212 break;
1213
1214 case FPDoubleRegType:
1215 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001216 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1217 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1218 (int64_t) Offset);
1219 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001220 break;
1221
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001222 case IntCCRegType:
1223 assert( 0 && "Cannot directly load into %ccr from memory");
1224
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001225 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001226 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001227 }
1228
1229 return MI;
1230}
1231
1232
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001233
1234
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001235
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001236//---------------------------------------------------------------------------
1237// Generate a copy instruction to copy a value to another. Temporarily
1238// used by PhiElimination code.
1239//---------------------------------------------------------------------------
1240
1241
Chris Lattner699683c2002-02-04 05:59:25 +00001242MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001243 int RegType = getRegType( Src );
1244
1245 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001246
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001247 MachineInstr * MI = NULL;
1248
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001249 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001250 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001251 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001252 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1253 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1254 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001255 break;
1256
1257 case FPSingleRegType:
1258 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001259 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1260 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001261 break;
1262
1263
1264 case FPDoubleRegType:
1265 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001266 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1267 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001268 break;
1269
1270 default:
1271 assert(0 && "Unknow RegType in CpValu2Value");
1272 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001273
1274 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001275}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001276
1277
1278
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001279
1280
1281
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001282//----------------------------------------------------------------------------
1283// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001284// a call machine instruction. The caller saving/restoring instructions are
1285// inserted like:
1286//
1287// ** caller saving instructions
1288// other instructions inserted for the call by ColorCallArg
1289// CALL instruction
1290// other instructions inserted for the call ColorCallArg
1291// ** caller restoring instructions
1292//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001293//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001294
Ruchira Sasanka91442282001-09-30 23:16:47 +00001295
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001296void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1297 const BasicBlock *BB,
1298 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001299
Ruchira Sasankabf915522002-01-07 21:03:42 +00001300 // has set to record which registers were saved/restored
1301 //
Chris Lattner697954c2002-01-20 22:54:45 +00001302 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001303
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001304 // Now find the LR of the return value of the call
1305 // The last *implicit operand* is the return value of a call
1306 // Insert it to to he PushedRegSet since we must not save that register
1307 // and restore it after the call.
1308 // We do this because, we look at the LV set *after* the instruction
1309 // to determine, which LRs must be saved across calls. The return value
1310 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001311
1312
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001313 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001314
Chris Lattner699683c2002-02-04 05:59:25 +00001315 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001316 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001317 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001318
Chris Lattner699683c2002-02-04 05:59:25 +00001319 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001320 PushedRegSet.insert(
1321 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001322 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001323 }
1324
1325
Chris Lattner748697d2002-02-05 04:20:12 +00001326 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1327 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001328
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001329 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001330 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001331
1332 // get the live range corresponding to live var
1333 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1334
1335 // LR can be null if it is a const since a const
1336 // doesn't have a dominating def - see Assumptions above
1337 if( LR ) {
1338
1339 if( LR->hasColor() ) {
1340
1341 unsigned RCID = (LR->getRegClass())->getID();
1342 unsigned Color = LR->getColor();
1343
1344 if ( isRegVolatile(RCID, Color) ) {
1345
1346 // if the value is in both LV sets (i.e., live before and after
1347 // the call machine instruction)
1348
1349 unsigned Reg = getUnifiedRegNum(RCID, Color);
1350
1351 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1352
1353 // if we haven't already pushed that register
1354
1355 unsigned RegType = getRegType( LR );
1356
1357 // Now get two instructions - to push on stack and pop from stack
1358 // and add them to InstrnsBefore and InstrnsAfter of the
1359 // call instruction
1360
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001361
1362 int StackOff = PRA.mcInfo.pushTempValue(target,
1363 getSpilledRegSize(RegType));
1364
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001365
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001366 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1367 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001368
1369 //---- Insert code for pushing the reg on stack ----------
1370
1371 if( RegType == IntCCRegType ) {
1372
1373 // Handle IntCCRegType specially since we cannot directly
1374 // push %ccr on to the stack
1375
Chris Lattner748697d2002-02-05 04:20:12 +00001376 const ValueSet &LVSetBef =
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001377 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1378
1379 // get a free INTEGER register
1380 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001381 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1382 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1383
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001384 // insert the instructions in reverse order since we are
1385 // adding them to the front of InstrnsBefore
1386
1387 if(AdIAftCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001388 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001389
1390 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001391 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001392
1393 if(AdIBefCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001394 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001395
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001396 if(DEBUG_RA) {
1397 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1398 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1399 cerr << "\t" << *AdICpCC;
1400 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1401 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001402
1403 } else {
1404 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001405 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001406 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001407 }
1408
1409
1410 //---- Insert code for popping the reg from the stack ----------
1411
Chris Lattner748697d2002-02-05 04:20:12 +00001412 if (RegType == IntCCRegType) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001413
1414 // Handle IntCCRegType specially since we cannot directly
1415 // pop %ccr on from the stack
1416
1417 // get a free INT register
1418 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001419 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1420 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001421
1422 if(AdIBefCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001423 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001424
1425 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001426 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001427
1428 if(AdIAftCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001429 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001430
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001431 if(DEBUG_RA) {
1432
1433 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1434 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1435 cerr << "\t" << *AdICpCC;
1436 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1437 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001438
1439 } else {
1440 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001441 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001442 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001443 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001444
Chris Lattner748697d2002-02-05 04:20:12 +00001445 PushedRegSet.insert(Reg);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001446
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001447 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001448 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001449 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001450 if( RegType == IntCCRegType ) {
1451 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1452 if(AdIAftCC) cerr << *AdIAftCC;
1453 }
1454 else {
1455 if(AdIBef) cerr << *AdIBef << "\t";
1456 if(AdIAft) cerr << *AdIAft;
1457 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001458 }
1459 } // if not already pushed
1460
1461 } // if LR has a volatile color
1462
1463 } // if LR has color
1464
1465 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001466
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001467 } // for each value in the LV set after instruction
1468
Ruchira Sasanka91442282001-09-30 23:16:47 +00001469}
1470
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001471//---------------------------------------------------------------------------
1472// Copies %ccr into an integer register. IntReg is the UNIFIED register
1473// number.
1474//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001475
Chris Lattner699683c2002-02-04 05:59:25 +00001476MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1477 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001478 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1479 SparcIntCCRegOrder::ccr),
1480 false, true);
1481 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001482 return MI;
1483}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001484
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001485//---------------------------------------------------------------------------
1486// Copies an integer register into %ccr. IntReg is the UNIFIED register
1487// number.
1488//---------------------------------------------------------------------------
1489
Chris Lattner699683c2002-02-04 05:59:25 +00001490MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1491 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001492 MI->SetMachineOperandReg(0, IntReg, false);
1493 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1494 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1495 true, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001496 return MI;
1497}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001498
1499
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001500
1501
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001502//---------------------------------------------------------------------------
1503// Print the register assigned to a LR
1504//---------------------------------------------------------------------------
1505
Chris Lattner699683c2002-02-04 05:59:25 +00001506void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001507 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001508 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001509
Chris Lattner699683c2002-02-04 05:59:25 +00001510 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001511 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001512 return;
1513 }
1514
1515 // if a color is found
1516
Chris Lattner1e23ed72001-10-15 18:15:27 +00001517 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001518
Chris Lattner699683c2002-02-04 05:59:25 +00001519 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001520 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001521
Chris Lattner699683c2002-02-04 05:59:25 +00001522 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001523 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001524 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001525 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001526 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001527 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001528}
Ruchira Sasanka868cf822001-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 Sasankaae4bcd72001-11-10 21:20:43 +00001536// instructions inserted by RegAlloc. All such instruction MUST have
1537// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001538
1539// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1540// this method is called.
1541
1542// This method uses two vectors for efficiency in accessing
1543
Ruchira Sasankaae4bcd72001-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.
1546
1547// All the uses are before THE def to a register
1548
1549
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001550//---------------------------------------------------------------------------
Chris Lattner697954c2002-01-20 22:54:45 +00001551void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1552 std::vector<MachineInstr *> &OrdVec,
1553 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-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 Sasankaae4bcd72001-11-10 21:20:43 +00001561
1562 Solution:
1563 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001564
Ruchira Sasankaae4bcd72001-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 Sasanka868cf822001-11-09 23:49:14 +00001580
1581 */
1582
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001583 bool CouldMoveAll;
1584 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001585
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001586 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001587 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001588 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001589
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001590 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001591
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001592 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001593
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001594 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001595
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001596 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001597
Ruchira Sasankaae4bcd72001-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
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001603 if( DefOp.opIsDef() &&
1604 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001605
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001606 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001607
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001608 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001609
Chris Lattner697954c2002-01-20 22:54:45 +00001610 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001611 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001612
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001613 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1614
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001615 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001616 if( UseInst == NULL) continue;
1617
1618 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001619 MachineOperand& UseOp = UseInst->getOperand(0);
1620
1621 if( ! UseOp.opIsDef() &&
1622 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1623
1624 // if use is a register ...
1625
1626 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1627
1628 // if Def and this use are the same, it means that this use
1629 // is destroyed by a def before it is used
1630
1631 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001632
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001633 DefEqUse = true;
1634 CouldMoveAll = false;
1635 DebugPrint = true;
1636 break;
1637 } // if two registers are equal
1638
1639 } // if use is a register
1640
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001641 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001642
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001643 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001644
1645 // after examining all the instructions that follow the DefInst
1646 // if there are no dependencies, we can move it to the OrdVec
1647
1648 // cerr << "Moved to Ord: " << *DefInst;
1649
1650 moveInst2OrdVec(OrdVec, DefInst, PRA);
1651
1652 //OrdVec.push_back(DefInst);
1653
1654 // mark the pos of DefInst with NULL to indicate that it is
1655 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001656 *DefIt = NULL;
1657 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001658
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001659 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001660
1661 } // for all instructions in the UnordVec
1662
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001663
Chris Lattner699683c2002-02-04 05:59:25 +00001664 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001665
Chris Lattner699683c2002-02-04 05:59:25 +00001666 if (DebugPrint) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001667 cerr << "\nAdded instructions were reordered to:\n";
1668 for(unsigned int i=0; i < OrdVec.size(); i++)
1669 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001670 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001671}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001672
1673
1674
1675
1676
Chris Lattner697954c2002-01-20 22:54:45 +00001677void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001678 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001679 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001680 MachineOperand& UseOp = UnordInst->getOperand(0);
1681
1682 if( ! UseOp.opIsDef() &&
1683 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1684
1685 // for the use of UnordInst, see whether there is a defining instr
1686 // before in the OrdVec
1687 bool DefEqUse = false;
1688
Chris Lattner697954c2002-01-20 22:54:45 +00001689 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001690
1691 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1692
1693 MachineInstr *OrdInst = *OrdIt ;
1694
1695 MachineOperand& DefOp =
1696 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1697
1698 if( DefOp.opIsDef() &&
1699 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1700
1701 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1702
1703 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1704
1705 // we are here because there is a preceding def in the OrdVec
1706 // for the use in this intr we are going to insert. This
1707 // happened because the original code was like:
1708 // 1. add %ox %g0 %oy
1709 // 2. add %oy %g0 %ox
1710 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1711 // Now we are processing %ox of 1.
1712 // We have to
1713
1714 const int UReg = DefOp.getMachineRegNum();
1715 const int RegType = getRegType(UReg);
1716 MachineInstr *AdIBef, *AdIAft;
1717
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001718 const int StackOff = PRA.mcInfo.pushTempValue(target,
1719 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001720
1721 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001722 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001723 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1724 OrdIt++; // points to current instr we processed
1725
1726 // Load directly into DReg (%oy)
1727 MachineOperand& DOp=
1728 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1729 assert(DOp.opIsDef() && "Last operand is not the def");
1730 const int DReg = DOp.getMachineRegNum();
1731
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001732 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001733 OrdVec.push_back(AdIAft);
1734
1735 cerr << "\nFixed CIRCULAR references by reordering";
1736
1737 if( DEBUG_RA ) {
1738 cerr << "\nBefore CIRCULAR Reordering:\n";
1739 cerr << *UnordInst;
1740 cerr << *OrdInst;
1741
1742 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1743 for(unsigned i=0; i < OrdVec.size(); i++)
1744 cerr << *(OrdVec[i]);
1745 }
1746
1747 // Do not copy the UseInst to OrdVec
1748 DefEqUse = true;
1749 break;
1750
1751 }// if two registers are equal
1752
1753 } // if Def is a register
1754
1755 } // for each instr in OrdVec
1756
Chris Lattner699683c2002-02-04 05:59:25 +00001757 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001758
1759 // We didn't find a def in the OrdVec, so just append this inst
1760 OrdVec.push_back( UnordInst );
1761 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1762 }
1763
1764 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001765}