blob: a86e4f9384560f07ee396d7d2acafd097150710c [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
289 // get the argument list
Chris Lattnerf739fa82002-04-08 22:03:57 +0000290 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000291
292 // for each argument. count INT and FP arguments separately.
293 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
294 argNo != ArgList.size(); ++argNo)
295 {
296 // get the LR of arg
297 LiveRange *LR = LRI.getLiveRangeForValue((const Value *)ArgList[argNo]);
298 assert( LR && "No live range found for method arg");
299
300 unsigned regType = getRegType( LR );
301 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
302
303 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000304 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
305 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
306 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
307 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000308
309 if(regNum != InvalidRegNum)
310 LR->setSuggestedColor(regNum);
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000311 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000312}
313
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000314
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000315//---------------------------------------------------------------------------
316// This method is called after graph coloring to move incoming args to
317// the correct hardware registers if they did not receive the correct
318// (suggested) color through graph coloring.
319//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000320void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000321 LiveRangeInfo &LRI,
322 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000323
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000324 // check if this is a varArgs function. needed for choosing regs.
325 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000326 // get the argument list
Chris Lattnerf739fa82002-04-08 22:03:57 +0000327 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000328 // get an iterator to arg list
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000329 MachineInstr *AdMI;
330
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000331 // for each argument
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000332 for( unsigned argNo=0, intArgNo=0, fpArgNo=0;
333 argNo != ArgList.size(); ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000334 // get the LR of arg
Chris Lattner98d0ac02002-04-09 19:46:27 +0000335 LiveRange *LR = LRI.getLiveRangeForValue((Value*)ArgList[argNo]);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000336 assert( LR && "No live range found for method arg");
337
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000338 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000339 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000340
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000341 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000342 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000343 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000344 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000345 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000346 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
347
348 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000349 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
350 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
351 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
352 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000353
354 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000355 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000356 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000357 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000358
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000359 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000360
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000361 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
362
363 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000364 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000365 if( UniLRReg == UniArgReg )
366 continue;
367
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000368 // We are here because the LR did not receive the suggested
369 // but LR received another register.
370 // Now we have to copy the %i reg (or stack pos of arg)
371 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000372
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000373 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000374 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000375 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000376 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000377 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000378 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000379
380 // It is a variable argument call: the float reg must go in a %o reg.
381 // We have to move an int reg to a float reg via memory.
382 //
383 assert(isVarArgs &&
384 RegClassID == FloatRegClassID &&
385 regClassIDOfArgReg == IntRegClassID &&
386 "This should only be an Int register for an FP argument");
387
388 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
389 getSpilledRegSize(regType));
Vikram S. Advee9327f02002-05-19 15:25:51 +0000390 cpReg2MemMI(UniArgReg, getFramePointer(), TmpOff, IntRegType,
391 FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000392
Vikram S. Advee9327f02002-05-19 15:25:51 +0000393 cpMem2RegMI(getFramePointer(), TmpOff, UniLRReg, regType,
394 FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000395 }
396 else {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000397 cpReg2RegMI(UniArgReg, UniLRReg, regType, FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000398 }
399 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000400 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000401
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000402 // Now the arg is coming on stack. Since the LR recieved a register,
403 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000404 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000405 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000406 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000407 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
408 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000409
Vikram S. Advee9327f02002-05-19 15:25:51 +0000410 cpMem2RegMI(getFramePointer(), offsetFromFP, UniLRReg, regType,
411 FirstAI->InstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000412 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000413
414 } // if LR received a color
415
416 else {
417
418 // Now, the LR did not receive a color. But it has a stack offset for
419 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000420 // So, if the arg is coming in UniArgReg register, we can just move
421 // that on to the stack pos of LR
422
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000423 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000424
425 if( regClassIDOfArgReg != RegClassID ) {
426 assert(0 &&
427 "FP arguments to a varargs function should be explicitly "
428 "copied to/from int registers by instruction selection!");
429
430 // It must be a float arg for a variable argument call, which
431 // must come in a %o reg. Move the int reg to the stack.
432 //
433 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
434 "This should only be an Int register for an FP argument");
435
Vikram S. Advee9327f02002-05-19 15:25:51 +0000436 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
437 IntRegType, FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000438 }
439 else {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000440 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
441 regType, FirstAI->InstrnsBefore);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000442 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000443 }
444
445 else {
446
447 // Now the arg is coming on stack. Since the LR did NOT
448 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000449 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000450 // since this method is called before any other method that makes
451 // uses of the stack pos of the LR (e.g., updateMachineInstr)
452
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000453 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000454 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000455 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
456 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000457
458 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000459 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000460
461 }
462
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000463 } // for each incoming argument
464
465}
466
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000467
468
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000469//---------------------------------------------------------------------------
470// This method is called before graph coloring to suggest colors to the
471// outgoing call args and the return value of the call.
472//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000473void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000474 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000475 std::vector<RegClass *> RCList) const {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000476 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000477
Vikram S. Advee9327f02002-05-19 15:25:51 +0000478 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000479
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000480 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000481
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000482 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000483 // will be in %o0 if the value is an integer type, or in %f0 if the
484 // value is a float type.
485
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000486 // the return value cannot have a LR in machine instruction since it is
487 // only defined by the call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000488
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000489 // if type is not void, create a new live range and set its
490 // register class and add to LRI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000491
Vikram S. Advee9327f02002-05-19 15:25:51 +0000492 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000493
Chris Lattner5216cc52002-02-04 05:59:25 +0000494 if (RetVal) {
495 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000496 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000497
Chris Lattner5216cc52002-02-04 05:59:25 +0000498 // create a new LR for the return value
499 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000500 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000501 unsigned RegClassID = getRegClassIDOfValue(RetVal);
502 RetValLR->setRegClass(RCList[RegClassID]);
503 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000504
505 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000506
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000507 if( RegClassID == IntRegClassID )
508 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
509 else if (RegClassID == FloatRegClassID )
510 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
511 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000512 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000513
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000514
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000515 // Now suggest colors for arguments (operands) of the call instruction.
516 // Colors are suggested only if the arg number is smaller than the
517 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000518 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000519
Vikram S. Advee9327f02002-05-19 15:25:51 +0000520 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000521
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000522 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
523 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000524
Vikram S. Advee9327f02002-05-19 15:25:51 +0000525 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000526
527 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000528 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000529
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000530 // not possible to have a null LR since all args (even consts)
531 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000532 if (!LR) {
533 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000534 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000535 }
536
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000537 unsigned regType = getRegType( LR );
538 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000539
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000540 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000541 // an INT or FP value. Here we ignore whether or not it is a
542 // varargs calls, because FP arguments will be explicitly copied
543 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000544 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000545 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
546 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
547 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
548 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000549
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000550 // If a register could be allocated, use it.
551 // If not, do NOTHING as this will be colored as a normal value.
552 if(regNum != InvalidRegNum)
553 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000554
Vikram S. Advee9327f02002-05-19 15:25:51 +0000555 // Repeat for the second copy of the argument, which would be
556 // an FP argument being passed to a function with no prototype
557 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
558 if (argCopy != NULL)
559 {
560 assert(regType != IntRegType && argCopy->getType()->isIntegral()
561 && "Must be passing copy of FP argument in int register");
562 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
563 argNo, intArgNo, fpArgNo-1,
564 regClassIDOfArgReg);
565 assert(copyRegNum != InvalidRegNum);
566 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
567 copyLR->setSuggestedColor(copyRegNum);
568 }
569
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000570 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000571
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000572}
573
574
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000575//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000576// Helper method for UltraSparcRegInfo::colorCallArgs().
577//---------------------------------------------------------------------------
578
579void
580UltraSparcRegInfo::InitializeOutgoingArg(const MachineInstr* CallMI,
581 AddedInstrns *CallAI,
582 PhyRegAlloc &PRA, LiveRange* LR,
583 unsigned regType, unsigned RegClassID,
584 int UniArgRegOrNone, unsigned int argNo,
585 std::vector<MachineInstr *>& AddedInstrnsBefore)
586 const
587{
588 MachineInstr *AdMI;
589 bool isArgInReg = false;
590 unsigned UniArgReg = MAXINT; // unused unless initialized below
591 if (UniArgRegOrNone != InvalidRegNum)
592 {
593 isArgInReg = true;
594 UniArgReg = (unsigned) UniArgRegOrNone;
595 }
596
597 if (LR->hasColor()) {
598 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
599
600 // if LR received the correct color, nothing to do
601 if( isArgInReg && UniArgReg == UniLRReg )
602 return;
603
604 // The LR is allocated to a register UniLRReg and must be copied
605 // to UniArgReg or to the stack slot.
606 //
607 if( isArgInReg ) {
608 // Copy UniLRReg to UniArgReg
609 cpReg2RegMI(UniLRReg, UniArgReg, regType, AddedInstrnsBefore);
610 }
611 else {
612 // Copy UniLRReg to the stack to pass the arg on stack.
613 const MachineFrameInfo& frameInfo = target.getFrameInfo();
614 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
615 cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, regType,
616 CallAI->InstrnsBefore);
617 }
618
619 } else { // LR is not colored (i.e., spilled)
620
621 if( isArgInReg ) {
622 // Insert a load instruction to load the LR to UniArgReg
623 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
624 UniArgReg, regType, AddedInstrnsBefore);
625 // Now add the instruction
626 }
627
628 else {
629 // Now, we have to pass the arg on stack. Since LR also did NOT
630 // receive a register we have to move an argument in memory to
631 // outgoing parameter on stack.
632 // Use TReg to load and store the value.
633 // Use TmpOff to save TReg, since that may have a live value.
634 //
635 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
636 int TmpOff = PRA.mcInfo.pushTempValue(target,
637 getSpilledRegSize(getRegType(LR)));
638 const MachineFrameInfo& frameInfo = target.getFrameInfo();
639 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
640
641 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
642
643 // Sequence:
644 // (1) Save TReg on stack
645 // (2) Load LR value into TReg from stack pos of LR
646 // (3) Store Treg on outgoing Arg pos on stack
647 // (4) Load the old value of TReg from stack to TReg (restore it)
648 //
649 // OPTIMIZE THIS:
650 // When reverse pointers in MahineInstr are introduced:
651 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
652 // needed only if this fails. Currently, we cannot call the
653 // above method since we cannot find LVSetBefore without the BB
654 //
655 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
656 // AddedInstrnsBefore since these instructions must not be reordered.
657 cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType,
658 CallAI->InstrnsBefore);
659 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(), TReg, regType,
660 CallAI->InstrnsBefore);
661 cpReg2MemMI(TReg, getStackPointer(), argOffset, regType,
662 CallAI->InstrnsBefore);
663 cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType,
664 CallAI->InstrnsBefore);
665 }
666 }
667}
668
669//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000670// After graph coloring, we have call this method to see whehter the return
671// value and the call args received the correct colors. If not, we have
672// to instert copy instructions.
673//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000674
Chris Lattner5216cc52002-02-04 05:59:25 +0000675void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
676 LiveRangeInfo &LRI,
677 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000678 PhyRegAlloc &PRA,
679 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000680
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000681 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
682
Vikram S. Advee9327f02002-05-19 15:25:51 +0000683 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
684
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000685 // First color the return value of the call.
686 // If there is a LR for the return value, it means this
687 // method returns a value
688
689 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000690
Vikram S. Advee9327f02002-05-19 15:25:51 +0000691 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000692
Chris Lattner30e8fb62002-02-05 01:43:49 +0000693 if (RetVal) {
694 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000695
Chris Lattner30e8fb62002-02-05 01:43:49 +0000696 if (!RetValLR) {
697 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000698 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000699 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000700
701 unsigned RegClassID = (RetValLR->getRegClass())->getID();
702 bool recvCorrectColor = false;
703
704 unsigned CorrectCol; // correct color for ret value
705 if(RegClassID == IntRegClassID)
706 CorrectCol = SparcIntRegOrder::o0;
707 else if(RegClassID == FloatRegClassID)
708 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000709 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000710 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000711 return;
712 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000713
714 // if the LR received the correct color, NOTHING to do
715
716 if( RetValLR->hasColor() )
717 if( RetValLR->getColor() == CorrectCol )
718 recvCorrectColor = true;
719
720
721 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000722 // put copy instruction
723
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000724 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000725
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000726 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000727
728 // the reg that LR must be colored with
729 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000730
731 if( RetValLR->hasColor() ) {
732
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000733 unsigned
734 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000735
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000736 // the return value is coming in UniRetReg but has to go into
737 // the UniRetLRReg
738
Vikram S. Advee9327f02002-05-19 15:25:51 +0000739 cpReg2RegMI(UniRetReg, UniRetLRReg, regType, CallAI->InstrnsAfter);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000740
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000741 } // if LR has color
742 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000743
744 // if the LR did NOT receive a color, we have to move the return
745 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000746
Vikram S. Advee9327f02002-05-19 15:25:51 +0000747 cpReg2MemMI(UniRetReg, getFramePointer(),RetValLR->getSpillOffFromFP(),
748 regType, CallAI->InstrnsAfter);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000749 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000750
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000751 } // the LR didn't receive the suggested color
752
753 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000754
755
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000756 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000757 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000758 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000759
Chris Lattner7f74a562002-01-20 22:54:45 +0000760 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000761
762 unsigned NumOfCallArgs = argDesc->getNumArgs();
763
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000764 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
765 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000766
Vikram S. Advee9327f02002-05-19 15:25:51 +0000767 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
768
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000769 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000770 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000771
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000772 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000773 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000774
Vikram S. Advee9327f02002-05-19 15:25:51 +0000775 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000776 // Also find the correct register the argument must use (UniArgReg)
777 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000778 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000779 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000780 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
781
Vikram S. Advee9327f02002-05-19 15:25:51 +0000782 // Find the register that must be used for this arg, depending on
783 // whether it is an INT or FP value. Here we ignore whether or not it
784 // is a varargs calls, because FP arguments will be explicitly copied
785 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000786 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000787 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
788 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
789 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
790 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000791
792 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000793 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000794 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000795 assert(regClassIDOfArgReg == RegClassID &&
796 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000797 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000798
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000799 // not possible to have a null LR since all args (even consts)
800 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000801 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000802 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000803 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000804 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000805
806 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
807 UniArgReg, argNo, AddedInstrnsBefore);
808
809 // Repeat for the second copy of the argument, which would be
810 // an FP argument being passed to a function with no prototype.
811 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
812 if (argCopy != NULL)
813 {
814 assert(regType != IntRegType && argCopy->getType()->isIntegral()
815 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000816
Vikram S. Advee9327f02002-05-19 15:25:51 +0000817 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
818 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
819
820 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
821 argNo, intArgNo, fpArgNo-1,
822 regClassIDOfArgReg);
823 assert(copyRegNum != InvalidRegNum);
824 assert(regClassIDOfArgReg == copyRegClassID &&
825 "Moving values between reg classes must happen during selection");
826
827 InitializeOutgoingArg(CallMI, CallAI, PRA,
828 LRI.getLiveRangeForValue(argCopy), copyRegType,
829 copyRegClassID, copyRegNum, argNo,
830 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000831 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000832 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000833
Vikram S. Advee9327f02002-05-19 15:25:51 +0000834 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000835 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000836 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000837 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000838
Chris Lattner5216cc52002-02-04 05:59:25 +0000839 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000840 cerr << "\nCalling reorder with instrns: \n";
841 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
842 cerr << *(AddedInstrnsBefore[i]);
843 }
844
Chris Lattner7f74a562002-01-20 22:54:45 +0000845 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000846 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000847
Chris Lattner5216cc52002-02-04 05:59:25 +0000848 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000849 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000850 for(unsigned i = 0; i < TmpVec.size(); i++)
851 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000852 }
853
854 // copy the results back from TmpVec to InstrnsBefore
855 for(unsigned i=0; i < TmpVec.size(); i++)
856 CallAI->InstrnsBefore.push_back( TmpVec[i] );
857 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000858
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000859 // now insert caller saving code for this call instruction
860 //
861 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000862}
863
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000864//---------------------------------------------------------------------------
865// This method is called for an LLVM return instruction to identify which
866// values will be returned from this method and to suggest colors.
867//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000868void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
869 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000870
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000871 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000872
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000873 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000874
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000875 // if there is an implicit ref, that has to be the ret value
876 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000878 // The first implicit operand is the return value of a return instr
879 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000880
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000881 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000882
Chris Lattner30e8fb62002-02-05 01:43:49 +0000883 if (!LR) {
884 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
885 assert(0 && "No LR for return value of non-void method");
886 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000887
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000888 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000889
Chris Lattner5216cc52002-02-04 05:59:25 +0000890 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000891 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000892 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000893 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000894 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000895}
896
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000897
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000898
899//---------------------------------------------------------------------------
900// Colors the return value of a method to %i0 or %f0, if possible. If it is
901// not possilbe to directly color the LR, insert a copy instruction to move
902// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
903// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000904//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000905void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
906 LiveRangeInfo &LRI,
907 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000908
Chris Lattner5216cc52002-02-04 05:59:25 +0000909 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000910
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000911 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000912 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000913
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000914 // The first implicit operand is the return value of a return instr
915 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000916
Chris Lattner5216cc52002-02-04 05:59:25 +0000917 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000918
Chris Lattner30e8fb62002-02-05 01:43:49 +0000919 if (!LR) {
920 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
921 // assert( LR && "No LR for return value of non-void method");
922 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000923 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000924
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000925 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000926 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000927
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000928 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000929 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000930 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000931 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000932 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000933 else {
Chris Lattner5216cc52002-02-04 05:59:25 +0000934 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000935 return;
936 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000937
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000938 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000939
Chris Lattner5216cc52002-02-04 05:59:25 +0000940 if (LR->hasColor() && LR->getColor() == CorrectCol)
941 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000942
Chris Lattner5216cc52002-02-04 05:59:25 +0000943 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000944
Chris Lattner5216cc52002-02-04 05:59:25 +0000945 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000946
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000947 // We are here because the LR was allocted a regiter
948 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000949
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000950 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000951
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000952 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000953
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000954 // the LR received UniLRReg but must be colored with UniRetReg
955 // to pass as the return value
Vikram S. Advee9327f02002-05-19 15:25:51 +0000956 cpReg2RegMI(UniLRReg, UniRetReg, regType, RetAI->InstrnsBefore);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000957 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000958 else { // if the LR is spilled
Vikram S. Advee9327f02002-05-19 15:25:51 +0000959 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
960 UniRetReg, regType, RetAI->InstrnsBefore);
Chris Lattner7f74a562002-01-20 22:54:45 +0000961 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000962 }
963
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000964 } // if there is a return value
965
966}
967
968
969//---------------------------------------------------------------------------
970// Copy from a register to register. Register number must be the unified
971// register number
972//---------------------------------------------------------------------------
973
Vikram S. Advee9327f02002-05-19 15:25:51 +0000974void
975UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
976 unsigned DestReg,
977 int RegType,
978 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000979 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980 "Invalid Register");
981
982 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000983
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000984 switch( RegType ) {
985
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000986 case IntCCRegType:
987 case FloatCCRegType:
Vikram S. Advee9327f02002-05-19 15:25:51 +0000988 assert(0 && "This code was bogus and needs to be fixed!");
989 break;
990
991 case IntRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000992 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000993 MI->SetMachineOperandReg(0, SrcReg, false);
994 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
995 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000997
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000998 case FPSingleRegType:
999 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001000 MI->SetMachineOperandReg(0, SrcReg, false);
1001 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001002 break;
1003
1004 case FPDoubleRegType:
1005 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001006 MI->SetMachineOperandReg(0, SrcReg, false);
1007 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001008 break;
1009
1010 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001011 assert(0 && "Unknown RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001012 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001013
1014 if (MI)
1015 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001016}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001017
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001018//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001019// Copy from a register to memory (i.e., Store). Register number must
1020// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001021//---------------------------------------------------------------------------
1022
1023
Vikram S. Advee9327f02002-05-19 15:25:51 +00001024void
1025UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1026 unsigned DestPtrReg,
1027 int Offset, int RegType,
1028 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001029 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001030 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001031 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001032 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001033 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001034 MI->SetMachineOperandReg(0, SrcReg, false);
1035 MI->SetMachineOperandReg(1, DestPtrReg, false);
1036 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1037 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001038 break;
1039
1040 case FPSingleRegType:
1041 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001042 MI->SetMachineOperandReg(0, SrcReg, false);
1043 MI->SetMachineOperandReg(1, DestPtrReg, false);
1044 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1045 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001046 break;
1047
1048 case FPDoubleRegType:
1049 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001050 MI->SetMachineOperandReg(0, SrcReg, false);
1051 MI->SetMachineOperandReg(1, DestPtrReg, false);
1052 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1053 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001054 break;
1055
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001056 case IntCCRegType:
1057 assert( 0 && "Cannot directly store %ccr to memory");
1058
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001059 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001060 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001061 }
1062
Vikram S. Advee9327f02002-05-19 15:25:51 +00001063 if (MI)
1064 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001065}
1066
1067
1068//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001069// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001070// register number
1071//---------------------------------------------------------------------------
1072
1073
Vikram S. Advee9327f02002-05-19 15:25:51 +00001074void
1075UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1076 int Offset,
1077 unsigned DestReg,
1078 int RegType,
1079 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001080 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001081 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001082 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001083 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001084 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001085 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1086 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1087 (int64_t) Offset);
1088 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001089 break;
1090
1091 case FPSingleRegType:
1092 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001093 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1094 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1095 (int64_t) Offset);
1096 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001097
1098 break;
1099
1100 case FPDoubleRegType:
1101 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001102 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1103 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1104 (int64_t) Offset);
1105 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001106 break;
1107
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001108 case IntCCRegType:
1109 assert( 0 && "Cannot directly load into %ccr from memory");
1110
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001111 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001112 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001113 }
1114
Vikram S. Advee9327f02002-05-19 15:25:51 +00001115 if (MI)
1116 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001117}
1118
1119
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001120//---------------------------------------------------------------------------
1121// Generate a copy instruction to copy a value to another. Temporarily
1122// used by PhiElimination code.
1123//---------------------------------------------------------------------------
1124
1125
Vikram S. Advee9327f02002-05-19 15:25:51 +00001126void
1127UltraSparcRegInfo::cpValue2Value(Value *Src,
1128 Value *Dest,
1129 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001130 int RegType = getRegType( Src );
1131
1132 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001133
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001134 MachineInstr * MI = NULL;
1135
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001136 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001137 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001138 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001139 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1140 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1141 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001142 break;
1143
1144 case FPSingleRegType:
1145 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001146 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1147 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001148 break;
1149
1150
1151 case FPDoubleRegType:
1152 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001153 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1154 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001155 break;
1156
1157 default:
1158 assert(0 && "Unknow RegType in CpValu2Value");
1159 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001160
Vikram S. Advee9327f02002-05-19 15:25:51 +00001161 if (MI)
1162 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001163}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001164
1165
1166
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001167
1168
1169
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001170//----------------------------------------------------------------------------
1171// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001172// a call machine instruction. The caller saving/restoring instructions are
1173// inserted like:
1174//
1175// ** caller saving instructions
1176// other instructions inserted for the call by ColorCallArg
1177// CALL instruction
1178// other instructions inserted for the call ColorCallArg
1179// ** caller restoring instructions
1180//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001181//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001182
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001183
Vikram S. Advee9327f02002-05-19 15:25:51 +00001184void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *CallMI,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001185 const BasicBlock *BB,
1186 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001187
Vikram S. Advee9327f02002-05-19 15:25:51 +00001188 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1189
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001190 // has set to record which registers were saved/restored
1191 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001192 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001193
Vikram S. Advee9327f02002-05-19 15:25:51 +00001194 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1195
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001196 // Now find the LR of the return value of the call
1197 // The last *implicit operand* is the return value of a call
1198 // Insert it to to he PushedRegSet since we must not save that register
1199 // and restore it after the call.
1200 // We do this because, we look at the LV set *after* the instruction
1201 // to determine, which LRs must be saved across calls. The return value
1202 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001203
Vikram S. Advee9327f02002-05-19 15:25:51 +00001204 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001205
Chris Lattner5216cc52002-02-04 05:59:25 +00001206 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001207 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001208 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001209
Chris Lattner5216cc52002-02-04 05:59:25 +00001210 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001211 PushedRegSet.insert(
1212 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001213 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001214 }
1215
1216
Vikram S. Advee9327f02002-05-19 15:25:51 +00001217 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001218 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001219
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001220 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001221 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001222
1223 // get the live range corresponding to live var
1224 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1225
1226 // LR can be null if it is a const since a const
1227 // doesn't have a dominating def - see Assumptions above
1228 if( LR ) {
1229
1230 if( LR->hasColor() ) {
1231
1232 unsigned RCID = (LR->getRegClass())->getID();
1233 unsigned Color = LR->getColor();
1234
1235 if ( isRegVolatile(RCID, Color) ) {
1236
1237 // if the value is in both LV sets (i.e., live before and after
1238 // the call machine instruction)
1239
1240 unsigned Reg = getUnifiedRegNum(RCID, Color);
1241
1242 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1243
1244 // if we haven't already pushed that register
1245
1246 unsigned RegType = getRegType( LR );
1247
1248 // Now get two instructions - to push on stack and pop from stack
1249 // and add them to InstrnsBefore and InstrnsAfter of the
1250 // call instruction
1251
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001252
1253 int StackOff = PRA.mcInfo.pushTempValue(target,
1254 getSpilledRegSize(RegType));
1255
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001256
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001257 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1258 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001259
1260 //---- Insert code for pushing the reg on stack ----------
1261
1262 if( RegType == IntCCRegType ) {
1263
1264 // Handle IntCCRegType specially since we cannot directly
1265 // push %ccr on to the stack
1266
Chris Lattner7e5ee422002-02-05 04:20:12 +00001267 const ValueSet &LVSetBef =
Vikram S. Advee9327f02002-05-19 15:25:51 +00001268 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001269
1270 // get a free INTEGER register
1271 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001272 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001273 IntRegType, CallMI, &LVSetBef, AdIBefCC, AdIAftCC);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001274
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001275 // insert the instructions in reverse order since we are
1276 // adding them to the front of InstrnsBefore
Vikram S. Advee9327f02002-05-19 15:25:51 +00001277 AddedInstrns& addedI = PRA.AddedInstrMap[CallMI];
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001278 if(AdIAftCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001279 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1280 AdIAftCC);
1281
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001282 AdICpCC = cpCCR2IntMI(FreeIntReg);
Vikram S. Advee9327f02002-05-19 15:25:51 +00001283 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1284 AdICpCC);
1285
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001286 if(AdIBefCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001287 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1288 AdIBefCC);
1289
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001290 if(DEBUG_RA) {
1291 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1292 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1293 cerr << "\t" << *AdICpCC;
1294 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1295 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001296
1297 } else {
1298 // for any other register type, just add the push inst
Vikram S. Advee9327f02002-05-19 15:25:51 +00001299 cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType,
1300 PRA.AddedInstrMap[CallMI].InstrnsBefore);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001301 }
1302
1303
1304 //---- Insert code for popping the reg from the stack ----------
1305
Chris Lattner7e5ee422002-02-05 04:20:12 +00001306 if (RegType == IntCCRegType) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001307
1308 // Handle IntCCRegType specially since we cannot directly
1309 // pop %ccr on from the stack
1310
1311 // get a free INT register
1312 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001313 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001314 IntRegType, CallMI, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001315
1316 if(AdIBefCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001317 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001318
1319 AdICpCC = cpInt2CCRMI(FreeIntReg);
Vikram S. Advee9327f02002-05-19 15:25:51 +00001320 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001321
1322 if(AdIAftCC)
Vikram S. Advee9327f02002-05-19 15:25:51 +00001323 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001324
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001325 if(DEBUG_RA) {
1326
1327 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1328 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1329 cerr << "\t" << *AdICpCC;
1330 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1331 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001332
1333 } else {
1334 // for any other register type, just add the pop inst
Vikram S. Advee9327f02002-05-19 15:25:51 +00001335 cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType,
1336 PRA.AddedInstrMap[CallMI].InstrnsAfter);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001337 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001338
Chris Lattner7e5ee422002-02-05 04:20:12 +00001339 PushedRegSet.insert(Reg);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001340
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001341 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001342 cerr << "\nFor call inst:" << *CallMI;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001343 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001344 if( RegType == IntCCRegType ) {
1345 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1346 if(AdIAftCC) cerr << *AdIAftCC;
1347 }
1348 else {
1349 if(AdIBef) cerr << *AdIBef << "\t";
1350 if(AdIAft) cerr << *AdIAft;
1351 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001352 }
1353 } // if not already pushed
1354
1355 } // if LR has a volatile color
1356
1357 } // if LR has color
1358
1359 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001360
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001361 } // for each value in the LV set after instruction
1362
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001363}
1364
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001365//---------------------------------------------------------------------------
1366// Copies %ccr into an integer register. IntReg is the UNIFIED register
1367// number.
1368//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001369
Chris Lattner5216cc52002-02-04 05:59:25 +00001370MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1371 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001372 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1373 SparcIntCCRegOrder::ccr),
1374 false, true);
1375 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001376 return MI;
1377}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001378
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001379//---------------------------------------------------------------------------
1380// Copies an integer register into %ccr. IntReg is the UNIFIED register
1381// number.
1382//---------------------------------------------------------------------------
1383
Chris Lattner5216cc52002-02-04 05:59:25 +00001384MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1385 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001386 MI->SetMachineOperandReg(0, IntReg, false);
1387 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1388 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1389 true, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001390 return MI;
1391}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001392
1393
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001394
1395
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001396//---------------------------------------------------------------------------
1397// Print the register assigned to a LR
1398//---------------------------------------------------------------------------
1399
Chris Lattner5216cc52002-02-04 05:59:25 +00001400void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001401 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001402 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001403
Chris Lattner5216cc52002-02-04 05:59:25 +00001404 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001405 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001406 return;
1407 }
1408
1409 // if a color is found
1410
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001411 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001412
Chris Lattner5216cc52002-02-04 05:59:25 +00001413 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001414 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001415
Chris Lattner5216cc52002-02-04 05:59:25 +00001416 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001417 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001418 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001419 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001420 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001421 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001422}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001423
1424//---------------------------------------------------------------------------
1425// This method examines instructions inserted by RegAlloc code before a
1426// machine instruction to detect invalid orders that destroy values before
1427// they are used. If it detects such conditions, it reorders the instructions.
1428//
1429// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001430// instructions inserted by RegAlloc. All such instruction MUST have
1431// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001432//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001433// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1434// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001435//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001436// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001437//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001438// Since instructions are inserted in RegAlloc, this assumes that the
1439// first operand is the source reg and the last operand is the dest reg.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001440//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001441// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001442//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001443
1444void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1445 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001446 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001447
1448 /*
1449 Problem: We can have instructions inserted by RegAlloc like
1450 1. add %ox %g0 %oy
1451 2. add %oy %g0 %oz, where z!=x or z==x
1452
1453 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001454
1455 Solution:
1456 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001457
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001458 Algorithm:
1459
1460 do
1461 for each instruction 'DefInst' in the UnOrdVec
1462 for each instruction 'UseInst' that follows the DefInst
1463 if the reg defined by DefInst is used by UseInst
1464 mark DefInst as not movable in this iteration
1465 If DefInst is not marked as not-movable, move DefInst to OrdVec
1466 while all instructions in DefInst are moved to OrdVec
1467
1468 For moving, we call the move2OrdVec(). It checks whether there is a def
1469 in it for the uses in the instruction to be added to OrdVec. If there
1470 are no preceding defs, it just appends the instruction. If there is a
1471 preceding def, it puts two instructions to save the reg on stack before
1472 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001473
1474 */
1475
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001476 bool CouldMoveAll;
1477 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001478
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001479 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001480 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001481 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001482
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001483 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001484
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001485 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001486
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001487 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001488
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001489 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001490
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001491 //cerr << "\nInst in UnordVec = " << *DefInst;
1492
1493 // last operand is the def (unless for a store which has no def reg)
1494 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1495
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001496 if( DefOp.opIsDef() &&
1497 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001498
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001499 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001500
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001501 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001502
Chris Lattner7f74a562002-01-20 22:54:45 +00001503 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001504 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001505
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001506 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1507
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001508 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001509 if( UseInst == NULL) continue;
1510
1511 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001512 MachineOperand& UseOp = UseInst->getOperand(0);
1513
1514 if( ! UseOp.opIsDef() &&
1515 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1516
1517 // if use is a register ...
1518
1519 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1520
1521 // if Def and this use are the same, it means that this use
1522 // is destroyed by a def before it is used
1523
1524 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001525
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001526 DefEqUse = true;
1527 CouldMoveAll = false;
1528 DebugPrint = true;
1529 break;
1530 } // if two registers are equal
1531
1532 } // if use is a register
1533
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001534 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001535
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001536 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001537
1538 // after examining all the instructions that follow the DefInst
1539 // if there are no dependencies, we can move it to the OrdVec
1540
1541 // cerr << "Moved to Ord: " << *DefInst;
1542
1543 moveInst2OrdVec(OrdVec, DefInst, PRA);
1544
1545 //OrdVec.push_back(DefInst);
1546
1547 // mark the pos of DefInst with NULL to indicate that it is
1548 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001549 *DefIt = NULL;
1550 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001551
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001552 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001553
1554 } // for all instructions in the UnordVec
1555
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001556
Chris Lattner5216cc52002-02-04 05:59:25 +00001557 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001558
Chris Lattner070cf772002-06-04 03:09:57 +00001559 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001560 cerr << "\nAdded instructions were reordered to:\n";
1561 for(unsigned int i=0; i < OrdVec.size(); i++)
1562 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001563 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001564}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565
1566
1567
1568
1569
Chris Lattner7f74a562002-01-20 22:54:45 +00001570void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001571 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001572 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001573 MachineOperand& UseOp = UnordInst->getOperand(0);
1574
1575 if( ! UseOp.opIsDef() &&
1576 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1577
1578 // for the use of UnordInst, see whether there is a defining instr
1579 // before in the OrdVec
1580 bool DefEqUse = false;
1581
Chris Lattner7f74a562002-01-20 22:54:45 +00001582 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001583
1584 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1585
1586 MachineInstr *OrdInst = *OrdIt ;
1587
1588 MachineOperand& DefOp =
1589 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1590
1591 if( DefOp.opIsDef() &&
1592 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1593
1594 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1595
1596 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1597
1598 // we are here because there is a preceding def in the OrdVec
1599 // for the use in this intr we are going to insert. This
1600 // happened because the original code was like:
1601 // 1. add %ox %g0 %oy
1602 // 2. add %oy %g0 %ox
1603 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1604 // Now we are processing %ox of 1.
1605 // We have to
1606
1607 const int UReg = DefOp.getMachineRegNum();
1608 const int RegType = getRegType(UReg);
1609 MachineInstr *AdIBef, *AdIAft;
1610
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001611 const int StackOff = PRA.mcInfo.pushTempValue(target,
1612 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001613
1614 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001615 vector<MachineInstr*> mvec;
1616 cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType, mvec);
1617 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1618 OrdIt = OrdVec.insert(OrdIt, *MI);
1619 ++OrdIt; // OrdIt must still point to current instr we processed
1620 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001621
1622 // Load directly into DReg (%oy)
1623 MachineOperand& DOp=
1624 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1625 assert(DOp.opIsDef() && "Last operand is not the def");
1626 const int DReg = DOp.getMachineRegNum();
1627
Vikram S. Advee9327f02002-05-19 15:25:51 +00001628 cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType, OrdVec);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001629
1630 cerr << "\nFixed CIRCULAR references by reordering";
1631
1632 if( DEBUG_RA ) {
1633 cerr << "\nBefore CIRCULAR Reordering:\n";
1634 cerr << *UnordInst;
1635 cerr << *OrdInst;
1636
1637 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1638 for(unsigned i=0; i < OrdVec.size(); i++)
1639 cerr << *(OrdVec[i]);
1640 }
1641
1642 // Do not copy the UseInst to OrdVec
1643 DefEqUse = true;
1644 break;
1645
1646 }// if two registers are equal
1647
1648 } // if Def is a register
1649
1650 } // for each instr in OrdVec
1651
Chris Lattner5216cc52002-02-04 05:59:25 +00001652 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001653
1654 // We didn't find a def in the OrdVec, so just append this inst
1655 OrdVec.push_back( UnordInst );
1656 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1657 }
1658
1659 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001660}