blob: 434816e0a6b023cbcd01549ca603f62dffd19347 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000014#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
15#include "llvm/iTerminators.h"
16#include "llvm/iOther.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000017#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000018#include <iostream>
19using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000020
Chris Lattner5216cc52002-02-04 05:59:25 +000021UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
22 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
23 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
24
25 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
26 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
27 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
28 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
29
30 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
31 "32 Float regs are used for float arg passing");
32}
33
34
Vikram S. Advedb1435f2002-03-18 03:12:16 +000035// getZeroRegNum - returns the register that contains always zero.
36// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000037//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000038int UltraSparcRegInfo::getZeroRegNum() const {
39 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
40 SparcIntRegOrder::g0);
41}
Chris Lattner5216cc52002-02-04 05:59:25 +000042
43// getCallAddressReg - returns the reg used for pushing the address when a
44// method is called. This can be used for other purposes between calls
45//
46unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000047 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
48 SparcIntRegOrder::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000049}
50
51// Returns the register containing the return address.
52// It should be made sure that this register contains the return
53// value when a return instruction is reached.
54//
55unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000056 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
57 SparcIntRegOrder::i7);
Chris Lattner5216cc52002-02-04 05:59:25 +000058}
59
60// given the unified register number, this gives the name
61// for generating assembly code or debugging.
62//
63const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
64 if( reg < 32 )
65 return SparcIntRegOrder::getRegName(reg);
66 else if ( reg < (64 + 32) )
67 return SparcFloatRegOrder::getRegName( reg - 32);
68 else if( reg < (64+32+4) )
69 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
70 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
71 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
72 else if (reg== InvalidRegNum) //****** TODO: Remove */
73 return "<*NoReg*>";
74 else
75 assert(0 && "Invalid register number");
76 return "";
77}
78
Vikram S. Advedb1435f2002-03-18 03:12:16 +000079// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000080unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000081 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
82 SparcIntRegOrder::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +000083}
84
Vikram S. Advedb1435f2002-03-18 03:12:16 +000085// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000086unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000087 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
88 SparcIntRegOrder::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +000089}
90
91
92
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000093//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000094// Finds the return value of a sparc specific call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000095//---------------------------------------------------------------------------
Vikram S. Adve02662bd2002-03-31 19:04:50 +000096
Ruchira Sasanka24729a32001-10-21 16:43:41 +000097const Value *
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000098UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000099 unsigned OpCode = CallMI->getOpCode();
Chris Lattner7f74a562002-01-20 22:54:45 +0000100 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000101
Chris Lattner7f74a562002-01-20 22:54:45 +0000102 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000103
104 // The one before the last implicit operand is the return value of
105 // a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000106 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000107 if( NumOfImpRefs > 1 )
Chris Lattner5216cc52002-02-04 05:59:25 +0000108 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
109 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000110
Chris Lattner7f74a562002-01-20 22:54:45 +0000111 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000112
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000113 // The last implicit operand is the return value of a JMPL
114 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000115 if(NumOfImpRefs > 0)
116 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
117 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner5216cc52002-02-04 05:59:25 +0000118 } else
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000119 assert(0 && "OpCode must be CALL/JMPL for a call instr");
120
121 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000122}
123
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000124
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000125const Value *
126UltraSparcRegInfo::getCallInstIndirectAddrVal(const MachineInstr *CallMI) const
127{
128 return (CallMI->getOpCode() == JMPLCALL)?
129 CallMI->getOperand(0).getVRegValue() : NULL;
130}
131
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000132
133//---------------------------------------------------------------------------
134// Finds the return address of a call sparc specific call instruction
135//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000136const Value *
Chris Lattner5216cc52002-02-04 05:59:25 +0000137UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000138 unsigned OpCode = CallMI->getOpCode();
139
Chris Lattner5216cc52002-02-04 05:59:25 +0000140 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000141 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
142
143 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000144
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000145 // The last implicit operand is the return address of a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000146 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000147 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000148
Chris Lattner5216cc52002-02-04 05:59:25 +0000149 } else if(OpCode == JMPLCALL) {
150 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000151 return MO.getVRegValue();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000152 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000153
154 assert(0 && "OpCode must be CALL/JMPL for a call instr");
155 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000156}
157
Chris Lattner5216cc52002-02-04 05:59:25 +0000158// The following 3 methods are used to find the RegType (see enum above)
159// of a LiveRange, Value and using the unified RegClassID
160//
161int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000162 switch (LR->getRegClass()->getID()) {
163 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000164 case FloatRegClassID: {
165 const Type *Typ = LR->getType();
166 if (Typ == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000167 return FPSingleRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000168 else if (Typ == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000169 return FPDoubleRegType;
170 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000171 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000172 case IntCCRegClassID: return IntCCRegType;
173 case FloatCCRegClassID: return FloatCCRegType;
174 default: assert( 0 && "Unknown reg class ID");
175 return 0;
176 }
177}
178
179int UltraSparcRegInfo::getRegType(const Value *Val) const {
180 unsigned Typ;
181
182 switch (getRegClassIDOfValue(Val)) {
183 case IntRegClassID: return IntRegType;
184 case FloatRegClassID:
185 Typ = Val->getType()->getPrimitiveID();
186 if (Typ == Type::FloatTyID)
187 return FPSingleRegType;
188 else if (Typ == Type::DoubleTyID)
189 return FPDoubleRegType;
190 assert(0 && "Unknown type in FloatRegClass");
191
192 case IntCCRegClassID: return IntCCRegType;
193 case FloatCCRegClassID: return FloatCCRegType ;
194 default: assert(0 && "Unknown reg class ID");
195 return 0;
196 }
197}
198
199int UltraSparcRegInfo::getRegType(int reg) const {
200 if (reg < 32)
201 return IntRegType;
202 else if (reg < (32 + 32))
203 return FPSingleRegType;
204 else if (reg < (64 + 32))
205 return FPDoubleRegType;
206 else if (reg < (64+32+4))
207 return FloatCCRegType;
208 else if (reg < (64+32+4+2))
209 return IntCCRegType;
210 else
211 assert(0 && "Invalid register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000212 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000213}
214
215
216
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000217
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000218
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000219//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000220// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000221//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000222unsigned
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000223UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
224
225 unsigned OpCode = CallMI->getOpCode();
Chris Lattner5216cc52002-02-04 05:59:25 +0000226 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000227
Chris Lattner5216cc52002-02-04 05:59:25 +0000228 if (OpCode == CALL) {
229 switch (NumOfImpRefs) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000230 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner5216cc52002-02-04 05:59:25 +0000231 case 1: return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000232 default: // two or more implicit refs
Chris Lattner5216cc52002-02-04 05:59:25 +0000233 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
234 return NumOfImpRefs - 2;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000235 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000236 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000237 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000238 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000239
240 // The last implicit operand is the return value of a JMPL instr
241 if( NumOfImpRefs > 0 ) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000242 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
243 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000244 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000245 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000246 }
247 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000248 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000249 }
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000250
Chris Lattner5216cc52002-02-04 05:59:25 +0000251 assert(0 && "OpCode must be CALL/JMPL for a call instr");
252 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000253}
254
255
Vikram S. Adve84982772001-10-22 13:41:12 +0000256
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000257//---------------------------------------------------------------------------
258// Finds whether a call is an indirect call
259//---------------------------------------------------------------------------
260bool UltraSparcRegInfo::isVarArgCall(const MachineInstr *CallMI) const {
261
262 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
263
264 const MachineOperand & calleeOp = CallMI->getOperand(0);
265 Value *calleeVal = calleeOp.getVRegValue();
266
267 PointerType *PT = cast<PointerType> (calleeVal->getType());
268 MethodType *MT = cast<MethodType>(PT->getElementType());
269
270 return MT->isVarArg();
271}
272
273
274
275
276//---------------------------------------------------------------------------
277// Suggests a register for the ret address in the RET machine instruction.
278// We always suggest %i7 by convention.
279//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000280void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000281 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000282
Vikram S. Adve84982772001-10-22 13:41:12 +0000283 assert( (RetMI->getNumOperands() >= 2)
284 && "JMPL/RETURN must have 3 and 2 operands respectively");
285
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000286 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
287
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000288 // return address is always mapped to i7
289 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000290 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000291
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000292 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000293 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000294 // we have to test later whether it received the suggested color.
295 // In that case, a LR has to be created at the start of method.
296 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000297
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000298 // const Value *RetAddrVal = MO.getVRegValue();
299 // assert( RetAddrVal && "LR for ret address must be created at start");
300 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
301 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
302 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000303}
304
305
306//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000307// Suggests a register for the ret address in the JMPL/CALL machine instr.
308// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000309//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000310void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
311 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000312 std::vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000313
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000314
315 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
316
317 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
318 // create a new LR for the return address and color it
319
320 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000321 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000322 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
323 RetAddrLR->setRegClass( RCList[RegClassID] );
324 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
325 LRI.addLRToMap( RetAddrVal, RetAddrLR);
326
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000327}
328
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000329
330
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000331
332//---------------------------------------------------------------------------
333// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000334// According to the Sparc ABI, the first 6 incoming args are in
335// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000336// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000337// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000338//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000339void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000340 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000341{
342
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000343 // get the argument list
344 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
345 // get an iterator to arg list
346 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000347
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000348 // for each argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000349 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000350
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000351 // get the LR of arg
352 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000353 assert( LR && "No live range found for method arg");
354
355 unsigned RegType = getRegType( LR );
356
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000357
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000358 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000359 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000360 if( RegType == IntRegType ) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000361
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000362 if( argNo < NumOfIntArgRegs) {
363 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000364 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000365 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000366 // Do NOTHING as this will be colored as a normal value.
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000367 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000368 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000369
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000370 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000371 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
372 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
373
374
375 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
376 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
377
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000378 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000379}
380
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000381
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000382
383//---------------------------------------------------------------------------
384// This method is called after graph coloring to move incoming args to
385// the correct hardware registers if they did not receive the correct
386// (suggested) color through graph coloring.
387//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000388void UltraSparcRegInfo::colorMethodArgs(const Method *Meth,
389 LiveRangeInfo &LRI,
390 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000391
392 // get the argument list
393 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
394 // get an iterator to arg list
395 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
396
397 MachineInstr *AdMI;
398
399
400 // for each argument
401 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
402
403 // get the LR of arg
404 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
405 assert( LR && "No live range found for method arg");
406
407
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000408 unsigned RegType = getRegType( LR );
409 unsigned RegClassID = (LR->getRegClass())->getID();
410
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000411 // Find whether this argument is coming in a register (if not, on stack)
412 // Also find the correct register that the argument must go (UniArgReg)
413 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000414 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000415 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000416
417 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
418 isArgInReg = true;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000419 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000420 }
421 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
422 isArgInReg = true;
423 UniArgReg = getUnifiedRegNum( RegClassID,
424 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
425 }
426 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
427 isArgInReg = true;
428 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
429 }
430
431
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000432 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000433
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000434 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
435
436 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000437 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000438 if( UniLRReg == UniArgReg )
439 continue;
440
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000441 // We are here because the LR did not receive the suggested
442 // but LR received another register.
443 // Now we have to copy the %i reg (or stack pos of arg)
444 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000445
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000446 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000447 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000448 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449 if( isArgInReg )
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000450 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000452 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000453
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000454 // Now the arg is coming on stack. Since the LR recieved a register,
455 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000456 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000457 const MachineFrameInfo& frameInfo = target.getFrameInfo();
458 assert(frameInfo.argsOnStackHaveFixedSize());
459
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000460 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000461 int firstArg =
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000462 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
463 growUp);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000464 int offsetFromFP =
465 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
466 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
467
468 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000469 UniLRReg, RegType );
470 }
471
472 FirstAI->InstrnsBefore.push_back( AdMI );
473
474 } // if LR received a color
475
476 else {
477
478 // Now, the LR did not receive a color. But it has a stack offset for
479 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000480 // So, if the arg is coming in UniArgReg register, we can just move
481 // that on to the stack pos of LR
482
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000483 if( isArgInReg ) {
Chris Lattner7f74a562002-01-20 22:54:45 +0000484 cpReg2MemMI(UniArgReg, getFramePointer(),
485 LR->getSpillOffFromFP(), RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000486
487 FirstAI->InstrnsBefore.push_back( AdMI );
488 }
489
490 else {
491
492 // Now the arg is coming on stack. Since the LR did NOT
493 // recieved a register as well, it is allocated a stack position. We
494 // can simply change the stack poistion of the LR. We can do this,
495 // since this method is called before any other method that makes
496 // uses of the stack pos of the LR (e.g., updateMachineInstr)
497
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000498 const MachineFrameInfo& frameInfo = target.getFrameInfo();
499 assert(frameInfo.argsOnStackHaveFixedSize());
500
501 bool growUp;
502 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
503 int offsetFromFP =
504 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
505 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
506
507 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000508 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000509
510 }
511
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000512 } // for each incoming argument
513
514}
515
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000516
517
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000518//---------------------------------------------------------------------------
519// This method is called before graph coloring to suggest colors to the
520// outgoing call args and the return value of the call.
521//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000522void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000523 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000524 std::vector<RegClass *> RCList) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000525
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000526 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000527
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000528 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000529
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000530
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000531 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000532 // will be in %o0 if the value is an integer type, or in %f0 if the
533 // value is a float type.
534
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000535 // the return value cannot have a LR in machine instruction since it is
536 // only defined by the call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000537
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000538 // if type is not void, create a new live range and set its
539 // register class and add to LRI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000540
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000541
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000542 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000543
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000544
Chris Lattner5216cc52002-02-04 05:59:25 +0000545 if (RetVal) {
546 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000547 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000548
Chris Lattner5216cc52002-02-04 05:59:25 +0000549 // create a new LR for the return value
550 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000551 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000552 unsigned RegClassID = getRegClassIDOfValue(RetVal);
553 RetValLR->setRegClass(RCList[RegClassID]);
554 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000555
556 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000557
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000558 if( RegClassID == IntRegClassID )
559 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
560 else if (RegClassID == FloatRegClassID )
561 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
562 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000563 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000564
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000565
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000566 // Now suggest colors for arguments (operands) of the call instruction.
567 // Colors are suggested only if the arg number is smaller than the
568 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000569 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000570
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000571 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000572
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000573 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
574
575 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000576
577 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000578 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000579
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000580 // not possible to have a null LR since all args (even consts)
581 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000582 if (!LR) {
583 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000584 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000585 }
586
587 unsigned RegType = getRegType( LR );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000588
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000589 // if the arg is in int class - allocate a reg for an int arg
590 if( RegType == IntRegType ) {
591
592 if( argNo < NumOfIntArgRegs)
593 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
594
595 else if (DEBUG_RA)
596 // Do NOTHING as this will be colored as a normal value.
Chris Lattner7f74a562002-01-20 22:54:45 +0000597 cerr << " Regr not suggested for int call arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000598
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000599 }
600 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
601 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
602
603
604 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
605 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
606
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000607
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000608 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000609
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000610}
611
612
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000613//---------------------------------------------------------------------------
614// After graph coloring, we have call this method to see whehter the return
615// value and the call args received the correct colors. If not, we have
616// to instert copy instructions.
617//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000618
Chris Lattner5216cc52002-02-04 05:59:25 +0000619void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
620 LiveRangeInfo &LRI,
621 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000622 PhyRegAlloc &PRA,
623 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000624
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000625 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
626
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000627 // Reset the optional args area in the stack frame
628 // since that is reused for each call
629 //
630 PRA.mcInfo.resetOptionalArgs(target);
631
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000632 // First color the return value of the call.
633 // If there is a LR for the return value, it means this
634 // method returns a value
635
636 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000637
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000638 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000639
Chris Lattner30e8fb62002-02-05 01:43:49 +0000640 if (RetVal) {
641 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000642
Chris Lattner30e8fb62002-02-05 01:43:49 +0000643 if (!RetValLR) {
644 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
645 assert(0 && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000646 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000647
648 unsigned RegClassID = (RetValLR->getRegClass())->getID();
649 bool recvCorrectColor = false;
650
651 unsigned CorrectCol; // correct color for ret value
652 if(RegClassID == IntRegClassID)
653 CorrectCol = SparcIntRegOrder::o0;
654 else if(RegClassID == FloatRegClassID)
655 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000656 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000657 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000658 return;
659 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000660
661 // if the LR received the correct color, NOTHING to do
662
663 if( RetValLR->hasColor() )
664 if( RetValLR->getColor() == CorrectCol )
665 recvCorrectColor = true;
666
667
668 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000669 // put copy instruction
670
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000671 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000672
673 unsigned RegType = getRegType( RetValLR );
674
675 // the reg that LR must be colored with
676 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000677
678 if( RetValLR->hasColor() ) {
679
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000680 unsigned
681 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000682
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000683 // the return value is coming in UniRetReg but has to go into
684 // the UniRetLRReg
685
686 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000687
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000688 } // if LR has color
689 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000690
691 // if the LR did NOT receive a color, we have to move the return
692 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000693
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000694 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
695 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000696 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000697
698 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000699
700 } // the LR didn't receive the suggested color
701
702 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000703
704
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000705 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000706 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000707 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000708
Chris Lattner7f74a562002-01-20 22:54:45 +0000709 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000710
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000711 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000712
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000713 bool VarArgCall = isVarArgCall( CallMI );
714
715 if(VarArgCall) cerr << "\nVar arg call found!!\n";
716
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000717 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
718
719 const Value *CallArg = CallMI->getImplicitRef(i);
720
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000721 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000722 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000723
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000724 unsigned RegType = getRegType( CallArg );
725 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000726
727 // find whether this argument is coming in a register (if not, on stack)
728
729 bool isArgInReg = false;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000730 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000731
732 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
733 isArgInReg = true;
734 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
735 }
736 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
737 isArgInReg = true;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000738
739 if( !VarArgCall )
740 UniArgReg = getUnifiedRegNum(RegClassID,
741 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
742 else {
743 // a variable argument call - must pass float arg in %o's
744 if( argNo < NumOfIntArgRegs)
745 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
746 else
747 isArgInReg = false;
748 }
749
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000750 }
751 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
752 isArgInReg = true;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000753
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000754 if( !VarArgCall )
755 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
756 else {
757 // a variable argument call - must pass float arg in %o's
758 if( argNo < NumOfIntArgRegs)
759 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
760 else
761 isArgInReg = false;
762 }
763 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000764
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000765 // not possible to have a null LR since all args (even consts)
766 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000767 if (!LR) {
768 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000769 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000770 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000771
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000772
Chris Lattner5216cc52002-02-04 05:59:25 +0000773 if (LR->hasColor()) {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000774 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
775
776 // if LR received the correct color, nothing to do
777 if( UniLRReg == UniArgReg )
778 continue;
779
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000780 // We are here because though the LR is allocated a register, it
781 // was not allocated the suggested register. So, we have to copy %ix reg
782 // (or stack pos of arg) to the register it was colored with
783
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000784 // the LR is colored with UniLRReg but has to go into UniArgReg
785 // to pass it as an argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000786
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000787 if( isArgInReg ) {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000788
789 if( VarArgCall && RegClassID == FloatRegClassID ) {
790
791
792 // for a variable argument call, the float reg must go in a %o reg.
793 // We have to move a float reg to an int reg via memory.
794 // The store instruction will be directly added to
795 // CallAI->InstrnsBefore since it does not need reordering
796 //
797 int TmpOff = PRA.mcInfo.pushTempValue(target,
798 getSpilledRegSize(RegType));
799
800 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
801 CallAI->InstrnsBefore.push_back( AdMI );
802
803 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
804 AddedInstrnsBefore.push_back( AdMI );
805 }
806
807 else {
808 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
809 AddedInstrnsBefore.push_back( AdMI );
810 }
811
Chris Lattner5216cc52002-02-04 05:59:25 +0000812 } else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000813 // Now, we have to pass the arg on stack. Since LR received a register
814 // we just have to move that register to the stack position where
815 // the argument must be passed
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000816
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000817 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000818
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000819 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000820
821 // Now add the instruction. We can directly add to
822 // CallAI->InstrnsBefore since we are just saving a reg on stack
823 //
824 CallAI->InstrnsBefore.push_back( AdMI );
825
826 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000827 }
828
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000829
Chris Lattner5216cc52002-02-04 05:59:25 +0000830 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000831
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000832 if( isArgInReg ) {
833
834 // Now the LR did NOT recieve a register but has a stack poistion.
835 // Since, the outgoing arg goes in a register we just have to insert
836 // a load instruction to load the LR to outgoing register
837
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000838 if( VarArgCall && RegClassID == FloatRegClassID )
839 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
840 UniArgReg, IntRegType );
841 else
842 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
843 UniArgReg, RegType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000844
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000845 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000846 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000847 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000848
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000849 else {
850 // Now, we have to pass the arg on stack. Since LR also did NOT
851 // receive a register we have to move an argument in memory to
852 // outgoing parameter on stack.
853
854 // Optoimize: Optimize when reverse pointers in MahineInstr are
855 // introduced.
856 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
857 // fails, then use the following code. Currently, we cannot call the
858 // above method since we cannot find LVSetBefore without the BB
859
Ruchira Sasankac97ccc52001-11-15 20:25:07 +0000860 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000861
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000862 int TmpOff = PRA.mcInfo.pushTempValue(target,
863 getSpilledRegSize(getRegType(LR)) );
864
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000865
866 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
867
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000868 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000869
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000870 // Sequence:
871 // (1) Save TReg on stack
872 // (2) Load LR value into TReg from stack pos of LR
873 // (3) Store Treg on outgoing Arg pos on stack
874 // (4) Load the old value of TReg from stack to TReg (restore it)
875
876 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
877 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
878 TReg, RegType );
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000879 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000880 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000881
882 // We directly add to CallAI->InstrnsBefore instead of adding to
883 // AddedInstrnsBefore since these instructions must not be
884 // reordered.
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000885
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000886 CallAI->InstrnsBefore.push_back( Ad1 );
887 CallAI->InstrnsBefore.push_back( Ad2 );
888 CallAI->InstrnsBefore.push_back( Ad3 );
889 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000890
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000891 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000892 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000893 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000894 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000895
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000896
897 // if we added any instruction before the call instruction, verify
898 // that they are in the proper order and if not, reorder them
899
Chris Lattner5216cc52002-02-04 05:59:25 +0000900 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000901
Chris Lattner5216cc52002-02-04 05:59:25 +0000902 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000903 cerr << "\nCalling reorder with instrns: \n";
904 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
905 cerr << *(AddedInstrnsBefore[i]);
906 }
907
Chris Lattner7f74a562002-01-20 22:54:45 +0000908 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000909 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000910
Chris Lattner5216cc52002-02-04 05:59:25 +0000911 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000912 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000913 for(unsigned i = 0; i < TmpVec.size(); i++)
914 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000915 }
916
917 // copy the results back from TmpVec to InstrnsBefore
918 for(unsigned i=0; i < TmpVec.size(); i++)
919 CallAI->InstrnsBefore.push_back( TmpVec[i] );
920 }
921
922
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000923 // now insert caller saving code for this call instruction
924 //
925 insertCallerSavingCode(CallMI, BB, PRA);
926
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000927 // Reset optional args area again to be safe
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000928 PRA.mcInfo.resetOptionalArgs(target);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000929}
930
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000931//---------------------------------------------------------------------------
932// This method is called for an LLVM return instruction to identify which
933// values will be returned from this method and to suggest colors.
934//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000935void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
936 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000937
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000938 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000939
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000940 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000941
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000942 // if there is an implicit ref, that has to be the ret value
943 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000944
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000945 // The first implicit operand is the return value of a return instr
946 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000947
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000948 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000949
Chris Lattner30e8fb62002-02-05 01:43:49 +0000950 if (!LR) {
951 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
952 assert(0 && "No LR for return value of non-void method");
953 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000954
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000955 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000956
Chris Lattner5216cc52002-02-04 05:59:25 +0000957 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000958 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000959 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000960 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000961 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000962}
963
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000964
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000965
966//---------------------------------------------------------------------------
967// Colors the return value of a method to %i0 or %f0, if possible. If it is
968// not possilbe to directly color the LR, insert a copy instruction to move
969// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
970// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000971//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000972void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
973 LiveRangeInfo &LRI,
974 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000975
Chris Lattner5216cc52002-02-04 05:59:25 +0000976 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000977
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000978 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000979 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000981 // The first implicit operand is the return value of a return instr
982 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000983
Chris Lattner5216cc52002-02-04 05:59:25 +0000984 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000985
Chris Lattner30e8fb62002-02-05 01:43:49 +0000986 if (!LR) {
987 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
988 // assert( LR && "No LR for return value of non-void method");
989 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000990 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000991
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000992 unsigned RegClassID = getRegClassIDOfValue(RetVal);
993 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000994
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000995 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000997 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000998 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000999 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001000 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001001 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001002 return;
1003 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001005 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001006
Chris Lattner5216cc52002-02-04 05:59:25 +00001007 if (LR->hasColor() && LR->getColor() == CorrectCol)
1008 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001009
Chris Lattner5216cc52002-02-04 05:59:25 +00001010 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001011
Chris Lattner5216cc52002-02-04 05:59:25 +00001012 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001013
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001014 // We are here because the LR was allocted a regiter
1015 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001016
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001017 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001018
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001019 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001020
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001021 // the LR received UniLRReg but must be colored with UniRetReg
1022 // to pass as the return value
Chris Lattner7f74a562002-01-20 22:54:45 +00001023 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, RegType));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001024 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001025 else { // if the LR is spilled
Chris Lattner7f74a562002-01-20 22:54:45 +00001026 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1027 LR->getSpillOffFromFP(),
1028 UniRetReg, RegType);
1029 RetAI->InstrnsBefore.push_back(AdMI);
1030 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001031 }
1032
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001033 } // if there is a return value
1034
1035}
1036
1037
1038//---------------------------------------------------------------------------
1039// Copy from a register to register. Register number must be the unified
1040// register number
1041//---------------------------------------------------------------------------
1042
Chris Lattner5216cc52002-02-04 05:59:25 +00001043MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg, unsigned DestReg,
1044 int RegType) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001045
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001046 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001047 "Invalid Register");
1048
1049 MachineInstr * MI = NULL;
1050
1051 switch( RegType ) {
1052
1053 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001054 case IntCCRegType:
1055 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001056 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001057 MI->SetMachineOperandReg(0, SrcReg, false);
1058 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1059 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001060 break;
1061
1062 case FPSingleRegType:
1063 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001064 MI->SetMachineOperandReg(0, SrcReg, false);
1065 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001066 break;
1067
1068 case FPDoubleRegType:
1069 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001070 MI->SetMachineOperandReg(0, SrcReg, false);
1071 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001072 break;
1073
1074 default:
1075 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001076 }
1077
1078 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001079}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001080
1081
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001082//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001083// Copy from a register to memory (i.e., Store). Register number must
1084// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001085//---------------------------------------------------------------------------
1086
1087
Chris Lattner5216cc52002-02-04 05:59:25 +00001088MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1089 unsigned DestPtrReg,
1090 int Offset, int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001091 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001092 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001093 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001094 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001095 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001096 MI->SetMachineOperandReg(0, SrcReg, false);
1097 MI->SetMachineOperandReg(1, DestPtrReg, false);
1098 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1099 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001100 break;
1101
1102 case FPSingleRegType:
1103 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001104 MI->SetMachineOperandReg(0, SrcReg, false);
1105 MI->SetMachineOperandReg(1, DestPtrReg, false);
1106 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1107 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001108 break;
1109
1110 case FPDoubleRegType:
1111 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001112 MI->SetMachineOperandReg(0, SrcReg, false);
1113 MI->SetMachineOperandReg(1, DestPtrReg, false);
1114 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1115 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001116 break;
1117
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001118 case IntCCRegType:
1119 assert( 0 && "Cannot directly store %ccr to memory");
1120
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001121 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001122 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001123 }
1124
1125 return MI;
1126}
1127
1128
1129//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001130// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001131// register number
1132//---------------------------------------------------------------------------
1133
1134
Chris Lattner5216cc52002-02-04 05:59:25 +00001135MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1136 int Offset,
1137 unsigned DestReg,
1138 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001139 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001140 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001141 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001142 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001143 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001144 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1145 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1146 (int64_t) Offset);
1147 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001148 break;
1149
1150 case FPSingleRegType:
1151 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001152 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1153 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1154 (int64_t) Offset);
1155 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001156
1157 break;
1158
1159 case FPDoubleRegType:
1160 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001161 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1162 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1163 (int64_t) Offset);
1164 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001165 break;
1166
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001167 case IntCCRegType:
1168 assert( 0 && "Cannot directly load into %ccr from memory");
1169
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001170 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001171 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001172 }
1173
1174 return MI;
1175}
1176
1177
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001178
1179
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001180
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001181//---------------------------------------------------------------------------
1182// Generate a copy instruction to copy a value to another. Temporarily
1183// used by PhiElimination code.
1184//---------------------------------------------------------------------------
1185
1186
Chris Lattner5216cc52002-02-04 05:59:25 +00001187MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001188 int RegType = getRegType( Src );
1189
1190 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001191
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001192 MachineInstr * MI = NULL;
1193
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001194 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001195 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001196 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001197 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1198 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1199 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001200 break;
1201
1202 case FPSingleRegType:
1203 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001204 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1205 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001206 break;
1207
1208
1209 case FPDoubleRegType:
1210 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001211 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1212 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001213 break;
1214
1215 default:
1216 assert(0 && "Unknow RegType in CpValu2Value");
1217 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001218
1219 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001220}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001221
1222
1223
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001224
1225
1226
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001227//----------------------------------------------------------------------------
1228// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001229// a call machine instruction. The caller saving/restoring instructions are
1230// inserted like:
1231//
1232// ** caller saving instructions
1233// other instructions inserted for the call by ColorCallArg
1234// CALL instruction
1235// other instructions inserted for the call ColorCallArg
1236// ** caller restoring instructions
1237//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001238//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001239
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001240
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001241void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1242 const BasicBlock *BB,
1243 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001244
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001245 // has set to record which registers were saved/restored
1246 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001247 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001248
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001249 // Now find the LR of the return value of the call
1250 // The last *implicit operand* is the return value of a call
1251 // Insert it to to he PushedRegSet since we must not save that register
1252 // and restore it after the call.
1253 // We do this because, we look at the LV set *after* the instruction
1254 // to determine, which LRs must be saved across calls. The return value
1255 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001256
1257
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001258 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001259
Chris Lattner5216cc52002-02-04 05:59:25 +00001260 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001261 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001262 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001263
Chris Lattner5216cc52002-02-04 05:59:25 +00001264 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001265 PushedRegSet.insert(
1266 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001267 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001268 }
1269
1270
Chris Lattner7e5ee422002-02-05 04:20:12 +00001271 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1272 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001273
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001274 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001275 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001276
1277 // get the live range corresponding to live var
1278 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1279
1280 // LR can be null if it is a const since a const
1281 // doesn't have a dominating def - see Assumptions above
1282 if( LR ) {
1283
1284 if( LR->hasColor() ) {
1285
1286 unsigned RCID = (LR->getRegClass())->getID();
1287 unsigned Color = LR->getColor();
1288
1289 if ( isRegVolatile(RCID, Color) ) {
1290
1291 // if the value is in both LV sets (i.e., live before and after
1292 // the call machine instruction)
1293
1294 unsigned Reg = getUnifiedRegNum(RCID, Color);
1295
1296 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1297
1298 // if we haven't already pushed that register
1299
1300 unsigned RegType = getRegType( LR );
1301
1302 // Now get two instructions - to push on stack and pop from stack
1303 // and add them to InstrnsBefore and InstrnsAfter of the
1304 // call instruction
1305
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001306
1307 int StackOff = PRA.mcInfo.pushTempValue(target,
1308 getSpilledRegSize(RegType));
1309
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001310
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001311 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1312 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001313
1314 //---- Insert code for pushing the reg on stack ----------
1315
1316 if( RegType == IntCCRegType ) {
1317
1318 // Handle IntCCRegType specially since we cannot directly
1319 // push %ccr on to the stack
1320
Chris Lattner7e5ee422002-02-05 04:20:12 +00001321 const ValueSet &LVSetBef =
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001322 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1323
1324 // get a free INTEGER register
1325 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001326 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1327 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1328
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001329 // insert the instructions in reverse order since we are
1330 // adding them to the front of InstrnsBefore
1331
1332 if(AdIAftCC)
Chris Lattner7e5ee422002-02-05 04:20:12 +00001333 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001334
1335 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001336 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001337
1338 if(AdIBefCC)
Chris Lattner7e5ee422002-02-05 04:20:12 +00001339 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001340
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001341 if(DEBUG_RA) {
1342 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1343 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1344 cerr << "\t" << *AdICpCC;
1345 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1346 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001347
1348 } else {
1349 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001350 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner7e5ee422002-02-05 04:20:12 +00001351 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001352 }
1353
1354
1355 //---- Insert code for popping the reg from the stack ----------
1356
Chris Lattner7e5ee422002-02-05 04:20:12 +00001357 if (RegType == IntCCRegType) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001358
1359 // Handle IntCCRegType specially since we cannot directly
1360 // pop %ccr on from the stack
1361
1362 // get a free INT register
1363 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001364 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1365 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001366
1367 if(AdIBefCC)
Chris Lattner7e5ee422002-02-05 04:20:12 +00001368 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001369
1370 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001371 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001372
1373 if(AdIAftCC)
Chris Lattner7e5ee422002-02-05 04:20:12 +00001374 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001375
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001376 if(DEBUG_RA) {
1377
1378 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1379 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1380 cerr << "\t" << *AdICpCC;
1381 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1382 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001383
1384 } else {
1385 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001386 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner7e5ee422002-02-05 04:20:12 +00001387 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001388 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001389
Chris Lattner7e5ee422002-02-05 04:20:12 +00001390 PushedRegSet.insert(Reg);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001391
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001392 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001393 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001394 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001395 if( RegType == IntCCRegType ) {
1396 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1397 if(AdIAftCC) cerr << *AdIAftCC;
1398 }
1399 else {
1400 if(AdIBef) cerr << *AdIBef << "\t";
1401 if(AdIAft) cerr << *AdIAft;
1402 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001403 }
1404 } // if not already pushed
1405
1406 } // if LR has a volatile color
1407
1408 } // if LR has color
1409
1410 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001411
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001412 } // for each value in the LV set after instruction
1413
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001414}
1415
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001416//---------------------------------------------------------------------------
1417// Copies %ccr into an integer register. IntReg is the UNIFIED register
1418// number.
1419//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001420
Chris Lattner5216cc52002-02-04 05:59:25 +00001421MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1422 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001423 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1424 SparcIntCCRegOrder::ccr),
1425 false, true);
1426 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001427 return MI;
1428}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001429
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001430//---------------------------------------------------------------------------
1431// Copies an integer register into %ccr. IntReg is the UNIFIED register
1432// number.
1433//---------------------------------------------------------------------------
1434
Chris Lattner5216cc52002-02-04 05:59:25 +00001435MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1436 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001437 MI->SetMachineOperandReg(0, IntReg, false);
1438 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1439 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1440 true, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001441 return MI;
1442}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001443
1444
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001445
1446
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001447//---------------------------------------------------------------------------
1448// Print the register assigned to a LR
1449//---------------------------------------------------------------------------
1450
Chris Lattner5216cc52002-02-04 05:59:25 +00001451void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001452 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001453 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001454
Chris Lattner5216cc52002-02-04 05:59:25 +00001455 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001456 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001457 return;
1458 }
1459
1460 // if a color is found
1461
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001462 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001463
Chris Lattner5216cc52002-02-04 05:59:25 +00001464 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001465 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001466
Chris Lattner5216cc52002-02-04 05:59:25 +00001467 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001468 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001469 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001470 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001471 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001472 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001473}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001474
1475//---------------------------------------------------------------------------
1476// This method examines instructions inserted by RegAlloc code before a
1477// machine instruction to detect invalid orders that destroy values before
1478// they are used. If it detects such conditions, it reorders the instructions.
1479//
1480// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001481// instructions inserted by RegAlloc. All such instruction MUST have
1482// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001483
1484// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1485// this method is called.
1486
1487// This method uses two vectors for efficiency in accessing
1488
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001489// Since instructions are inserted in RegAlloc, this assumes that the
1490// first operand is the source reg and the last operand is the dest reg.
1491
1492// All the uses are before THE def to a register
1493
1494
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001495//---------------------------------------------------------------------------
Chris Lattner7f74a562002-01-20 22:54:45 +00001496void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1497 std::vector<MachineInstr *> &OrdVec,
1498 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001499
1500 /*
1501 Problem: We can have instructions inserted by RegAlloc like
1502 1. add %ox %g0 %oy
1503 2. add %oy %g0 %oz, where z!=x or z==x
1504
1505 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001506
1507 Solution:
1508 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001509
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001510 Algorithm:
1511
1512 do
1513 for each instruction 'DefInst' in the UnOrdVec
1514 for each instruction 'UseInst' that follows the DefInst
1515 if the reg defined by DefInst is used by UseInst
1516 mark DefInst as not movable in this iteration
1517 If DefInst is not marked as not-movable, move DefInst to OrdVec
1518 while all instructions in DefInst are moved to OrdVec
1519
1520 For moving, we call the move2OrdVec(). It checks whether there is a def
1521 in it for the uses in the instruction to be added to OrdVec. If there
1522 are no preceding defs, it just appends the instruction. If there is a
1523 preceding def, it puts two instructions to save the reg on stack before
1524 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001525
1526 */
1527
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001528 bool CouldMoveAll;
1529 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001530
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001531 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001532 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001533 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001534
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001535 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001536
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001537 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001538
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001539 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001540
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001541 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001542
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001543 //cerr << "\nInst in UnordVec = " << *DefInst;
1544
1545 // last operand is the def (unless for a store which has no def reg)
1546 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1547
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001548 if( DefOp.opIsDef() &&
1549 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001550
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001551 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001552
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001553 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001554
Chris Lattner7f74a562002-01-20 22:54:45 +00001555 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001556 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001557
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001558 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1559
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001560 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561 if( UseInst == NULL) continue;
1562
1563 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001564 MachineOperand& UseOp = UseInst->getOperand(0);
1565
1566 if( ! UseOp.opIsDef() &&
1567 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1568
1569 // if use is a register ...
1570
1571 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1572
1573 // if Def and this use are the same, it means that this use
1574 // is destroyed by a def before it is used
1575
1576 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001577
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001578 DefEqUse = true;
1579 CouldMoveAll = false;
1580 DebugPrint = true;
1581 break;
1582 } // if two registers are equal
1583
1584 } // if use is a register
1585
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001586 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001587
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001588 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001589
1590 // after examining all the instructions that follow the DefInst
1591 // if there are no dependencies, we can move it to the OrdVec
1592
1593 // cerr << "Moved to Ord: " << *DefInst;
1594
1595 moveInst2OrdVec(OrdVec, DefInst, PRA);
1596
1597 //OrdVec.push_back(DefInst);
1598
1599 // mark the pos of DefInst with NULL to indicate that it is
1600 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001601 *DefIt = NULL;
1602 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001603
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001604 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001605
1606 } // for all instructions in the UnordVec
1607
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001608
Chris Lattner5216cc52002-02-04 05:59:25 +00001609 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001610
Chris Lattner5216cc52002-02-04 05:59:25 +00001611 if (DebugPrint) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001612 cerr << "\nAdded instructions were reordered to:\n";
1613 for(unsigned int i=0; i < OrdVec.size(); i++)
1614 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001615 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001616}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001617
1618
1619
1620
1621
Chris Lattner7f74a562002-01-20 22:54:45 +00001622void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001623 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001624 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001625 MachineOperand& UseOp = UnordInst->getOperand(0);
1626
1627 if( ! UseOp.opIsDef() &&
1628 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1629
1630 // for the use of UnordInst, see whether there is a defining instr
1631 // before in the OrdVec
1632 bool DefEqUse = false;
1633
Chris Lattner7f74a562002-01-20 22:54:45 +00001634 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001635
1636 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1637
1638 MachineInstr *OrdInst = *OrdIt ;
1639
1640 MachineOperand& DefOp =
1641 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1642
1643 if( DefOp.opIsDef() &&
1644 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1645
1646 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1647
1648 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1649
1650 // we are here because there is a preceding def in the OrdVec
1651 // for the use in this intr we are going to insert. This
1652 // happened because the original code was like:
1653 // 1. add %ox %g0 %oy
1654 // 2. add %oy %g0 %ox
1655 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1656 // Now we are processing %ox of 1.
1657 // We have to
1658
1659 const int UReg = DefOp.getMachineRegNum();
1660 const int RegType = getRegType(UReg);
1661 MachineInstr *AdIBef, *AdIAft;
1662
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001663 const int StackOff = PRA.mcInfo.pushTempValue(target,
1664 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001665
1666 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001667 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001668 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1669 OrdIt++; // points to current instr we processed
1670
1671 // Load directly into DReg (%oy)
1672 MachineOperand& DOp=
1673 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1674 assert(DOp.opIsDef() && "Last operand is not the def");
1675 const int DReg = DOp.getMachineRegNum();
1676
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001677 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001678 OrdVec.push_back(AdIAft);
1679
1680 cerr << "\nFixed CIRCULAR references by reordering";
1681
1682 if( DEBUG_RA ) {
1683 cerr << "\nBefore CIRCULAR Reordering:\n";
1684 cerr << *UnordInst;
1685 cerr << *OrdInst;
1686
1687 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1688 for(unsigned i=0; i < OrdVec.size(); i++)
1689 cerr << *(OrdVec[i]);
1690 }
1691
1692 // Do not copy the UseInst to OrdVec
1693 DefEqUse = true;
1694 break;
1695
1696 }// if two registers are equal
1697
1698 } // if Def is a register
1699
1700 } // for each instr in OrdVec
1701
Chris Lattner5216cc52002-02-04 05:59:25 +00001702 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001703
1704 // We didn't find a def in the OrdVec, so just append this inst
1705 OrdVec.push_back( UnordInst );
1706 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1707 }
1708
1709 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001710}