blob: 8ec23991083d10439b3d93eb7e58b853c989d9e6 [file] [log] [blame]
Chris Lattnered5171e2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner699683c2002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
Chris Lattner699683c2002-02-04 05:59:25 +000014#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
15#include "llvm/iTerminators.h"
16#include "llvm/iOther.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000017#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000018#include <iostream>
19using std::cerr;
Chris Lattner20b1ea02001-09-14 03:47:57 +000020
Chris Lattner699683c2002-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. Advef1c15ee2002-03-18 03:12:16 +000035// getZeroRegNum - returns the register that contains always zero.
36// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000037//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000038int UltraSparcRegInfo::getZeroRegNum() const {
39 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
40 SparcIntRegOrder::g0);
41}
Chris Lattner699683c2002-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. Advef1c15ee2002-03-18 03:12:16 +000047 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
48 SparcIntRegOrder::o7);
Chris Lattner699683c2002-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. Advef1c15ee2002-03-18 03:12:16 +000056 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
57 SparcIntRegOrder::i7);
Chris Lattner699683c2002-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. Advef1c15ee2002-03-18 03:12:16 +000079// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000080unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000081 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
82 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000083}
84
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000085// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000086unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000087 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
88 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000089}
90
91
92
Ruchira Sasankad00982a2002-01-07 19:20:28 +000093//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +000094// Finds the return value of a sparc specific call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000095//---------------------------------------------------------------------------
Vikram S. Advea44c6c02002-03-31 19:04:50 +000096
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000097const Value *
Ruchira Sasankad00982a2002-01-07 19:20:28 +000098UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000099 unsigned OpCode = CallMI->getOpCode();
Chris Lattner697954c2002-01-20 22:54:45 +0000100 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000101
Chris Lattner697954c2002-01-20 22:54:45 +0000102 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000103
104 // The one before the last implicit operand is the return value of
105 // a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000106 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000107 if( NumOfImpRefs > 1 )
Chris Lattner699683c2002-02-04 05:59:25 +0000108 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
109 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000110
Chris Lattner697954c2002-01-20 22:54:45 +0000111 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000112
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000113 // The last implicit operand is the return value of a JMPL
114 //
Chris Lattner697954c2002-01-20 22:54:45 +0000115 if(NumOfImpRefs > 0)
116 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
117 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner699683c2002-02-04 05:59:25 +0000118 } else
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000119 assert(0 && "OpCode must be CALL/JMPL for a call instr");
120
121 return NULL;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000122}
123
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000124
Vikram S. Advea44c6c02002-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 Sasankad00982a2002-01-07 19:20:28 +0000132
133//---------------------------------------------------------------------------
134// Finds the return address of a call sparc specific call instruction
135//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000136const Value *
Chris Lattner699683c2002-02-04 05:59:25 +0000137UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000138 unsigned OpCode = CallMI->getOpCode();
139
Chris Lattner699683c2002-02-04 05:59:25 +0000140 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000141 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
142
143 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000144
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000145 // The last implicit operand is the return address of a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000146 //
Chris Lattner699683c2002-02-04 05:59:25 +0000147 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000148
Chris Lattner699683c2002-02-04 05:59:25 +0000149 } else if(OpCode == JMPLCALL) {
150 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000151 return MO.getVRegValue();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000152 }
Chris Lattner699683c2002-02-04 05:59:25 +0000153
154 assert(0 && "OpCode must be CALL/JMPL for a call instr");
155 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000156}
157
Chris Lattner699683c2002-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 Lattner699683c2002-02-04 05:59:25 +0000162 switch (LR->getRegClass()->getID()) {
163 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000164 case FloatRegClassID: {
165 const Type *Typ = LR->getType();
166 if (Typ == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000167 return FPSingleRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000168 else if (Typ == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000169 return FPDoubleRegType;
170 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000171 }
Chris Lattner699683c2002-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 Lattner49b8a9c2002-02-24 23:02:40 +0000212 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000213}
214
215
216
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000217
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000218
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000219//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +0000220// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000221//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000222unsigned
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000223UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
224
225 unsigned OpCode = CallMI->getOpCode();
Chris Lattner699683c2002-02-04 05:59:25 +0000226 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000227
Chris Lattner699683c2002-02-04 05:59:25 +0000228 if (OpCode == CALL) {
229 switch (NumOfImpRefs) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000230 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner699683c2002-02-04 05:59:25 +0000231 case 1: return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000232 default: // two or more implicit refs
Chris Lattner699683c2002-02-04 05:59:25 +0000233 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
234 return NumOfImpRefs - 2;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000235 else
Chris Lattner699683c2002-02-04 05:59:25 +0000236 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000237 }
Chris Lattner699683c2002-02-04 05:59:25 +0000238 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000239
240 // The last implicit operand is the return value of a JMPL instr
241 if( NumOfImpRefs > 0 ) {
Chris Lattner699683c2002-02-04 05:59:25 +0000242 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
243 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000244 else
Chris Lattner699683c2002-02-04 05:59:25 +0000245 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000246 }
247 else
Chris Lattner699683c2002-02-04 05:59:25 +0000248 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000249 }
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000250
Chris Lattner699683c2002-02-04 05:59:25 +0000251 assert(0 && "OpCode must be CALL/JMPL for a call instr");
252 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000253}
254
255
Vikram S. Adve53fec862001-10-22 13:41:12 +0000256
Ruchira Sasankad00982a2002-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
Chris Lattner2aac6bf2002-04-04 22:19:18 +0000267 PointerType *PT = cast<PointerType>(calleeVal->getType());
268 return cast<FunctionType>(PT->getElementType())->isVarArg();
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000269}
270
271
272
273
274//---------------------------------------------------------------------------
275// Suggests a register for the ret address in the RET machine instruction.
276// We always suggest %i7 by convention.
277//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000278void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000279 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000280
Vikram S. Adve53fec862001-10-22 13:41:12 +0000281 assert( (RetMI->getNumOperands() >= 2)
282 && "JMPL/RETURN must have 3 and 2 operands respectively");
283
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000284 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
285
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000286 // return address is always mapped to i7
287 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000288 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000289
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000290 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000291 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000292 // we have to test later whether it received the suggested color.
293 // In that case, a LR has to be created at the start of method.
294 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000295
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000296 // const Value *RetAddrVal = MO.getVRegValue();
297 // assert( RetAddrVal && "LR for ret address must be created at start");
298 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
299 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
300 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000301}
302
303
304//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000305// Suggests a register for the ret address in the JMPL/CALL machine instr.
306// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000307//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000308void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
309 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000310 std::vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000311
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000312
313 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
314
315 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
316 // create a new LR for the return address and color it
317
318 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000319 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000320 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
321 RetAddrLR->setRegClass( RCList[RegClassID] );
322 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
323 LRI.addLRToMap( RetAddrVal, RetAddrLR);
324
Ruchira Sasanka91442282001-09-30 23:16:47 +0000325}
326
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000327
328
Ruchira Sasanka91442282001-09-30 23:16:47 +0000329
330//---------------------------------------------------------------------------
331// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000332// According to the Sparc ABI, the first 6 incoming args are in
333// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000334// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000335// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000336//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000337void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000338 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000339{
340
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000341 // get the argument list
342 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
343 // get an iterator to arg list
344 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
Chris Lattner20b1ea02001-09-14 03:47:57 +0000345
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000346 // for each argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000347 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000348
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000349 // get the LR of arg
350 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000351 assert( LR && "No live range found for method arg");
352
353 unsigned RegType = getRegType( LR );
354
Chris Lattner20b1ea02001-09-14 03:47:57 +0000355
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000356 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000357 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000358 if( RegType == IntRegType ) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000359
Ruchira Sasanka91442282001-09-30 23:16:47 +0000360 if( argNo < NumOfIntArgRegs) {
361 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000362 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000363 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000364 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000365 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000366 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000367
Chris Lattner20b1ea02001-09-14 03:47:57 +0000368 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000369 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
370 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
371
372
373 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
374 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
375
Chris Lattner20b1ea02001-09-14 03:47:57 +0000376 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000377}
378
Ruchira Sasanka91442282001-09-30 23:16:47 +0000379
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000380
381//---------------------------------------------------------------------------
382// This method is called after graph coloring to move incoming args to
383// the correct hardware registers if they did not receive the correct
384// (suggested) color through graph coloring.
385//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000386void UltraSparcRegInfo::colorMethodArgs(const Method *Meth,
387 LiveRangeInfo &LRI,
388 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000389
390 // get the argument list
391 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
392 // get an iterator to arg list
393 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
394
395 MachineInstr *AdMI;
396
397
398 // for each argument
399 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
400
401 // get the LR of arg
402 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
403 assert( LR && "No live range found for method arg");
404
405
Ruchira Sasanka91442282001-09-30 23:16:47 +0000406 unsigned RegType = getRegType( LR );
407 unsigned RegClassID = (LR->getRegClass())->getID();
408
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000409 // Find whether this argument is coming in a register (if not, on stack)
410 // Also find the correct register that the argument must go (UniArgReg)
411 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000412 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000413 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000414
415 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
416 isArgInReg = true;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000417 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000418 }
419 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
420 isArgInReg = true;
421 UniArgReg = getUnifiedRegNum( RegClassID,
422 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
423 }
424 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
425 isArgInReg = true;
426 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
427 }
428
429
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000430 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000431
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000432 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
433
434 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000435 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000436 if( UniLRReg == UniArgReg )
437 continue;
438
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000439 // We are here because the LR did not receive the suggested
440 // but LR received another register.
441 // Now we have to copy the %i reg (or stack pos of arg)
442 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000443
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000444 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000445 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000446 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000447 if( isArgInReg )
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000448 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000449
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000450 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000451
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000452 // Now the arg is coming on stack. Since the LR recieved a register,
453 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000454 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000455 const MachineFrameInfo& frameInfo = target.getFrameInfo();
456 assert(frameInfo.argsOnStackHaveFixedSize());
457
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000458 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000459 int firstArg =
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000460 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
461 growUp);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000462 int offsetFromFP =
463 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
464 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
465
466 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000467 UniLRReg, RegType );
468 }
469
470 FirstAI->InstrnsBefore.push_back( AdMI );
471
472 } // if LR received a color
473
474 else {
475
476 // Now, the LR did not receive a color. But it has a stack offset for
477 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000478 // So, if the arg is coming in UniArgReg register, we can just move
479 // that on to the stack pos of LR
480
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000481 if( isArgInReg ) {
Chris Lattner697954c2002-01-20 22:54:45 +0000482 cpReg2MemMI(UniArgReg, getFramePointer(),
483 LR->getSpillOffFromFP(), RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000484
485 FirstAI->InstrnsBefore.push_back( AdMI );
486 }
487
488 else {
489
490 // Now the arg is coming on stack. Since the LR did NOT
491 // recieved a register as well, it is allocated a stack position. We
492 // can simply change the stack poistion of the LR. We can do this,
493 // since this method is called before any other method that makes
494 // uses of the stack pos of the LR (e.g., updateMachineInstr)
495
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000496 const MachineFrameInfo& frameInfo = target.getFrameInfo();
497 assert(frameInfo.argsOnStackHaveFixedSize());
498
499 bool growUp;
500 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
501 int offsetFromFP =
502 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
503 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
504
505 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000506 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000507
508 }
509
Ruchira Sasanka91442282001-09-30 23:16:47 +0000510 } // for each incoming argument
511
512}
513
Chris Lattner20b1ea02001-09-14 03:47:57 +0000514
515
Ruchira Sasanka91442282001-09-30 23:16:47 +0000516//---------------------------------------------------------------------------
517// This method is called before graph coloring to suggest colors to the
518// outgoing call args and the return value of the call.
519//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000520void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000521 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000522 std::vector<RegClass *> RCList) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000523
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000524 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000525
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000526 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000527
Chris Lattner20b1ea02001-09-14 03:47:57 +0000528
Ruchira Sasanka91442282001-09-30 23:16:47 +0000529 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000530 // will be in %o0 if the value is an integer type, or in %f0 if the
531 // value is a float type.
532
Ruchira Sasanka91442282001-09-30 23:16:47 +0000533 // the return value cannot have a LR in machine instruction since it is
534 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000535
Ruchira Sasanka91442282001-09-30 23:16:47 +0000536 // if type is not void, create a new live range and set its
537 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000538
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000539
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000540 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000541
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000542
Chris Lattner699683c2002-02-04 05:59:25 +0000543 if (RetVal) {
544 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000545 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000546
Chris Lattner699683c2002-02-04 05:59:25 +0000547 // create a new LR for the return value
548 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000549 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000550 unsigned RegClassID = getRegClassIDOfValue(RetVal);
551 RetValLR->setRegClass(RCList[RegClassID]);
552 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000553
554 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000555
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000556 if( RegClassID == IntRegClassID )
557 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
558 else if (RegClassID == FloatRegClassID )
559 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
560 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000561 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000562
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000563
Ruchira Sasanka91442282001-09-30 23:16:47 +0000564 // Now suggest colors for arguments (operands) of the call instruction.
565 // Colors are suggested only if the arg number is smaller than the
566 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000567 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000568
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000569 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000570
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000571 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
572
573 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000574
575 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000576 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000577
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000578 // not possible to have a null LR since all args (even consts)
579 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000580 if (!LR) {
581 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000582 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000583 }
584
585 unsigned RegType = getRegType( LR );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000586
Ruchira Sasanka91442282001-09-30 23:16:47 +0000587 // if the arg is in int class - allocate a reg for an int arg
588 if( RegType == IntRegType ) {
589
590 if( argNo < NumOfIntArgRegs)
591 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
592
593 else if (DEBUG_RA)
594 // Do NOTHING as this will be colored as a normal value.
Chris Lattner697954c2002-01-20 22:54:45 +0000595 cerr << " Regr not suggested for int call arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000596
Ruchira Sasanka91442282001-09-30 23:16:47 +0000597 }
598 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
599 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
600
601
602 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
603 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
604
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000605
Ruchira Sasanka91442282001-09-30 23:16:47 +0000606 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000607
Chris Lattner20b1ea02001-09-14 03:47:57 +0000608}
609
610
Ruchira Sasanka91442282001-09-30 23:16:47 +0000611//---------------------------------------------------------------------------
612// After graph coloring, we have call this method to see whehter the return
613// value and the call args received the correct colors. If not, we have
614// to instert copy instructions.
615//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000616
Chris Lattner699683c2002-02-04 05:59:25 +0000617void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
618 LiveRangeInfo &LRI,
619 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000620 PhyRegAlloc &PRA,
621 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000622
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000623 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
624
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000625 // Reset the optional args area in the stack frame
626 // since that is reused for each call
627 //
628 PRA.mcInfo.resetOptionalArgs(target);
629
Ruchira Sasanka91442282001-09-30 23:16:47 +0000630 // First color the return value of the call.
631 // If there is a LR for the return value, it means this
632 // method returns a value
633
634 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000635
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000636 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000637
Chris Lattner0665a5f2002-02-05 01:43:49 +0000638 if (RetVal) {
639 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000640
Chris Lattner0665a5f2002-02-05 01:43:49 +0000641 if (!RetValLR) {
642 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
643 assert(0 && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000644 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000645
646 unsigned RegClassID = (RetValLR->getRegClass())->getID();
647 bool recvCorrectColor = false;
648
649 unsigned CorrectCol; // correct color for ret value
650 if(RegClassID == IntRegClassID)
651 CorrectCol = SparcIntRegOrder::o0;
652 else if(RegClassID == FloatRegClassID)
653 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000654 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000655 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000656 return;
657 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000658
659 // if the LR received the correct color, NOTHING to do
660
661 if( RetValLR->hasColor() )
662 if( RetValLR->getColor() == CorrectCol )
663 recvCorrectColor = true;
664
665
666 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000667 // put copy instruction
668
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000669 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000670
671 unsigned RegType = getRegType( RetValLR );
672
673 // the reg that LR must be colored with
674 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000675
676 if( RetValLR->hasColor() ) {
677
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000678 unsigned
679 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000680
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000681 // the return value is coming in UniRetReg but has to go into
682 // the UniRetLRReg
683
684 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000685
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000686 } // if LR has color
687 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000688
689 // if the LR did NOT receive a color, we have to move the return
690 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000691
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000692 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
693 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000694 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000695
696 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000697
698 } // the LR didn't receive the suggested color
699
700 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000701
702
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000703 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000704 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000705 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000706
Chris Lattner697954c2002-01-20 22:54:45 +0000707 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000708
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000709 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000710
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000711 bool VarArgCall = isVarArgCall( CallMI );
712
713 if(VarArgCall) cerr << "\nVar arg call found!!\n";
714
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000715 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
716
717 const Value *CallArg = CallMI->getImplicitRef(i);
718
Ruchira Sasanka91442282001-09-30 23:16:47 +0000719 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000720 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000721
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000722 unsigned RegType = getRegType( CallArg );
723 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000724
725 // find whether this argument is coming in a register (if not, on stack)
726
727 bool isArgInReg = false;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000728 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000729
730 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
731 isArgInReg = true;
732 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
733 }
734 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
735 isArgInReg = true;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000736
737 if( !VarArgCall )
738 UniArgReg = getUnifiedRegNum(RegClassID,
739 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
740 else {
741 // a variable argument call - must pass float arg in %o's
742 if( argNo < NumOfIntArgRegs)
743 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
744 else
745 isArgInReg = false;
746 }
747
Ruchira Sasanka91442282001-09-30 23:16:47 +0000748 }
749 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
750 isArgInReg = true;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000751
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000752 if( !VarArgCall )
753 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
754 else {
755 // a variable argument call - must pass float arg in %o's
756 if( argNo < NumOfIntArgRegs)
757 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
758 else
759 isArgInReg = false;
760 }
761 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000762
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000763 // not possible to have a null LR since all args (even consts)
764 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000765 if (!LR) {
766 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000767 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000768 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000769
Ruchira Sasanka91442282001-09-30 23:16:47 +0000770
Chris Lattner699683c2002-02-04 05:59:25 +0000771 if (LR->hasColor()) {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000772 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
773
774 // if LR received the correct color, nothing to do
775 if( UniLRReg == UniArgReg )
776 continue;
777
Ruchira Sasanka91442282001-09-30 23:16:47 +0000778 // We are here because though the LR is allocated a register, it
779 // was not allocated the suggested register. So, we have to copy %ix reg
780 // (or stack pos of arg) to the register it was colored with
781
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000782 // the LR is colored with UniLRReg but has to go into UniArgReg
783 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000784
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000785 if( isArgInReg ) {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000786
787 if( VarArgCall && RegClassID == FloatRegClassID ) {
788
789
790 // for a variable argument call, the float reg must go in a %o reg.
791 // We have to move a float reg to an int reg via memory.
792 // The store instruction will be directly added to
793 // CallAI->InstrnsBefore since it does not need reordering
794 //
795 int TmpOff = PRA.mcInfo.pushTempValue(target,
796 getSpilledRegSize(RegType));
797
798 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
799 CallAI->InstrnsBefore.push_back( AdMI );
800
801 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
802 AddedInstrnsBefore.push_back( AdMI );
803 }
804
805 else {
806 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
807 AddedInstrnsBefore.push_back( AdMI );
808 }
809
Chris Lattner699683c2002-02-04 05:59:25 +0000810 } else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000811 // Now, we have to pass the arg on stack. Since LR received a register
812 // we just have to move that register to the stack position where
813 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000814
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000815 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000816
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000817 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000818
819 // Now add the instruction. We can directly add to
820 // CallAI->InstrnsBefore since we are just saving a reg on stack
821 //
822 CallAI->InstrnsBefore.push_back( AdMI );
823
824 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000825 }
826
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000827
Chris Lattner699683c2002-02-04 05:59:25 +0000828 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000829
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000830 if( isArgInReg ) {
831
832 // Now the LR did NOT recieve a register but has a stack poistion.
833 // Since, the outgoing arg goes in a register we just have to insert
834 // a load instruction to load the LR to outgoing register
835
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000836 if( VarArgCall && RegClassID == FloatRegClassID )
837 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
838 UniArgReg, IntRegType );
839 else
840 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
841 UniArgReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000842
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000843 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000844 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000845 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000846
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000847 else {
848 // Now, we have to pass the arg on stack. Since LR also did NOT
849 // receive a register we have to move an argument in memory to
850 // outgoing parameter on stack.
851
852 // Optoimize: Optimize when reverse pointers in MahineInstr are
853 // introduced.
854 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
855 // fails, then use the following code. Currently, we cannot call the
856 // above method since we cannot find LVSetBefore without the BB
857
Ruchira Sasanka295264d2001-11-15 20:25:07 +0000858 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000859
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000860 int TmpOff = PRA.mcInfo.pushTempValue(target,
861 getSpilledRegSize(getRegType(LR)) );
862
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000863
864 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
865
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000866 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000867
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000868 // Sequence:
869 // (1) Save TReg on stack
870 // (2) Load LR value into TReg from stack pos of LR
871 // (3) Store Treg on outgoing Arg pos on stack
872 // (4) Load the old value of TReg from stack to TReg (restore it)
873
874 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
875 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
876 TReg, RegType );
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000877 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000878 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000879
880 // We directly add to CallAI->InstrnsBefore instead of adding to
881 // AddedInstrnsBefore since these instructions must not be
882 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000883
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000884 CallAI->InstrnsBefore.push_back( Ad1 );
885 CallAI->InstrnsBefore.push_back( Ad2 );
886 CallAI->InstrnsBefore.push_back( Ad3 );
887 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000888
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000889 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000890 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000891 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000892 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000893
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000894
895 // if we added any instruction before the call instruction, verify
896 // that they are in the proper order and if not, reorder them
897
Chris Lattner699683c2002-02-04 05:59:25 +0000898 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000899
Chris Lattner699683c2002-02-04 05:59:25 +0000900 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000901 cerr << "\nCalling reorder with instrns: \n";
902 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
903 cerr << *(AddedInstrnsBefore[i]);
904 }
905
Chris Lattner697954c2002-01-20 22:54:45 +0000906 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000907 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000908
Chris Lattner699683c2002-02-04 05:59:25 +0000909 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000910 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000911 for(unsigned i = 0; i < TmpVec.size(); i++)
912 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000913 }
914
915 // copy the results back from TmpVec to InstrnsBefore
916 for(unsigned i=0; i < TmpVec.size(); i++)
917 CallAI->InstrnsBefore.push_back( TmpVec[i] );
918 }
919
920
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000921 // now insert caller saving code for this call instruction
922 //
923 insertCallerSavingCode(CallMI, BB, PRA);
924
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000925 // Reset optional args area again to be safe
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000926 PRA.mcInfo.resetOptionalArgs(target);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000927}
928
Ruchira Sasanka91442282001-09-30 23:16:47 +0000929//---------------------------------------------------------------------------
930// This method is called for an LLVM return instruction to identify which
931// values will be returned from this method and to suggest colors.
932//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000933void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
934 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000935
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000936 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000937
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000938 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000939
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000940 // if there is an implicit ref, that has to be the ret value
941 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000942
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000943 // The first implicit operand is the return value of a return instr
944 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000945
Ruchira Sasanka91442282001-09-30 23:16:47 +0000946 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000947
Chris Lattner0665a5f2002-02-05 01:43:49 +0000948 if (!LR) {
949 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
950 assert(0 && "No LR for return value of non-void method");
951 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000952
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000953 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000954
Chris Lattner699683c2002-02-04 05:59:25 +0000955 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000956 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000957 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000958 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000959 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000960}
961
Ruchira Sasanka91442282001-09-30 23:16:47 +0000962
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000963
964//---------------------------------------------------------------------------
965// Colors the return value of a method to %i0 or %f0, if possible. If it is
966// not possilbe to directly color the LR, insert a copy instruction to move
967// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
968// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000969//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000970void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
971 LiveRangeInfo &LRI,
972 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000973
Chris Lattner699683c2002-02-04 05:59:25 +0000974 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000975
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000976 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000977 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000978
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000979 // The first implicit operand is the return value of a return instr
980 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000981
Chris Lattner699683c2002-02-04 05:59:25 +0000982 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000983
Chris Lattner0665a5f2002-02-05 01:43:49 +0000984 if (!LR) {
985 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
986 // assert( LR && "No LR for return value of non-void method");
987 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000988 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000989
Ruchira Sasanka91442282001-09-30 23:16:47 +0000990 unsigned RegClassID = getRegClassIDOfValue(RetVal);
991 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000992
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000993 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000994 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000995 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000996 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000997 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000998 else {
Chris Lattner699683c2002-02-04 05:59:25 +0000999 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001000 return;
1001 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001002
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001003 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +00001004
Chris Lattner699683c2002-02-04 05:59:25 +00001005 if (LR->hasColor() && LR->getColor() == CorrectCol)
1006 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001007
Chris Lattner699683c2002-02-04 05:59:25 +00001008 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001009
Chris Lattner699683c2002-02-04 05:59:25 +00001010 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001011
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001012 // We are here because the LR was allocted a regiter
1013 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001014
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001015 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001016
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001017 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001018
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001019 // the LR received UniLRReg but must be colored with UniRetReg
1020 // to pass as the return value
Chris Lattner697954c2002-01-20 22:54:45 +00001021 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, RegType));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001022 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001023 else { // if the LR is spilled
Chris Lattner697954c2002-01-20 22:54:45 +00001024 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1025 LR->getSpillOffFromFP(),
1026 UniRetReg, RegType);
1027 RetAI->InstrnsBefore.push_back(AdMI);
1028 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001029 }
1030
Ruchira Sasanka91442282001-09-30 23:16:47 +00001031 } // if there is a return value
1032
1033}
1034
1035
1036//---------------------------------------------------------------------------
1037// Copy from a register to register. Register number must be the unified
1038// register number
1039//---------------------------------------------------------------------------
1040
Chris Lattner699683c2002-02-04 05:59:25 +00001041MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg, unsigned DestReg,
1042 int RegType) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001043
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001044 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001045 "Invalid Register");
1046
1047 MachineInstr * MI = NULL;
1048
1049 switch( RegType ) {
1050
1051 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001052 case IntCCRegType:
1053 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +00001054 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001055 MI->SetMachineOperandReg(0, SrcReg, false);
1056 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1057 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001058 break;
1059
1060 case FPSingleRegType:
1061 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001062 MI->SetMachineOperandReg(0, SrcReg, false);
1063 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001064 break;
1065
1066 case FPDoubleRegType:
1067 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001068 MI->SetMachineOperandReg(0, SrcReg, false);
1069 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001070 break;
1071
1072 default:
1073 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001074 }
1075
1076 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001077}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001078
1079
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001080//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001081// Copy from a register to memory (i.e., Store). Register number must
1082// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001083//---------------------------------------------------------------------------
1084
1085
Chris Lattner699683c2002-02-04 05:59:25 +00001086MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1087 unsigned DestPtrReg,
1088 int Offset, int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001089 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001090 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001091 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001092 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001093 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001094 MI->SetMachineOperandReg(0, SrcReg, false);
1095 MI->SetMachineOperandReg(1, DestPtrReg, false);
1096 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1097 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001098 break;
1099
1100 case FPSingleRegType:
1101 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001102 MI->SetMachineOperandReg(0, SrcReg, false);
1103 MI->SetMachineOperandReg(1, DestPtrReg, false);
1104 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1105 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001106 break;
1107
1108 case FPDoubleRegType:
1109 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001110 MI->SetMachineOperandReg(0, SrcReg, false);
1111 MI->SetMachineOperandReg(1, DestPtrReg, false);
1112 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1113 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001114 break;
1115
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001116 case IntCCRegType:
1117 assert( 0 && "Cannot directly store %ccr to memory");
1118
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001119 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001120 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001121 }
1122
1123 return MI;
1124}
1125
1126
1127//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001128// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001129// register number
1130//---------------------------------------------------------------------------
1131
1132
Chris Lattner699683c2002-02-04 05:59:25 +00001133MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1134 int Offset,
1135 unsigned DestReg,
1136 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001137 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001138 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001139 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001140 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001141 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001142 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1143 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1144 (int64_t) Offset);
1145 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001146 break;
1147
1148 case FPSingleRegType:
1149 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001150 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1151 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1152 (int64_t) Offset);
1153 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001154
1155 break;
1156
1157 case FPDoubleRegType:
1158 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001159 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1160 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1161 (int64_t) Offset);
1162 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001163 break;
1164
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001165 case IntCCRegType:
1166 assert( 0 && "Cannot directly load into %ccr from memory");
1167
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001168 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001169 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001170 }
1171
1172 return MI;
1173}
1174
1175
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001176
1177
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001178
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001179//---------------------------------------------------------------------------
1180// Generate a copy instruction to copy a value to another. Temporarily
1181// used by PhiElimination code.
1182//---------------------------------------------------------------------------
1183
1184
Chris Lattner699683c2002-02-04 05:59:25 +00001185MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001186 int RegType = getRegType( Src );
1187
1188 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001189
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001190 MachineInstr * MI = NULL;
1191
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001192 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001193 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001194 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001195 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1196 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1197 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001198 break;
1199
1200 case FPSingleRegType:
1201 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001202 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1203 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001204 break;
1205
1206
1207 case FPDoubleRegType:
1208 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001209 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1210 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001211 break;
1212
1213 default:
1214 assert(0 && "Unknow RegType in CpValu2Value");
1215 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001216
1217 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001218}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001219
1220
1221
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001222
1223
1224
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001225//----------------------------------------------------------------------------
1226// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001227// a call machine instruction. The caller saving/restoring instructions are
1228// inserted like:
1229//
1230// ** caller saving instructions
1231// other instructions inserted for the call by ColorCallArg
1232// CALL instruction
1233// other instructions inserted for the call ColorCallArg
1234// ** caller restoring instructions
1235//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001236//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001237
Ruchira Sasanka91442282001-09-30 23:16:47 +00001238
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001239void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1240 const BasicBlock *BB,
1241 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001242
Ruchira Sasankabf915522002-01-07 21:03:42 +00001243 // has set to record which registers were saved/restored
1244 //
Chris Lattner697954c2002-01-20 22:54:45 +00001245 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001246
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001247 // Now find the LR of the return value of the call
1248 // The last *implicit operand* is the return value of a call
1249 // Insert it to to he PushedRegSet since we must not save that register
1250 // and restore it after the call.
1251 // We do this because, we look at the LV set *after* the instruction
1252 // to determine, which LRs must be saved across calls. The return value
1253 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001254
1255
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001256 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001257
Chris Lattner699683c2002-02-04 05:59:25 +00001258 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001259 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001260 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001261
Chris Lattner699683c2002-02-04 05:59:25 +00001262 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001263 PushedRegSet.insert(
1264 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001265 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001266 }
1267
1268
Chris Lattner748697d2002-02-05 04:20:12 +00001269 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1270 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001271
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001272 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001273 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001274
1275 // get the live range corresponding to live var
1276 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1277
1278 // LR can be null if it is a const since a const
1279 // doesn't have a dominating def - see Assumptions above
1280 if( LR ) {
1281
1282 if( LR->hasColor() ) {
1283
1284 unsigned RCID = (LR->getRegClass())->getID();
1285 unsigned Color = LR->getColor();
1286
1287 if ( isRegVolatile(RCID, Color) ) {
1288
1289 // if the value is in both LV sets (i.e., live before and after
1290 // the call machine instruction)
1291
1292 unsigned Reg = getUnifiedRegNum(RCID, Color);
1293
1294 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1295
1296 // if we haven't already pushed that register
1297
1298 unsigned RegType = getRegType( LR );
1299
1300 // Now get two instructions - to push on stack and pop from stack
1301 // and add them to InstrnsBefore and InstrnsAfter of the
1302 // call instruction
1303
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001304
1305 int StackOff = PRA.mcInfo.pushTempValue(target,
1306 getSpilledRegSize(RegType));
1307
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001308
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001309 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1310 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001311
1312 //---- Insert code for pushing the reg on stack ----------
1313
1314 if( RegType == IntCCRegType ) {
1315
1316 // Handle IntCCRegType specially since we cannot directly
1317 // push %ccr on to the stack
1318
Chris Lattner748697d2002-02-05 04:20:12 +00001319 const ValueSet &LVSetBef =
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001320 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1321
1322 // get a free INTEGER register
1323 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001324 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1325 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1326
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001327 // insert the instructions in reverse order since we are
1328 // adding them to the front of InstrnsBefore
1329
1330 if(AdIAftCC)
Chris Lattner748697d2002-02-05 04:20:12 +00001331 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001332
1333 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner748697d2002-02-05 04:20:12 +00001334 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001335
1336 if(AdIBefCC)
Chris Lattner748697d2002-02-05 04:20:12 +00001337 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001338
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001339 if(DEBUG_RA) {
1340 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1341 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1342 cerr << "\t" << *AdICpCC;
1343 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1344 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001345
1346 } else {
1347 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001348 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner748697d2002-02-05 04:20:12 +00001349 PRA.AddedInstrMap[MInst]->InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001350 }
1351
1352
1353 //---- Insert code for popping the reg from the stack ----------
1354
Chris Lattner748697d2002-02-05 04:20:12 +00001355 if (RegType == IntCCRegType) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001356
1357 // Handle IntCCRegType specially since we cannot directly
1358 // pop %ccr on from the stack
1359
1360 // get a free INT register
1361 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001362 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1363 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001364
1365 if(AdIBefCC)
Chris Lattner748697d2002-02-05 04:20:12 +00001366 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001367
1368 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner748697d2002-02-05 04:20:12 +00001369 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001370
1371 if(AdIAftCC)
Chris Lattner748697d2002-02-05 04:20:12 +00001372 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001373
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001374 if(DEBUG_RA) {
1375
1376 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1377 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1378 cerr << "\t" << *AdICpCC;
1379 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1380 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001381
1382 } else {
1383 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001384 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner748697d2002-02-05 04:20:12 +00001385 PRA.AddedInstrMap[MInst]->InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001386 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001387
Chris Lattner748697d2002-02-05 04:20:12 +00001388 PushedRegSet.insert(Reg);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001389
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001390 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001391 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001392 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001393 if( RegType == IntCCRegType ) {
1394 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1395 if(AdIAftCC) cerr << *AdIAftCC;
1396 }
1397 else {
1398 if(AdIBef) cerr << *AdIBef << "\t";
1399 if(AdIAft) cerr << *AdIAft;
1400 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001401 }
1402 } // if not already pushed
1403
1404 } // if LR has a volatile color
1405
1406 } // if LR has color
1407
1408 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001409
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001410 } // for each value in the LV set after instruction
1411
Ruchira Sasanka91442282001-09-30 23:16:47 +00001412}
1413
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001414//---------------------------------------------------------------------------
1415// Copies %ccr into an integer register. IntReg is the UNIFIED register
1416// number.
1417//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001418
Chris Lattner699683c2002-02-04 05:59:25 +00001419MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1420 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001421 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1422 SparcIntCCRegOrder::ccr),
1423 false, true);
1424 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001425 return MI;
1426}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001427
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001428//---------------------------------------------------------------------------
1429// Copies an integer register into %ccr. IntReg is the UNIFIED register
1430// number.
1431//---------------------------------------------------------------------------
1432
Chris Lattner699683c2002-02-04 05:59:25 +00001433MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1434 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001435 MI->SetMachineOperandReg(0, IntReg, false);
1436 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1437 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1438 true, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001439 return MI;
1440}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001441
1442
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001443
1444
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001445//---------------------------------------------------------------------------
1446// Print the register assigned to a LR
1447//---------------------------------------------------------------------------
1448
Chris Lattner699683c2002-02-04 05:59:25 +00001449void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001450 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001451 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001452
Chris Lattner699683c2002-02-04 05:59:25 +00001453 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001454 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001455 return;
1456 }
1457
1458 // if a color is found
1459
Chris Lattner1e23ed72001-10-15 18:15:27 +00001460 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001461
Chris Lattner699683c2002-02-04 05:59:25 +00001462 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001463 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001464
Chris Lattner699683c2002-02-04 05:59:25 +00001465 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001466 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001467 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001468 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001469 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001470 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001471}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001472
1473//---------------------------------------------------------------------------
1474// This method examines instructions inserted by RegAlloc code before a
1475// machine instruction to detect invalid orders that destroy values before
1476// they are used. If it detects such conditions, it reorders the instructions.
1477//
1478// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001479// instructions inserted by RegAlloc. All such instruction MUST have
1480// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001481
1482// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1483// this method is called.
1484
1485// This method uses two vectors for efficiency in accessing
1486
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001487// Since instructions are inserted in RegAlloc, this assumes that the
1488// first operand is the source reg and the last operand is the dest reg.
1489
1490// All the uses are before THE def to a register
1491
1492
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001493//---------------------------------------------------------------------------
Chris Lattner697954c2002-01-20 22:54:45 +00001494void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1495 std::vector<MachineInstr *> &OrdVec,
1496 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001497
1498 /*
1499 Problem: We can have instructions inserted by RegAlloc like
1500 1. add %ox %g0 %oy
1501 2. add %oy %g0 %oz, where z!=x or z==x
1502
1503 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001504
1505 Solution:
1506 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001507
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001508 Algorithm:
1509
1510 do
1511 for each instruction 'DefInst' in the UnOrdVec
1512 for each instruction 'UseInst' that follows the DefInst
1513 if the reg defined by DefInst is used by UseInst
1514 mark DefInst as not movable in this iteration
1515 If DefInst is not marked as not-movable, move DefInst to OrdVec
1516 while all instructions in DefInst are moved to OrdVec
1517
1518 For moving, we call the move2OrdVec(). It checks whether there is a def
1519 in it for the uses in the instruction to be added to OrdVec. If there
1520 are no preceding defs, it just appends the instruction. If there is a
1521 preceding def, it puts two instructions to save the reg on stack before
1522 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001523
1524 */
1525
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001526 bool CouldMoveAll;
1527 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001528
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001529 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001530 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001531 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001532
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001533 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001534
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001535 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001536
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001537 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001538
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001539 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001540
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001541 //cerr << "\nInst in UnordVec = " << *DefInst;
1542
1543 // last operand is the def (unless for a store which has no def reg)
1544 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1545
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001546 if( DefOp.opIsDef() &&
1547 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001548
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001549 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001550
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001551 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001552
Chris Lattner697954c2002-01-20 22:54:45 +00001553 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001554 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001555
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001556 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1557
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001558 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001559 if( UseInst == NULL) continue;
1560
1561 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001562 MachineOperand& UseOp = UseInst->getOperand(0);
1563
1564 if( ! UseOp.opIsDef() &&
1565 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1566
1567 // if use is a register ...
1568
1569 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1570
1571 // if Def and this use are the same, it means that this use
1572 // is destroyed by a def before it is used
1573
1574 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001575
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001576 DefEqUse = true;
1577 CouldMoveAll = false;
1578 DebugPrint = true;
1579 break;
1580 } // if two registers are equal
1581
1582 } // if use is a register
1583
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001584 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001585
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001586 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001587
1588 // after examining all the instructions that follow the DefInst
1589 // if there are no dependencies, we can move it to the OrdVec
1590
1591 // cerr << "Moved to Ord: " << *DefInst;
1592
1593 moveInst2OrdVec(OrdVec, DefInst, PRA);
1594
1595 //OrdVec.push_back(DefInst);
1596
1597 // mark the pos of DefInst with NULL to indicate that it is
1598 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001599 *DefIt = NULL;
1600 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001601
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001602 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001603
1604 } // for all instructions in the UnordVec
1605
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001606
Chris Lattner699683c2002-02-04 05:59:25 +00001607 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001608
Chris Lattner699683c2002-02-04 05:59:25 +00001609 if (DebugPrint) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001610 cerr << "\nAdded instructions were reordered to:\n";
1611 for(unsigned int i=0; i < OrdVec.size(); i++)
1612 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001613 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001614}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001615
1616
1617
1618
1619
Chris Lattner697954c2002-01-20 22:54:45 +00001620void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001621 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001622 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001623 MachineOperand& UseOp = UnordInst->getOperand(0);
1624
1625 if( ! UseOp.opIsDef() &&
1626 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1627
1628 // for the use of UnordInst, see whether there is a defining instr
1629 // before in the OrdVec
1630 bool DefEqUse = false;
1631
Chris Lattner697954c2002-01-20 22:54:45 +00001632 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001633
1634 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1635
1636 MachineInstr *OrdInst = *OrdIt ;
1637
1638 MachineOperand& DefOp =
1639 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1640
1641 if( DefOp.opIsDef() &&
1642 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1643
1644 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1645
1646 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1647
1648 // we are here because there is a preceding def in the OrdVec
1649 // for the use in this intr we are going to insert. This
1650 // happened because the original code was like:
1651 // 1. add %ox %g0 %oy
1652 // 2. add %oy %g0 %ox
1653 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1654 // Now we are processing %ox of 1.
1655 // We have to
1656
1657 const int UReg = DefOp.getMachineRegNum();
1658 const int RegType = getRegType(UReg);
1659 MachineInstr *AdIBef, *AdIAft;
1660
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001661 const int StackOff = PRA.mcInfo.pushTempValue(target,
1662 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001663
1664 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001665 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001666 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1667 OrdIt++; // points to current instr we processed
1668
1669 // Load directly into DReg (%oy)
1670 MachineOperand& DOp=
1671 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1672 assert(DOp.opIsDef() && "Last operand is not the def");
1673 const int DReg = DOp.getMachineRegNum();
1674
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001675 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001676 OrdVec.push_back(AdIAft);
1677
1678 cerr << "\nFixed CIRCULAR references by reordering";
1679
1680 if( DEBUG_RA ) {
1681 cerr << "\nBefore CIRCULAR Reordering:\n";
1682 cerr << *UnordInst;
1683 cerr << *OrdInst;
1684
1685 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1686 for(unsigned i=0; i < OrdVec.size(); i++)
1687 cerr << *(OrdVec[i]);
1688 }
1689
1690 // Do not copy the UseInst to OrdVec
1691 DefEqUse = true;
1692 break;
1693
1694 }// if two registers are equal
1695
1696 } // if Def is a register
1697
1698 } // for each instr in OrdVec
1699
Chris Lattner699683c2002-02-04 05:59:25 +00001700 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001701
1702 // We didn't find a def in the OrdVec, so just append this inst
1703 OrdVec.push_back( UnordInst );
1704 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1705 }
1706
1707 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001708}