blob: 6aa4d816264141ddfe22f6e8cf73664885fd159a [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000014#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000015#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerd5a84702002-04-29 17:42:12 +000016#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattnerf9986852002-04-27 07:27:19 +000017#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000018#include "llvm/iTerminators.h"
19#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000020#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000021#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000022#include <iostream>
Vikram S. Advea6d94c92002-04-25 04:42:21 +000023#include <values.h>
Chris Lattner7f74a562002-01-20 22:54:45 +000024using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000025
Chris Lattner5216cc52002-02-04 05:59:25 +000026UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
27 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
28 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
29
30 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
31 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
32 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
34
35 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
36 "32 Float regs are used for float arg passing");
37}
38
39
Vikram S. Advedb1435f2002-03-18 03:12:16 +000040// getZeroRegNum - returns the register that contains always zero.
41// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000042//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000043int UltraSparcRegInfo::getZeroRegNum() const {
44 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
45 SparcIntRegOrder::g0);
46}
Chris Lattner5216cc52002-02-04 05:59:25 +000047
48// getCallAddressReg - returns the reg used for pushing the address when a
49// method is called. This can be used for other purposes between calls
50//
51unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000052 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
53 SparcIntRegOrder::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000054}
55
56// Returns the register containing the return address.
57// It should be made sure that this register contains the return
58// value when a return instruction is reached.
59//
60unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000061 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
62 SparcIntRegOrder::i7);
Chris Lattner5216cc52002-02-04 05:59:25 +000063}
64
65// given the unified register number, this gives the name
66// for generating assembly code or debugging.
67//
68const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
69 if( reg < 32 )
70 return SparcIntRegOrder::getRegName(reg);
71 else if ( reg < (64 + 32) )
72 return SparcFloatRegOrder::getRegName( reg - 32);
73 else if( reg < (64+32+4) )
74 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
75 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
76 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
77 else if (reg== InvalidRegNum) //****** TODO: Remove */
78 return "<*NoReg*>";
79 else
80 assert(0 && "Invalid register number");
81 return "";
82}
83
Vikram S. Advedb1435f2002-03-18 03:12:16 +000084// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000085unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000086 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
87 SparcIntRegOrder::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +000088}
89
Vikram S. Advedb1435f2002-03-18 03:12:16 +000090// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000091unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000092 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
93 SparcIntRegOrder::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +000094}
95
96
Vikram S. Advea6d94c92002-04-25 04:42:21 +000097//---------------------------------------------------------------------------
98// Finds whether a call is an indirect call
99//---------------------------------------------------------------------------
100
101inline bool
102isVarArgsFunction(const Type *funcType) {
103 return cast<FunctionType>(cast<PointerType>(funcType)
104 ->getElementType())->isVarArg();
105}
106
107inline bool
108isVarArgsCall(const MachineInstr *CallMI) {
109 Value* callee = CallMI->getOperand(0).getVRegValue();
110 // const Type* funcType = isa<Function>(callee)? callee->getType()
111 // : cast<PointerType>(callee->getType())->getElementType();
112 const Type* funcType = callee->getType();
113 return isVarArgsFunction(funcType);
114}
115
116
117// Get the register number for the specified integer arg#,
118// assuming there are argNum total args, intArgNum int args,
119// and fpArgNum FP args preceding (and not including) this one.
120// Use INT regs for FP args if this is a varargs call.
121//
122// Return value:
123// InvalidRegNum, if there is no int register available for the arg.
124// regNum, otherwise (this is NOT the unified reg. num).
125//
126inline int
127UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
128 unsigned argNo,
129 unsigned intArgNo, unsigned fpArgNo,
130 unsigned& regClassId) const
131{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000132 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000133 if (argNo >= NumOfIntArgRegs)
134 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000135 else
136 return argNo + (inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000137}
138
139// Get the register number for the specified FP arg#,
140// assuming there are argNum total args, intArgNum int args,
141// and fpArgNum FP args preceding (and not including) this one.
142// Use INT regs for FP args if this is a varargs call.
143//
144// Return value:
145// InvalidRegNum, if there is no int register available for the arg.
146// regNum, otherwise (this is NOT the unified reg. num).
147//
148inline int
149UltraSparcRegInfo::regNumForFPArg(unsigned regType,
150 bool inCallee, bool isVarArgsCall,
151 unsigned argNo,
152 unsigned intArgNo, unsigned fpArgNo,
153 unsigned& regClassId) const
154{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000155 if (isVarArgsCall)
156 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
157 regClassId);
158 else
159 {
160 regClassId = FloatRegClassID;
161 if (regType == FPSingleRegType)
162 return (argNo*2+1 >= NumOfFloatArgRegs)?
163 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2 + 1);
164 else if (regType == FPDoubleRegType)
165 return (argNo*2 >= NumOfFloatArgRegs)?
166 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2);
167 else
168 assert(0 && "Illegal FP register type");
169 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000170}
171
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000172
173//---------------------------------------------------------------------------
174// Finds the return address of a call sparc specific call instruction
175//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000176
Vikram S. Advee9327f02002-05-19 15:25:51 +0000177// The following 4 methods are used to find the RegType (see enum above)
178// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000179//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000180int UltraSparcRegInfo::getRegType(unsigned regClassID,
181 const Type* type) const {
182 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000183 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000184 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000185 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000186 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000187 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000188 return FPDoubleRegType;
189 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000190 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000191 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000192 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000193 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000194 }
195}
196
Vikram S. Advee9327f02002-05-19 15:25:51 +0000197int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
198 return getRegType(LR->getRegClass()->getID(), LR->getType());
199}
200
Chris Lattner5216cc52002-02-04 05:59:25 +0000201int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000202 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000203}
204
205int UltraSparcRegInfo::getRegType(int reg) const {
206 if (reg < 32)
207 return IntRegType;
208 else if (reg < (32 + 32))
209 return FPSingleRegType;
210 else if (reg < (64 + 32))
211 return FPDoubleRegType;
212 else if (reg < (64+32+4))
213 return FloatCCRegType;
214 else if (reg < (64+32+4+2))
215 return IntCCRegType;
216 else
217 assert(0 && "Invalid register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000218 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000219}
220
221
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000222//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000223// Suggests a register for the ret address in the RET machine instruction.
224// We always suggest %i7 by convention.
225//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000226void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000227 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000228
Vikram S. Adve84982772001-10-22 13:41:12 +0000229 assert( (RetMI->getNumOperands() >= 2)
230 && "JMPL/RETURN must have 3 and 2 operands respectively");
231
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000232 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
233
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000234 // return address is always mapped to i7
235 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000236 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000237
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000238 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000239 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000240 // we have to test later whether it received the suggested color.
241 // In that case, a LR has to be created at the start of method.
242 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000243
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000244 // const Value *RetAddrVal = MO.getVRegValue();
245 // assert( RetAddrVal && "LR for ret address must be created at start");
246 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
247 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
248 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000249}
250
251
252//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000253// Suggests a register for the ret address in the JMPL/CALL machine instr.
254// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000255//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000256void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
257 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000258 std::vector<RegClass *> RCList) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000259 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
260 const Value *RetAddrVal = argDesc->getReturnAddrReg();
261 assert(RetAddrVal && "Return address value is required");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000262
Vikram S. Advee9327f02002-05-19 15:25:51 +0000263 // create a new LR for the return address and color it
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000264 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000265 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000266 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
267 RetAddrLR->setRegClass( RCList[RegClassID] );
268 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
269 LRI.addLRToMap( RetAddrVal, RetAddrLR);
270
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000271}
272
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000273
274
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000275
276//---------------------------------------------------------------------------
277// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000278// According to the Sparc ABI, the first 6 incoming args are in
279// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000280// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000281// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000282//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000283void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000284 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000285{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000286 // check if this is a varArgs function. needed for choosing regs.
287 bool isVarArgs = isVarArgsFunction(Meth->getType());
288
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000289 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000290 unsigned argNo=0, intArgNo=0, fpArgNo=0;
291 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
292 I != E; ++I, ++argNo) {
293 // get the LR of arg
294 LiveRange *LR = LRI.getLiveRangeForValue(I);
295 assert(LR && "No live range found for method arg");
296
297 unsigned regType = getRegType(LR);
298 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
299
300 int regNum = (regType == IntRegType)
301 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
302 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
303 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
304 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
305
306 if(regNum != InvalidRegNum)
307 LR->setSuggestedColor(regNum);
308 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000309}
310
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000311
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000312//---------------------------------------------------------------------------
313// This method is called after graph coloring to move incoming args to
314// the correct hardware registers if they did not receive the correct
315// (suggested) color through graph coloring.
316//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000317void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000318 LiveRangeInfo &LRI,
319 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000320
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000321 // check if this is a varArgs function. needed for choosing regs.
322 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000323 MachineInstr *AdMI;
324
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000325 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000326 // for each argument. count INT and FP arguments separately.
327 unsigned argNo=0, intArgNo=0, fpArgNo=0;
328 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
329 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000330 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000331 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000332 assert( LR && "No live range found for method arg");
333
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000334 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000335 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000336
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000337 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000338 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000339 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000340 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000341 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000342 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
343
344 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000345 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
346 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
347 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
348 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000349
350 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000351 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000352 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000353 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000354
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000355 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000356
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000357 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
358
359 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000360 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000361 if( UniLRReg == UniArgReg )
362 continue;
363
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000364 // We are here because the LR did not receive the suggested
365 // but LR received another register.
366 // Now we have to copy the %i reg (or stack pos of arg)
367 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000368
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000369 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000370 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000371 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000372 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000373 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000374 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000375
376 // It is a variable argument call: the float reg must go in a %o reg.
377 // We have to move an int reg to a float reg via memory.
378 //
379 assert(isVarArgs &&
380 RegClassID == FloatRegClassID &&
381 regClassIDOfArgReg == IntRegClassID &&
382 "This should only be an Int register for an FP argument");
383
384 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
385 getSpilledRegSize(regType));
Vikram S. Advee9327f02002-05-19 15:25:51 +0000386 cpReg2MemMI(UniArgReg, getFramePointer(), TmpOff, IntRegType,
387 FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000388
Vikram S. Advee9327f02002-05-19 15:25:51 +0000389 cpMem2RegMI(getFramePointer(), TmpOff, UniLRReg, regType,
390 FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000391 }
392 else {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000393 cpReg2RegMI(UniArgReg, UniLRReg, regType, FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000394 }
395 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000396 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000397
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000398 // Now the arg is coming on stack. Since the LR recieved a register,
399 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000400 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000401 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000402 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000403 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
404 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000405
Vikram S. Advee9327f02002-05-19 15:25:51 +0000406 cpMem2RegMI(getFramePointer(), offsetFromFP, UniLRReg, regType,
407 FirstAI->InstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000408 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000409
410 } // if LR received a color
411
412 else {
413
414 // Now, the LR did not receive a color. But it has a stack offset for
415 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000416 // So, if the arg is coming in UniArgReg register, we can just move
417 // that on to the stack pos of LR
418
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000419 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000420
421 if( regClassIDOfArgReg != RegClassID ) {
422 assert(0 &&
423 "FP arguments to a varargs function should be explicitly "
424 "copied to/from int registers by instruction selection!");
425
426 // It must be a float arg for a variable argument call, which
427 // must come in a %o reg. Move the int reg to the stack.
428 //
429 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
430 "This should only be an Int register for an FP argument");
431
Vikram S. Advee9327f02002-05-19 15:25:51 +0000432 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
433 IntRegType, FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000434 }
435 else {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000436 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
437 regType, FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000438 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000439 }
440
441 else {
442
443 // Now the arg is coming on stack. Since the LR did NOT
444 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000445 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000446 // since this method is called before any other method that makes
447 // uses of the stack pos of the LR (e.g., updateMachineInstr)
448
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000449 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000450 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000451 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
452 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000453
454 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000455 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000456
457 }
458
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000459 } // for each incoming argument
460
461}
462
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000463
464
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000465//---------------------------------------------------------------------------
466// This method is called before graph coloring to suggest colors to the
467// outgoing call args and the return value of the call.
468//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000469void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000470 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000471 std::vector<RegClass *> RCList) const {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000472 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000473
Vikram S. Advee9327f02002-05-19 15:25:51 +0000474 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000475
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000476 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000477
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000478 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000479 // will be in %o0 if the value is an integer type, or in %f0 if the
480 // value is a float type.
481
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000482 // the return value cannot have a LR in machine instruction since it is
483 // only defined by the call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000484
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000485 // if type is not void, create a new live range and set its
486 // register class and add to LRI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000487
Vikram S. Advee9327f02002-05-19 15:25:51 +0000488 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000489
Chris Lattner5216cc52002-02-04 05:59:25 +0000490 if (RetVal) {
491 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000492 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000493
Chris Lattner5216cc52002-02-04 05:59:25 +0000494 // create a new LR for the return value
495 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000496 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000497 unsigned RegClassID = getRegClassIDOfValue(RetVal);
498 RetValLR->setRegClass(RCList[RegClassID]);
499 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000500
501 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000502
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000503 if( RegClassID == IntRegClassID )
504 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
505 else if (RegClassID == FloatRegClassID )
506 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
507 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000508 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000509
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000510
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000511 // Now suggest colors for arguments (operands) of the call instruction.
512 // Colors are suggested only if the arg number is smaller than the
513 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000514 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000515
Vikram S. Advee9327f02002-05-19 15:25:51 +0000516 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000517
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000518 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
519 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000520
Vikram S. Advee9327f02002-05-19 15:25:51 +0000521 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000522
523 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000524 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000525
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000526 // not possible to have a null LR since all args (even consts)
527 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000528 if (!LR) {
529 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000530 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000531 }
532
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000533 unsigned regType = getRegType( LR );
534 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000535
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000536 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000537 // an INT or FP value. Here we ignore whether or not it is a
538 // varargs calls, because FP arguments will be explicitly copied
539 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000540 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000541 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
542 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
543 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
544 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000545
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000546 // If a register could be allocated, use it.
547 // If not, do NOTHING as this will be colored as a normal value.
548 if(regNum != InvalidRegNum)
549 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000550
Vikram S. Advee9327f02002-05-19 15:25:51 +0000551 // Repeat for the second copy of the argument, which would be
552 // an FP argument being passed to a function with no prototype
553 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
554 if (argCopy != NULL)
555 {
556 assert(regType != IntRegType && argCopy->getType()->isIntegral()
557 && "Must be passing copy of FP argument in int register");
558 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
559 argNo, intArgNo, fpArgNo-1,
560 regClassIDOfArgReg);
561 assert(copyRegNum != InvalidRegNum);
562 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
563 copyLR->setSuggestedColor(copyRegNum);
564 }
565
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000566 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000567
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000568}
569
570
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000571//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000572// Helper method for UltraSparcRegInfo::colorCallArgs().
573//---------------------------------------------------------------------------
574
575void
576UltraSparcRegInfo::InitializeOutgoingArg(const MachineInstr* CallMI,
577 AddedInstrns *CallAI,
578 PhyRegAlloc &PRA, LiveRange* LR,
579 unsigned regType, unsigned RegClassID,
580 int UniArgRegOrNone, unsigned int argNo,
581 std::vector<MachineInstr *>& AddedInstrnsBefore)
582 const
583{
584 MachineInstr *AdMI;
585 bool isArgInReg = false;
586 unsigned UniArgReg = MAXINT; // unused unless initialized below
587 if (UniArgRegOrNone != InvalidRegNum)
588 {
589 isArgInReg = true;
590 UniArgReg = (unsigned) UniArgRegOrNone;
591 }
592
593 if (LR->hasColor()) {
594 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
595
596 // if LR received the correct color, nothing to do
597 if( isArgInReg && UniArgReg == UniLRReg )
598 return;
599
600 // The LR is allocated to a register UniLRReg and must be copied
601 // to UniArgReg or to the stack slot.
602 //
603 if( isArgInReg ) {
604 // Copy UniLRReg to UniArgReg
605 cpReg2RegMI(UniLRReg, UniArgReg, regType, AddedInstrnsBefore);
606 }
607 else {
608 // Copy UniLRReg to the stack to pass the arg on stack.
609 const MachineFrameInfo& frameInfo = target.getFrameInfo();
610 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
611 cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, regType,
612 CallAI->InstrnsBefore);
613 }
614
615 } else { // LR is not colored (i.e., spilled)
616
617 if( isArgInReg ) {
618 // Insert a load instruction to load the LR to UniArgReg
619 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
620 UniArgReg, regType, AddedInstrnsBefore);
621 // Now add the instruction
622 }
623
624 else {
625 // Now, we have to pass the arg on stack. Since LR also did NOT
626 // receive a register we have to move an argument in memory to
627 // outgoing parameter on stack.
628 // Use TReg to load and store the value.
629 // Use TmpOff to save TReg, since that may have a live value.
630 //
631 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
632 int TmpOff = PRA.mcInfo.pushTempValue(target,
633 getSpilledRegSize(getRegType(LR)));
634 const MachineFrameInfo& frameInfo = target.getFrameInfo();
635 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
636
637 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
638
639 // Sequence:
640 // (1) Save TReg on stack
641 // (2) Load LR value into TReg from stack pos of LR
642 // (3) Store Treg on outgoing Arg pos on stack
643 // (4) Load the old value of TReg from stack to TReg (restore it)
644 //
645 // OPTIMIZE THIS:
646 // When reverse pointers in MahineInstr are introduced:
647 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
648 // needed only if this fails. Currently, we cannot call the
649 // above method since we cannot find LVSetBefore without the BB
650 //
651 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
652 // AddedInstrnsBefore since these instructions must not be reordered.
653 cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType,
654 CallAI->InstrnsBefore);
655 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(), TReg, regType,
656 CallAI->InstrnsBefore);
657 cpReg2MemMI(TReg, getStackPointer(), argOffset, regType,
658 CallAI->InstrnsBefore);
659 cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType,
660 CallAI->InstrnsBefore);
661 }
662 }
663}
664
665//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000666// After graph coloring, we have call this method to see whehter the return
667// value and the call args received the correct colors. If not, we have
668// to instert copy instructions.
669//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000670
Chris Lattner5216cc52002-02-04 05:59:25 +0000671void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
672 LiveRangeInfo &LRI,
673 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000674 PhyRegAlloc &PRA,
675 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000676
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000677 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
678
Vikram S. Advee9327f02002-05-19 15:25:51 +0000679 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
680
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000681 // First color the return value of the call.
682 // If there is a LR for the return value, it means this
683 // method returns a value
684
685 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000686
Vikram S. Advee9327f02002-05-19 15:25:51 +0000687 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000688
Chris Lattner30e8fb62002-02-05 01:43:49 +0000689 if (RetVal) {
690 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000691
Chris Lattner30e8fb62002-02-05 01:43:49 +0000692 if (!RetValLR) {
693 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000694 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000695 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000696
697 unsigned RegClassID = (RetValLR->getRegClass())->getID();
698 bool recvCorrectColor = false;
699
700 unsigned CorrectCol; // correct color for ret value
701 if(RegClassID == IntRegClassID)
702 CorrectCol = SparcIntRegOrder::o0;
703 else if(RegClassID == FloatRegClassID)
704 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000705 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000706 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000707 return;
708 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000709
710 // if the LR received the correct color, NOTHING to do
711
712 if( RetValLR->hasColor() )
713 if( RetValLR->getColor() == CorrectCol )
714 recvCorrectColor = true;
715
716
717 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000718 // put copy instruction
719
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000720 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000721
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000722 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000723
724 // the reg that LR must be colored with
725 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000726
727 if( RetValLR->hasColor() ) {
728
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000729 unsigned
730 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000731
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000732 // the return value is coming in UniRetReg but has to go into
733 // the UniRetLRReg
734
Vikram S. Advee9327f02002-05-19 15:25:51 +0000735 cpReg2RegMI(UniRetReg, UniRetLRReg, regType, CallAI->InstrnsAfter);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000736
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000737 } // if LR has color
738 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000739
740 // if the LR did NOT receive a color, we have to move the return
741 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000742
Vikram S. Advee9327f02002-05-19 15:25:51 +0000743 cpReg2MemMI(UniRetReg, getFramePointer(),RetValLR->getSpillOffFromFP(),
744 regType, CallAI->InstrnsAfter);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000745 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000746
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000747 } // the LR didn't receive the suggested color
748
749 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000750
751
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000752 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000753 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000754 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000755
Chris Lattner7f74a562002-01-20 22:54:45 +0000756 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000757
758 unsigned NumOfCallArgs = argDesc->getNumArgs();
759
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000760 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
761 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000762
Vikram S. Advee9327f02002-05-19 15:25:51 +0000763 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
764
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000765 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000766 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000767
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000768 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000769 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000770
Vikram S. Advee9327f02002-05-19 15:25:51 +0000771 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000772 // Also find the correct register the argument must use (UniArgReg)
773 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000774 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000775 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000776 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
777
Vikram S. Advee9327f02002-05-19 15:25:51 +0000778 // Find the register that must be used for this arg, depending on
779 // whether it is an INT or FP value. Here we ignore whether or not it
780 // is a varargs calls, because FP arguments will be explicitly copied
781 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000782 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000783 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
784 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
785 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
786 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000787
788 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000789 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000790 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000791 assert(regClassIDOfArgReg == RegClassID &&
792 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000793 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000794
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000795 // not possible to have a null LR since all args (even consts)
796 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000797 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000798 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000799 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000800 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000801
802 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
803 UniArgReg, argNo, AddedInstrnsBefore);
804
805 // Repeat for the second copy of the argument, which would be
806 // an FP argument being passed to a function with no prototype.
807 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
808 if (argCopy != NULL)
809 {
810 assert(regType != IntRegType && argCopy->getType()->isIntegral()
811 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000812
Vikram S. Advee9327f02002-05-19 15:25:51 +0000813 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
814 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
815
816 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
817 argNo, intArgNo, fpArgNo-1,
818 regClassIDOfArgReg);
819 assert(copyRegNum != InvalidRegNum);
820 assert(regClassIDOfArgReg == copyRegClassID &&
821 "Moving values between reg classes must happen during selection");
822
823 InitializeOutgoingArg(CallMI, CallAI, PRA,
824 LRI.getLiveRangeForValue(argCopy), copyRegType,
825 copyRegClassID, copyRegNum, argNo,
826 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000827 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000828 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000829
Vikram S. Advee9327f02002-05-19 15:25:51 +0000830 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000831 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000832 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000833 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000834
Chris Lattner5216cc52002-02-04 05:59:25 +0000835 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000836 cerr << "\nCalling reorder with instrns: \n";
837 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
838 cerr << *(AddedInstrnsBefore[i]);
839 }
840
Chris Lattner7f74a562002-01-20 22:54:45 +0000841 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000842 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000843
Chris Lattner5216cc52002-02-04 05:59:25 +0000844 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000845 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000846 for(unsigned i = 0; i < TmpVec.size(); i++)
847 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000848 }
849
850 // copy the results back from TmpVec to InstrnsBefore
851 for(unsigned i=0; i < TmpVec.size(); i++)
852 CallAI->InstrnsBefore.push_back( TmpVec[i] );
853 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000854
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000855 // now insert caller saving code for this call instruction
856 //
857 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000858}
859
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000860//---------------------------------------------------------------------------
861// This method is called for an LLVM return instruction to identify which
862// values will be returned from this method and to suggest colors.
863//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000864void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
865 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000866
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000867 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000868
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000869 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000870
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000871 // if there is an implicit ref, that has to be the ret value
872 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000873
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000874 // The first implicit operand is the return value of a return instr
875 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000876
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000878
Chris Lattner30e8fb62002-02-05 01:43:49 +0000879 if (!LR) {
880 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
881 assert(0 && "No LR for return value of non-void method");
882 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000883
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000884 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000885
Chris Lattner5216cc52002-02-04 05:59:25 +0000886 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000887 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000888 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000889 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000890 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000891}
892
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000893
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000894
895//---------------------------------------------------------------------------
896// Colors the return value of a method to %i0 or %f0, if possible. If it is
897// not possilbe to directly color the LR, insert a copy instruction to move
898// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
899// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000900//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000901void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
902 LiveRangeInfo &LRI,
903 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000904
Chris Lattner5216cc52002-02-04 05:59:25 +0000905 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000906
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000907 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000908 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000909
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000910 // The first implicit operand is the return value of a return instr
911 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000912
Chris Lattner5216cc52002-02-04 05:59:25 +0000913 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000914
Chris Lattner30e8fb62002-02-05 01:43:49 +0000915 if (!LR) {
916 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
917 // assert( LR && "No LR for return value of non-void method");
918 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000919 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000920
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000921 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000922 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000923
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000924 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000925 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000926 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000927 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000928 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000929 else {
Chris Lattner5216cc52002-02-04 05:59:25 +0000930 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000931 return;
932 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000933
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000934 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000935
Chris Lattner5216cc52002-02-04 05:59:25 +0000936 if (LR->hasColor() && LR->getColor() == CorrectCol)
937 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000938
Chris Lattner5216cc52002-02-04 05:59:25 +0000939 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000940
Chris Lattner5216cc52002-02-04 05:59:25 +0000941 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000942
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000943 // We are here because the LR was allocted a regiter
944 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000945
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000946 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000947
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000948 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000949
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000950 // the LR received UniLRReg but must be colored with UniRetReg
951 // to pass as the return value
Vikram S. Advee9327f02002-05-19 15:25:51 +0000952 cpReg2RegMI(UniLRReg, UniRetReg, regType, RetAI->InstrnsBefore);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000953 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000954 else { // if the LR is spilled
Vikram S. Advee9327f02002-05-19 15:25:51 +0000955 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
956 UniRetReg, regType, RetAI->InstrnsBefore);
Chris Lattner7f74a562002-01-20 22:54:45 +0000957 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000958 }
959
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000960 } // if there is a return value
961
962}
963
964
965//---------------------------------------------------------------------------
966// Copy from a register to register. Register number must be the unified
967// register number
968//---------------------------------------------------------------------------
969
Vikram S. Advee9327f02002-05-19 15:25:51 +0000970void
971UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
972 unsigned DestReg,
973 int RegType,
974 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000975 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000976 "Invalid Register");
977
978 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000979
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980 switch( RegType ) {
981
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000982 case IntCCRegType:
983 case FloatCCRegType:
Vikram S. Advee9327f02002-05-19 15:25:51 +0000984 assert(0 && "This code was bogus and needs to be fixed!");
985 break;
986
987 case IntRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000988 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000989 MI->SetMachineOperandReg(0, SrcReg, false);
990 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
991 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000992 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000993
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000994 case FPSingleRegType:
995 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000996 MI->SetMachineOperandReg(0, SrcReg, false);
997 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000998 break;
999
1000 case FPDoubleRegType:
1001 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001002 MI->SetMachineOperandReg(0, SrcReg, false);
1003 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004 break;
1005
1006 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001007 assert(0 && "Unknown RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001008 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001009
1010 if (MI)
1011 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001012}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001013
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001014//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001015// Copy from a register to memory (i.e., Store). Register number must
1016// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001017//---------------------------------------------------------------------------
1018
1019
Vikram S. Advee9327f02002-05-19 15:25:51 +00001020void
1021UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1022 unsigned DestPtrReg,
1023 int Offset, int RegType,
1024 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001025 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001026 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001027 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001028 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001029 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001030 MI->SetMachineOperandReg(0, SrcReg, false);
1031 MI->SetMachineOperandReg(1, DestPtrReg, false);
1032 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1033 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001034 break;
1035
1036 case FPSingleRegType:
1037 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001038 MI->SetMachineOperandReg(0, SrcReg, false);
1039 MI->SetMachineOperandReg(1, DestPtrReg, false);
1040 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1041 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001042 break;
1043
1044 case FPDoubleRegType:
1045 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001046 MI->SetMachineOperandReg(0, SrcReg, false);
1047 MI->SetMachineOperandReg(1, DestPtrReg, false);
1048 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1049 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001050 break;
1051
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001052 case IntCCRegType:
1053 assert( 0 && "Cannot directly store %ccr to memory");
1054
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001055 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001056 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001057 }
1058
Vikram S. Advee9327f02002-05-19 15:25:51 +00001059 if (MI)
1060 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001061}
1062
1063
1064//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001065// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001066// register number
1067//---------------------------------------------------------------------------
1068
1069
Vikram S. Advee9327f02002-05-19 15:25:51 +00001070void
1071UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1072 int Offset,
1073 unsigned DestReg,
1074 int RegType,
1075 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001076 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001077 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001078 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001079 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001080 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001081 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1082 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1083 (int64_t) Offset);
1084 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001085 break;
1086
1087 case FPSingleRegType:
1088 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001089 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1090 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1091 (int64_t) Offset);
1092 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001093
1094 break;
1095
1096 case FPDoubleRegType:
1097 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001098 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1099 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1100 (int64_t) Offset);
1101 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001102 break;
1103
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001104 case IntCCRegType:
1105 assert( 0 && "Cannot directly load into %ccr from memory");
1106
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001107 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001108 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001109 }
1110
Vikram S. Advee9327f02002-05-19 15:25:51 +00001111 if (MI)
1112 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001113}
1114
1115
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001116//---------------------------------------------------------------------------
1117// Generate a copy instruction to copy a value to another. Temporarily
1118// used by PhiElimination code.
1119//---------------------------------------------------------------------------
1120
1121
Vikram S. Advee9327f02002-05-19 15:25:51 +00001122void
1123UltraSparcRegInfo::cpValue2Value(Value *Src,
1124 Value *Dest,
1125 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001126 int RegType = getRegType( Src );
1127
1128 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001129
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001130 MachineInstr * MI = NULL;
1131
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001132 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001133 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001134 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001135 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1136 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1137 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001138 break;
1139
1140 case FPSingleRegType:
1141 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001142 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1143 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001144 break;
1145
1146
1147 case FPDoubleRegType:
1148 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001149 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1150 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001151 break;
1152
1153 default:
1154 assert(0 && "Unknow RegType in CpValu2Value");
1155 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001156
Vikram S. Advee9327f02002-05-19 15:25:51 +00001157 if (MI)
1158 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001159}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001160
1161
1162
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001163
1164
1165
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001166//----------------------------------------------------------------------------
1167// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001168// a call machine instruction. The caller saving/restoring instructions are
1169// inserted like:
1170//
1171// ** caller saving instructions
1172// other instructions inserted for the call by ColorCallArg
1173// CALL instruction
1174// other instructions inserted for the call ColorCallArg
1175// ** caller restoring instructions
1176//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001177//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001178
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001179
Vikram S. Advee9327f02002-05-19 15:25:51 +00001180void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *CallMI,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001181 const BasicBlock *BB,
1182 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001183
Vikram S. Advee9327f02002-05-19 15:25:51 +00001184 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1185
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001186 // has set to record which registers were saved/restored
1187 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001188 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001189
Vikram S. Advee9327f02002-05-19 15:25:51 +00001190 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1191
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001192 // Now find the LR of the return value of the call
1193 // The last *implicit operand* is the return value of a call
1194 // Insert it to to he PushedRegSet since we must not save that register
1195 // and restore it after the call.
1196 // We do this because, we look at the LV set *after* the instruction
1197 // to determine, which LRs must be saved across calls. The return value
1198 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001199
Vikram S. Advee9327f02002-05-19 15:25:51 +00001200 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001201
Chris Lattner5216cc52002-02-04 05:59:25 +00001202 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001203 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001204 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001205
Chris Lattner5216cc52002-02-04 05:59:25 +00001206 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001207 PushedRegSet.insert(
1208 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001209 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001210 }
1211
1212
Vikram S. Advee9327f02002-05-19 15:25:51 +00001213 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001214 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001215
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001216 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001217 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001218
1219 // get the live range corresponding to live var
1220 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1221
1222 // LR can be null if it is a const since a const
1223 // doesn't have a dominating def - see Assumptions above
1224 if( LR ) {
1225
1226 if( LR->hasColor() ) {
1227
1228 unsigned RCID = (LR->getRegClass())->getID();
1229 unsigned Color = LR->getColor();
1230
1231 if ( isRegVolatile(RCID, Color) ) {
1232
1233 // if the value is in both LV sets (i.e., live before and after
1234 // the call machine instruction)
1235
1236 unsigned Reg = getUnifiedRegNum(RCID, Color);
1237
1238 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1239
1240 // if we haven't already pushed that register
1241
1242 unsigned RegType = getRegType( LR );
1243
1244 // Now get two instructions - to push on stack and pop from stack
1245 // and add them to InstrnsBefore and InstrnsAfter of the
1246 // call instruction
1247
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001248
1249 int StackOff = PRA.mcInfo.pushTempValue(target,
1250 getSpilledRegSize(RegType));
1251
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001252
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001253 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1254 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001255
1256 //---- Insert code for pushing the reg on stack ----------
1257
1258 if( RegType == IntCCRegType ) {
1259
1260 // Handle IntCCRegType specially since we cannot directly
1261 // push %ccr on to the stack
1262
Chris Lattner7e5ee422002-02-05 04:20:12 +00001263 const ValueSet &LVSetBef =
Vikram S. Advee9327f02002-05-19 15:25:51 +00001264 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001265
1266 // get a free INTEGER register
1267 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001268 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001269 IntRegType, CallMI, &LVSetBef, AdIBefCC, AdIAftCC);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001270
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001271 // insert the instructions in reverse order since we are
1272 // adding them to the front of InstrnsBefore
Vikram S. Advee9327f02002-05-19 15:25:51 +00001273 AddedInstrns& addedI = PRA.AddedInstrMap[CallMI];
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001274 if(AdIAftCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001275 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1276 AdIAftCC);
1277
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001278 AdICpCC = cpCCR2IntMI(FreeIntReg);
Vikram S. Advee9327f02002-05-19 15:25:51 +00001279 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1280 AdICpCC);
1281
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001282 if(AdIBefCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001283 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1284 AdIBefCC);
1285
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001286 if(DEBUG_RA) {
1287 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1288 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1289 cerr << "\t" << *AdICpCC;
1290 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1291 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001292
1293 } else {
1294 // for any other register type, just add the push inst
Vikram S. Advee9327f02002-05-19 15:25:51 +00001295 cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType,
1296 PRA.AddedInstrMap[CallMI].InstrnsBefore);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001297 }
1298
1299
1300 //---- Insert code for popping the reg from the stack ----------
1301
Chris Lattner7e5ee422002-02-05 04:20:12 +00001302 if (RegType == IntCCRegType) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001303
1304 // Handle IntCCRegType specially since we cannot directly
1305 // pop %ccr on from the stack
1306
1307 // get a free INT register
1308 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001309 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001310 IntRegType, CallMI, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001311
1312 if(AdIBefCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001313 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001314
1315 AdICpCC = cpInt2CCRMI(FreeIntReg);
Vikram S. Advee9327f02002-05-19 15:25:51 +00001316 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001317
1318 if(AdIAftCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001319 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001320
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001321 if(DEBUG_RA) {
1322
1323 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1324 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1325 cerr << "\t" << *AdICpCC;
1326 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1327 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001328
1329 } else {
1330 // for any other register type, just add the pop inst
Vikram S. Advee9327f02002-05-19 15:25:51 +00001331 cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType,
1332 PRA.AddedInstrMap[CallMI].InstrnsAfter);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001333 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001334
Chris Lattner7e5ee422002-02-05 04:20:12 +00001335 PushedRegSet.insert(Reg);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001336
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001337 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001338 cerr << "\nFor call inst:" << *CallMI;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001339 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001340 if( RegType == IntCCRegType ) {
1341 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1342 if(AdIAftCC) cerr << *AdIAftCC;
1343 }
1344 else {
1345 if(AdIBef) cerr << *AdIBef << "\t";
1346 if(AdIAft) cerr << *AdIAft;
1347 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001348 }
1349 } // if not already pushed
1350
1351 } // if LR has a volatile color
1352
1353 } // if LR has color
1354
1355 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001356
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001357 } // for each value in the LV set after instruction
1358
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001359}
1360
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001361//---------------------------------------------------------------------------
1362// Copies %ccr into an integer register. IntReg is the UNIFIED register
1363// number.
1364//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001365
Chris Lattner5216cc52002-02-04 05:59:25 +00001366MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1367 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001368 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1369 SparcIntCCRegOrder::ccr),
1370 false, true);
1371 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001372 return MI;
1373}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001374
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001375//---------------------------------------------------------------------------
1376// Copies an integer register into %ccr. IntReg is the UNIFIED register
1377// number.
1378//---------------------------------------------------------------------------
1379
Chris Lattner5216cc52002-02-04 05:59:25 +00001380MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1381 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001382 MI->SetMachineOperandReg(0, IntReg, false);
1383 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1384 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1385 true, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001386 return MI;
1387}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001388
1389
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001390
1391
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001392//---------------------------------------------------------------------------
1393// Print the register assigned to a LR
1394//---------------------------------------------------------------------------
1395
Chris Lattner5216cc52002-02-04 05:59:25 +00001396void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001397 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001398 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001399
Chris Lattner5216cc52002-02-04 05:59:25 +00001400 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001401 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001402 return;
1403 }
1404
1405 // if a color is found
1406
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001407 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001408
Chris Lattner5216cc52002-02-04 05:59:25 +00001409 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001410 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001411
Chris Lattner5216cc52002-02-04 05:59:25 +00001412 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001413 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001414 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001415 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001416 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001417 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001418}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001419
1420//---------------------------------------------------------------------------
1421// This method examines instructions inserted by RegAlloc code before a
1422// machine instruction to detect invalid orders that destroy values before
1423// they are used. If it detects such conditions, it reorders the instructions.
1424//
1425// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001426// instructions inserted by RegAlloc. All such instruction MUST have
1427// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001428//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001429// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1430// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001431//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001432// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001433//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001434// Since instructions are inserted in RegAlloc, this assumes that the
1435// first operand is the source reg and the last operand is the dest reg.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001436//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001437// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001438//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001439
1440void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1441 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001442 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001443
1444 /*
1445 Problem: We can have instructions inserted by RegAlloc like
1446 1. add %ox %g0 %oy
1447 2. add %oy %g0 %oz, where z!=x or z==x
1448
1449 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001450
1451 Solution:
1452 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001453
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001454 Algorithm:
1455
1456 do
1457 for each instruction 'DefInst' in the UnOrdVec
1458 for each instruction 'UseInst' that follows the DefInst
1459 if the reg defined by DefInst is used by UseInst
1460 mark DefInst as not movable in this iteration
1461 If DefInst is not marked as not-movable, move DefInst to OrdVec
1462 while all instructions in DefInst are moved to OrdVec
1463
1464 For moving, we call the move2OrdVec(). It checks whether there is a def
1465 in it for the uses in the instruction to be added to OrdVec. If there
1466 are no preceding defs, it just appends the instruction. If there is a
1467 preceding def, it puts two instructions to save the reg on stack before
1468 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001469
1470 */
1471
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001472 bool CouldMoveAll;
1473 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001474
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001475 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001476 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001477 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001478
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001479 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001480
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001481 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001482
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001483 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001484
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001485 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001486
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001487 //cerr << "\nInst in UnordVec = " << *DefInst;
1488
1489 // last operand is the def (unless for a store which has no def reg)
1490 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1491
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001492 if( DefOp.opIsDef() &&
1493 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001494
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001495 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001496
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001497 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001498
Chris Lattner7f74a562002-01-20 22:54:45 +00001499 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001500 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001501
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001502 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1503
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001504 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001505 if( UseInst == NULL) continue;
1506
1507 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001508 MachineOperand& UseOp = UseInst->getOperand(0);
1509
1510 if( ! UseOp.opIsDef() &&
1511 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1512
1513 // if use is a register ...
1514
1515 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1516
1517 // if Def and this use are the same, it means that this use
1518 // is destroyed by a def before it is used
1519
1520 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001521
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001522 DefEqUse = true;
1523 CouldMoveAll = false;
1524 DebugPrint = true;
1525 break;
1526 } // if two registers are equal
1527
1528 } // if use is a register
1529
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001530 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001531
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001532 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001533
1534 // after examining all the instructions that follow the DefInst
1535 // if there are no dependencies, we can move it to the OrdVec
1536
1537 // cerr << "Moved to Ord: " << *DefInst;
1538
1539 moveInst2OrdVec(OrdVec, DefInst, PRA);
1540
1541 //OrdVec.push_back(DefInst);
1542
1543 // mark the pos of DefInst with NULL to indicate that it is
1544 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001545 *DefIt = NULL;
1546 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001547
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001548 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001549
1550 } // for all instructions in the UnordVec
1551
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001552
Chris Lattner5216cc52002-02-04 05:59:25 +00001553 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001554
Chris Lattner070cf772002-06-04 03:09:57 +00001555 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001556 cerr << "\nAdded instructions were reordered to:\n";
1557 for(unsigned int i=0; i < OrdVec.size(); i++)
1558 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001559 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001560}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561
1562
1563
1564
1565
Chris Lattner7f74a562002-01-20 22:54:45 +00001566void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001567 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001568 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001569 MachineOperand& UseOp = UnordInst->getOperand(0);
1570
1571 if( ! UseOp.opIsDef() &&
1572 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1573
1574 // for the use of UnordInst, see whether there is a defining instr
1575 // before in the OrdVec
1576 bool DefEqUse = false;
1577
Chris Lattner7f74a562002-01-20 22:54:45 +00001578 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001579
1580 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1581
1582 MachineInstr *OrdInst = *OrdIt ;
1583
1584 MachineOperand& DefOp =
1585 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1586
1587 if( DefOp.opIsDef() &&
1588 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1589
1590 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1591
1592 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1593
1594 // we are here because there is a preceding def in the OrdVec
1595 // for the use in this intr we are going to insert. This
1596 // happened because the original code was like:
1597 // 1. add %ox %g0 %oy
1598 // 2. add %oy %g0 %ox
1599 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1600 // Now we are processing %ox of 1.
1601 // We have to
1602
1603 const int UReg = DefOp.getMachineRegNum();
1604 const int RegType = getRegType(UReg);
1605 MachineInstr *AdIBef, *AdIAft;
1606
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001607 const int StackOff = PRA.mcInfo.pushTempValue(target,
1608 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001609
1610 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001611 vector<MachineInstr*> mvec;
1612 cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType, mvec);
1613 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1614 OrdIt = OrdVec.insert(OrdIt, *MI);
1615 ++OrdIt; // OrdIt must still point to current instr we processed
1616 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001617
1618 // Load directly into DReg (%oy)
1619 MachineOperand& DOp=
1620 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1621 assert(DOp.opIsDef() && "Last operand is not the def");
1622 const int DReg = DOp.getMachineRegNum();
1623
Vikram S. Advee9327f02002-05-19 15:25:51 +00001624 cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType, OrdVec);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001625
1626 cerr << "\nFixed CIRCULAR references by reordering";
1627
1628 if( DEBUG_RA ) {
1629 cerr << "\nBefore CIRCULAR Reordering:\n";
1630 cerr << *UnordInst;
1631 cerr << *OrdInst;
1632
1633 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1634 for(unsigned i=0; i < OrdVec.size(); i++)
1635 cerr << *(OrdVec[i]);
1636 }
1637
1638 // Do not copy the UseInst to OrdVec
1639 DefEqUse = true;
1640 break;
1641
1642 }// if two registers are equal
1643
1644 } // if Def is a register
1645
1646 } // for each instr in OrdVec
1647
Chris Lattner5216cc52002-02-04 05:59:25 +00001648 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001649
1650 // We didn't find a def in the OrdVec, so just append this inst
1651 OrdVec.push_back( UnordInst );
1652 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1653 }
1654
1655 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001656}