blob: ad0dd25685ff6f4b486e4171c0611068e7ef7de6 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
Chris Lattnerf9986852002-04-27 07:27:19 +000014#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000015#include "llvm/iTerminators.h"
16#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000017#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000018#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000019#include <iostream>
Vikram S. Advea6d94c92002-04-25 04:42:21 +000020#include <values.h>
Chris Lattner7f74a562002-01-20 22:54:45 +000021using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000022
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000037// getZeroRegNum - returns the register that contains always zero.
38// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000039//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000040int UltraSparcRegInfo::getZeroRegNum() const {
41 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
42 SparcIntRegOrder::g0);
43}
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000049 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
50 SparcIntRegOrder::o7);
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000058 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
59 SparcIntRegOrder::i7);
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000081// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000082unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000083 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
84 SparcIntRegOrder::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +000085}
86
Vikram S. Advedb1435f2002-03-18 03:12:16 +000087// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000088unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000089 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
90 SparcIntRegOrder::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +000091}
92
93
Vikram S. Advea6d94c92002-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 Lattner5216cc52002-02-04 05:59:25 +0000173
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000174//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000175// Finds the return value of a sparc specific call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000176//---------------------------------------------------------------------------
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000177
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000178const Value *
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000179UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000180 unsigned OpCode = CallMI->getOpCode();
Chris Lattner7f74a562002-01-20 22:54:45 +0000181 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000182
Chris Lattner7f74a562002-01-20 22:54:45 +0000183 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000184
185 // The one before the last implicit operand is the return value of
186 // a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000187 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000188 if( NumOfImpRefs > 1 )
Chris Lattner5216cc52002-02-04 05:59:25 +0000189 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
190 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000191
Chris Lattner7f74a562002-01-20 22:54:45 +0000192 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000193
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000194 // The last implicit operand is the return value of a JMPL
195 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000196 if(NumOfImpRefs > 0)
197 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
198 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner5216cc52002-02-04 05:59:25 +0000199 } else
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000200 assert(0 && "OpCode must be CALL/JMPL for a call instr");
201
202 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000203}
204
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000205
Vikram S. Adve02662bd2002-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000213
214//---------------------------------------------------------------------------
215// Finds the return address of a call sparc specific call instruction
216//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000217const Value *
Chris Lattner5216cc52002-02-04 05:59:25 +0000218UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000219 unsigned OpCode = CallMI->getOpCode();
220
Chris Lattner5216cc52002-02-04 05:59:25 +0000221 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000222 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
223
224 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000225
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000226 // The last implicit operand is the return address of a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000227 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000228 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000229
Chris Lattner5216cc52002-02-04 05:59:25 +0000230 } else if(OpCode == JMPLCALL) {
231 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000232 return MO.getVRegValue();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000233 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000234
235 assert(0 && "OpCode must be CALL/JMPL for a call instr");
236 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000237}
238
Chris Lattner5216cc52002-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 Lattner5216cc52002-02-04 05:59:25 +0000243 switch (LR->getRegClass()->getID()) {
244 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000245 case FloatRegClassID: {
246 const Type *Typ = LR->getType();
247 if (Typ == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000248 return FPSingleRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000249 else if (Typ == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000250 return FPDoubleRegType;
251 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000252 }
Chris Lattner5216cc52002-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 Lattner93ddab22002-04-27 02:24:17 +0000265 case FloatRegClassID:
266 if (Val->getType() == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000267 return FPSingleRegType;
Chris Lattner93ddab22002-04-27 02:24:17 +0000268 else if (Val->getType() == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000269 return FPDoubleRegType;
270 assert(0 && "Unknown type in FloatRegClass");
271
Chris Lattner93ddab22002-04-27 02:24:17 +0000272 case IntCCRegClassID: return IntCCRegType;
273 case FloatCCRegClassID: return FloatCCRegType;
Chris Lattner5216cc52002-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 Lattner5536c9c2002-02-24 23:02:40 +0000292 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000293}
294
295
296
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000297
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000298
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000299//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000300// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000301//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000302unsigned
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000303UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
304
305 unsigned OpCode = CallMI->getOpCode();
Chris Lattner5216cc52002-02-04 05:59:25 +0000306 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000307
Chris Lattner5216cc52002-02-04 05:59:25 +0000308 if (OpCode == CALL) {
309 switch (NumOfImpRefs) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000310 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner5216cc52002-02-04 05:59:25 +0000311 case 1: return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000312 default: // two or more implicit refs
Chris Lattner5216cc52002-02-04 05:59:25 +0000313 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
314 return NumOfImpRefs - 2;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000315 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000316 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000317 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000318 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000319
320 // The last implicit operand is the return value of a JMPL instr
321 if( NumOfImpRefs > 0 ) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000322 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
323 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000324 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000325 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000326 }
327 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000328 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000329 }
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000330
Chris Lattner5216cc52002-02-04 05:59:25 +0000331 assert(0 && "OpCode must be CALL/JMPL for a call instr");
332 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000333}
334
335
Vikram S. Adve84982772001-10-22 13:41:12 +0000336
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000337//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-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 Lattner5216cc52002-02-04 05:59:25 +0000341void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000342 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000343
Vikram S. Adve84982772001-10-22 13:41:12 +0000344 assert( (RetMI->getNumOperands() >= 2)
345 && "JMPL/RETURN must have 3 and 2 operands respectively");
346
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000347 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
348
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000349 // return address is always mapped to i7
350 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000351 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000352
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000353 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000354 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000358
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000364}
365
366
367//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000370//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000371void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
372 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000373 std::vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000374
Ruchira Sasanka24729a32001-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 Lattnere6b511d2002-02-04 16:37:09 +0000382 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000388}
389
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000390
391
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000392
393//---------------------------------------------------------------------------
394// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000397// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000398// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000399//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000400void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000401 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000402{
Vikram S. Advea6d94c92002-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 Lattnerf739fa82002-04-08 22:03:57 +0000407 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Vikram S. Advea6d94c92002-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000426 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000427}
428
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000429
Ruchira Sasanka4cfbfd52002-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 Lattnerf739fa82002-04-08 22:03:57 +0000436void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000437 LiveRangeInfo &LRI,
438 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000439
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000440 // check if this is a varArgs function. needed for choosing regs.
441 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000442 // get the argument list
Chris Lattnerf739fa82002-04-08 22:03:57 +0000443 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000444 // get an iterator to arg list
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000445 MachineInstr *AdMI;
446
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000447 // for each argument
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000448 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
449 argNo != ArgList.size(); ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000450 // get the LR of arg
Chris Lattner98d0ac02002-04-09 19:46:27 +0000451 LiveRange *LR = LRI.getLiveRangeForValue((Value*)ArgList[argNo]);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000452 assert( LR && "No live range found for method arg");
453
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000454 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000455 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000456
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000457 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000458 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000459 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000460 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000461 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000469 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000470 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000471 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000472
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000473 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000474
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000475 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
476
477 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000478 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000479 if( UniLRReg == UniArgReg )
480 continue;
481
Ruchira Sasanka4cfbfd52002-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 Sasanka36bcd792001-10-24 15:56:58 +0000486
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000487 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000488 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000489 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000490 if( isArgInReg ) {
491 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, regType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000492
Vikram S. Advea6d94c92002-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000519 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000520
Ruchira Sasanka9c38dbc2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000523 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000524 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000525 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000526 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
527 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000528
529 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000530 UniLRReg, regType );
531 FirstAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000532 }
Ruchira Sasanka9c38dbc2001-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 Sasanka9c38dbc2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000543 if( isArgInReg ) {
Vikram S. Advea6d94c92002-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 Sasanka9c38dbc2001-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. Advea6d94c92002-04-25 04:42:21 +0000571 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-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. Adve7a1524f2001-11-08 04:56:41 +0000575 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000576 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000577 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
578 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000579
580 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000581 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000582
583 }
584
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000585 } // for each incoming argument
586
587}
588
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000589
590
Ruchira Sasanka5867c7a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000595void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000596 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000597 std::vector<RegClass *> RCList) const {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000598 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000599
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000600 // check if this is a varArgs function. needed for choosing regs.
601 bool isVarArgs = isVarArgsCall(CallMI);
602
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000603 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000604
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000605
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000606 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-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 Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000612
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000615
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000616
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000617 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000618
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000619
Chris Lattner5216cc52002-02-04 05:59:25 +0000620 if (RetVal) {
621 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000622 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000623
Chris Lattner5216cc52002-02-04 05:59:25 +0000624 // create a new LR for the return value
625 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000626 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000627 unsigned RegClassID = getRegClassIDOfValue(RetVal);
628 RetValLR->setRegClass(RCList[RegClassID]);
629 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000630
631 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000632
Ruchira Sasanka24729a32001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000638 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000639
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000640
Ruchira Sasanka5867c7a2001-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 Sasanka24729a32001-10-21 16:43:41 +0000644 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000645
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000646 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000647
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000648 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
649 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000650
651 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000652
653 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000654 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000655
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000656 // not possible to have a null LR since all args (even consts)
657 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000658 if (!LR) {
659 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000660 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000661 }
662
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000663 unsigned regType = getRegType( LR );
664 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000665
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000671
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000676
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000677 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000678
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000679}
680
681
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000687
Chris Lattner5216cc52002-02-04 05:59:25 +0000688void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
689 LiveRangeInfo &LRI,
690 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000691 PhyRegAlloc &PRA,
692 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000693
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000694 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
695
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000701
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000702 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000703
Chris Lattner30e8fb62002-02-05 01:43:49 +0000704 if (RetVal) {
705 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000706
Chris Lattner30e8fb62002-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 Sasanka24729a32001-10-21 16:43:41 +0000710 }
Ruchira Sasanka36bcd792001-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 Lattnere147d062001-11-07 14:01:59 +0000720 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000721 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000722 return;
723 }
Ruchira Sasanka36bcd792001-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 Sasanka24729a32001-10-21 16:43:41 +0000733 // put copy instruction
734
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000735 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000736
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000737 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000738
739 // the reg that LR must be colored with
740 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000741
742 if( RetValLR->hasColor() ) {
743
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000744 unsigned
745 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000746
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000747 // the return value is coming in UniRetReg but has to go into
748 // the UniRetLRReg
749
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000750 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, regType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000751
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000752 } // if LR has color
753 else {
Ruchira Sasanka9c38dbc2001-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 Sasanka24729a32001-10-21 16:43:41 +0000757
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000758 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000759 RetValLR->getSpillOffFromFP(), regType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000760 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000761
762 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000763
764 } // the LR didn't receive the suggested color
765
766 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000767
768
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000769 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000770 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000771 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000772
Chris Lattner7f74a562002-01-20 22:54:45 +0000773 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000774
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000775 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000776
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000777 bool isVarArgs = isVarArgsCall(CallMI);
778 if (DEBUG_RA && isVarArgs) cerr << "\nVar arg call found!!\n";
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000779
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000780 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
781 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000782
783 const Value *CallArg = CallMI->getImplicitRef(i);
784
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000785 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000786 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000787
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000788 unsigned regType = getRegType( CallArg );
789 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000790
791 // find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000792 // Also find the correct register the argument must use (UniArgReg)
793 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000794 bool isArgInReg = false;
Vikram S. Advea6d94c92002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000803 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000804 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000805 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000806
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000807 // not possible to have a null LR since all args (even consts)
808 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000809 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000810 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000811 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000812 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000813
Chris Lattner5216cc52002-02-04 05:59:25 +0000814 if (LR->hasColor()) {
Ruchira Sasanka36bcd792001-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 Sasanka5867c7a2001-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 Sasanka36bcd792001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000827
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000828 if( isArgInReg ) {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000829
Vikram S. Advea6d94c92002-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000837 // We have to move a float reg to an int reg via memory.
Vikram S. Advea6d94c92002-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 Sasanka4cfbfd52002-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. Advea6d94c92002-04-25 04:42:21 +0000848 getSpilledRegSize(regType));
849
850 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, regType );
Ruchira Sasanka4cfbfd52002-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. Advea6d94c92002-04-25 04:42:21 +0000858 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, regType );
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000859 AddedInstrnsBefore.push_back( AdMI );
860 }
861
Chris Lattner5216cc52002-02-04 05:59:25 +0000862 } else {
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000866
Vikram S. Advea6d94c92002-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 Sasanka20e105f2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000879 }
880
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000881
Chris Lattner5216cc52002-02-04 05:59:25 +0000882 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000883
Ruchira Sasanka9c38dbc2001-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. Advea6d94c92002-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000894 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
895 UniArgReg, IntRegType );
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000896 }
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000897 else
898 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000899 UniArgReg, regType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000900
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000901 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000902 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000903 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000904
Ruchira Sasanka9c38dbc2001-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. Advea6d94c92002-04-25 04:42:21 +0000910 // Optimize: Optimize when reverse pointers in MahineInstr are
Ruchira Sasanka9c38dbc2001-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 Sasankac97ccc52001-11-15 20:25:07 +0000916 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000917
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000918 int TmpOff = PRA.mcInfo.pushTempValue(target,
919 getSpilledRegSize(getRegType(LR)) );
920
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000921
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000922 const MachineFrameInfo& frameInfo = target.getFrameInfo();
923 int argOffset =
924 frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000925
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000926 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000927
Ruchira Sasanka9c38dbc2001-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. Advea6d94c92002-04-25 04:42:21 +0000934 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000935 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000936 TReg, regType );
937 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, regType );
938 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType );
Ruchira Sasankad0d294a2001-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. Adve7a1524f2001-11-08 04:56:41 +0000943
Ruchira Sasanka9c38dbc2001-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 Sasankad0d294a2001-11-09 23:49:14 +0000948
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000949 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000950 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000951 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000952 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000953
Ruchira Sasankad0d294a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000958 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000959
Chris Lattner5216cc52002-02-04 05:59:25 +0000960 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-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 Lattner7f74a562002-01-20 22:54:45 +0000966 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000967 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000968
Chris Lattner5216cc52002-02-04 05:59:25 +0000969 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000970 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000971 for(unsigned i = 0; i < TmpVec.size(); i++)
972 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000981 // now insert caller saving code for this call instruction
982 //
983 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000984}
985
Ruchira Sasanka5867c7a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000990void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
991 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000992
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000993 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000994
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000995 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000996
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000999
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001002
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001003 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004
Chris Lattner30e8fb62002-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 Sasanka5867c7a2001-09-30 23:16:47 +00001009
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001010 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001011
Chris Lattner5216cc52002-02-04 05:59:25 +00001012 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001013 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +00001014 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001015 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001016 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001017}
1018
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001019
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001026//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +00001027void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
1028 LiveRangeInfo &LRI,
1029 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001030
Chris Lattner5216cc52002-02-04 05:59:25 +00001031 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001032
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001033 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001034 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001035
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001038
Chris Lattner5216cc52002-02-04 05:59:25 +00001039 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001040
Chris Lattner30e8fb62002-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 Sasanka9c38dbc2001-10-28 18:15:12 +00001045 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001046
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001047 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001048 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001049
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001050 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001051 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001052 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001053 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001054 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001055 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001056 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001057 return;
1058 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001059
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001060 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001061
Chris Lattner5216cc52002-02-04 05:59:25 +00001062 if (LR->hasColor() && LR->getColor() == CorrectCol)
1063 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001064
Chris Lattner5216cc52002-02-04 05:59:25 +00001065 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001066
Chris Lattner5216cc52002-02-04 05:59:25 +00001067 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001068
Ruchira Sasanka6a7f0202001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001071
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001072 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001073
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001074 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001075
Ruchira Sasanka36bcd792001-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. Advea6d94c92002-04-25 04:42:21 +00001078 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, regType));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001079 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001080 else { // if the LR is spilled
Chris Lattner7f74a562002-01-20 22:54:45 +00001081 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1082 LR->getSpillOffFromFP(),
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001083 UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001084 RetAI->InstrnsBefore.push_back(AdMI);
1085 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001086 }
1087
Ruchira Sasanka5867c7a2001-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. Advea6d94c92002-04-25 04:42:21 +00001098MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
1099 unsigned DestReg,
Chris Lattner5216cc52002-02-04 05:59:25 +00001100 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001101 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001102 "Invalid Register");
1103
1104 MachineInstr * MI = NULL;
1105
1106 switch( RegType ) {
1107
1108 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001109 case IntCCRegType:
1110 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001111 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5867c7a2001-09-30 23:16:47 +00001115 break;
1116
1117 case FPSingleRegType:
1118 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001119 MI->SetMachineOperandReg(0, SrcReg, false);
1120 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001121 break;
1122
1123 case FPDoubleRegType:
1124 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001125 MI->SetMachineOperandReg(0, SrcReg, false);
1126 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001127 break;
1128
1129 default:
1130 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001131 }
1132
1133 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001134}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001135
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001136//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-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 Sasanka5b8971f2001-10-16 01:23:19 +00001139//---------------------------------------------------------------------------
1140
1141
Chris Lattner5216cc52002-02-04 05:59:25 +00001142MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1143 unsigned DestPtrReg,
1144 int Offset, int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001145 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001146 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001147 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001148 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001149 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001154 break;
1155
1156 case FPSingleRegType:
1157 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001162 break;
1163
1164 case FPDoubleRegType:
1165 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001170 break;
1171
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001172 case IntCCRegType:
1173 assert( 0 && "Cannot directly store %ccr to memory");
1174
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001175 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001176 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001177 }
1178
1179 return MI;
1180}
1181
1182
1183//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001184// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001185// register number
1186//---------------------------------------------------------------------------
1187
1188
Chris Lattner5216cc52002-02-04 05:59:25 +00001189MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1190 int Offset,
1191 unsigned DestReg,
1192 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001193 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001194 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001195 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001196 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001197 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001202 break;
1203
1204 case FPSingleRegType:
1205 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001210
1211 break;
1212
1213 case FPDoubleRegType:
1214 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001219 break;
1220
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001221 case IntCCRegType:
1222 assert( 0 && "Cannot directly load into %ccr from memory");
1223
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001224 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001225 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001226 }
1227
1228 return MI;
1229}
1230
1231
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001232
1233
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001234
Ruchira Sasankafcdc2ff2001-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 Lattner5216cc52002-02-04 05:59:25 +00001241MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001242 int RegType = getRegType( Src );
1243
1244 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001245
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001246 MachineInstr * MI = NULL;
1247
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001248 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001249 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001250 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-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 Sasankafcdc2ff2001-11-12 14:45:33 +00001254 break;
1255
1256 case FPSingleRegType:
1257 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001258 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1259 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001260 break;
1261
1262
1263 case FPDoubleRegType:
1264 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001265 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1266 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001267 break;
1268
1269 default:
1270 assert(0 && "Unknow RegType in CpValu2Value");
1271 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001272
1273 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001274}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001275
1276
1277
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001278
1279
1280
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001281//----------------------------------------------------------------------------
1282// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-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 Sasanka9c38dbc2001-10-28 18:15:12 +00001292//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001293
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001294
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001295void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1296 const BasicBlock *BB,
1297 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001298
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001299 // has set to record which registers were saved/restored
1300 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001301 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001302
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001310
1311
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001312 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001313
Chris Lattner5216cc52002-02-04 05:59:25 +00001314 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001315 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001316 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001317
Chris Lattner5216cc52002-02-04 05:59:25 +00001318 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001319 PushedRegSet.insert(
1320 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001321 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001322 }
1323
1324
Chris Lattner7e5ee422002-02-05 04:20:12 +00001325 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1326 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001327
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001328 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001329 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +00001360
1361 int StackOff = PRA.mcInfo.pushTempValue(target,
1362 getSpilledRegSize(RegType));
1363
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001364
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001365 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1366 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka9d8950d2001-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 Lattner7e5ee422002-02-05 04:20:12 +00001375 const ValueSet &LVSetBef =
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001376 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1377
1378 // get a free INTEGER register
1379 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001380 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1381 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1382
Ruchira Sasanka9d8950d2001-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 Lattner30e23da2002-04-09 05:13:04 +00001387 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001388
1389 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner30e23da2002-04-09 05:13:04 +00001390 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001391
1392 if(AdIBefCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001393 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001394
Ruchira Sasanka1812fc42001-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 Sasanka9d8950d2001-11-03 19:59:59 +00001401
1402 } else {
1403 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001404 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner30e23da2002-04-09 05:13:04 +00001405 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001406 }
1407
1408
1409 //---- Insert code for popping the reg from the stack ----------
1410
Chris Lattner7e5ee422002-02-05 04:20:12 +00001411 if (RegType == IntCCRegType) {
Ruchira Sasanka9d8950d2001-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. Advedb1435f2002-03-18 03:12:16 +00001418 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1419 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001420
1421 if(AdIBefCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001422 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001423
1424 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner30e23da2002-04-09 05:13:04 +00001425 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001426
1427 if(AdIAftCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001428 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001429
Ruchira Sasanka1812fc42001-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 Sasanka9d8950d2001-11-03 19:59:59 +00001437
1438 } else {
1439 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001440 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner30e23da2002-04-09 05:13:04 +00001441 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001442 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001443
Chris Lattner7e5ee422002-02-05 04:20:12 +00001444 PushedRegSet.insert(Reg);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001445
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001446 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001447 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001448 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advedb1435f2002-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 Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +00001465
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001466 } // for each value in the LV set after instruction
1467
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001468}
1469
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001470//---------------------------------------------------------------------------
1471// Copies %ccr into an integer register. IntReg is the UNIFIED register
1472// number.
1473//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001474
Chris Lattner5216cc52002-02-04 05:59:25 +00001475MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1476 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advedb1435f2002-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 Sasanka9d8950d2001-11-03 19:59:59 +00001481 return MI;
1482}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001483
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001484//---------------------------------------------------------------------------
1485// Copies an integer register into %ccr. IntReg is the UNIFIED register
1486// number.
1487//---------------------------------------------------------------------------
1488
Chris Lattner5216cc52002-02-04 05:59:25 +00001489MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1490 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advedb1435f2002-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 Sasanka9d8950d2001-11-03 19:59:59 +00001495 return MI;
1496}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001497
1498
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001499
1500
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001501//---------------------------------------------------------------------------
1502// Print the register assigned to a LR
1503//---------------------------------------------------------------------------
1504
Chris Lattner5216cc52002-02-04 05:59:25 +00001505void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001506 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001507 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001508
Chris Lattner5216cc52002-02-04 05:59:25 +00001509 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001510 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001511 return;
1512 }
1513
1514 // if a color is found
1515
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001516 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001517
Chris Lattner5216cc52002-02-04 05:59:25 +00001518 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001519 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001520
Chris Lattner5216cc52002-02-04 05:59:25 +00001521 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001522 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001523 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001524 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001525 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001526 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001527}
Ruchira Sasankad0d294a2001-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 Sasanka0c085982001-11-10 21:20:43 +00001535// instructions inserted by RegAlloc. All such instruction MUST have
1536// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-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 Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001549//---------------------------------------------------------------------------
Chris Lattner7f74a562002-01-20 22:54:45 +00001550void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1551 std::vector<MachineInstr *> &OrdVec,
1552 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-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 Sasanka0c085982001-11-10 21:20:43 +00001560
1561 Solution:
1562 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001563
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001579
1580 */
1581
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001582 bool CouldMoveAll;
1583 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001584
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001585 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001586 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001587 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001588
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001589 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001590
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001591 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001592
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001593 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001595 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001596
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001602 if( DefOp.opIsDef() &&
1603 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001604
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001605 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001606
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001607 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001608
Chris Lattner7f74a562002-01-20 22:54:45 +00001609 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001610 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001611
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001612 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1613
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001614 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001615 if( UseInst == NULL) continue;
1616
1617 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001618 MachineOperand& UseOp = UseInst->getOperand(0);
1619
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 Sasankad0d294a2001-11-09 23:49:14 +00001631
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001632 DefEqUse = true;
1633 CouldMoveAll = false;
1634 DebugPrint = true;
1635 break;
1636 } // if two registers are equal
1637
1638 } // if use is a register
1639
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001640 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001641
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001642 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001643
1644 // after examining all the instructions that follow the DefInst
1645 // if there are no dependencies, we can move it to the OrdVec
1646
1647 // cerr << "Moved to Ord: " << *DefInst;
1648
1649 moveInst2OrdVec(OrdVec, DefInst, PRA);
1650
1651 //OrdVec.push_back(DefInst);
1652
1653 // mark the pos of DefInst with NULL to indicate that it is
1654 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001655 *DefIt = NULL;
1656 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001657
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001658 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001659
1660 } // for all instructions in the UnordVec
1661
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001662
Chris Lattner5216cc52002-02-04 05:59:25 +00001663 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001664
Chris Lattner5216cc52002-02-04 05:59:25 +00001665 if (DebugPrint) {
Ruchira Sasanka0c085982001-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 Sasankad0d294a2001-11-09 23:49:14 +00001669 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001670}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001671
1672
1673
1674
1675
Chris Lattner7f74a562002-01-20 22:54:45 +00001676void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001677 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001678 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001679 MachineOperand& UseOp = UnordInst->getOperand(0);
1680
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 Lattner7f74a562002-01-20 22:54:45 +00001688 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001689
1690 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1691
1692 MachineInstr *OrdInst = *OrdIt ;
1693
1694 MachineOperand& DefOp =
1695 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1696
1697 if( DefOp.opIsDef() &&
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 Sasanka4cfbfd52002-01-07 19:20:28 +00001717 const int StackOff = PRA.mcInfo.pushTempValue(target,
1718 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001719
1720 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001721 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-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 Sasanka2d5c48f2001-11-11 21:49:37 +00001731 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-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 Lattner5216cc52002-02-04 05:59:25 +00001756 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001757
1758 // We didn't find a def in the OrdVec, so just append this inst
1759 OrdVec.push_back( UnordInst );
1760 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1761 }
1762
1763 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001764}