blob: ad0dd25685ff6f4b486e4171c0611068e7ef7de6 [file] [log] [blame]
Chris Lattnered5171e2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner699683c2002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000014#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000015#include "llvm/iTerminators.h"
16#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000017#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000018#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000019#include <iostream>
Vikram S. Adve31f78c42002-04-25 04:42:21 +000020#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000021using std::cerr;
Chris Lattner20b1ea02001-09-14 03:47:57 +000022
Chris Lattner699683c2002-02-04 05:59:25 +000023UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
24 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
25 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
26
27 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
28 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
29 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
30 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
31
32 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
33 "32 Float regs are used for float arg passing");
34}
35
36
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000037// getZeroRegNum - returns the register that contains always zero.
38// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000039//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000040int UltraSparcRegInfo::getZeroRegNum() const {
41 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
42 SparcIntRegOrder::g0);
43}
Chris Lattner699683c2002-02-04 05:59:25 +000044
45// getCallAddressReg - returns the reg used for pushing the address when a
46// method is called. This can be used for other purposes between calls
47//
48unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000049 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
50 SparcIntRegOrder::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000051}
52
53// Returns the register containing the return address.
54// It should be made sure that this register contains the return
55// value when a return instruction is reached.
56//
57unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000058 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
59 SparcIntRegOrder::i7);
Chris Lattner699683c2002-02-04 05:59:25 +000060}
61
62// given the unified register number, this gives the name
63// for generating assembly code or debugging.
64//
65const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
66 if( reg < 32 )
67 return SparcIntRegOrder::getRegName(reg);
68 else if ( reg < (64 + 32) )
69 return SparcFloatRegOrder::getRegName( reg - 32);
70 else if( reg < (64+32+4) )
71 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
72 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
73 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
74 else if (reg== InvalidRegNum) //****** TODO: Remove */
75 return "<*NoReg*>";
76 else
77 assert(0 && "Invalid register number");
78 return "";
79}
80
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000081// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000082unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000083 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
84 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000085}
86
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000087// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000088unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000089 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
90 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000091}
92
93
Vikram S. Adve31f78c42002-04-25 04:42:21 +000094//---------------------------------------------------------------------------
95// Finds whether a call is an indirect call
96//---------------------------------------------------------------------------
97
98inline bool
99isVarArgsFunction(const Type *funcType) {
100 return cast<FunctionType>(cast<PointerType>(funcType)
101 ->getElementType())->isVarArg();
102}
103
104inline bool
105isVarArgsCall(const MachineInstr *CallMI) {
106 Value* callee = CallMI->getOperand(0).getVRegValue();
107 // const Type* funcType = isa<Function>(callee)? callee->getType()
108 // : cast<PointerType>(callee->getType())->getElementType();
109 const Type* funcType = callee->getType();
110 return isVarArgsFunction(funcType);
111}
112
113
114// Get the register number for the specified integer arg#,
115// assuming there are argNum total args, intArgNum int args,
116// and fpArgNum FP args preceding (and not including) this one.
117// Use INT regs for FP args if this is a varargs call.
118//
119// Return value:
120// InvalidRegNum, if there is no int register available for the arg.
121// regNum, otherwise (this is NOT the unified reg. num).
122//
123inline int
124UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
125 unsigned argNo,
126 unsigned intArgNo, unsigned fpArgNo,
127 unsigned& regClassId) const
128{
129 int firstArgReg = inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0;
130 if (argNo >= NumOfIntArgRegs)
131 return InvalidRegNum;
132 else {
133 regClassId = IntRegClassID;
134 return isVarArgsCall? firstArgReg + argNo
135 : firstArgReg + intArgNo;
136 }
137}
138
139// Get the register number for the specified FP arg#,
140// assuming there are argNum total args, intArgNum int args,
141// and fpArgNum FP args preceding (and not including) this one.
142// Use INT regs for FP args if this is a varargs call.
143//
144// Return value:
145// InvalidRegNum, if there is no int register available for the arg.
146// regNum, otherwise (this is NOT the unified reg. num).
147//
148inline int
149UltraSparcRegInfo::regNumForFPArg(unsigned regType,
150 bool inCallee, bool isVarArgsCall,
151 unsigned argNo,
152 unsigned intArgNo, unsigned fpArgNo,
153 unsigned& regClassId) const
154{
155 if (isVarArgsCall) {
156 assert(! isVarArgsCall &&
157 "FP arguments to a varargs function should be explicitly copied "
158 "to/from int registers by instruction selection!");
159 return InvalidRegNum;
160 }
161 else {
162 regClassId = FloatRegClassID;
163 if (regType == FPSingleRegType)
164 return (fpArgNo*2+1 >= NumOfFloatArgRegs)?
165 InvalidRegNum : SparcFloatRegOrder::f0 + (fpArgNo * 2 + 1);
166 else if (regType == FPDoubleRegType)
167 return (fpArgNo*2 >= NumOfFloatArgRegs)?
168 InvalidRegNum : SparcFloatRegOrder::f0 + (fpArgNo * 2);
169 else
170 assert(0 && "Illegal FP register type");
171 }
172}
Chris Lattner699683c2002-02-04 05:59:25 +0000173
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000174//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000175// Finds the return value of a sparc specific call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000176//---------------------------------------------------------------------------
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000177
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000178const Value *
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000179UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000180 unsigned OpCode = CallMI->getOpCode();
Chris Lattner697954c2002-01-20 22:54:45 +0000181 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000182
Chris Lattner697954c2002-01-20 22:54:45 +0000183 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000184
185 // The one before the last implicit operand is the return value of
186 // a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000187 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000188 if( NumOfImpRefs > 1 )
Chris Lattner699683c2002-02-04 05:59:25 +0000189 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
190 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000191
Chris Lattner697954c2002-01-20 22:54:45 +0000192 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000193
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000194 // The last implicit operand is the return value of a JMPL
195 //
Chris Lattner697954c2002-01-20 22:54:45 +0000196 if(NumOfImpRefs > 0)
197 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
198 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner699683c2002-02-04 05:59:25 +0000199 } else
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000200 assert(0 && "OpCode must be CALL/JMPL for a call instr");
201
202 return NULL;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000203}
204
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000205
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000206const Value *
207UltraSparcRegInfo::getCallInstIndirectAddrVal(const MachineInstr *CallMI) const
208{
209 return (CallMI->getOpCode() == JMPLCALL)?
210 CallMI->getOperand(0).getVRegValue() : NULL;
211}
212
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000213
214//---------------------------------------------------------------------------
215// Finds the return address of a call sparc specific call instruction
216//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000217const Value *
Chris Lattner699683c2002-02-04 05:59:25 +0000218UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000219 unsigned OpCode = CallMI->getOpCode();
220
Chris Lattner699683c2002-02-04 05:59:25 +0000221 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000222 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
223
224 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000225
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000226 // The last implicit operand is the return address of a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000227 //
Chris Lattner699683c2002-02-04 05:59:25 +0000228 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000229
Chris Lattner699683c2002-02-04 05:59:25 +0000230 } else if(OpCode == JMPLCALL) {
231 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000232 return MO.getVRegValue();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000233 }
Chris Lattner699683c2002-02-04 05:59:25 +0000234
235 assert(0 && "OpCode must be CALL/JMPL for a call instr");
236 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000237}
238
Chris Lattner699683c2002-02-04 05:59:25 +0000239// The following 3 methods are used to find the RegType (see enum above)
240// of a LiveRange, Value and using the unified RegClassID
241//
242int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
Chris Lattner699683c2002-02-04 05:59:25 +0000243 switch (LR->getRegClass()->getID()) {
244 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000245 case FloatRegClassID: {
246 const Type *Typ = LR->getType();
247 if (Typ == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000248 return FPSingleRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000249 else if (Typ == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000250 return FPDoubleRegType;
251 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000252 }
Chris Lattner699683c2002-02-04 05:59:25 +0000253 case IntCCRegClassID: return IntCCRegType;
254 case FloatCCRegClassID: return FloatCCRegType;
255 default: assert( 0 && "Unknown reg class ID");
256 return 0;
257 }
258}
259
260int UltraSparcRegInfo::getRegType(const Value *Val) const {
261 unsigned Typ;
262
263 switch (getRegClassIDOfValue(Val)) {
264 case IntRegClassID: return IntRegType;
Chris Lattner87e873b2002-04-27 02:24:17 +0000265 case FloatRegClassID:
266 if (Val->getType() == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000267 return FPSingleRegType;
Chris Lattner87e873b2002-04-27 02:24:17 +0000268 else if (Val->getType() == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000269 return FPDoubleRegType;
270 assert(0 && "Unknown type in FloatRegClass");
271
Chris Lattner87e873b2002-04-27 02:24:17 +0000272 case IntCCRegClassID: return IntCCRegType;
273 case FloatCCRegClassID: return FloatCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000274 default: assert(0 && "Unknown reg class ID");
275 return 0;
276 }
277}
278
279int UltraSparcRegInfo::getRegType(int reg) const {
280 if (reg < 32)
281 return IntRegType;
282 else if (reg < (32 + 32))
283 return FPSingleRegType;
284 else if (reg < (64 + 32))
285 return FPDoubleRegType;
286 else if (reg < (64+32+4))
287 return FloatCCRegType;
288 else if (reg < (64+32+4+2))
289 return IntCCRegType;
290 else
291 assert(0 && "Invalid register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000292 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000293}
294
295
296
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000297
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000298
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000299//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +0000300// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000301//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000302unsigned
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000303UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
304
305 unsigned OpCode = CallMI->getOpCode();
Chris Lattner699683c2002-02-04 05:59:25 +0000306 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000307
Chris Lattner699683c2002-02-04 05:59:25 +0000308 if (OpCode == CALL) {
309 switch (NumOfImpRefs) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000310 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner699683c2002-02-04 05:59:25 +0000311 case 1: return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000312 default: // two or more implicit refs
Chris Lattner699683c2002-02-04 05:59:25 +0000313 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
314 return NumOfImpRefs - 2;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000315 else
Chris Lattner699683c2002-02-04 05:59:25 +0000316 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000317 }
Chris Lattner699683c2002-02-04 05:59:25 +0000318 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000319
320 // The last implicit operand is the return value of a JMPL instr
321 if( NumOfImpRefs > 0 ) {
Chris Lattner699683c2002-02-04 05:59:25 +0000322 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
323 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000324 else
Chris Lattner699683c2002-02-04 05:59:25 +0000325 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000326 }
327 else
Chris Lattner699683c2002-02-04 05:59:25 +0000328 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000329 }
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000330
Chris Lattner699683c2002-02-04 05:59:25 +0000331 assert(0 && "OpCode must be CALL/JMPL for a call instr");
332 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000333}
334
335
Vikram S. Adve53fec862001-10-22 13:41:12 +0000336
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000337//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000338// Suggests a register for the ret address in the RET machine instruction.
339// We always suggest %i7 by convention.
340//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000341void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000342 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000343
Vikram S. Adve53fec862001-10-22 13:41:12 +0000344 assert( (RetMI->getNumOperands() >= 2)
345 && "JMPL/RETURN must have 3 and 2 operands respectively");
346
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000347 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
348
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000349 // return address is always mapped to i7
350 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000351 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000352
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000353 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000354 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000355 // we have to test later whether it received the suggested color.
356 // In that case, a LR has to be created at the start of method.
357 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000358
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000359 // const Value *RetAddrVal = MO.getVRegValue();
360 // assert( RetAddrVal && "LR for ret address must be created at start");
361 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
362 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
363 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000364}
365
366
367//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000368// Suggests a register for the ret address in the JMPL/CALL machine instr.
369// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000370//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000371void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
372 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000373 std::vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000374
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000375
376 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
377
378 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
379 // create a new LR for the return address and color it
380
381 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000382 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000383 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
384 RetAddrLR->setRegClass( RCList[RegClassID] );
385 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
386 LRI.addLRToMap( RetAddrVal, RetAddrLR);
387
Ruchira Sasanka91442282001-09-30 23:16:47 +0000388}
389
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000390
391
Ruchira Sasanka91442282001-09-30 23:16:47 +0000392
393//---------------------------------------------------------------------------
394// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000395// According to the Sparc ABI, the first 6 incoming args are in
396// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000397// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000398// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000399//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000400void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000401 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000402{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000403 // check if this is a varArgs function. needed for choosing regs.
404 bool isVarArgs = isVarArgsFunction(Meth->getType());
405
406 // get the argument list
Chris Lattnerb7653df2002-04-08 22:03:57 +0000407 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000408
409 // for each argument. count INT and FP arguments separately.
410 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
411 argNo != ArgList.size(); ++argNo)
412 {
413 // get the LR of arg
414 LiveRange *LR = LRI.getLiveRangeForValue((const Value *)ArgList[argNo]);
415 assert( LR && "No live range found for method arg");
416
417 unsigned regType = getRegType( LR );
418 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
419
420 int regNum = (regType == IntRegType)
421 ? regNumForIntArg(true, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
422 : regNumForFPArg(regType, true, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
423
424 if(regNum != InvalidRegNum)
425 LR->setSuggestedColor(regNum);
Chris Lattner20b1ea02001-09-14 03:47:57 +0000426 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000427}
428
Ruchira Sasanka91442282001-09-30 23:16:47 +0000429
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000430
431//---------------------------------------------------------------------------
432// This method is called after graph coloring to move incoming args to
433// the correct hardware registers if they did not receive the correct
434// (suggested) color through graph coloring.
435//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000436void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000437 LiveRangeInfo &LRI,
438 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000439
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000440 // check if this is a varArgs function. needed for choosing regs.
441 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000442 // get the argument list
Chris Lattnerb7653df2002-04-08 22:03:57 +0000443 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000444 // get an iterator to arg list
Ruchira Sasanka91442282001-09-30 23:16:47 +0000445 MachineInstr *AdMI;
446
Ruchira Sasanka91442282001-09-30 23:16:47 +0000447 // for each argument
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000448 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
449 argNo != ArgList.size(); ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000450 // get the LR of arg
Chris Lattnerb62fc4a2002-04-09 19:46:27 +0000451 LiveRange *LR = LRI.getLiveRangeForValue((Value*)ArgList[argNo]);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000452 assert( LR && "No live range found for method arg");
453
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000454 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000455 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000456
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000457 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000458 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000459 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000460 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000461 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000462 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
463
464 int regNum = (regType == IntRegType)
465 ? regNumForIntArg(true, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
466 : regNumForFPArg(regType, true, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
467
468 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000469 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000470 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000471 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000472
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000473 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000474
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000475 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
476
477 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000478 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000479 if( UniLRReg == UniArgReg )
480 continue;
481
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000482 // We are here because the LR did not receive the suggested
483 // but LR received another register.
484 // Now we have to copy the %i reg (or stack pos of arg)
485 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000486
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000487 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000488 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000489 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000490 if( isArgInReg ) {
491 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, regType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000492
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000493 if( regClassIDOfArgReg != RegClassID ) {
494 assert(0 &&
495 "FP arguments to a varargs function should be explicitly "
496 "copied to/from int registers by instruction selection!");
497
498 // It is a variable argument call: the float reg must go in a %o reg.
499 // We have to move an int reg to a float reg via memory.
500 //
501 assert(isVarArgs &&
502 RegClassID == FloatRegClassID &&
503 regClassIDOfArgReg == IntRegClassID &&
504 "This should only be an Int register for an FP argument");
505
506 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
507 getSpilledRegSize(regType));
508 AdMI = cpReg2MemMI(UniArgReg, getFramePointer(), TmpOff, IntRegType);
509 FirstAI->InstrnsBefore.push_back(AdMI);
510
511 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniLRReg, regType);
512 FirstAI->InstrnsBefore.push_back(AdMI);
513 }
514 else {
515 AdMI = cpReg2RegMI(UniArgReg, UniLRReg, regType );
516 FirstAI->InstrnsBefore.push_back( AdMI );
517 }
518 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000519 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000520
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000521 // Now the arg is coming on stack. Since the LR recieved a register,
522 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000523 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000524 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000525 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000526 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
527 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000528
529 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000530 UniLRReg, regType );
531 FirstAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000532 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000533
534 } // if LR received a color
535
536 else {
537
538 // Now, the LR did not receive a color. But it has a stack offset for
539 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000540 // So, if the arg is coming in UniArgReg register, we can just move
541 // that on to the stack pos of LR
542
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000543 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000544
545 if( regClassIDOfArgReg != RegClassID ) {
546 assert(0 &&
547 "FP arguments to a varargs function should be explicitly "
548 "copied to/from int registers by instruction selection!");
549
550 // It must be a float arg for a variable argument call, which
551 // must come in a %o reg. Move the int reg to the stack.
552 //
553 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
554 "This should only be an Int register for an FP argument");
555
556 AdMI = cpReg2MemMI(UniArgReg, getFramePointer(),
557 LR->getSpillOffFromFP(), IntRegType );
558 }
559 else {
560 AdMI = cpReg2MemMI(UniArgReg, getFramePointer(),
561 LR->getSpillOffFromFP(), regType );
562 }
563
564 FirstAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000565 }
566
567 else {
568
569 // Now the arg is coming on stack. Since the LR did NOT
570 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000571 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000572 // since this method is called before any other method that makes
573 // uses of the stack pos of the LR (e.g., updateMachineInstr)
574
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000575 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000576 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000577 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
578 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000579
580 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000581 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000582
583 }
584
Ruchira Sasanka91442282001-09-30 23:16:47 +0000585 } // for each incoming argument
586
587}
588
Chris Lattner20b1ea02001-09-14 03:47:57 +0000589
590
Ruchira Sasanka91442282001-09-30 23:16:47 +0000591//---------------------------------------------------------------------------
592// This method is called before graph coloring to suggest colors to the
593// outgoing call args and the return value of the call.
594//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000595void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000596 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000597 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000598 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000599
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000600 // check if this is a varArgs function. needed for choosing regs.
601 bool isVarArgs = isVarArgsCall(CallMI);
602
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000603 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000604
Chris Lattner20b1ea02001-09-14 03:47:57 +0000605
Ruchira Sasanka91442282001-09-30 23:16:47 +0000606 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000607 // will be in %o0 if the value is an integer type, or in %f0 if the
608 // value is a float type.
609
Ruchira Sasanka91442282001-09-30 23:16:47 +0000610 // the return value cannot have a LR in machine instruction since it is
611 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000612
Ruchira Sasanka91442282001-09-30 23:16:47 +0000613 // if type is not void, create a new live range and set its
614 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000615
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000616
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000617 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000618
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000619
Chris Lattner699683c2002-02-04 05:59:25 +0000620 if (RetVal) {
621 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000622 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000623
Chris Lattner699683c2002-02-04 05:59:25 +0000624 // create a new LR for the return value
625 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000626 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000627 unsigned RegClassID = getRegClassIDOfValue(RetVal);
628 RetValLR->setRegClass(RCList[RegClassID]);
629 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000630
631 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000632
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000633 if( RegClassID == IntRegClassID )
634 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
635 else if (RegClassID == FloatRegClassID )
636 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
637 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000638 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000639
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000640
Ruchira Sasanka91442282001-09-30 23:16:47 +0000641 // Now suggest colors for arguments (operands) of the call instruction.
642 // Colors are suggested only if the arg number is smaller than the
643 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000644 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000645
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000646 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000647
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000648 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
649 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000650
651 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000652
653 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000654 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000655
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000656 // not possible to have a null LR since all args (even consts)
657 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000658 if (!LR) {
659 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000660 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000661 }
662
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000663 unsigned regType = getRegType( LR );
664 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000665
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000666 // Choose a register for this arg depending on whether it is
667 // an INT or FP value, and if it is a varargs call
668 int regNum = (regType == IntRegType)
669 ? regNumForIntArg(false, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
670 : regNumForFPArg(regType, false, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000671
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000672 // If a register could be allocated, use it.
673 // If not, do NOTHING as this will be colored as a normal value.
674 if(regNum != InvalidRegNum)
675 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000676
Ruchira Sasanka91442282001-09-30 23:16:47 +0000677 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000678
Chris Lattner20b1ea02001-09-14 03:47:57 +0000679}
680
681
Ruchira Sasanka91442282001-09-30 23:16:47 +0000682//---------------------------------------------------------------------------
683// After graph coloring, we have call this method to see whehter the return
684// value and the call args received the correct colors. If not, we have
685// to instert copy instructions.
686//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000687
Chris Lattner699683c2002-02-04 05:59:25 +0000688void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
689 LiveRangeInfo &LRI,
690 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000691 PhyRegAlloc &PRA,
692 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000693
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000694 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
695
Ruchira Sasanka91442282001-09-30 23:16:47 +0000696 // First color the return value of the call.
697 // If there is a LR for the return value, it means this
698 // method returns a value
699
700 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000701
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000702 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000703
Chris Lattner0665a5f2002-02-05 01:43:49 +0000704 if (RetVal) {
705 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000706
Chris Lattner0665a5f2002-02-05 01:43:49 +0000707 if (!RetValLR) {
708 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
709 assert(0 && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000710 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000711
712 unsigned RegClassID = (RetValLR->getRegClass())->getID();
713 bool recvCorrectColor = false;
714
715 unsigned CorrectCol; // correct color for ret value
716 if(RegClassID == IntRegClassID)
717 CorrectCol = SparcIntRegOrder::o0;
718 else if(RegClassID == FloatRegClassID)
719 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000720 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000721 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000722 return;
723 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000724
725 // if the LR received the correct color, NOTHING to do
726
727 if( RetValLR->hasColor() )
728 if( RetValLR->getColor() == CorrectCol )
729 recvCorrectColor = true;
730
731
732 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000733 // put copy instruction
734
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000735 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000736
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000737 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000738
739 // the reg that LR must be colored with
740 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000741
742 if( RetValLR->hasColor() ) {
743
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000744 unsigned
745 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000746
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000747 // the return value is coming in UniRetReg but has to go into
748 // the UniRetLRReg
749
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000750 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, regType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000751
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000752 } // if LR has color
753 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000754
755 // if the LR did NOT receive a color, we have to move the return
756 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000757
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000758 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000759 RetValLR->getSpillOffFromFP(), regType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000760 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000761
762 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000763
764 } // the LR didn't receive the suggested color
765
766 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000767
768
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000769 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000770 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000771 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000772
Chris Lattner697954c2002-01-20 22:54:45 +0000773 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000774
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000775 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000776
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000777 bool isVarArgs = isVarArgsCall(CallMI);
778 if (DEBUG_RA && isVarArgs) cerr << "\nVar arg call found!!\n";
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000779
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000780 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
781 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000782
783 const Value *CallArg = CallMI->getImplicitRef(i);
784
Ruchira Sasanka91442282001-09-30 23:16:47 +0000785 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000786 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000787
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000788 unsigned regType = getRegType( CallArg );
789 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000790
791 // find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000792 // Also find the correct register the argument must use (UniArgReg)
793 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000794 bool isArgInReg = false;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000795 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
796 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
797
798 int regNum = (regType == IntRegType)
799 ? regNumForIntArg(false, isVarArgs, argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
800 : regNumForFPArg(regType, false, isVarArgs, argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
801
802 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000803 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000804 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000805 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000806
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000807 // not possible to have a null LR since all args (even consts)
808 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000809 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000810 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000811 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000812 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000813
Chris Lattner699683c2002-02-04 05:59:25 +0000814 if (LR->hasColor()) {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000815 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
816
817 // if LR received the correct color, nothing to do
818 if( UniLRReg == UniArgReg )
819 continue;
820
Ruchira Sasanka91442282001-09-30 23:16:47 +0000821 // We are here because though the LR is allocated a register, it
822 // was not allocated the suggested register. So, we have to copy %ix reg
823 // (or stack pos of arg) to the register it was colored with
824
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000825 // the LR is colored with UniLRReg but has to go into UniArgReg
826 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000827
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000828 if( isArgInReg ) {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000829
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000830 if( regClassIDOfArgReg != RegClassID ) {
831 assert(0 &&
832 "FP arguments to a varargs function should be explicitly "
833 "copied to/from int registers by instruction selection!");
834
835 // It must be a float arg for a variable argument call, which
836 // must come in a %o reg.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000837 // We have to move a float reg to an int reg via memory.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000838 //
839 assert(isVarArgs &&
840 RegClassID == FloatRegClassID &&
841 regClassIDOfArgReg == IntRegClassID &&
842 "This should only be an Int register for an FP argument");
843
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000844 // The store instruction will be directly added to
845 // CallAI->InstrnsBefore since it does not need reordering
846 //
847 int TmpOff = PRA.mcInfo.pushTempValue(target,
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000848 getSpilledRegSize(regType));
849
850 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, regType );
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000851 CallAI->InstrnsBefore.push_back( AdMI );
852
853 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
854 AddedInstrnsBefore.push_back( AdMI );
855 }
856
857 else {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000858 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, regType );
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000859 AddedInstrnsBefore.push_back( AdMI );
860 }
861
Chris Lattner699683c2002-02-04 05:59:25 +0000862 } else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000863 // Now, we have to pass the arg on stack. Since LR received a register
864 // we just have to move that register to the stack position where
865 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000866
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000867 const MachineFrameInfo& frameInfo = target.getFrameInfo();
868 int argOffset =
869 frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
870
871 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, regType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000872
873 // Now add the instruction. We can directly add to
874 // CallAI->InstrnsBefore since we are just saving a reg on stack
875 //
876 CallAI->InstrnsBefore.push_back( AdMI );
877
878 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000879 }
880
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000881
Chris Lattner699683c2002-02-04 05:59:25 +0000882 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000883
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000884 if( isArgInReg ) {
885
886 // Now the LR did NOT recieve a register but has a stack poistion.
887 // Since, the outgoing arg goes in a register we just have to insert
888 // a load instruction to load the LR to outgoing register
889
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000890 if( regClassIDOfArgReg != RegClassID ) {
891 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
892 "This should only be an Int register for an FP argument");
893
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000894 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
895 UniArgReg, IntRegType );
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000896 }
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000897 else
898 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000899 UniArgReg, regType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000900
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000901 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000902 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000903 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000904
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000905 else {
906 // Now, we have to pass the arg on stack. Since LR also did NOT
907 // receive a register we have to move an argument in memory to
908 // outgoing parameter on stack.
909
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000910 // Optimize: Optimize when reverse pointers in MahineInstr are
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000911 // introduced.
912 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
913 // fails, then use the following code. Currently, we cannot call the
914 // above method since we cannot find LVSetBefore without the BB
915
Ruchira Sasanka295264d2001-11-15 20:25:07 +0000916 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000917
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000918 int TmpOff = PRA.mcInfo.pushTempValue(target,
919 getSpilledRegSize(getRegType(LR)) );
920
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000921
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000922 const MachineFrameInfo& frameInfo = target.getFrameInfo();
923 int argOffset =
924 frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000925
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000926 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000927
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000928 // Sequence:
929 // (1) Save TReg on stack
930 // (2) Load LR value into TReg from stack pos of LR
931 // (3) Store Treg on outgoing Arg pos on stack
932 // (4) Load the old value of TReg from stack to TReg (restore it)
933
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000934 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000935 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000936 TReg, regType );
937 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, regType );
938 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000939
940 // We directly add to CallAI->InstrnsBefore instead of adding to
941 // AddedInstrnsBefore since these instructions must not be
942 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000943
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000944 CallAI->InstrnsBefore.push_back( Ad1 );
945 CallAI->InstrnsBefore.push_back( Ad2 );
946 CallAI->InstrnsBefore.push_back( Ad3 );
947 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000948
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000949 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000950 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000951 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000952 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000953
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000954
955 // if we added any instruction before the call instruction, verify
956 // that they are in the proper order and if not, reorder them
957
Chris Lattner699683c2002-02-04 05:59:25 +0000958 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000959
Chris Lattner699683c2002-02-04 05:59:25 +0000960 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000961 cerr << "\nCalling reorder with instrns: \n";
962 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
963 cerr << *(AddedInstrnsBefore[i]);
964 }
965
Chris Lattner697954c2002-01-20 22:54:45 +0000966 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000967 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000968
Chris Lattner699683c2002-02-04 05:59:25 +0000969 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000970 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000971 for(unsigned i = 0; i < TmpVec.size(); i++)
972 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000973 }
974
975 // copy the results back from TmpVec to InstrnsBefore
976 for(unsigned i=0; i < TmpVec.size(); i++)
977 CallAI->InstrnsBefore.push_back( TmpVec[i] );
978 }
979
980
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000981 // now insert caller saving code for this call instruction
982 //
983 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000984}
985
Ruchira Sasanka91442282001-09-30 23:16:47 +0000986//---------------------------------------------------------------------------
987// This method is called for an LLVM return instruction to identify which
988// values will be returned from this method and to suggest colors.
989//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000990void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
991 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000992
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000993 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000994
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000995 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000996
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000997 // if there is an implicit ref, that has to be the ret value
998 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000999
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001000 // The first implicit operand is the return value of a return instr
1001 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001002
Ruchira Sasanka91442282001-09-30 23:16:47 +00001003 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001004
Chris Lattner0665a5f2002-02-05 01:43:49 +00001005 if (!LR) {
1006 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1007 assert(0 && "No LR for return value of non-void method");
1008 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001009
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001010 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001011
Chris Lattner699683c2002-02-04 05:59:25 +00001012 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001013 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +00001014 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001015 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001016 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001017}
1018
Ruchira Sasanka91442282001-09-30 23:16:47 +00001019
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001020
1021//---------------------------------------------------------------------------
1022// Colors the return value of a method to %i0 or %f0, if possible. If it is
1023// not possilbe to directly color the LR, insert a copy instruction to move
1024// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
1025// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001026//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +00001027void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
1028 LiveRangeInfo &LRI,
1029 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001030
Chris Lattner699683c2002-02-04 05:59:25 +00001031 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001032
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001033 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +00001034 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001035
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001036 // The first implicit operand is the return value of a return instr
1037 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001038
Chris Lattner699683c2002-02-04 05:59:25 +00001039 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001040
Chris Lattner0665a5f2002-02-05 01:43:49 +00001041 if (!LR) {
1042 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1043 // assert( LR && "No LR for return value of non-void method");
1044 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001045 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001046
Ruchira Sasanka91442282001-09-30 23:16:47 +00001047 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001048 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001049
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001050 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001051 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001052 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001053 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001054 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001055 else {
Chris Lattner699683c2002-02-04 05:59:25 +00001056 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001057 return;
1058 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001059
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001060 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +00001061
Chris Lattner699683c2002-02-04 05:59:25 +00001062 if (LR->hasColor() && LR->getColor() == CorrectCol)
1063 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001064
Chris Lattner699683c2002-02-04 05:59:25 +00001065 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001066
Chris Lattner699683c2002-02-04 05:59:25 +00001067 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001068
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001069 // We are here because the LR was allocted a regiter
1070 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001071
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001072 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001073
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001074 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001075
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001076 // the LR received UniLRReg but must be colored with UniRetReg
1077 // to pass as the return value
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001078 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, regType));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001079 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001080 else { // if the LR is spilled
Chris Lattner697954c2002-01-20 22:54:45 +00001081 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1082 LR->getSpillOffFromFP(),
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001083 UniRetReg, regType);
Chris Lattner697954c2002-01-20 22:54:45 +00001084 RetAI->InstrnsBefore.push_back(AdMI);
1085 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001086 }
1087
Ruchira Sasanka91442282001-09-30 23:16:47 +00001088 } // if there is a return value
1089
1090}
1091
1092
1093//---------------------------------------------------------------------------
1094// Copy from a register to register. Register number must be the unified
1095// register number
1096//---------------------------------------------------------------------------
1097
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001098MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
1099 unsigned DestReg,
Chris Lattner699683c2002-02-04 05:59:25 +00001100 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001101 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001102 "Invalid Register");
1103
1104 MachineInstr * MI = NULL;
1105
1106 switch( RegType ) {
1107
1108 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001109 case IntCCRegType:
1110 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +00001111 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001112 MI->SetMachineOperandReg(0, SrcReg, false);
1113 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1114 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001115 break;
1116
1117 case FPSingleRegType:
1118 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001119 MI->SetMachineOperandReg(0, SrcReg, false);
1120 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001121 break;
1122
1123 case FPDoubleRegType:
1124 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001125 MI->SetMachineOperandReg(0, SrcReg, false);
1126 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001127 break;
1128
1129 default:
1130 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001131 }
1132
1133 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001134}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001135
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001136//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001137// Copy from a register to memory (i.e., Store). Register number must
1138// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001139//---------------------------------------------------------------------------
1140
1141
Chris Lattner699683c2002-02-04 05:59:25 +00001142MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1143 unsigned DestPtrReg,
1144 int Offset, int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001145 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001146 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001147 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001148 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001149 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001150 MI->SetMachineOperandReg(0, SrcReg, false);
1151 MI->SetMachineOperandReg(1, DestPtrReg, false);
1152 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1153 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001154 break;
1155
1156 case FPSingleRegType:
1157 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001158 MI->SetMachineOperandReg(0, SrcReg, false);
1159 MI->SetMachineOperandReg(1, DestPtrReg, false);
1160 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1161 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001162 break;
1163
1164 case FPDoubleRegType:
1165 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001166 MI->SetMachineOperandReg(0, SrcReg, false);
1167 MI->SetMachineOperandReg(1, DestPtrReg, false);
1168 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1169 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001170 break;
1171
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001172 case IntCCRegType:
1173 assert( 0 && "Cannot directly store %ccr to memory");
1174
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001175 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001176 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001177 }
1178
1179 return MI;
1180}
1181
1182
1183//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001184// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001185// register number
1186//---------------------------------------------------------------------------
1187
1188
Chris Lattner699683c2002-02-04 05:59:25 +00001189MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1190 int Offset,
1191 unsigned DestReg,
1192 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001193 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001194 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001195 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001196 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001197 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001198 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1199 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1200 (int64_t) Offset);
1201 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001202 break;
1203
1204 case FPSingleRegType:
1205 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001206 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1207 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1208 (int64_t) Offset);
1209 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001210
1211 break;
1212
1213 case FPDoubleRegType:
1214 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001215 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1216 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1217 (int64_t) Offset);
1218 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001219 break;
1220
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001221 case IntCCRegType:
1222 assert( 0 && "Cannot directly load into %ccr from memory");
1223
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001224 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001225 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001226 }
1227
1228 return MI;
1229}
1230
1231
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001232
1233
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001234
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001235//---------------------------------------------------------------------------
1236// Generate a copy instruction to copy a value to another. Temporarily
1237// used by PhiElimination code.
1238//---------------------------------------------------------------------------
1239
1240
Chris Lattner699683c2002-02-04 05:59:25 +00001241MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001242 int RegType = getRegType( Src );
1243
1244 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001245
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001246 MachineInstr * MI = NULL;
1247
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001248 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001249 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001250 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001251 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1252 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1253 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001254 break;
1255
1256 case FPSingleRegType:
1257 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001258 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1259 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001260 break;
1261
1262
1263 case FPDoubleRegType:
1264 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001265 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1266 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001267 break;
1268
1269 default:
1270 assert(0 && "Unknow RegType in CpValu2Value");
1271 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001272
1273 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001274}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001275
1276
1277
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001278
1279
1280
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001281//----------------------------------------------------------------------------
1282// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001283// a call machine instruction. The caller saving/restoring instructions are
1284// inserted like:
1285//
1286// ** caller saving instructions
1287// other instructions inserted for the call by ColorCallArg
1288// CALL instruction
1289// other instructions inserted for the call ColorCallArg
1290// ** caller restoring instructions
1291//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001292//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001293
Ruchira Sasanka91442282001-09-30 23:16:47 +00001294
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001295void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1296 const BasicBlock *BB,
1297 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001298
Ruchira Sasankabf915522002-01-07 21:03:42 +00001299 // has set to record which registers were saved/restored
1300 //
Chris Lattner697954c2002-01-20 22:54:45 +00001301 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001302
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001303 // Now find the LR of the return value of the call
1304 // The last *implicit operand* is the return value of a call
1305 // Insert it to to he PushedRegSet since we must not save that register
1306 // and restore it after the call.
1307 // We do this because, we look at the LV set *after* the instruction
1308 // to determine, which LRs must be saved across calls. The return value
1309 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001310
1311
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001312 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001313
Chris Lattner699683c2002-02-04 05:59:25 +00001314 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001315 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001316 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001317
Chris Lattner699683c2002-02-04 05:59:25 +00001318 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001319 PushedRegSet.insert(
1320 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001321 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001322 }
1323
1324
Chris Lattner748697d2002-02-05 04:20:12 +00001325 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1326 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001327
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001328 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001329 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001330
1331 // get the live range corresponding to live var
1332 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1333
1334 // LR can be null if it is a const since a const
1335 // doesn't have a dominating def - see Assumptions above
1336 if( LR ) {
1337
1338 if( LR->hasColor() ) {
1339
1340 unsigned RCID = (LR->getRegClass())->getID();
1341 unsigned Color = LR->getColor();
1342
1343 if ( isRegVolatile(RCID, Color) ) {
1344
1345 // if the value is in both LV sets (i.e., live before and after
1346 // the call machine instruction)
1347
1348 unsigned Reg = getUnifiedRegNum(RCID, Color);
1349
1350 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1351
1352 // if we haven't already pushed that register
1353
1354 unsigned RegType = getRegType( LR );
1355
1356 // Now get two instructions - to push on stack and pop from stack
1357 // and add them to InstrnsBefore and InstrnsAfter of the
1358 // call instruction
1359
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001360
1361 int StackOff = PRA.mcInfo.pushTempValue(target,
1362 getSpilledRegSize(RegType));
1363
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001364
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001365 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1366 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001367
1368 //---- Insert code for pushing the reg on stack ----------
1369
1370 if( RegType == IntCCRegType ) {
1371
1372 // Handle IntCCRegType specially since we cannot directly
1373 // push %ccr on to the stack
1374
Chris Lattner748697d2002-02-05 04:20:12 +00001375 const ValueSet &LVSetBef =
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001376 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1377
1378 // get a free INTEGER register
1379 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001380 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1381 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1382
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001383 // insert the instructions in reverse order since we are
1384 // adding them to the front of InstrnsBefore
1385
1386 if(AdIAftCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001387 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001388
1389 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001390 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001391
1392 if(AdIBefCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001393 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001394
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001395 if(DEBUG_RA) {
1396 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1397 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1398 cerr << "\t" << *AdICpCC;
1399 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1400 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001401
1402 } else {
1403 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001404 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001405 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001406 }
1407
1408
1409 //---- Insert code for popping the reg from the stack ----------
1410
Chris Lattner748697d2002-02-05 04:20:12 +00001411 if (RegType == IntCCRegType) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001412
1413 // Handle IntCCRegType specially since we cannot directly
1414 // pop %ccr on from the stack
1415
1416 // get a free INT register
1417 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001418 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1419 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001420
1421 if(AdIBefCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001422 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001423
1424 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001425 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001426
1427 if(AdIAftCC)
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001428 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001429
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001430 if(DEBUG_RA) {
1431
1432 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1433 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1434 cerr << "\t" << *AdICpCC;
1435 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1436 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001437
1438 } else {
1439 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001440 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner0b0ffa02002-04-09 05:13:04 +00001441 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001442 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001443
Chris Lattner748697d2002-02-05 04:20:12 +00001444 PushedRegSet.insert(Reg);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001445
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001446 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001447 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001448 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001449 if( RegType == IntCCRegType ) {
1450 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1451 if(AdIAftCC) cerr << *AdIAftCC;
1452 }
1453 else {
1454 if(AdIBef) cerr << *AdIBef << "\t";
1455 if(AdIAft) cerr << *AdIAft;
1456 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001457 }
1458 } // if not already pushed
1459
1460 } // if LR has a volatile color
1461
1462 } // if LR has color
1463
1464 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001465
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001466 } // for each value in the LV set after instruction
1467
Ruchira Sasanka91442282001-09-30 23:16:47 +00001468}
1469
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001470//---------------------------------------------------------------------------
1471// Copies %ccr into an integer register. IntReg is the UNIFIED register
1472// number.
1473//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001474
Chris Lattner699683c2002-02-04 05:59:25 +00001475MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1476 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001477 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1478 SparcIntCCRegOrder::ccr),
1479 false, true);
1480 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001481 return MI;
1482}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001483
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001484//---------------------------------------------------------------------------
1485// Copies an integer register into %ccr. IntReg is the UNIFIED register
1486// number.
1487//---------------------------------------------------------------------------
1488
Chris Lattner699683c2002-02-04 05:59:25 +00001489MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1490 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001491 MI->SetMachineOperandReg(0, IntReg, false);
1492 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1493 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1494 true, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001495 return MI;
1496}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001497
1498
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001499
1500
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001501//---------------------------------------------------------------------------
1502// Print the register assigned to a LR
1503//---------------------------------------------------------------------------
1504
Chris Lattner699683c2002-02-04 05:59:25 +00001505void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001506 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001507 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001508
Chris Lattner699683c2002-02-04 05:59:25 +00001509 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001510 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001511 return;
1512 }
1513
1514 // if a color is found
1515
Chris Lattner1e23ed72001-10-15 18:15:27 +00001516 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001517
Chris Lattner699683c2002-02-04 05:59:25 +00001518 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001519 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001520
Chris Lattner699683c2002-02-04 05:59:25 +00001521 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001522 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001523 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001524 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001525 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001526 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001527}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001528
1529//---------------------------------------------------------------------------
1530// This method examines instructions inserted by RegAlloc code before a
1531// machine instruction to detect invalid orders that destroy values before
1532// they are used. If it detects such conditions, it reorders the instructions.
1533//
1534// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001535// instructions inserted by RegAlloc. All such instruction MUST have
1536// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001537
1538// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1539// this method is called.
1540
1541// This method uses two vectors for efficiency in accessing
1542
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001543// Since instructions are inserted in RegAlloc, this assumes that the
1544// first operand is the source reg and the last operand is the dest reg.
1545
1546// All the uses are before THE def to a register
1547
1548
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001549//---------------------------------------------------------------------------
Chris Lattner697954c2002-01-20 22:54:45 +00001550void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1551 std::vector<MachineInstr *> &OrdVec,
1552 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001553
1554 /*
1555 Problem: We can have instructions inserted by RegAlloc like
1556 1. add %ox %g0 %oy
1557 2. add %oy %g0 %oz, where z!=x or z==x
1558
1559 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001560
1561 Solution:
1562 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001563
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001564 Algorithm:
1565
1566 do
1567 for each instruction 'DefInst' in the UnOrdVec
1568 for each instruction 'UseInst' that follows the DefInst
1569 if the reg defined by DefInst is used by UseInst
1570 mark DefInst as not movable in this iteration
1571 If DefInst is not marked as not-movable, move DefInst to OrdVec
1572 while all instructions in DefInst are moved to OrdVec
1573
1574 For moving, we call the move2OrdVec(). It checks whether there is a def
1575 in it for the uses in the instruction to be added to OrdVec. If there
1576 are no preceding defs, it just appends the instruction. If there is a
1577 preceding def, it puts two instructions to save the reg on stack before
1578 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001579
1580 */
1581
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001582 bool CouldMoveAll;
1583 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001584
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001585 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001586 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001587 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001588
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001589 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001590
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001591 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001592
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001593 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001594
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001595 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001596
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001597 //cerr << "\nInst in UnordVec = " << *DefInst;
1598
1599 // last operand is the def (unless for a store which has no def reg)
1600 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1601
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001602 if( DefOp.opIsDef() &&
1603 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001604
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001605 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001606
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001607 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001608
Chris Lattner697954c2002-01-20 22:54:45 +00001609 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001610 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001611
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001612 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1613
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001614 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001615 if( UseInst == NULL) continue;
1616
1617 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001618 MachineOperand& UseOp = UseInst->getOperand(0);
1619
1620 if( ! UseOp.opIsDef() &&
1621 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1622
1623 // if use is a register ...
1624
1625 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1626
1627 // if Def and this use are the same, it means that this use
1628 // is destroyed by a def before it is used
1629
1630 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001631
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001632 DefEqUse = true;
1633 CouldMoveAll = false;
1634 DebugPrint = true;
1635 break;
1636 } // if two registers are equal
1637
1638 } // if use is a register
1639
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001640 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001641
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001642 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001643
1644 // after examining all the instructions that follow the DefInst
1645 // if there are no dependencies, we can move it to the OrdVec
1646
1647 // cerr << "Moved to Ord: " << *DefInst;
1648
1649 moveInst2OrdVec(OrdVec, DefInst, PRA);
1650
1651 //OrdVec.push_back(DefInst);
1652
1653 // mark the pos of DefInst with NULL to indicate that it is
1654 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001655 *DefIt = NULL;
1656 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001657
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001658 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001659
1660 } // for all instructions in the UnordVec
1661
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001662
Chris Lattner699683c2002-02-04 05:59:25 +00001663 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001664
Chris Lattner699683c2002-02-04 05:59:25 +00001665 if (DebugPrint) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001666 cerr << "\nAdded instructions were reordered to:\n";
1667 for(unsigned int i=0; i < OrdVec.size(); i++)
1668 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001669 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001670}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001671
1672
1673
1674
1675
Chris Lattner697954c2002-01-20 22:54:45 +00001676void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001677 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001678 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001679 MachineOperand& UseOp = UnordInst->getOperand(0);
1680
1681 if( ! UseOp.opIsDef() &&
1682 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1683
1684 // for the use of UnordInst, see whether there is a defining instr
1685 // before in the OrdVec
1686 bool DefEqUse = false;
1687
Chris Lattner697954c2002-01-20 22:54:45 +00001688 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001689
1690 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1691
1692 MachineInstr *OrdInst = *OrdIt ;
1693
1694 MachineOperand& DefOp =
1695 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1696
1697 if( DefOp.opIsDef() &&
1698 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1699
1700 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1701
1702 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1703
1704 // we are here because there is a preceding def in the OrdVec
1705 // for the use in this intr we are going to insert. This
1706 // happened because the original code was like:
1707 // 1. add %ox %g0 %oy
1708 // 2. add %oy %g0 %ox
1709 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1710 // Now we are processing %ox of 1.
1711 // We have to
1712
1713 const int UReg = DefOp.getMachineRegNum();
1714 const int RegType = getRegType(UReg);
1715 MachineInstr *AdIBef, *AdIAft;
1716
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001717 const int StackOff = PRA.mcInfo.pushTempValue(target,
1718 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001719
1720 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001721 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001722 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1723 OrdIt++; // points to current instr we processed
1724
1725 // Load directly into DReg (%oy)
1726 MachineOperand& DOp=
1727 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1728 assert(DOp.opIsDef() && "Last operand is not the def");
1729 const int DReg = DOp.getMachineRegNum();
1730
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001731 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001732 OrdVec.push_back(AdIAft);
1733
1734 cerr << "\nFixed CIRCULAR references by reordering";
1735
1736 if( DEBUG_RA ) {
1737 cerr << "\nBefore CIRCULAR Reordering:\n";
1738 cerr << *UnordInst;
1739 cerr << *OrdInst;
1740
1741 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1742 for(unsigned i=0; i < OrdVec.size(); i++)
1743 cerr << *(OrdVec[i]);
1744 }
1745
1746 // Do not copy the UseInst to OrdVec
1747 DefEqUse = true;
1748 break;
1749
1750 }// if two registers are equal
1751
1752 } // if Def is a register
1753
1754 } // for each instr in OrdVec
1755
Chris Lattner699683c2002-02-04 05:59:25 +00001756 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001757
1758 // We didn't find a def in the OrdVec, so just append this inst
1759 OrdVec.push_back( UnordInst );
1760 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1761 }
1762
1763 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001764}