blob: 86ee00c79a006bade2ba453b8efb0d38a6ca35f1 [file] [log] [blame]
Chris Lattnered5171e2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adve76ee6f72002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner699683c2002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000023#include <iostream>
Vikram S. Adve31f78c42002-04-25 04:42:21 +000024#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000025using std::cerr;
Anand Shuklacfb22d32002-06-25 20:55:50 +000026using std::vector;
Chris Lattner20b1ea02001-09-14 03:47:57 +000027
Chris Lattner699683c2002-02-04 05:59:25 +000028UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
29 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
30 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
31
32 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
34 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
35 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +000036
Chris Lattner699683c2002-02-04 05:59:25 +000037 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
38 "32 Float regs are used for float arg passing");
39}
40
41
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000042// getZeroRegNum - returns the register that contains always zero.
43// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000044//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000045int UltraSparcRegInfo::getZeroRegNum() const {
46 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
47 SparcIntRegOrder::g0);
48}
Chris Lattner699683c2002-02-04 05:59:25 +000049
50// getCallAddressReg - returns the reg used for pushing the address when a
51// method is called. This can be used for other purposes between calls
52//
53unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000054 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
55 SparcIntRegOrder::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000056}
57
58// Returns the register containing the return address.
59// It should be made sure that this register contains the return
60// value when a return instruction is reached.
61//
62unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000063 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
64 SparcIntRegOrder::i7);
Chris Lattner699683c2002-02-04 05:59:25 +000065}
66
67// given the unified register number, this gives the name
68// for generating assembly code or debugging.
69//
70const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
71 if( reg < 32 )
72 return SparcIntRegOrder::getRegName(reg);
73 else if ( reg < (64 + 32) )
74 return SparcFloatRegOrder::getRegName( reg - 32);
75 else if( reg < (64+32+4) )
76 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
77 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
78 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
79 else if (reg== InvalidRegNum) //****** TODO: Remove */
80 return "<*NoReg*>";
81 else
82 assert(0 && "Invalid register number");
83 return "";
84}
85
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000086// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000087unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000088 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
89 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000090}
91
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000092// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000093unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000094 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
95 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000096}
97
98
Vikram S. Adve31f78c42002-04-25 04:42:21 +000099//---------------------------------------------------------------------------
100// Finds whether a call is an indirect call
101//---------------------------------------------------------------------------
102
103inline bool
104isVarArgsFunction(const Type *funcType) {
105 return cast<FunctionType>(cast<PointerType>(funcType)
106 ->getElementType())->isVarArg();
107}
108
109inline bool
110isVarArgsCall(const MachineInstr *CallMI) {
111 Value* callee = CallMI->getOperand(0).getVRegValue();
112 // const Type* funcType = isa<Function>(callee)? callee->getType()
113 // : cast<PointerType>(callee->getType())->getElementType();
114 const Type* funcType = callee->getType();
115 return isVarArgsFunction(funcType);
116}
117
118
119// Get the register number for the specified integer arg#,
120// assuming there are argNum total args, intArgNum int args,
121// and fpArgNum FP args preceding (and not including) this one.
122// Use INT regs for FP args if this is a varargs call.
123//
124// Return value:
125// InvalidRegNum, if there is no int register available for the arg.
126// regNum, otherwise (this is NOT the unified reg. num).
127//
128inline int
129UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
130 unsigned argNo,
131 unsigned intArgNo, unsigned fpArgNo,
132 unsigned& regClassId) const
133{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000134 regClassId = IntRegClassID;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000135 if (argNo >= NumOfIntArgRegs)
136 return InvalidRegNum;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000137 else
138 return argNo + (inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000139}
140
141// Get the register number for the specified FP arg#,
142// assuming there are argNum total args, intArgNum int args,
143// and fpArgNum FP args preceding (and not including) this one.
144// Use INT regs for FP args if this is a varargs call.
145//
146// Return value:
147// InvalidRegNum, if there is no int register available for the arg.
148// regNum, otherwise (this is NOT the unified reg. num).
149//
150inline int
151UltraSparcRegInfo::regNumForFPArg(unsigned regType,
152 bool inCallee, bool isVarArgsCall,
153 unsigned argNo,
154 unsigned intArgNo, unsigned fpArgNo,
155 unsigned& regClassId) const
156{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000157 if (isVarArgsCall)
158 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
159 regClassId);
160 else
161 {
162 regClassId = FloatRegClassID;
163 if (regType == FPSingleRegType)
164 return (argNo*2+1 >= NumOfFloatArgRegs)?
165 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2 + 1);
166 else if (regType == FPDoubleRegType)
167 return (argNo*2 >= NumOfFloatArgRegs)?
168 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2);
169 else
170 assert(0 && "Illegal FP register type");
171 }
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000172}
173
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000174
175//---------------------------------------------------------------------------
176// Finds the return address of a call sparc specific call instruction
177//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000178
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000179// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000180// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner699683c2002-02-04 05:59:25 +0000181//
Vikram S. Adve242a8082002-05-19 15:25:51 +0000182int UltraSparcRegInfo::getRegType(unsigned regClassID,
183 const Type* type) const {
184 switch (regClassID) {
Chris Lattner699683c2002-02-04 05:59:25 +0000185 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000186 case FloatRegClassID: {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000187 if (type == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000188 return FPSingleRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000189 else if (type == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000190 return FPDoubleRegType;
191 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000192 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000193 case IntCCRegClassID: return IntCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000194 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000195 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000196 }
197}
198
Vikram S. Adve242a8082002-05-19 15:25:51 +0000199int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
200 return getRegType(LR->getRegClass()->getID(), LR->getType());
201}
202
Chris Lattner699683c2002-02-04 05:59:25 +0000203int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000204 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner699683c2002-02-04 05:59:25 +0000205}
206
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000207int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
208 if (unifiedRegNum < 32)
Chris Lattner699683c2002-02-04 05:59:25 +0000209 return IntRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000210 else if (unifiedRegNum < (32 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000211 return FPSingleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000212 else if (unifiedRegNum < (64 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000213 return FPDoubleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000214 else if (unifiedRegNum < (64+32+4))
Chris Lattner699683c2002-02-04 05:59:25 +0000215 return FloatCCRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000216 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner699683c2002-02-04 05:59:25 +0000217 return IntCCRegType;
218 else
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000219 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000220 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000221}
222
223
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000224// To find the register class used for a specified Type
225//
226unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
227 bool isCCReg = false) const {
228 Type::PrimitiveID ty = type->getPrimitiveID();
229 unsigned res;
230
231 // FIXME: Comparing types like this isn't very safe...
232 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
233 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
234 res = IntRegClassID; // sparc int reg (ty=0: void)
235 else if (ty <= Type::DoubleTyID)
236 res = FloatRegClassID; // sparc float reg class
237 else {
238 //std::cerr << "TypeID: " << ty << "\n";
239 assert(0 && "Cannot resolve register class for type");
240 return 0;
241 }
242
243 if(isCCReg)
244 return res + 2; // corresponidng condition code regiser
245 else
246 return res;
247}
248
249// To find the register class to which a specified register belongs
250//
251unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
252 unsigned classId = 0;
253 (void) getClassRegNum(unifiedRegNum, classId);
254 return classId;
255}
256
257unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
258 switch(regType) {
259 case IntRegType: return IntRegClassID;
260 case FPSingleRegType:
261 case FPDoubleRegType: return FloatRegClassID;
262 case IntCCRegType: return IntCCRegClassID;
263 case FloatCCRegType: return FloatCCRegClassID;
264 default:
265 assert(0 && "Invalid register type in getRegClassIDOfRegType");
266 return 0;
267 }
268}
269
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000270//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000271// Suggests a register for the ret address in the RET machine instruction.
272// We always suggest %i7 by convention.
273//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000274void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000275 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000276
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000277 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000278
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000279 // return address is always mapped to i7 so set it immediately
280 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
281 SparcIntRegOrder::i7));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000282
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000283 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000284 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000285 // we have to test later whether it received the suggested color.
286 // In that case, a LR has to be created at the start of method.
287 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000288
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000289 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000290 // const Value *RetAddrVal = MO.getVRegValue();
291 // assert( RetAddrVal && "LR for ret address must be created at start");
292 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
293 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000294 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000295}
296
297
298//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000299// Suggests a register for the ret address in the JMPL/CALL machine instr.
300// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000301//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000302void UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000303 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000304 std::vector<RegClass *> RCList) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000305 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
306 const Value *RetAddrVal = argDesc->getReturnAddrReg();
307 assert(RetAddrVal && "Return address value is required");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000308
Vikram S. Adve242a8082002-05-19 15:25:51 +0000309 // create a new LR for the return address and color it
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000310 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000311 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000312 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
313 RetAddrLR->setRegClass( RCList[RegClassID] );
314 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
315 LRI.addLRToMap( RetAddrVal, RetAddrLR);
316
Ruchira Sasanka91442282001-09-30 23:16:47 +0000317}
318
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000319
320
Ruchira Sasanka91442282001-09-30 23:16:47 +0000321
322//---------------------------------------------------------------------------
323// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000324// According to the Sparc ABI, the first 6 incoming args are in
325// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000326// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000327// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000328//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000329void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000330 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000331{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000332 // check if this is a varArgs function. needed for choosing regs.
333 bool isVarArgs = isVarArgsFunction(Meth->getType());
334
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000335 // for each argument. count INT and FP arguments separately.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000336 unsigned argNo=0, intArgNo=0, fpArgNo=0;
337 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
338 I != E; ++I, ++argNo) {
339 // get the LR of arg
340 LiveRange *LR = LRI.getLiveRangeForValue(I);
341 assert(LR && "No live range found for method arg");
342
343 unsigned regType = getRegType(LR);
344 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
345
346 int regNum = (regType == IntRegType)
347 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
348 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
349 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
350 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
351
352 if(regNum != InvalidRegNum)
353 LR->setSuggestedColor(regNum);
354 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000355}
356
Ruchira Sasanka91442282001-09-30 23:16:47 +0000357
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000358//---------------------------------------------------------------------------
359// This method is called after graph coloring to move incoming args to
360// the correct hardware registers if they did not receive the correct
361// (suggested) color through graph coloring.
362//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000363void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000364 LiveRangeInfo &LRI,
365 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000366
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000367 // check if this is a varArgs function. needed for choosing regs.
368 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000369 MachineInstr *AdMI;
370
Ruchira Sasanka91442282001-09-30 23:16:47 +0000371 // for each argument
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000372 // for each argument. count INT and FP arguments separately.
373 unsigned argNo=0, intArgNo=0, fpArgNo=0;
374 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
375 I != E; ++I, ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000376 // get the LR of arg
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000377 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000378 assert( LR && "No live range found for method arg");
379
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000380 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000381 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000382
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000383 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000384 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000385 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000386 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000387 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000388 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
389
390 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000391 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
392 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
393 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
394 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000395
396 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000397 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000398 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000399 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000400
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000401 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000402
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000403 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
404
405 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000406 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000407 if( UniLRReg == UniArgReg )
408 continue;
409
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000410 // We are here because the LR did not receive the suggested
411 // but LR received another register.
412 // Now we have to copy the %i reg (or stack pos of arg)
413 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000414
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000415 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000416 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000417 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000418 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000419 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000420 assert(0 && "This could should work but it is not tested yet");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000421
422 // It is a variable argument call: the float reg must go in a %o reg.
423 // We have to move an int reg to a float reg via memory.
424 //
425 assert(isVarArgs &&
426 RegClassID == FloatRegClassID &&
427 regClassIDOfArgReg == IntRegClassID &&
428 "This should only be an Int register for an FP argument");
429
430 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
431 getSpilledRegSize(regType));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000432 cpReg2MemMI(FirstAI->InstrnsBefore,
433 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000434
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000435 cpMem2RegMI(FirstAI->InstrnsBefore,
436 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000437 }
438 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000439 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000440 }
441 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000442 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000443
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000444 // Now the arg is coming on stack. Since the LR recieved a register,
445 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000446 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000447 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000448 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000449 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
450 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000451
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000452 cpMem2RegMI(FirstAI->InstrnsBefore,
453 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000454 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000455
456 } // if LR received a color
457
458 else {
459
460 // Now, the LR did not receive a color. But it has a stack offset for
461 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000462 // So, if the arg is coming in UniArgReg register, we can just move
463 // that on to the stack pos of LR
464
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000465 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000466
467 if( regClassIDOfArgReg != RegClassID ) {
468 assert(0 &&
469 "FP arguments to a varargs function should be explicitly "
470 "copied to/from int registers by instruction selection!");
471
472 // It must be a float arg for a variable argument call, which
473 // must come in a %o reg. Move the int reg to the stack.
474 //
475 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
476 "This should only be an Int register for an FP argument");
477
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000478 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
479 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000480 }
481 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000482 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
483 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000484 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000485 }
486
487 else {
488
489 // Now the arg is coming on stack. Since the LR did NOT
490 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000491 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000492 // since this method is called before any other method that makes
493 // uses of the stack pos of the LR (e.g., updateMachineInstr)
494
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000495 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000496 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000497 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
498 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000499
500 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000501 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000502
503 }
504
Ruchira Sasanka91442282001-09-30 23:16:47 +0000505 } // for each incoming argument
506
507}
508
Chris Lattner20b1ea02001-09-14 03:47:57 +0000509
510
Ruchira Sasanka91442282001-09-30 23:16:47 +0000511//---------------------------------------------------------------------------
512// This method is called before graph coloring to suggest colors to the
513// outgoing call args and the return value of the call.
514//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000515void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000516 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000517 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000518 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000519
Vikram S. Adve242a8082002-05-19 15:25:51 +0000520 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000521
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000522 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000523
Ruchira Sasanka91442282001-09-30 23:16:47 +0000524 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000525 // will be in %o0 if the value is an integer type, or in %f0 if the
526 // value is a float type.
527
Ruchira Sasanka91442282001-09-30 23:16:47 +0000528 // the return value cannot have a LR in machine instruction since it is
529 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000530
Ruchira Sasanka91442282001-09-30 23:16:47 +0000531 // if type is not void, create a new live range and set its
532 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000533
Vikram S. Adve242a8082002-05-19 15:25:51 +0000534 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000535
Chris Lattner699683c2002-02-04 05:59:25 +0000536 if (RetVal) {
537 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000538 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000539
Chris Lattner699683c2002-02-04 05:59:25 +0000540 // create a new LR for the return value
541 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000542 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000543 unsigned RegClassID = getRegClassIDOfValue(RetVal);
544 RetValLR->setRegClass(RCList[RegClassID]);
545 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000546
547 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000548
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000549 if( RegClassID == IntRegClassID )
550 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
551 else if (RegClassID == FloatRegClassID )
552 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
553 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000554 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000555
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000556
Ruchira Sasanka91442282001-09-30 23:16:47 +0000557 // Now suggest colors for arguments (operands) of the call instruction.
558 // Colors are suggested only if the arg number is smaller than the
559 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000560 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000561
Vikram S. Adve242a8082002-05-19 15:25:51 +0000562 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000563
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000564 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
565 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000566
Vikram S. Adve242a8082002-05-19 15:25:51 +0000567 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000568
569 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000570 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000571
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000572 // not possible to have a null LR since all args (even consts)
573 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000574 if (!LR) {
575 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000576 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000577 }
578
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000579 unsigned regType = getRegType( LR );
580 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000581
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000582 // Choose a register for this arg depending on whether it is
Vikram S. Adve242a8082002-05-19 15:25:51 +0000583 // an INT or FP value. Here we ignore whether or not it is a
584 // varargs calls, because FP arguments will be explicitly copied
585 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000586 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000587 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
588 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
589 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
590 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000591
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000592 // If a register could be allocated, use it.
593 // If not, do NOTHING as this will be colored as a normal value.
594 if(regNum != InvalidRegNum)
595 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000596
Vikram S. Adve242a8082002-05-19 15:25:51 +0000597 // Repeat for the second copy of the argument, which would be
598 // an FP argument being passed to a function with no prototype
599 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
600 if (argCopy != NULL)
601 {
602 assert(regType != IntRegType && argCopy->getType()->isIntegral()
603 && "Must be passing copy of FP argument in int register");
604 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
605 argNo, intArgNo, fpArgNo-1,
606 regClassIDOfArgReg);
607 assert(copyRegNum != InvalidRegNum);
608 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
609 copyLR->setSuggestedColor(copyRegNum);
610 }
611
Ruchira Sasanka91442282001-09-30 23:16:47 +0000612 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000613
Chris Lattner20b1ea02001-09-14 03:47:57 +0000614}
615
616
Ruchira Sasanka91442282001-09-30 23:16:47 +0000617//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +0000618// Helper method for UltraSparcRegInfo::colorCallArgs().
619//---------------------------------------------------------------------------
620
621void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000622UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000623 AddedInstrns *CallAI,
624 PhyRegAlloc &PRA, LiveRange* LR,
625 unsigned regType, unsigned RegClassID,
626 int UniArgRegOrNone, unsigned int argNo,
627 std::vector<MachineInstr *>& AddedInstrnsBefore)
628 const
629{
630 MachineInstr *AdMI;
631 bool isArgInReg = false;
632 unsigned UniArgReg = MAXINT; // unused unless initialized below
633 if (UniArgRegOrNone != InvalidRegNum)
634 {
635 isArgInReg = true;
636 UniArgReg = (unsigned) UniArgRegOrNone;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000637 CallMI->getRegsUsed().insert(UniArgReg); // mark the reg as used
Vikram S. Adve242a8082002-05-19 15:25:51 +0000638 }
639
640 if (LR->hasColor()) {
641 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
642
643 // if LR received the correct color, nothing to do
644 if( isArgInReg && UniArgReg == UniLRReg )
645 return;
646
647 // The LR is allocated to a register UniLRReg and must be copied
648 // to UniArgReg or to the stack slot.
649 //
650 if( isArgInReg ) {
651 // Copy UniLRReg to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000652 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000653 }
654 else {
655 // Copy UniLRReg to the stack to pass the arg on stack.
656 const MachineFrameInfo& frameInfo = target.getFrameInfo();
657 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000658 cpReg2MemMI(CallAI->InstrnsBefore,
659 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000660 }
661
662 } else { // LR is not colored (i.e., spilled)
663
664 if( isArgInReg ) {
665 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000666 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
667 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000668 // Now add the instruction
669 }
670
671 else {
672 // Now, we have to pass the arg on stack. Since LR also did NOT
673 // receive a register we have to move an argument in memory to
674 // outgoing parameter on stack.
675 // Use TReg to load and store the value.
676 // Use TmpOff to save TReg, since that may have a live value.
677 //
678 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
679 int TmpOff = PRA.mcInfo.pushTempValue(target,
680 getSpilledRegSize(getRegType(LR)));
681 const MachineFrameInfo& frameInfo = target.getFrameInfo();
682 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
683
684 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
685
686 // Sequence:
687 // (1) Save TReg on stack
688 // (2) Load LR value into TReg from stack pos of LR
689 // (3) Store Treg on outgoing Arg pos on stack
690 // (4) Load the old value of TReg from stack to TReg (restore it)
691 //
692 // OPTIMIZE THIS:
693 // When reverse pointers in MahineInstr are introduced:
694 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
695 // needed only if this fails. Currently, we cannot call the
696 // above method since we cannot find LVSetBefore without the BB
697 //
698 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
699 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000700 cpReg2MemMI(CallAI->InstrnsBefore,
701 TReg, getFramePointer(), TmpOff, regType);
702 cpMem2RegMI(CallAI->InstrnsBefore,
703 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
704 cpReg2MemMI(CallAI->InstrnsBefore,
705 TReg, getStackPointer(), argOffset, regType);
706 cpMem2RegMI(CallAI->InstrnsBefore,
707 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000708 }
709 }
710}
711
712//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000713// After graph coloring, we have call this method to see whehter the return
714// value and the call args received the correct colors. If not, we have
715// to instert copy instructions.
716//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000717
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000718void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000719 LiveRangeInfo &LRI,
720 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000721 PhyRegAlloc &PRA,
722 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000723
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000724 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
725
Vikram S. Adve242a8082002-05-19 15:25:51 +0000726 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
727
Ruchira Sasanka91442282001-09-30 23:16:47 +0000728 // First color the return value of the call.
729 // If there is a LR for the return value, it means this
730 // method returns a value
731
732 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000733
Vikram S. Adve242a8082002-05-19 15:25:51 +0000734 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000735
Chris Lattner0665a5f2002-02-05 01:43:49 +0000736 if (RetVal) {
737 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000738
Chris Lattner0665a5f2002-02-05 01:43:49 +0000739 if (!RetValLR) {
740 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000741 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000742 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000743
744 unsigned RegClassID = (RetValLR->getRegClass())->getID();
745 bool recvCorrectColor = false;
746
747 unsigned CorrectCol; // correct color for ret value
748 if(RegClassID == IntRegClassID)
749 CorrectCol = SparcIntRegOrder::o0;
750 else if(RegClassID == FloatRegClassID)
751 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000752 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000753 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000754 return;
755 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000756
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000757 // Mark the register as used by this instruction
758 CallMI->getRegsUsed().insert(this->getUnifiedRegNum(RegClassID,CorrectCol));
759
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000760 // if the LR received the correct color, NOTHING to do
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000761 if( RetValLR->hasColor() )
762 if( RetValLR->getColor() == CorrectCol )
763 recvCorrectColor = true;
764
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000765 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000766 // put copy instruction
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000767 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000768
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000769 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000770
771 // the reg that LR must be colored with
772 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000773
774 if( RetValLR->hasColor() ) {
775
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000776 unsigned
777 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000778
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000779 // the return value is coming in UniRetReg but has to go into
780 // the UniRetLRReg
781
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000782 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000783
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000784 } // if LR has color
785 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000786
787 // if the LR did NOT receive a color, we have to move the return
788 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000789
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000790 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
791 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000792 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000793
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000794 } // the LR didn't receive the suggested color
795
796 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000797
798
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000799 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000800 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000801 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000802
Chris Lattner697954c2002-01-20 22:54:45 +0000803 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000804
805 unsigned NumOfCallArgs = argDesc->getNumArgs();
806
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000807 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
808 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000809
Vikram S. Adve242a8082002-05-19 15:25:51 +0000810 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
811
Ruchira Sasanka91442282001-09-30 23:16:47 +0000812 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000813 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000814
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000815 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000816 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000817
Vikram S. Adve242a8082002-05-19 15:25:51 +0000818 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000819 // Also find the correct register the argument must use (UniArgReg)
820 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000821 bool isArgInReg = false;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000822 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000823 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
824
Vikram S. Adve242a8082002-05-19 15:25:51 +0000825 // Find the register that must be used for this arg, depending on
826 // whether it is an INT or FP value. Here we ignore whether or not it
827 // is a varargs calls, because FP arguments will be explicitly copied
828 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000829 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000830 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
831 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
832 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
833 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000834
835 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000836 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000837 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000838 assert(regClassIDOfArgReg == RegClassID &&
839 "Moving values between reg classes must happen during selection");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000840 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000841
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000842 // not possible to have a null LR since all args (even consts)
843 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000844 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000845 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000846 assert(LR && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000847 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000848
849 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
850 UniArgReg, argNo, AddedInstrnsBefore);
851
852 // Repeat for the second copy of the argument, which would be
853 // an FP argument being passed to a function with no prototype.
854 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
855 if (argCopy != NULL)
856 {
857 assert(regType != IntRegType && argCopy->getType()->isIntegral()
858 && "Must be passing copy of FP argument in int register");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000859
Vikram S. Adve242a8082002-05-19 15:25:51 +0000860 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
861 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
862
863 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
864 argNo, intArgNo, fpArgNo-1,
865 regClassIDOfArgReg);
866 assert(copyRegNum != InvalidRegNum);
867 assert(regClassIDOfArgReg == copyRegClassID &&
868 "Moving values between reg classes must happen during selection");
869
870 InitializeOutgoingArg(CallMI, CallAI, PRA,
871 LRI.getLiveRangeForValue(argCopy), copyRegType,
872 copyRegClassID, copyRegNum, argNo,
873 AddedInstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000874 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000875 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000876
Vikram S. Adve242a8082002-05-19 15:25:51 +0000877 // If we added any instruction before the call instruction, verify
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000878 // that they are in the proper order and if not, reorder them
Vikram S. Adve242a8082002-05-19 15:25:51 +0000879 //
Chris Lattner699683c2002-02-04 05:59:25 +0000880 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000881
Chris Lattner699683c2002-02-04 05:59:25 +0000882 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000883 cerr << "\nCalling reorder with instrns: \n";
884 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
885 cerr << *(AddedInstrnsBefore[i]);
886 }
887
Chris Lattner697954c2002-01-20 22:54:45 +0000888 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000889 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000890
Chris Lattner699683c2002-02-04 05:59:25 +0000891 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000892 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000893 for(unsigned i = 0; i < TmpVec.size(); i++)
894 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000895 }
896
897 // copy the results back from TmpVec to InstrnsBefore
898 for(unsigned i=0; i < TmpVec.size(); i++)
899 CallAI->InstrnsBefore.push_back( TmpVec[i] );
900 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000901
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000902 // now insert caller saving code for this call instruction
903 //
904 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000905}
906
Ruchira Sasanka91442282001-09-30 23:16:47 +0000907//---------------------------------------------------------------------------
908// This method is called for an LLVM return instruction to identify which
909// values will be returned from this method and to suggest colors.
910//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000911void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000912 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000913
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000914 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000915
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000916 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000917
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000918 // if there is an implicit ref, that has to be the ret value
919 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000920
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000921 // The first implicit operand is the return value of a return instr
922 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000923
Ruchira Sasanka91442282001-09-30 23:16:47 +0000924 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000925
Chris Lattner0665a5f2002-02-05 01:43:49 +0000926 if (!LR) {
927 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
928 assert(0 && "No LR for return value of non-void method");
929 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000930
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000931 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000932
Chris Lattner699683c2002-02-04 05:59:25 +0000933 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000934 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000935 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000936 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000937 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000938}
939
Ruchira Sasanka91442282001-09-30 23:16:47 +0000940
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000941
942//---------------------------------------------------------------------------
943// Colors the return value of a method to %i0 or %f0, if possible. If it is
944// not possilbe to directly color the LR, insert a copy instruction to move
945// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
946// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000947//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000948void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000949 LiveRangeInfo &LRI,
950 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000951
Chris Lattner699683c2002-02-04 05:59:25 +0000952 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000953
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000954 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000955 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000956
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000957 // The first implicit operand is the return value of a return instr
958 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000959
Chris Lattner699683c2002-02-04 05:59:25 +0000960 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000961
Chris Lattner0665a5f2002-02-05 01:43:49 +0000962 if (!LR) {
963 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
964 // assert( LR && "No LR for return value of non-void method");
965 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000966 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000967
Ruchira Sasanka91442282001-09-30 23:16:47 +0000968 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000969 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000970
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000971 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000972 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000973 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000974 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000975 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000976 else {
Chris Lattner699683c2002-02-04 05:59:25 +0000977 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000978 return;
979 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000980
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000981 // Mark the register as used by this instruction
982 RetMI->getRegsUsed().insert(this->getUnifiedRegNum(RegClassID, CorrectCol));
983
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000984 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000985
Chris Lattner699683c2002-02-04 05:59:25 +0000986 if (LR->hasColor() && LR->getColor() == CorrectCol)
987 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000988
Chris Lattner699683c2002-02-04 05:59:25 +0000989 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000990
Chris Lattner699683c2002-02-04 05:59:25 +0000991 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000992
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000993 // We are here because the LR was allocted a regiter
994 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000995
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000996 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000997
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000998 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000999
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001000 // the LR received UniLRReg but must be colored with UniRetReg
1001 // to pass as the return value
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001002 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001003 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001004 else { // if the LR is spilled
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001005 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1006 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner697954c2002-01-20 22:54:45 +00001007 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001008 }
1009
Ruchira Sasanka91442282001-09-30 23:16:47 +00001010 } // if there is a return value
1011
1012}
1013
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001014//---------------------------------------------------------------------------
1015// Check if a specified register type needs a scratch register to be
1016// copied to/from memory. If it does, the reg. type that must be used
1017// for scratch registers is returned in scratchRegType.
1018//
1019// Only the int CC register needs such a scratch register.
1020// The FP CC registers can (and must) be copied directly to/from memory.
1021//---------------------------------------------------------------------------
1022
1023bool
1024UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1025 int& scratchRegType) const
1026{
1027 if (RegType == IntCCRegType)
1028 {
1029 scratchRegType = IntRegType;
1030 return true;
1031 }
1032 return false;
1033}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001034
1035//---------------------------------------------------------------------------
1036// Copy from a register to register. Register number must be the unified
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001037// register number.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001038//---------------------------------------------------------------------------
1039
Vikram S. Adve242a8082002-05-19 15:25:51 +00001040void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001041UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1042 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001043 unsigned DestReg,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001044 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001045 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001046 "Invalid Register");
1047
1048 MachineInstr * MI = NULL;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001049
Ruchira Sasanka91442282001-09-30 23:16:47 +00001050 switch( RegType ) {
1051
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001052 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001053 if (this->getRegType(DestReg) == IntRegType)
1054 { // copy intCC reg to int reg
1055 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1056 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1057 }
1058 else
1059 { // copy int reg to intCC reg
1060 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1061 assert(this->getRegType(SrcReg) == IntRegType
1062 && "Can only copy CC reg to/from integer reg");
1063 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1064 }
1065 break;
1066
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001067 case FloatCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001068 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Adve242a8082002-05-19 15:25:51 +00001069 break;
1070
1071 case IntRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001072 MI = Create3OperandInstr_Reg(ADD, SrcReg, this->getZeroRegNum(), DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001073 break;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001074
Ruchira Sasanka91442282001-09-30 23:16:47 +00001075 case FPSingleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001076 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001077 break;
1078
1079 case FPDoubleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001080 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001081 break;
1082
1083 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001084 assert(0 && "Unknown RegType");
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001085 break;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001086 }
Vikram S. Adve242a8082002-05-19 15:25:51 +00001087
1088 if (MI)
1089 mvec.push_back(MI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001090}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001091
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001092//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001093// Copy from a register to memory (i.e., Store). Register number must
1094// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001095//---------------------------------------------------------------------------
1096
1097
Vikram S. Adve242a8082002-05-19 15:25:51 +00001098void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001099UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1100 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001101 unsigned DestPtrReg,
1102 int Offset, int RegType,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001103 int scratchReg = -1) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001104 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001105 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001106 case IntRegType:
1107 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001108 MI->SetMachineOperandReg(0, SrcReg, false);
1109 MI->SetMachineOperandReg(1, DestPtrReg, false);
1110 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1111 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001112 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001113 break;
1114
1115 case FPSingleRegType:
1116 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001117 MI->SetMachineOperandReg(0, SrcReg, false);
1118 MI->SetMachineOperandReg(1, DestPtrReg, false);
1119 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1120 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001121 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001122 break;
1123
1124 case FPDoubleRegType:
1125 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001126 MI->SetMachineOperandReg(0, SrcReg, false);
1127 MI->SetMachineOperandReg(1, DestPtrReg, false);
1128 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1129 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001130 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001131 break;
1132
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001133 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001134 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
1135 assert(this->getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1136
1137 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1138 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1139 mvec.push_back(MI);
1140
1141 this->cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
1142 break;
1143
1144 case FloatCCRegType:
1145 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1146 MI = new MachineInstr(STXFSR, 3);
1147 MI->SetMachineOperandReg(0, SrcReg, false);
1148 MI->SetMachineOperandReg(1, DestPtrReg, false);
1149 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1150 (int64_t) Offset);
1151 mvec.push_back(MI);
1152 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001153
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001154 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001155 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001156 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001157}
1158
1159
1160//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001161// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001162// register number
1163//---------------------------------------------------------------------------
1164
1165
Vikram S. Adve242a8082002-05-19 15:25:51 +00001166void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001167UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1168 unsigned SrcPtrReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001169 int Offset,
1170 unsigned DestReg,
1171 int RegType,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001172 int scratchReg = -1) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001173 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001174 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001175 case IntRegType:
1176 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001177 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1178 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1179 (int64_t) Offset);
1180 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001181 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001182 break;
1183
1184 case FPSingleRegType:
1185 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001186 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1187 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1188 (int64_t) Offset);
1189 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001190 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001191 break;
1192
1193 case FPDoubleRegType:
1194 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001195 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1196 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1197 (int64_t) Offset);
1198 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001199 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001200 break;
1201
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001202 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001203 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
1204 assert(this->getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1205 this->cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
1206
1207 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1208 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1209 mvec.push_back(MI);
1210
1211 break;
1212
1213 case FloatCCRegType:
1214 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1215 MI = new MachineInstr(LDXFSR, 3);
1216 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1217 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1218 (int64_t) Offset);
1219 MI->SetMachineOperandReg(2, DestReg, true);
1220 mvec.push_back(MI);
1221 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001222
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001223 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001224 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001225 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001226}
1227
1228
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001229//---------------------------------------------------------------------------
1230// Generate a copy instruction to copy a value to another. Temporarily
1231// used by PhiElimination code.
1232//---------------------------------------------------------------------------
1233
1234
Vikram S. Adve242a8082002-05-19 15:25:51 +00001235void
1236UltraSparcRegInfo::cpValue2Value(Value *Src,
1237 Value *Dest,
1238 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001239 int RegType = getRegType( Src );
1240
1241 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001242
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001243 MachineInstr * MI = NULL;
1244
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001245 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001246 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001247 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001248 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1249 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1250 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001251 break;
1252
1253 case FPSingleRegType:
1254 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001255 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1256 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001257 break;
1258
1259
1260 case FPDoubleRegType:
1261 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001262 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1263 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001264 break;
1265
1266 default:
1267 assert(0 && "Unknow RegType in CpValu2Value");
1268 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001269
Vikram S. Adve242a8082002-05-19 15:25:51 +00001270 if (MI)
1271 mvec.push_back(MI);
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001272}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001273
1274
1275
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001276
1277
1278
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001279//----------------------------------------------------------------------------
1280// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001281// a call machine instruction. The caller saving/restoring instructions are
1282// inserted like:
1283//
1284// ** caller saving instructions
1285// other instructions inserted for the call by ColorCallArg
1286// CALL instruction
1287// other instructions inserted for the call ColorCallArg
1288// ** caller restoring instructions
1289//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001290//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001291
Ruchira Sasanka91442282001-09-30 23:16:47 +00001292
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001293void UltraSparcRegInfo::insertCallerSavingCode(MachineInstr *CallMI,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001294 const BasicBlock *BB,
1295 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001296
Vikram S. Adve242a8082002-05-19 15:25:51 +00001297 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1298
Ruchira Sasankabf915522002-01-07 21:03:42 +00001299 // has set to record which registers were saved/restored
1300 //
Chris Lattner697954c2002-01-20 22:54:45 +00001301 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001302
Vikram S. Adve242a8082002-05-19 15:25:51 +00001303 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1304
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001305 // Now find the LR of the return value of the call
1306 // The last *implicit operand* is the return value of a call
1307 // Insert it to to he PushedRegSet since we must not save that register
1308 // and restore it after the call.
1309 // We do this because, we look at the LV set *after* the instruction
1310 // to determine, which LRs must be saved across calls. The return value
1311 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001312
Vikram S. Adve242a8082002-05-19 15:25:51 +00001313 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001314
Chris Lattner699683c2002-02-04 05:59:25 +00001315 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001316 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001317 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001318
Chris Lattner699683c2002-02-04 05:59:25 +00001319 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001320 PushedRegSet.insert(
1321 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001322 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001323 }
1324
1325
Vikram S. Adve242a8082002-05-19 15:25:51 +00001326 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner748697d2002-02-05 04:20:12 +00001327 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001328
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001329 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001330 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001331
1332 // get the live range corresponding to live var
1333 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1334
1335 // LR can be null if it is a const since a const
1336 // doesn't have a dominating def - see Assumptions above
1337 if( LR ) {
1338
1339 if( LR->hasColor() ) {
1340
1341 unsigned RCID = (LR->getRegClass())->getID();
1342 unsigned Color = LR->getColor();
1343
1344 if ( isRegVolatile(RCID, Color) ) {
1345
1346 // if the value is in both LV sets (i.e., live before and after
1347 // the call machine instruction)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001348
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001349 unsigned Reg = getUnifiedRegNum(RCID, Color);
1350
1351 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1352
1353 // if we haven't already pushed that register
1354
1355 unsigned RegType = getRegType( LR );
1356
1357 // Now get two instructions - to push on stack and pop from stack
1358 // and add them to InstrnsBefore and InstrnsAfter of the
1359 // call instruction
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001360 //
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001361 int StackOff = PRA.mcInfo.pushTempValue(target,
1362 getSpilledRegSize(RegType));
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001363
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001364 vector<MachineInstr*>& instrnsBefore =
1365 PRA.AddedInstrMap[CallMI].InstrnsBefore;
1366 vector<MachineInstr*>& instrnsAfter =
1367 PRA.AddedInstrMap[CallMI].InstrnsAfter;
1368
1369 vector<MachineInstr*> AdIBef, AdIAft;
1370
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001371 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001372
1373 // We may need a scratch register to copy the saved value
1374 // to/from memory. This may itself have to insert code to
1375 // free up a scratch register. Any such code should go before
1376 // the save code.
1377 int scratchRegType = -1;
1378 int scratchReg = -1;
1379 if (this->regTypeNeedsScratchReg(RegType, scratchRegType))
1380 { // Find a register not live in the LVSet before CallMI
1381 const ValueSet &LVSetBef =
1382 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1383 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1384 CallMI, AdIBef, AdIAft);
1385 assert(scratchReg != this->getInvalidRegNum());
1386 CallMI->getRegsUsed().insert(scratchReg);
1387 }
1388
1389 if (AdIBef.size() > 0)
1390 instrnsBefore.insert(instrnsBefore.end(),
1391 AdIBef.begin(), AdIBef.end());
1392
1393 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1394 scratchReg);
1395
1396 if (AdIBef.size() > 0)
1397 instrnsBefore.insert(instrnsBefore.end(),
1398 AdIAft.begin(), AdIAft.end());
1399
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001400 //---- Insert code for popping the reg from the stack ----------
1401
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001402 // We may need a scratch register to copy the saved value
1403 // from memory. This may itself have to insert code to
1404 // free up a scratch register. Any such code should go
1405 // after the save code.
1406 //
1407 scratchRegType = -1;
1408 scratchReg = -1;
1409 if (this->regTypeNeedsScratchReg(RegType, scratchRegType))
1410 { // Find a register not live in the LVSet after CallMI
1411 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1412 CallMI, AdIBef, AdIAft);
1413 assert(scratchReg != this->getInvalidRegNum());
1414 CallMI->getRegsUsed().insert(scratchReg);
1415 }
1416
1417 if (AdIBef.size() > 0)
1418 instrnsAfter.insert(instrnsAfter.end(),
1419 AdIBef.begin(), AdIBef.end());
1420
1421 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1422 scratchReg);
1423
1424 if (AdIAft.size() > 0)
1425 instrnsAfter.insert(instrnsAfter.end(),
1426 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001427
Chris Lattner748697d2002-02-05 04:20:12 +00001428 PushedRegSet.insert(Reg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001429
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001430 if(DEBUG_RA) {
Vikram S. Adve242a8082002-05-19 15:25:51 +00001431 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001432 cerr << " -inserted caller saving instrs: Before:\n\t ";
1433 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001434 std::mem_fun(&MachineInstr::dump));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001435 cerr << " -and After:\n\t ";
1436 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001437 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001438 }
1439 } // if not already pushed
1440
1441 } // if LR has a volatile color
1442
1443 } // if LR has color
1444
1445 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001446
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001447 } // for each value in the LV set after instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +00001448}
1449
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001450
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001451//---------------------------------------------------------------------------
1452// Print the register assigned to a LR
1453//---------------------------------------------------------------------------
1454
Chris Lattner699683c2002-02-04 05:59:25 +00001455void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001456 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001457 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001458
Chris Lattner699683c2002-02-04 05:59:25 +00001459 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001460 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001461 return;
1462 }
1463
1464 // if a color is found
1465
Chris Lattner1e23ed72001-10-15 18:15:27 +00001466 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001467
Chris Lattner699683c2002-02-04 05:59:25 +00001468 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001469 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001470
Chris Lattner699683c2002-02-04 05:59:25 +00001471 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001472 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001473 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001474 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001475 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001476 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001477}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001478
1479//---------------------------------------------------------------------------
1480// This method examines instructions inserted by RegAlloc code before a
1481// machine instruction to detect invalid orders that destroy values before
1482// they are used. If it detects such conditions, it reorders the instructions.
1483//
1484// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001485// instructions inserted by RegAlloc. All such instruction MUST have
1486// their USES BEFORE THE DEFS after reordering.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001487//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001488// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1489// this method is called.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001490//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001491// This method uses two vectors for efficiency in accessing
Vikram S. Adve242a8082002-05-19 15:25:51 +00001492//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001493// Since instructions are inserted in RegAlloc, this assumes that the
1494// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001495// It also does not consider operands that are both use and def.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001496//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001497// All the uses are before THE def to a register
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001498//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +00001499
1500void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1501 std::vector<MachineInstr*> &OrdVec,
Chris Lattner697954c2002-01-20 22:54:45 +00001502 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001503
1504 /*
1505 Problem: We can have instructions inserted by RegAlloc like
1506 1. add %ox %g0 %oy
1507 2. add %oy %g0 %oz, where z!=x or z==x
1508
1509 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001510
1511 Solution:
1512 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001513
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001514 Algorithm:
1515
1516 do
1517 for each instruction 'DefInst' in the UnOrdVec
1518 for each instruction 'UseInst' that follows the DefInst
1519 if the reg defined by DefInst is used by UseInst
1520 mark DefInst as not movable in this iteration
1521 If DefInst is not marked as not-movable, move DefInst to OrdVec
1522 while all instructions in DefInst are moved to OrdVec
1523
1524 For moving, we call the move2OrdVec(). It checks whether there is a def
1525 in it for the uses in the instruction to be added to OrdVec. If there
1526 are no preceding defs, it just appends the instruction. If there is a
1527 preceding def, it puts two instructions to save the reg on stack before
1528 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001529
1530 */
1531
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001532 bool CouldMoveAll;
1533 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001534
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001535 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001536 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001537 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001538
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001539 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001540
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001541 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001542
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001543 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001544
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001545 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001546
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001547 //cerr << "\nInst in UnordVec = " << *DefInst;
1548
1549 // last operand is the def (unless for a store which has no def reg)
1550 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1551
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001552 if( DefOp.opIsDef() &&
1553 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001554
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001555 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001556
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001557 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001558
Chris Lattner697954c2002-01-20 22:54:45 +00001559 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001560 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001561
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001562 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1563
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001564 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001565 if( UseInst == NULL) continue;
1566
1567 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001568 MachineOperand& UseOp = UseInst->getOperand(0);
1569
1570 if( ! UseOp.opIsDef() &&
1571 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1572
1573 // if use is a register ...
1574
1575 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1576
1577 // if Def and this use are the same, it means that this use
1578 // is destroyed by a def before it is used
1579
1580 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001581
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001582 DefEqUse = true;
1583 CouldMoveAll = false;
1584 DebugPrint = true;
1585 break;
1586 } // if two registers are equal
1587
1588 } // if use is a register
1589
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001590 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001591
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001592 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001593
1594 // after examining all the instructions that follow the DefInst
1595 // if there are no dependencies, we can move it to the OrdVec
1596
1597 // cerr << "Moved to Ord: " << *DefInst;
1598
1599 moveInst2OrdVec(OrdVec, DefInst, PRA);
1600
1601 //OrdVec.push_back(DefInst);
1602
1603 // mark the pos of DefInst with NULL to indicate that it is
1604 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001605 *DefIt = NULL;
1606 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001607
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001608 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001609
1610 } // for all instructions in the UnordVec
1611
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001612
Chris Lattner699683c2002-02-04 05:59:25 +00001613 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001614
Chris Lattner44014412002-06-04 03:09:57 +00001615 if (DebugPrint && DEBUG_RA) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001616 cerr << "\nAdded instructions were reordered to:\n";
1617 for(unsigned int i=0; i < OrdVec.size(); i++)
1618 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001619 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001620}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001621
1622
1623
1624
1625
Chris Lattner697954c2002-01-20 22:54:45 +00001626void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001627 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001628 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001629 MachineOperand& UseOp = UnordInst->getOperand(0);
1630
1631 if( ! UseOp.opIsDef() &&
1632 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1633
1634 // for the use of UnordInst, see whether there is a defining instr
1635 // before in the OrdVec
1636 bool DefEqUse = false;
1637
Chris Lattner697954c2002-01-20 22:54:45 +00001638 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001639
1640 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1641
1642 MachineInstr *OrdInst = *OrdIt ;
1643
1644 MachineOperand& DefOp =
1645 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1646
1647 if( DefOp.opIsDef() &&
1648 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1649
1650 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1651
1652 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1653
1654 // we are here because there is a preceding def in the OrdVec
1655 // for the use in this intr we are going to insert. This
1656 // happened because the original code was like:
1657 // 1. add %ox %g0 %oy
1658 // 2. add %oy %g0 %ox
1659 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1660 // Now we are processing %ox of 1.
1661 // We have to
1662
1663 const int UReg = DefOp.getMachineRegNum();
1664 const int RegType = getRegType(UReg);
1665 MachineInstr *AdIBef, *AdIAft;
1666
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001667 const int StackOff = PRA.mcInfo.pushTempValue(target,
1668 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001669
1670 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Adve242a8082002-05-19 15:25:51 +00001671 vector<MachineInstr*> mvec;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001672 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001673 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1674 OrdIt = OrdVec.insert(OrdIt, *MI);
1675 ++OrdIt; // OrdIt must still point to current instr we processed
1676 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001677
1678 // Load directly into DReg (%oy)
1679 MachineOperand& DOp=
1680 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1681 assert(DOp.opIsDef() && "Last operand is not the def");
1682 const int DReg = DOp.getMachineRegNum();
1683
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001684 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001685
1686 cerr << "\nFixed CIRCULAR references by reordering";
1687
1688 if( DEBUG_RA ) {
1689 cerr << "\nBefore CIRCULAR Reordering:\n";
1690 cerr << *UnordInst;
1691 cerr << *OrdInst;
1692
1693 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1694 for(unsigned i=0; i < OrdVec.size(); i++)
1695 cerr << *(OrdVec[i]);
1696 }
1697
1698 // Do not copy the UseInst to OrdVec
1699 DefEqUse = true;
1700 break;
1701
1702 }// if two registers are equal
1703
1704 } // if Def is a register
1705
1706 } // for each instr in OrdVec
1707
Chris Lattner699683c2002-02-04 05:59:25 +00001708 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001709
1710 // We didn't find a def in the OrdVec, so just append this inst
1711 OrdVec.push_back( UnordInst );
1712 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1713 }
1714
1715 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001716}