blob: b660e89805fb1b218ab16f97b1ff4002381769a7 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
Chris Lattnerd5a84702002-04-29 17:42:12 +000014#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattnerf9986852002-04-27 07:27:19 +000015#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000016#include "llvm/iTerminators.h"
17#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000018#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000019#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000020#include <iostream>
Vikram S. Advea6d94c92002-04-25 04:42:21 +000021#include <values.h>
Chris Lattner7f74a562002-01-20 22:54:45 +000022using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000023
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000038// getZeroRegNum - returns the register that contains always zero.
39// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000040//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000041int UltraSparcRegInfo::getZeroRegNum() const {
42 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
43 SparcIntRegOrder::g0);
44}
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000050 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
51 SparcIntRegOrder::o7);
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000059 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
60 SparcIntRegOrder::i7);
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000082// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000083unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000084 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
85 SparcIntRegOrder::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +000086}
87
Vikram S. Advedb1435f2002-03-18 03:12:16 +000088// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000089unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000090 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
91 SparcIntRegOrder::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +000092}
93
94
Vikram S. Advea6d94c92002-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 Lattner5216cc52002-02-04 05:59:25 +0000174
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000175//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000176// Finds the return value of a sparc specific call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000177//---------------------------------------------------------------------------
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000178
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000179const Value *
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000180UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000181 unsigned OpCode = CallMI->getOpCode();
Chris Lattner7f74a562002-01-20 22:54:45 +0000182 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000183
Chris Lattner7f74a562002-01-20 22:54:45 +0000184 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000185
186 // The one before the last implicit operand is the return value of
187 // a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000188 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000189 if( NumOfImpRefs > 1 )
Chris Lattner5216cc52002-02-04 05:59:25 +0000190 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
191 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000192
Chris Lattner7f74a562002-01-20 22:54:45 +0000193 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000194
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000195 // The last implicit operand is the return value of a JMPL
196 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000197 if(NumOfImpRefs > 0)
198 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
199 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner5216cc52002-02-04 05:59:25 +0000200 } else
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000201 assert(0 && "OpCode must be CALL/JMPL for a call instr");
202
203 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000204}
205
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000206
Vikram S. Adve02662bd2002-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000214
215//---------------------------------------------------------------------------
216// Finds the return address of a call sparc specific call instruction
217//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000218const Value *
Chris Lattner5216cc52002-02-04 05:59:25 +0000219UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000220 unsigned OpCode = CallMI->getOpCode();
221
Chris Lattner5216cc52002-02-04 05:59:25 +0000222 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000223 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
224
225 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000226
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000227 // The last implicit operand is the return address of a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000228 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000229 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000230
Chris Lattner5216cc52002-02-04 05:59:25 +0000231 } else if(OpCode == JMPLCALL) {
232 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000233 return MO.getVRegValue();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000234 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000235
236 assert(0 && "OpCode must be CALL/JMPL for a call instr");
237 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000238}
239
Chris Lattner5216cc52002-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 Lattner5216cc52002-02-04 05:59:25 +0000244 switch (LR->getRegClass()->getID()) {
245 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000246 case FloatRegClassID: {
247 const Type *Typ = LR->getType();
248 if (Typ == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000249 return FPSingleRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000250 else if (Typ == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000251 return FPDoubleRegType;
252 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000253 }
Chris Lattner5216cc52002-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 Lattner93ddab22002-04-27 02:24:17 +0000266 case FloatRegClassID:
267 if (Val->getType() == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000268 return FPSingleRegType;
Chris Lattner93ddab22002-04-27 02:24:17 +0000269 else if (Val->getType() == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000270 return FPDoubleRegType;
271 assert(0 && "Unknown type in FloatRegClass");
272
Chris Lattner93ddab22002-04-27 02:24:17 +0000273 case IntCCRegClassID: return IntCCRegType;
274 case FloatCCRegClassID: return FloatCCRegType;
Chris Lattner5216cc52002-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 Lattner5536c9c2002-02-24 23:02:40 +0000293 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000294}
295
296
297
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000298
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000299
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000300//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000301// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000302//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000303unsigned
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000304UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
305
306 unsigned OpCode = CallMI->getOpCode();
Chris Lattner5216cc52002-02-04 05:59:25 +0000307 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000308
Chris Lattner5216cc52002-02-04 05:59:25 +0000309 if (OpCode == CALL) {
310 switch (NumOfImpRefs) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000311 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner5216cc52002-02-04 05:59:25 +0000312 case 1: return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000313 default: // two or more implicit refs
Chris Lattner5216cc52002-02-04 05:59:25 +0000314 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
315 return NumOfImpRefs - 2;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000316 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000317 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000318 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000319 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000320
321 // The last implicit operand is the return value of a JMPL instr
322 if( NumOfImpRefs > 0 ) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000323 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
324 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000325 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000326 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000327 }
328 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000329 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000330 }
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000331
Chris Lattner5216cc52002-02-04 05:59:25 +0000332 assert(0 && "OpCode must be CALL/JMPL for a call instr");
333 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000334}
335
336
Vikram S. Adve84982772001-10-22 13:41:12 +0000337
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000338//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-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 Lattner5216cc52002-02-04 05:59:25 +0000342void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000343 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000344
Vikram S. Adve84982772001-10-22 13:41:12 +0000345 assert( (RetMI->getNumOperands() >= 2)
346 && "JMPL/RETURN must have 3 and 2 operands respectively");
347
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000348 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
349
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000350 // return address is always mapped to i7
351 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000352 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000353
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000354 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000355 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000359
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000365}
366
367
368//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000371//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000372void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
373 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000374 std::vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000375
Ruchira Sasanka24729a32001-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 Lattnere6b511d2002-02-04 16:37:09 +0000383 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000389}
390
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000391
392
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000393
394//---------------------------------------------------------------------------
395// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000398// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000399// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000400//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000401void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000402 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000403{
Vikram S. Advea6d94c92002-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 Lattnerf739fa82002-04-08 22:03:57 +0000408 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Vikram S. Advea6d94c92002-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000427 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000428}
429
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000430
Ruchira Sasanka4cfbfd52002-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 Lattnerf739fa82002-04-08 22:03:57 +0000437void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000438 LiveRangeInfo &LRI,
439 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000440
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000441 // check if this is a varArgs function. needed for choosing regs.
442 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000443 // get the argument list
Chris Lattnerf739fa82002-04-08 22:03:57 +0000444 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000445 // get an iterator to arg list
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000446 MachineInstr *AdMI;
447
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000448 // for each argument
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000449 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
450 argNo != ArgList.size(); ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451 // get the LR of arg
Chris Lattner98d0ac02002-04-09 19:46:27 +0000452 LiveRange *LR = LRI.getLiveRangeForValue((Value*)ArgList[argNo]);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000453 assert( LR && "No live range found for method arg");
454
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000455 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000456 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000457
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000458 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000459 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000460 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000461 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000462 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000470 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000471 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000472 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000473
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000474 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000475
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000476 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
477
478 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000479 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000480 if( UniLRReg == UniArgReg )
481 continue;
482
Ruchira Sasanka4cfbfd52002-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 Sasanka36bcd792001-10-24 15:56:58 +0000487
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000488 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000489 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000490 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000491 if( isArgInReg ) {
492 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, regType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000493
Vikram S. Advea6d94c92002-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000520 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000521
Ruchira Sasanka9c38dbc2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000524 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000525 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000526 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000527 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
528 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000529
530 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000531 UniLRReg, regType );
532 FirstAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000533 }
Ruchira Sasanka9c38dbc2001-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 Sasanka9c38dbc2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000544 if( isArgInReg ) {
Vikram S. Advea6d94c92002-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 Sasanka9c38dbc2001-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. Advea6d94c92002-04-25 04:42:21 +0000572 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-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. Adve7a1524f2001-11-08 04:56:41 +0000576 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000577 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000578 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
579 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000580
581 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000582 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000583
584 }
585
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000586 } // for each incoming argument
587
588}
589
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000590
591
Ruchira Sasanka5867c7a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000596void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000597 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000598 std::vector<RegClass *> RCList) const {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000599 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000600
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000601 // check if this is a varArgs function. needed for choosing regs.
602 bool isVarArgs = isVarArgsCall(CallMI);
603
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000604 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000605
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000606
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000607 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-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 Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000613
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000616
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000617
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000618 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000619
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000620
Chris Lattner5216cc52002-02-04 05:59:25 +0000621 if (RetVal) {
622 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000623 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000624
Chris Lattner5216cc52002-02-04 05:59:25 +0000625 // create a new LR for the return value
626 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000627 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000628 unsigned RegClassID = getRegClassIDOfValue(RetVal);
629 RetValLR->setRegClass(RCList[RegClassID]);
630 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000631
632 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000633
Ruchira Sasanka24729a32001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000639 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000640
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000641
Ruchira Sasanka5867c7a2001-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 Sasanka24729a32001-10-21 16:43:41 +0000645 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000646
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000647 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000648
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000649 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
650 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000651
652 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000653
654 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000655 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000656
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000657 // not possible to have a null LR since all args (even consts)
658 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000659 if (!LR) {
660 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000661 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000662 }
663
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000664 unsigned regType = getRegType( LR );
665 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000666
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000672
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000677
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000678 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000679
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000680}
681
682
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000688
Chris Lattner5216cc52002-02-04 05:59:25 +0000689void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
690 LiveRangeInfo &LRI,
691 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000692 PhyRegAlloc &PRA,
693 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000694
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000695 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
696
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000702
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000703 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000704
Chris Lattner30e8fb62002-02-05 01:43:49 +0000705 if (RetVal) {
706 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000707
Chris Lattner30e8fb62002-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 Sasanka24729a32001-10-21 16:43:41 +0000711 }
Ruchira Sasanka36bcd792001-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 Lattnere147d062001-11-07 14:01:59 +0000721 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000722 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000723 return;
724 }
Ruchira Sasanka36bcd792001-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 Sasanka24729a32001-10-21 16:43:41 +0000734 // put copy instruction
735
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000736 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000737
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000738 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000739
740 // the reg that LR must be colored with
741 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000742
743 if( RetValLR->hasColor() ) {
744
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000745 unsigned
746 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000747
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000748 // the return value is coming in UniRetReg but has to go into
749 // the UniRetLRReg
750
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000751 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, regType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000752
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000753 } // if LR has color
754 else {
Ruchira Sasanka9c38dbc2001-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 Sasanka24729a32001-10-21 16:43:41 +0000758
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000759 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000760 RetValLR->getSpillOffFromFP(), regType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000761 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000762
763 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000764
765 } // the LR didn't receive the suggested color
766
767 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000768
769
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000770 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000771 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000772 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000773
Chris Lattner7f74a562002-01-20 22:54:45 +0000774 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000775
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000776 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000777
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000778 bool isVarArgs = isVarArgsCall(CallMI);
779 if (DEBUG_RA && isVarArgs) cerr << "\nVar arg call found!!\n";
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000780
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000781 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
782 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000783
784 const Value *CallArg = CallMI->getImplicitRef(i);
785
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000786 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000787 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000788
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000789 unsigned regType = getRegType( CallArg );
790 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000791
792 // find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000793 // Also find the correct register the argument must use (UniArgReg)
794 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000795 bool isArgInReg = false;
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000804 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000805 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000806 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000807
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000808 // not possible to have a null LR since all args (even consts)
809 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000810 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000811 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000812 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000813 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000814
Chris Lattner5216cc52002-02-04 05:59:25 +0000815 if (LR->hasColor()) {
Ruchira Sasanka36bcd792001-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 Sasanka5867c7a2001-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 Sasanka36bcd792001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000828
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000829 if( isArgInReg ) {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000830
Vikram S. Advea6d94c92002-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000838 // We have to move a float reg to an int reg via memory.
Vikram S. Advea6d94c92002-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 Sasanka4cfbfd52002-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. Advea6d94c92002-04-25 04:42:21 +0000849 getSpilledRegSize(regType));
850
851 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, regType );
Ruchira Sasanka4cfbfd52002-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. Advea6d94c92002-04-25 04:42:21 +0000859 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, regType );
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000860 AddedInstrnsBefore.push_back( AdMI );
861 }
862
Chris Lattner5216cc52002-02-04 05:59:25 +0000863 } else {
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000867
Vikram S. Advea6d94c92002-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 Sasanka20e105f2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000880 }
881
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000882
Chris Lattner5216cc52002-02-04 05:59:25 +0000883 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000884
Ruchira Sasanka9c38dbc2001-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. Advea6d94c92002-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000895 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
896 UniArgReg, IntRegType );
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000897 }
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000898 else
899 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000900 UniArgReg, regType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000901
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000902 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000903 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000904 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000905
Ruchira Sasanka9c38dbc2001-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. Advea6d94c92002-04-25 04:42:21 +0000911 // Optimize: Optimize when reverse pointers in MahineInstr are
Ruchira Sasanka9c38dbc2001-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 Sasankac97ccc52001-11-15 20:25:07 +0000917 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000918
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000919 int TmpOff = PRA.mcInfo.pushTempValue(target,
920 getSpilledRegSize(getRegType(LR)) );
921
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000922
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000923 const MachineFrameInfo& frameInfo = target.getFrameInfo();
924 int argOffset =
925 frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000926
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000927 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000928
Ruchira Sasanka9c38dbc2001-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. Advea6d94c92002-04-25 04:42:21 +0000935 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000936 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000937 TReg, regType );
938 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, regType );
939 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType );
Ruchira Sasankad0d294a2001-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. Adve7a1524f2001-11-08 04:56:41 +0000944
Ruchira Sasanka9c38dbc2001-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 Sasankad0d294a2001-11-09 23:49:14 +0000949
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000950 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000951 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000952 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000953 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000954
Ruchira Sasankad0d294a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000959 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000960
Chris Lattner5216cc52002-02-04 05:59:25 +0000961 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-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 Lattner7f74a562002-01-20 22:54:45 +0000967 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000968 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000969
Chris Lattner5216cc52002-02-04 05:59:25 +0000970 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000971 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000972 for(unsigned i = 0; i < TmpVec.size(); i++)
973 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000982 // now insert caller saving code for this call instruction
983 //
984 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000985}
986
Ruchira Sasanka5867c7a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000991void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
992 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000993
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000994 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000995
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000996 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000997
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001000
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001003
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001005
Chris Lattner30e8fb62002-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 Sasanka5867c7a2001-09-30 23:16:47 +00001010
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001011 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001012
Chris Lattner5216cc52002-02-04 05:59:25 +00001013 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001014 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +00001015 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001016 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001017 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001018}
1019
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001020
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001027//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +00001028void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
1029 LiveRangeInfo &LRI,
1030 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001031
Chris Lattner5216cc52002-02-04 05:59:25 +00001032 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001033
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001034 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001035 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001036
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001039
Chris Lattner5216cc52002-02-04 05:59:25 +00001040 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001041
Chris Lattner30e8fb62002-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 Sasanka9c38dbc2001-10-28 18:15:12 +00001046 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001047
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001048 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001049 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001050
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001051 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001052 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001053 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001054 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001055 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001056 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001057 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001058 return;
1059 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001060
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001061 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001062
Chris Lattner5216cc52002-02-04 05:59:25 +00001063 if (LR->hasColor() && LR->getColor() == CorrectCol)
1064 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001065
Chris Lattner5216cc52002-02-04 05:59:25 +00001066 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001067
Chris Lattner5216cc52002-02-04 05:59:25 +00001068 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001069
Ruchira Sasanka6a7f0202001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001072
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001073 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001074
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001075 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001076
Ruchira Sasanka36bcd792001-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. Advea6d94c92002-04-25 04:42:21 +00001079 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, regType));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001080 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001081 else { // if the LR is spilled
Chris Lattner7f74a562002-01-20 22:54:45 +00001082 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1083 LR->getSpillOffFromFP(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001084 UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001085 RetAI->InstrnsBefore.push_back(AdMI);
1086 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001087 }
1088
Ruchira Sasanka5867c7a2001-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. Advea6d94c92002-04-25 04:42:21 +00001099MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
1100 unsigned DestReg,
Chris Lattner5216cc52002-02-04 05:59:25 +00001101 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001102 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001103 "Invalid Register");
1104
1105 MachineInstr * MI = NULL;
1106
1107 switch( RegType ) {
1108
1109 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001110 case IntCCRegType:
1111 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001112 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5867c7a2001-09-30 23:16:47 +00001116 break;
1117
1118 case FPSingleRegType:
1119 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001120 MI->SetMachineOperandReg(0, SrcReg, false);
1121 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001122 break;
1123
1124 case FPDoubleRegType:
1125 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001126 MI->SetMachineOperandReg(0, SrcReg, false);
1127 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001128 break;
1129
1130 default:
1131 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001132 }
1133
1134 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001135}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001136
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001137//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-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 Sasanka5b8971f2001-10-16 01:23:19 +00001140//---------------------------------------------------------------------------
1141
1142
Chris Lattner5216cc52002-02-04 05:59:25 +00001143MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1144 unsigned DestPtrReg,
1145 int Offset, int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001146 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001147 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001148 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001149 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001150 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001155 break;
1156
1157 case FPSingleRegType:
1158 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001163 break;
1164
1165 case FPDoubleRegType:
1166 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001171 break;
1172
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001173 case IntCCRegType:
1174 assert( 0 && "Cannot directly store %ccr to memory");
1175
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001176 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001177 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001178 }
1179
1180 return MI;
1181}
1182
1183
1184//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001185// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001186// register number
1187//---------------------------------------------------------------------------
1188
1189
Chris Lattner5216cc52002-02-04 05:59:25 +00001190MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1191 int Offset,
1192 unsigned DestReg,
1193 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001194 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001195 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001196 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001197 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001198 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001203 break;
1204
1205 case FPSingleRegType:
1206 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001211
1212 break;
1213
1214 case FPDoubleRegType:
1215 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001220 break;
1221
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001222 case IntCCRegType:
1223 assert( 0 && "Cannot directly load into %ccr from memory");
1224
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001225 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001226 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001227 }
1228
1229 return MI;
1230}
1231
1232
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001233
1234
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001235
Ruchira Sasankafcdc2ff2001-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 Lattner5216cc52002-02-04 05:59:25 +00001242MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001243 int RegType = getRegType( Src );
1244
1245 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001246
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001247 MachineInstr * MI = NULL;
1248
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001249 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001250 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001251 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-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 Sasankafcdc2ff2001-11-12 14:45:33 +00001255 break;
1256
1257 case FPSingleRegType:
1258 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001259 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1260 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001261 break;
1262
1263
1264 case FPDoubleRegType:
1265 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001266 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1267 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001268 break;
1269
1270 default:
1271 assert(0 && "Unknow RegType in CpValu2Value");
1272 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001273
1274 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001275}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001276
1277
1278
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001279
1280
1281
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001282//----------------------------------------------------------------------------
1283// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-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 Sasanka9c38dbc2001-10-28 18:15:12 +00001293//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001294
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001295
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001296void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1297 const BasicBlock *BB,
1298 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001299
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001300 // has set to record which registers were saved/restored
1301 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001302 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001303
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001311
1312
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001313 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001314
Chris Lattner5216cc52002-02-04 05:59:25 +00001315 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001316 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001317 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001318
Chris Lattner5216cc52002-02-04 05:59:25 +00001319 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001320 PushedRegSet.insert(
1321 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001322 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001323 }
1324
1325
Chris Lattner7e5ee422002-02-05 04:20:12 +00001326 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1327 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001328
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001329 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001330 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +00001361
1362 int StackOff = PRA.mcInfo.pushTempValue(target,
1363 getSpilledRegSize(RegType));
1364
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001365
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001366 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1367 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka9d8950d2001-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 Lattner7e5ee422002-02-05 04:20:12 +00001376 const ValueSet &LVSetBef =
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001377 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1378
1379 // get a free INTEGER register
1380 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001381 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1382 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1383
Ruchira Sasanka9d8950d2001-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 Lattner30e23da2002-04-09 05:13:04 +00001388 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001389
1390 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner30e23da2002-04-09 05:13:04 +00001391 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001392
1393 if(AdIBefCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001394 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001395
Ruchira Sasanka1812fc42001-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 Sasanka9d8950d2001-11-03 19:59:59 +00001402
1403 } else {
1404 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001405 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner30e23da2002-04-09 05:13:04 +00001406 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001407 }
1408
1409
1410 //---- Insert code for popping the reg from the stack ----------
1411
Chris Lattner7e5ee422002-02-05 04:20:12 +00001412 if (RegType == IntCCRegType) {
Ruchira Sasanka9d8950d2001-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. Advedb1435f2002-03-18 03:12:16 +00001419 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1420 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001421
1422 if(AdIBefCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001423 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001424
1425 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner30e23da2002-04-09 05:13:04 +00001426 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001427
1428 if(AdIAftCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001429 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001430
Ruchira Sasanka1812fc42001-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 Sasanka9d8950d2001-11-03 19:59:59 +00001438
1439 } else {
1440 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001441 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner30e23da2002-04-09 05:13:04 +00001442 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001443 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001444
Chris Lattner7e5ee422002-02-05 04:20:12 +00001445 PushedRegSet.insert(Reg);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001446
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001447 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001448 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001449 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advedb1435f2002-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 Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001466
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001467 } // for each value in the LV set after instruction
1468
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001469}
1470
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001471//---------------------------------------------------------------------------
1472// Copies %ccr into an integer register. IntReg is the UNIFIED register
1473// number.
1474//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001475
Chris Lattner5216cc52002-02-04 05:59:25 +00001476MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1477 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advedb1435f2002-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 Sasanka9d8950d2001-11-03 19:59:59 +00001482 return MI;
1483}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001484
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001485//---------------------------------------------------------------------------
1486// Copies an integer register into %ccr. IntReg is the UNIFIED register
1487// number.
1488//---------------------------------------------------------------------------
1489
Chris Lattner5216cc52002-02-04 05:59:25 +00001490MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1491 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advedb1435f2002-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 Sasanka9d8950d2001-11-03 19:59:59 +00001496 return MI;
1497}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001498
1499
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001500
1501
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001502//---------------------------------------------------------------------------
1503// Print the register assigned to a LR
1504//---------------------------------------------------------------------------
1505
Chris Lattner5216cc52002-02-04 05:59:25 +00001506void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001507 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001508 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001509
Chris Lattner5216cc52002-02-04 05:59:25 +00001510 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001511 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001512 return;
1513 }
1514
1515 // if a color is found
1516
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001517 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001518
Chris Lattner5216cc52002-02-04 05:59:25 +00001519 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001520 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001521
Chris Lattner5216cc52002-02-04 05:59:25 +00001522 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001523 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001524 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001525 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001526 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001527 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001528}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001529
1530//---------------------------------------------------------------------------
1531// This method examines instructions inserted by RegAlloc code before a
1532// machine instruction to detect invalid orders that destroy values before
1533// they are used. If it detects such conditions, it reorders the instructions.
1534//
1535// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001536// instructions inserted by RegAlloc. All such instruction MUST have
1537// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-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 Sasanka0c085982001-11-10 21:20:43 +00001544// Since instructions are inserted in RegAlloc, this assumes that the
1545// first operand is the source reg and the last operand is the dest reg.
1546
1547// All the uses are before THE def to a register
1548
1549
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001550//---------------------------------------------------------------------------
Chris Lattner7f74a562002-01-20 22:54:45 +00001551void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1552 std::vector<MachineInstr *> &OrdVec,
1553 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001554
1555 /*
1556 Problem: We can have instructions inserted by RegAlloc like
1557 1. add %ox %g0 %oy
1558 2. add %oy %g0 %oz, where z!=x or z==x
1559
1560 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561
1562 Solution:
1563 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001564
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565 Algorithm:
1566
1567 do
1568 for each instruction 'DefInst' in the UnOrdVec
1569 for each instruction 'UseInst' that follows the DefInst
1570 if the reg defined by DefInst is used by UseInst
1571 mark DefInst as not movable in this iteration
1572 If DefInst is not marked as not-movable, move DefInst to OrdVec
1573 while all instructions in DefInst are moved to OrdVec
1574
1575 For moving, we call the move2OrdVec(). It checks whether there is a def
1576 in it for the uses in the instruction to be added to OrdVec. If there
1577 are no preceding defs, it just appends the instruction. If there is a
1578 preceding def, it puts two instructions to save the reg on stack before
1579 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001580
1581 */
1582
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001583 bool CouldMoveAll;
1584 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001585
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001586 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001587 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001588 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001589
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001590 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001591
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001592 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001593
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001594 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001595
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001596 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001597
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001598 //cerr << "\nInst in UnordVec = " << *DefInst;
1599
1600 // last operand is the def (unless for a store which has no def reg)
1601 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1602
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001603 if( DefOp.opIsDef() &&
1604 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001605
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001606 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001607
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001608 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001609
Chris Lattner7f74a562002-01-20 22:54:45 +00001610 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001611 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001612
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001613 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1614
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001615 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001616 if( UseInst == NULL) continue;
1617
1618 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001632
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001641 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001642
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001643 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001656 *DefIt = NULL;
1657 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001658
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001659 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001660
1661 } // for all instructions in the UnordVec
1662
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001663
Chris Lattner5216cc52002-02-04 05:59:25 +00001664 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001665
Chris Lattner5216cc52002-02-04 05:59:25 +00001666 if (DebugPrint) {
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001670 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001671}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001672
1673
1674
1675
1676
Chris Lattner7f74a562002-01-20 22:54:45 +00001677void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001678 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001679 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-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 Lattner7f74a562002-01-20 22:54:45 +00001689 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-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 Sasanka4cfbfd52002-01-07 19:20:28 +00001718 const int StackOff = PRA.mcInfo.pushTempValue(target,
1719 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001720
1721 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001722 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-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 Sasanka2d5c48f2001-11-11 21:49:37 +00001732 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-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 Lattner5216cc52002-02-04 05:59:25 +00001757 if(!DefEqUse) {
Ruchira Sasanka0c085982001-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 Sasanka0c085982001-11-10 21:20:43 +00001765}