blob: d86bf6c0045fda6c3a3db701231b9708cce2a66b [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"
Chris Lattner06be1802002-04-09 19:08:28 +000017#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000018#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000019#include <iostream>
20using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000021
Chris Lattner5216cc52002-02-04 05:59:25 +000022UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
23 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
24 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
25
26 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
27 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
28 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
29 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
30
31 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
32 "32 Float regs are used for float arg passing");
33}
34
35
Vikram S. Advedb1435f2002-03-18 03:12:16 +000036// getZeroRegNum - returns the register that contains always zero.
37// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000038//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000039int UltraSparcRegInfo::getZeroRegNum() const {
40 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
41 SparcIntRegOrder::g0);
42}
Chris Lattner5216cc52002-02-04 05:59:25 +000043
44// getCallAddressReg - returns the reg used for pushing the address when a
45// method is called. This can be used for other purposes between calls
46//
47unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000048 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
49 SparcIntRegOrder::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000050}
51
52// Returns the register containing the return address.
53// It should be made sure that this register contains the return
54// value when a return instruction is reached.
55//
56unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000057 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
58 SparcIntRegOrder::i7);
Chris Lattner5216cc52002-02-04 05:59:25 +000059}
60
61// given the unified register number, this gives the name
62// for generating assembly code or debugging.
63//
64const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
65 if( reg < 32 )
66 return SparcIntRegOrder::getRegName(reg);
67 else if ( reg < (64 + 32) )
68 return SparcFloatRegOrder::getRegName( reg - 32);
69 else if( reg < (64+32+4) )
70 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
71 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
72 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
73 else if (reg== InvalidRegNum) //****** TODO: Remove */
74 return "<*NoReg*>";
75 else
76 assert(0 && "Invalid register number");
77 return "";
78}
79
Vikram S. Advedb1435f2002-03-18 03:12:16 +000080// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000081unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000082 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
83 SparcIntRegOrder::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +000084}
85
Vikram S. Advedb1435f2002-03-18 03:12:16 +000086// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000087unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000088 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
89 SparcIntRegOrder::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +000090}
91
92
93
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000094//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000095// Finds the return value of a sparc specific call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000096//---------------------------------------------------------------------------
Vikram S. Adve02662bd2002-03-31 19:04:50 +000097
Ruchira Sasanka24729a32001-10-21 16:43:41 +000098const Value *
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000099UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000100 unsigned OpCode = CallMI->getOpCode();
Chris Lattner7f74a562002-01-20 22:54:45 +0000101 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000102
Chris Lattner7f74a562002-01-20 22:54:45 +0000103 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000104
105 // The one before the last implicit operand is the return value of
106 // a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000107 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000108 if( NumOfImpRefs > 1 )
Chris Lattner5216cc52002-02-04 05:59:25 +0000109 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
110 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000111
Chris Lattner7f74a562002-01-20 22:54:45 +0000112 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000113
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000114 // The last implicit operand is the return value of a JMPL
115 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000116 if(NumOfImpRefs > 0)
117 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
118 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner5216cc52002-02-04 05:59:25 +0000119 } else
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000120 assert(0 && "OpCode must be CALL/JMPL for a call instr");
121
122 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000123}
124
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000125
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000126const Value *
127UltraSparcRegInfo::getCallInstIndirectAddrVal(const MachineInstr *CallMI) const
128{
129 return (CallMI->getOpCode() == JMPLCALL)?
130 CallMI->getOperand(0).getVRegValue() : NULL;
131}
132
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000133
134//---------------------------------------------------------------------------
135// Finds the return address of a call sparc specific call instruction
136//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000137const Value *
Chris Lattner5216cc52002-02-04 05:59:25 +0000138UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000139 unsigned OpCode = CallMI->getOpCode();
140
Chris Lattner5216cc52002-02-04 05:59:25 +0000141 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000142 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
143
144 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000145
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000146 // The last implicit operand is the return address of a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000147 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000148 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000149
Chris Lattner5216cc52002-02-04 05:59:25 +0000150 } else if(OpCode == JMPLCALL) {
151 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000152 return MO.getVRegValue();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000153 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000154
155 assert(0 && "OpCode must be CALL/JMPL for a call instr");
156 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000157}
158
Chris Lattner5216cc52002-02-04 05:59:25 +0000159// The following 3 methods are used to find the RegType (see enum above)
160// of a LiveRange, Value and using the unified RegClassID
161//
162int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000163 switch (LR->getRegClass()->getID()) {
164 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000165 case FloatRegClassID: {
166 const Type *Typ = LR->getType();
167 if (Typ == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000168 return FPSingleRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000169 else if (Typ == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000170 return FPDoubleRegType;
171 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000172 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000173 case IntCCRegClassID: return IntCCRegType;
174 case FloatCCRegClassID: return FloatCCRegType;
175 default: assert( 0 && "Unknown reg class ID");
176 return 0;
177 }
178}
179
180int UltraSparcRegInfo::getRegType(const Value *Val) const {
181 unsigned Typ;
182
183 switch (getRegClassIDOfValue(Val)) {
184 case IntRegClassID: return IntRegType;
185 case FloatRegClassID:
186 Typ = Val->getType()->getPrimitiveID();
187 if (Typ == Type::FloatTyID)
188 return FPSingleRegType;
189 else if (Typ == Type::DoubleTyID)
190 return FPDoubleRegType;
191 assert(0 && "Unknown type in FloatRegClass");
192
193 case IntCCRegClassID: return IntCCRegType;
194 case FloatCCRegClassID: return FloatCCRegType ;
195 default: assert(0 && "Unknown reg class ID");
196 return 0;
197 }
198}
199
200int UltraSparcRegInfo::getRegType(int reg) const {
201 if (reg < 32)
202 return IntRegType;
203 else if (reg < (32 + 32))
204 return FPSingleRegType;
205 else if (reg < (64 + 32))
206 return FPDoubleRegType;
207 else if (reg < (64+32+4))
208 return FloatCCRegType;
209 else if (reg < (64+32+4+2))
210 return IntCCRegType;
211 else
212 assert(0 && "Invalid register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000213 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000214}
215
216
217
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000218
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000219
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000220//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000221// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000222//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000223unsigned
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000224UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
225
226 unsigned OpCode = CallMI->getOpCode();
Chris Lattner5216cc52002-02-04 05:59:25 +0000227 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000228
Chris Lattner5216cc52002-02-04 05:59:25 +0000229 if (OpCode == CALL) {
230 switch (NumOfImpRefs) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000231 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner5216cc52002-02-04 05:59:25 +0000232 case 1: return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000233 default: // two or more implicit refs
Chris Lattner5216cc52002-02-04 05:59:25 +0000234 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
235 return NumOfImpRefs - 2;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000236 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000237 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000238 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000239 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000240
241 // The last implicit operand is the return value of a JMPL instr
242 if( NumOfImpRefs > 0 ) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000243 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
244 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000245 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000246 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000247 }
248 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000249 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000250 }
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000251
Chris Lattner5216cc52002-02-04 05:59:25 +0000252 assert(0 && "OpCode must be CALL/JMPL for a call instr");
253 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000254}
255
256
Vikram S. Adve84982772001-10-22 13:41:12 +0000257
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000258//---------------------------------------------------------------------------
259// Finds whether a call is an indirect call
260//---------------------------------------------------------------------------
261bool UltraSparcRegInfo::isVarArgCall(const MachineInstr *CallMI) const {
Chris Lattnera8e24c42002-04-15 22:41:48 +0000262 assert(UltraSparcInfo->getInstrInfo().isCall(CallMI->getOpCode()));
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000263
Chris Lattnera8e24c42002-04-15 22:41:48 +0000264 const MachineOperand &calleeOp = CallMI->getOperand(0);
265 Value *calleeVal = calleeOp.getVRegValue();
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000266
Chris Lattnera8e24c42002-04-15 22:41:48 +0000267 PointerType *PT = cast<PointerType>(calleeVal->getType());
Chris Lattnere2f2f542002-04-04 22:19:18 +0000268 return cast<FunctionType>(PT->getElementType())->isVarArg();
Ruchira Sasanka4cfbfd52002-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 Lattner5216cc52002-02-04 05:59:25 +0000278void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000279 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000280
Vikram S. Adve84982772001-10-22 13:41:12 +0000281 assert( (RetMI->getNumOperands() >= 2)
282 && "JMPL/RETURN must have 3 and 2 operands respectively");
283
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000284 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
285
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000286 // return address is always mapped to i7
287 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000288 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000289
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000290 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000291 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000295
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000301}
302
303
304//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000307//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000308void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
309 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000310 std::vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000311
Ruchira Sasanka24729a32001-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 Lattnere6b511d2002-02-04 16:37:09 +0000319 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000325}
326
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000327
328
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000329
330//---------------------------------------------------------------------------
331// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000334// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000335// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000336//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000337void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000338 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000339{
340
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000341 // get the argument list
Chris Lattnerf739fa82002-04-08 22:03:57 +0000342 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000343 // get an iterator to arg list
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000344 // for each argument
Chris Lattner98d0ac02002-04-09 19:46:27 +0000345 for( unsigned argNo=0; argNo != ArgList.size(); ++argNo) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000346 // get the LR of arg
Chris Lattner98d0ac02002-04-09 19:46:27 +0000347 LiveRange *LR = LRI.getLiveRangeForValue((const Value *)ArgList[argNo]);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000348 assert( LR && "No live range found for method arg");
349
350 unsigned RegType = getRegType( LR );
351
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000352
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000353 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000354 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000355 if( RegType == IntRegType ) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000356
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000357 if( argNo < NumOfIntArgRegs) {
358 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000359 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000360 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000361 // Do NOTHING as this will be colored as a normal value.
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000362 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000363 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000364
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000365 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000366 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
367 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
368
369
370 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
371 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
372
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000373 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000374}
375
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000376
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000377
378//---------------------------------------------------------------------------
379// This method is called after graph coloring to move incoming args to
380// the correct hardware registers if they did not receive the correct
381// (suggested) color through graph coloring.
382//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000383void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000384 LiveRangeInfo &LRI,
385 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000386
387 // get the argument list
Chris Lattnerf739fa82002-04-08 22:03:57 +0000388 const Function::ArgumentListType& ArgList = Meth->getArgumentList();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000389 // get an iterator to arg list
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000390 MachineInstr *AdMI;
391
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000392 // for each argument
Chris Lattner98d0ac02002-04-09 19:46:27 +0000393 for( unsigned argNo=0; argNo != ArgList.size(); ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000394 // get the LR of arg
Chris Lattner98d0ac02002-04-09 19:46:27 +0000395 LiveRange *LR = LRI.getLiveRangeForValue((Value*)ArgList[argNo]);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000396 assert( LR && "No live range found for method arg");
397
398
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000399 unsigned RegType = getRegType( LR );
400 unsigned RegClassID = (LR->getRegClass())->getID();
401
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000402 // Find whether this argument is coming in a register (if not, on stack)
403 // Also find the correct register that the argument must go (UniArgReg)
404 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000405 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000406 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000407
408 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
409 isArgInReg = true;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000410 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000411 }
412 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
413 isArgInReg = true;
414 UniArgReg = getUnifiedRegNum( RegClassID,
415 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
416 }
417 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
418 isArgInReg = true;
419 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
420 }
421
422
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000423 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000424
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000425 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
426
427 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000428 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000429 if( UniLRReg == UniArgReg )
430 continue;
431
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000432 // We are here because the LR did not receive the suggested
433 // but LR received another register.
434 // Now we have to copy the %i reg (or stack pos of arg)
435 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000436
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000437 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000438 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000439 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000440 if( isArgInReg )
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000441 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000442
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000443 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000444
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000445 // Now the arg is coming on stack. Since the LR recieved a register,
446 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000447 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000448 const MachineFrameInfo& frameInfo = target.getFrameInfo();
449 assert(frameInfo.argsOnStackHaveFixedSize());
450
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000451 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000452 int firstArg =
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000453 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
454 growUp);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000455 int offsetFromFP =
456 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
457 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
458
459 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000460 UniLRReg, RegType );
461 }
462
463 FirstAI->InstrnsBefore.push_back( AdMI );
464
465 } // if LR received a color
466
467 else {
468
469 // Now, the LR did not receive a color. But it has a stack offset for
470 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000471 // So, if the arg is coming in UniArgReg register, we can just move
472 // that on to the stack pos of LR
473
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000474 if( isArgInReg ) {
Chris Lattner7f74a562002-01-20 22:54:45 +0000475 cpReg2MemMI(UniArgReg, getFramePointer(),
476 LR->getSpillOffFromFP(), RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000477
478 FirstAI->InstrnsBefore.push_back( AdMI );
479 }
480
481 else {
482
483 // Now the arg is coming on stack. Since the LR did NOT
484 // recieved a register as well, it is allocated a stack position. We
485 // can simply change the stack poistion of the LR. We can do this,
486 // since this method is called before any other method that makes
487 // uses of the stack pos of the LR (e.g., updateMachineInstr)
488
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000489 const MachineFrameInfo& frameInfo = target.getFrameInfo();
490 assert(frameInfo.argsOnStackHaveFixedSize());
491
492 bool growUp;
493 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
494 int offsetFromFP =
495 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
496 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
497
498 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000499 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000500
501 }
502
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000503 } // for each incoming argument
504
505}
506
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000507
508
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000509//---------------------------------------------------------------------------
510// This method is called before graph coloring to suggest colors to the
511// outgoing call args and the return value of the call.
512//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000513void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000514 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000515 std::vector<RegClass *> RCList) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000516
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000517 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000518
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000519 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000520
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000521
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000522 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000523 // will be in %o0 if the value is an integer type, or in %f0 if the
524 // value is a float type.
525
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000526 // the return value cannot have a LR in machine instruction since it is
527 // only defined by the call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000528
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000529 // if type is not void, create a new live range and set its
530 // register class and add to LRI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000531
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000532
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000533 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000534
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000535
Chris Lattner5216cc52002-02-04 05:59:25 +0000536 if (RetVal) {
537 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000538 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000539
Chris Lattner5216cc52002-02-04 05:59:25 +0000540 // create a new LR for the return value
541 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000542 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000543 unsigned RegClassID = getRegClassIDOfValue(RetVal);
544 RetValLR->setRegClass(RCList[RegClassID]);
545 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000546
547 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000548
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000549 if( RegClassID == IntRegClassID )
550 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
551 else if (RegClassID == FloatRegClassID )
552 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
553 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000554 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000555
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000556
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000557 // Now suggest colors for arguments (operands) of the call instruction.
558 // Colors are suggested only if the arg number is smaller than the
559 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000560 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000561
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000562 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000563
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000564 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
565
566 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000567
568 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000569 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000570
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000571 // not possible to have a null LR since all args (even consts)
572 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000573 if (!LR) {
574 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000575 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000576 }
577
578 unsigned RegType = getRegType( LR );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000579
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000580 // if the arg is in int class - allocate a reg for an int arg
581 if( RegType == IntRegType ) {
582
583 if( argNo < NumOfIntArgRegs)
584 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
585
586 else if (DEBUG_RA)
587 // Do NOTHING as this will be colored as a normal value.
Chris Lattner7f74a562002-01-20 22:54:45 +0000588 cerr << " Regr not suggested for int call arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000589
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000590 }
591 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
592 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
593
594
595 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
596 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
597
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000598
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000599 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000600
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000601}
602
603
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000604//---------------------------------------------------------------------------
605// After graph coloring, we have call this method to see whehter the return
606// value and the call args received the correct colors. If not, we have
607// to instert copy instructions.
608//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000609
Chris Lattner5216cc52002-02-04 05:59:25 +0000610void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
611 LiveRangeInfo &LRI,
612 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000613 PhyRegAlloc &PRA,
614 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000615
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000616 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
617
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000618 // Reset the optional args area in the stack frame
619 // since that is reused for each call
620 //
621 PRA.mcInfo.resetOptionalArgs(target);
622
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000623 // First color the return value of the call.
624 // If there is a LR for the return value, it means this
625 // method returns a value
626
627 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000628
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000629 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000630
Chris Lattner30e8fb62002-02-05 01:43:49 +0000631 if (RetVal) {
632 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000633
Chris Lattner30e8fb62002-02-05 01:43:49 +0000634 if (!RetValLR) {
635 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
636 assert(0 && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000637 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000638
639 unsigned RegClassID = (RetValLR->getRegClass())->getID();
640 bool recvCorrectColor = false;
641
642 unsigned CorrectCol; // correct color for ret value
643 if(RegClassID == IntRegClassID)
644 CorrectCol = SparcIntRegOrder::o0;
645 else if(RegClassID == FloatRegClassID)
646 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000647 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000648 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000649 return;
650 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000651
652 // if the LR received the correct color, NOTHING to do
653
654 if( RetValLR->hasColor() )
655 if( RetValLR->getColor() == CorrectCol )
656 recvCorrectColor = true;
657
658
659 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000660 // put copy instruction
661
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000662 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000663
664 unsigned RegType = getRegType( RetValLR );
665
666 // the reg that LR must be colored with
667 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000668
669 if( RetValLR->hasColor() ) {
670
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000671 unsigned
672 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000673
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000674 // the return value is coming in UniRetReg but has to go into
675 // the UniRetLRReg
676
677 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000678
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000679 } // if LR has color
680 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000681
682 // if the LR did NOT receive a color, we have to move the return
683 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000684
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000685 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
686 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000687 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000688
689 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000690
691 } // the LR didn't receive the suggested color
692
693 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000694
695
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000696 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000697 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000698 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000699
Chris Lattner7f74a562002-01-20 22:54:45 +0000700 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000701
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000702 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000703
Chris Lattnera8e24c42002-04-15 22:41:48 +0000704 bool VarArgCall = isVarArgCall(CallMI);
705 if (DEBUG_RA && VarArgCall) cerr << "\nVar arg call found!!\n";
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000706
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000707 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
708
709 const Value *CallArg = CallMI->getImplicitRef(i);
710
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000711 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000712 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000713
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000714 unsigned RegType = getRegType( CallArg );
715 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000716
717 // find whether this argument is coming in a register (if not, on stack)
718
719 bool isArgInReg = false;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000720 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000721
722 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
723 isArgInReg = true;
724 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
725 }
726 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
727 isArgInReg = true;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000728
729 if( !VarArgCall )
730 UniArgReg = getUnifiedRegNum(RegClassID,
731 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
732 else {
733 // a variable argument call - must pass float arg in %o's
734 if( argNo < NumOfIntArgRegs)
735 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
736 else
737 isArgInReg = false;
738 }
739
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000740 }
741 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
742 isArgInReg = true;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000743
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000744 if( !VarArgCall )
745 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
746 else {
747 // a variable argument call - must pass float arg in %o's
748 if( argNo < NumOfIntArgRegs)
749 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
750 else
751 isArgInReg = false;
752 }
753 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000754
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000755 // not possible to have a null LR since all args (even consts)
756 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000757 if (!LR) {
758 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000759 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000760 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000761
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000762
Chris Lattner5216cc52002-02-04 05:59:25 +0000763 if (LR->hasColor()) {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000764 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
765
766 // if LR received the correct color, nothing to do
767 if( UniLRReg == UniArgReg )
768 continue;
769
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000770 // We are here because though the LR is allocated a register, it
771 // was not allocated the suggested register. So, we have to copy %ix reg
772 // (or stack pos of arg) to the register it was colored with
773
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000774 // the LR is colored with UniLRReg but has to go into UniArgReg
775 // to pass it as an argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000776
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000777 if( isArgInReg ) {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000778
779 if( VarArgCall && RegClassID == FloatRegClassID ) {
780
781
782 // for a variable argument call, the float reg must go in a %o reg.
783 // We have to move a float reg to an int reg via memory.
784 // The store instruction will be directly added to
785 // CallAI->InstrnsBefore since it does not need reordering
786 //
787 int TmpOff = PRA.mcInfo.pushTempValue(target,
788 getSpilledRegSize(RegType));
789
790 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
791 CallAI->InstrnsBefore.push_back( AdMI );
792
793 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
794 AddedInstrnsBefore.push_back( AdMI );
795 }
796
797 else {
798 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
799 AddedInstrnsBefore.push_back( AdMI );
800 }
801
Chris Lattner5216cc52002-02-04 05:59:25 +0000802 } else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000803 // Now, we have to pass the arg on stack. Since LR received a register
804 // we just have to move that register to the stack position where
805 // the argument must be passed
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000806
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000807 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000808
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000809 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000810
811 // Now add the instruction. We can directly add to
812 // CallAI->InstrnsBefore since we are just saving a reg on stack
813 //
814 CallAI->InstrnsBefore.push_back( AdMI );
815
816 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000817 }
818
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000819
Chris Lattner5216cc52002-02-04 05:59:25 +0000820 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000821
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000822 if( isArgInReg ) {
823
824 // Now the LR did NOT recieve a register but has a stack poistion.
825 // Since, the outgoing arg goes in a register we just have to insert
826 // a load instruction to load the LR to outgoing register
827
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000828 if( VarArgCall && RegClassID == FloatRegClassID )
829 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
830 UniArgReg, IntRegType );
831 else
832 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
833 UniArgReg, RegType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000834
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000835 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000836 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000837 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000838
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000839 else {
840 // Now, we have to pass the arg on stack. Since LR also did NOT
841 // receive a register we have to move an argument in memory to
842 // outgoing parameter on stack.
843
844 // Optoimize: Optimize when reverse pointers in MahineInstr are
845 // introduced.
846 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
847 // fails, then use the following code. Currently, we cannot call the
848 // above method since we cannot find LVSetBefore without the BB
849
Ruchira Sasankac97ccc52001-11-15 20:25:07 +0000850 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000851
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000852 int TmpOff = PRA.mcInfo.pushTempValue(target,
853 getSpilledRegSize(getRegType(LR)) );
854
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000855
856 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
857
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000858 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000859
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000860 // Sequence:
861 // (1) Save TReg on stack
862 // (2) Load LR value into TReg from stack pos of LR
863 // (3) Store Treg on outgoing Arg pos on stack
864 // (4) Load the old value of TReg from stack to TReg (restore it)
865
866 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
867 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
868 TReg, RegType );
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000869 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000870 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000871
872 // We directly add to CallAI->InstrnsBefore instead of adding to
873 // AddedInstrnsBefore since these instructions must not be
874 // reordered.
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000875
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000876 CallAI->InstrnsBefore.push_back( Ad1 );
877 CallAI->InstrnsBefore.push_back( Ad2 );
878 CallAI->InstrnsBefore.push_back( Ad3 );
879 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000880
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000881 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000882 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000883 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000884 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000885
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000886
887 // if we added any instruction before the call instruction, verify
888 // that they are in the proper order and if not, reorder them
889
Chris Lattner5216cc52002-02-04 05:59:25 +0000890 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000891
Chris Lattner5216cc52002-02-04 05:59:25 +0000892 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000893 cerr << "\nCalling reorder with instrns: \n";
894 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
895 cerr << *(AddedInstrnsBefore[i]);
896 }
897
Chris Lattner7f74a562002-01-20 22:54:45 +0000898 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000899 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000900
Chris Lattner5216cc52002-02-04 05:59:25 +0000901 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000902 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000903 for(unsigned i = 0; i < TmpVec.size(); i++)
904 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000905 }
906
907 // copy the results back from TmpVec to InstrnsBefore
908 for(unsigned i=0; i < TmpVec.size(); i++)
909 CallAI->InstrnsBefore.push_back( TmpVec[i] );
910 }
911
912
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000913 // now insert caller saving code for this call instruction
914 //
915 insertCallerSavingCode(CallMI, BB, PRA);
916
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000917 // Reset optional args area again to be safe
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000918 PRA.mcInfo.resetOptionalArgs(target);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000919}
920
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000921//---------------------------------------------------------------------------
922// This method is called for an LLVM return instruction to identify which
923// values will be returned from this method and to suggest colors.
924//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000925void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
926 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000927
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000928 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000929
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000930 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000931
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000932 // if there is an implicit ref, that has to be the ret value
933 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000934
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000935 // The first implicit operand is the return value of a return instr
936 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000937
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000938 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000939
Chris Lattner30e8fb62002-02-05 01:43:49 +0000940 if (!LR) {
941 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
942 assert(0 && "No LR for return value of non-void method");
943 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000944
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000945 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000946
Chris Lattner5216cc52002-02-04 05:59:25 +0000947 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000948 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000949 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000950 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000951 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000952}
953
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000954
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000955
956//---------------------------------------------------------------------------
957// Colors the return value of a method to %i0 or %f0, if possible. If it is
958// not possilbe to directly color the LR, insert a copy instruction to move
959// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
960// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000961//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000962void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
963 LiveRangeInfo &LRI,
964 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000965
Chris Lattner5216cc52002-02-04 05:59:25 +0000966 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000967
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000968 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000969 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000970
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000971 // The first implicit operand is the return value of a return instr
972 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000973
Chris Lattner5216cc52002-02-04 05:59:25 +0000974 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000975
Chris Lattner30e8fb62002-02-05 01:43:49 +0000976 if (!LR) {
977 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
978 // assert( LR && "No LR for return value of non-void method");
979 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000980 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000981
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000982 unsigned RegClassID = getRegClassIDOfValue(RetVal);
983 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000984
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000985 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000986 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000987 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000988 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000989 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000990 else {
Chris Lattner5216cc52002-02-04 05:59:25 +0000991 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000992 return;
993 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000994
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000995 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996
Chris Lattner5216cc52002-02-04 05:59:25 +0000997 if (LR->hasColor() && LR->getColor() == CorrectCol)
998 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000999
Chris Lattner5216cc52002-02-04 05:59:25 +00001000 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001001
Chris Lattner5216cc52002-02-04 05:59:25 +00001002 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001003
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001004 // We are here because the LR was allocted a regiter
1005 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001006
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001007 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001008
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001009 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001010
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001011 // the LR received UniLRReg but must be colored with UniRetReg
1012 // to pass as the return value
Chris Lattner7f74a562002-01-20 22:54:45 +00001013 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, RegType));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001015 else { // if the LR is spilled
Chris Lattner7f74a562002-01-20 22:54:45 +00001016 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1017 LR->getSpillOffFromFP(),
1018 UniRetReg, RegType);
1019 RetAI->InstrnsBefore.push_back(AdMI);
1020 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001021 }
1022
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001023 } // if there is a return value
1024
1025}
1026
1027
1028//---------------------------------------------------------------------------
1029// Copy from a register to register. Register number must be the unified
1030// register number
1031//---------------------------------------------------------------------------
1032
Chris Lattner5216cc52002-02-04 05:59:25 +00001033MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg, unsigned DestReg,
1034 int RegType) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001035
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001036 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001037 "Invalid Register");
1038
1039 MachineInstr * MI = NULL;
1040
1041 switch( RegType ) {
1042
1043 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001044 case IntCCRegType:
1045 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001046 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001047 MI->SetMachineOperandReg(0, SrcReg, false);
1048 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1049 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001050 break;
1051
1052 case FPSingleRegType:
1053 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001054 MI->SetMachineOperandReg(0, SrcReg, false);
1055 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001056 break;
1057
1058 case FPDoubleRegType:
1059 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001060 MI->SetMachineOperandReg(0, SrcReg, false);
1061 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001062 break;
1063
1064 default:
1065 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001066 }
1067
1068 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001069}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001070
1071
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001072//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001073// Copy from a register to memory (i.e., Store). Register number must
1074// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001075//---------------------------------------------------------------------------
1076
1077
Chris Lattner5216cc52002-02-04 05:59:25 +00001078MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1079 unsigned DestPtrReg,
1080 int Offset, int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001081 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001082 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001083 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001084 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001085 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001086 MI->SetMachineOperandReg(0, SrcReg, false);
1087 MI->SetMachineOperandReg(1, DestPtrReg, false);
1088 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1089 (int64_t) Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001090 break;
1091
1092 case FPSingleRegType:
1093 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001098 break;
1099
1100 case FPDoubleRegType:
1101 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001106 break;
1107
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001108 case IntCCRegType:
1109 assert( 0 && "Cannot directly store %ccr to memory");
1110
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001111 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001112 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001113 }
1114
1115 return MI;
1116}
1117
1118
1119//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001120// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001121// register number
1122//---------------------------------------------------------------------------
1123
1124
Chris Lattner5216cc52002-02-04 05:59:25 +00001125MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1126 int Offset,
1127 unsigned DestReg,
1128 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001129 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001130 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001131 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001132 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001133 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001134 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1135 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1136 (int64_t) Offset);
1137 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001138 break;
1139
1140 case FPSingleRegType:
1141 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-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 Sasanka5b8971f2001-10-16 01:23:19 +00001146
1147 break;
1148
1149 case FPDoubleRegType:
1150 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001151 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1152 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1153 (int64_t) Offset);
1154 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001155 break;
1156
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001157 case IntCCRegType:
1158 assert( 0 && "Cannot directly load into %ccr from memory");
1159
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001160 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001161 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001162 }
1163
1164 return MI;
1165}
1166
1167
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001168
1169
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001170
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001171//---------------------------------------------------------------------------
1172// Generate a copy instruction to copy a value to another. Temporarily
1173// used by PhiElimination code.
1174//---------------------------------------------------------------------------
1175
1176
Chris Lattner5216cc52002-02-04 05:59:25 +00001177MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001178 int RegType = getRegType( Src );
1179
1180 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001181
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001182 MachineInstr * MI = NULL;
1183
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001184 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001185 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001186 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001187 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1188 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1189 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001190 break;
1191
1192 case FPSingleRegType:
1193 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001194 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1195 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001196 break;
1197
1198
1199 case FPDoubleRegType:
1200 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001201 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1202 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001203 break;
1204
1205 default:
1206 assert(0 && "Unknow RegType in CpValu2Value");
1207 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001208
1209 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001210}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001211
1212
1213
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001214
1215
1216
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001217//----------------------------------------------------------------------------
1218// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001219// a call machine instruction. The caller saving/restoring instructions are
1220// inserted like:
1221//
1222// ** caller saving instructions
1223// other instructions inserted for the call by ColorCallArg
1224// CALL instruction
1225// other instructions inserted for the call ColorCallArg
1226// ** caller restoring instructions
1227//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001228//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001229
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001230
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001231void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1232 const BasicBlock *BB,
1233 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001234
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001235 // has set to record which registers were saved/restored
1236 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001237 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001238
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001239 // Now find the LR of the return value of the call
1240 // The last *implicit operand* is the return value of a call
1241 // Insert it to to he PushedRegSet since we must not save that register
1242 // and restore it after the call.
1243 // We do this because, we look at the LV set *after* the instruction
1244 // to determine, which LRs must be saved across calls. The return value
1245 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001246
1247
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001248 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001249
Chris Lattner5216cc52002-02-04 05:59:25 +00001250 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001251 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001252 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001253
Chris Lattner5216cc52002-02-04 05:59:25 +00001254 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001255 PushedRegSet.insert(
1256 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001257 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001258 }
1259
1260
Chris Lattner7e5ee422002-02-05 04:20:12 +00001261 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1262 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001263
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001264 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001265 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001266
1267 // get the live range corresponding to live var
1268 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1269
1270 // LR can be null if it is a const since a const
1271 // doesn't have a dominating def - see Assumptions above
1272 if( LR ) {
1273
1274 if( LR->hasColor() ) {
1275
1276 unsigned RCID = (LR->getRegClass())->getID();
1277 unsigned Color = LR->getColor();
1278
1279 if ( isRegVolatile(RCID, Color) ) {
1280
1281 // if the value is in both LV sets (i.e., live before and after
1282 // the call machine instruction)
1283
1284 unsigned Reg = getUnifiedRegNum(RCID, Color);
1285
1286 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1287
1288 // if we haven't already pushed that register
1289
1290 unsigned RegType = getRegType( LR );
1291
1292 // Now get two instructions - to push on stack and pop from stack
1293 // and add them to InstrnsBefore and InstrnsAfter of the
1294 // call instruction
1295
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001296
1297 int StackOff = PRA.mcInfo.pushTempValue(target,
1298 getSpilledRegSize(RegType));
1299
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001300
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001301 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1302 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001303
1304 //---- Insert code for pushing the reg on stack ----------
1305
1306 if( RegType == IntCCRegType ) {
1307
1308 // Handle IntCCRegType specially since we cannot directly
1309 // push %ccr on to the stack
1310
Chris Lattner7e5ee422002-02-05 04:20:12 +00001311 const ValueSet &LVSetBef =
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001312 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1313
1314 // get a free INTEGER register
1315 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001316 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
1317 IntRegType, MInst, &LVSetBef, AdIBefCC, AdIAftCC);
1318
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001319 // insert the instructions in reverse order since we are
1320 // adding them to the front of InstrnsBefore
1321
1322 if(AdIAftCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001323 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001324
1325 AdICpCC = cpCCR2IntMI(FreeIntReg);
Chris Lattner30e23da2002-04-09 05:13:04 +00001326 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001327
1328 if(AdIBefCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001329 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001330
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001331 if(DEBUG_RA) {
1332 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1333 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1334 cerr << "\t" << *AdICpCC;
1335 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1336 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001337
1338 } else {
1339 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001340 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Chris Lattner30e23da2002-04-09 05:13:04 +00001341 PRA.AddedInstrMap[MInst].InstrnsBefore.push_front(AdIBef);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001342 }
1343
1344
1345 //---- Insert code for popping the reg from the stack ----------
1346
Chris Lattner7e5ee422002-02-05 04:20:12 +00001347 if (RegType == IntCCRegType) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001348
1349 // Handle IntCCRegType specially since we cannot directly
1350 // pop %ccr on from the stack
1351
1352 // get a free INT register
1353 int FreeIntReg =
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001354 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
1355 IntRegType, MInst, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001356
1357 if(AdIBefCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001358 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001359
1360 AdICpCC = cpInt2CCRMI(FreeIntReg);
Chris Lattner30e23da2002-04-09 05:13:04 +00001361 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001362
1363 if(AdIAftCC)
Chris Lattner30e23da2002-04-09 05:13:04 +00001364 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001365
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001366 if(DEBUG_RA) {
1367
1368 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1369 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1370 cerr << "\t" << *AdICpCC;
1371 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1372 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001373
1374 } else {
1375 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001376 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Chris Lattner30e23da2002-04-09 05:13:04 +00001377 PRA.AddedInstrMap[MInst].InstrnsAfter.push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001378 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001379
Chris Lattner7e5ee422002-02-05 04:20:12 +00001380 PushedRegSet.insert(Reg);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001381
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001382 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001383 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001384 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001385 if( RegType == IntCCRegType ) {
1386 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1387 if(AdIAftCC) cerr << *AdIAftCC;
1388 }
1389 else {
1390 if(AdIBef) cerr << *AdIBef << "\t";
1391 if(AdIAft) cerr << *AdIAft;
1392 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001393 }
1394 } // if not already pushed
1395
1396 } // if LR has a volatile color
1397
1398 } // if LR has color
1399
1400 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001401
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001402 } // for each value in the LV set after instruction
1403
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001404}
1405
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001406//---------------------------------------------------------------------------
1407// Copies %ccr into an integer register. IntReg is the UNIFIED register
1408// number.
1409//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001410
Chris Lattner5216cc52002-02-04 05:59:25 +00001411MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1412 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001413 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1414 SparcIntCCRegOrder::ccr),
1415 false, true);
1416 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001417 return MI;
1418}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001419
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001420//---------------------------------------------------------------------------
1421// Copies an integer register into %ccr. IntReg is the UNIFIED register
1422// number.
1423//---------------------------------------------------------------------------
1424
Chris Lattner5216cc52002-02-04 05:59:25 +00001425MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1426 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001427 MI->SetMachineOperandReg(0, IntReg, false);
1428 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1429 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1430 true, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001431 return MI;
1432}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001433
1434
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001435
1436
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001437//---------------------------------------------------------------------------
1438// Print the register assigned to a LR
1439//---------------------------------------------------------------------------
1440
Chris Lattner5216cc52002-02-04 05:59:25 +00001441void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001442 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001443 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001444
Chris Lattner5216cc52002-02-04 05:59:25 +00001445 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001446 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001447 return;
1448 }
1449
1450 // if a color is found
1451
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001452 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001453
Chris Lattner5216cc52002-02-04 05:59:25 +00001454 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001455 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001456
Chris Lattner5216cc52002-02-04 05:59:25 +00001457 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001458 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001459 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001460 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001461 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001462 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001463}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001464
1465//---------------------------------------------------------------------------
1466// This method examines instructions inserted by RegAlloc code before a
1467// machine instruction to detect invalid orders that destroy values before
1468// they are used. If it detects such conditions, it reorders the instructions.
1469//
1470// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001471// instructions inserted by RegAlloc. All such instruction MUST have
1472// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001473
1474// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1475// this method is called.
1476
1477// This method uses two vectors for efficiency in accessing
1478
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001479// Since instructions are inserted in RegAlloc, this assumes that the
1480// first operand is the source reg and the last operand is the dest reg.
1481
1482// All the uses are before THE def to a register
1483
1484
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001485//---------------------------------------------------------------------------
Chris Lattner7f74a562002-01-20 22:54:45 +00001486void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1487 std::vector<MachineInstr *> &OrdVec,
1488 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001489
1490 /*
1491 Problem: We can have instructions inserted by RegAlloc like
1492 1. add %ox %g0 %oy
1493 2. add %oy %g0 %oz, where z!=x or z==x
1494
1495 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001496
1497 Solution:
1498 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001499
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001500 Algorithm:
1501
1502 do
1503 for each instruction 'DefInst' in the UnOrdVec
1504 for each instruction 'UseInst' that follows the DefInst
1505 if the reg defined by DefInst is used by UseInst
1506 mark DefInst as not movable in this iteration
1507 If DefInst is not marked as not-movable, move DefInst to OrdVec
1508 while all instructions in DefInst are moved to OrdVec
1509
1510 For moving, we call the move2OrdVec(). It checks whether there is a def
1511 in it for the uses in the instruction to be added to OrdVec. If there
1512 are no preceding defs, it just appends the instruction. If there is a
1513 preceding def, it puts two instructions to save the reg on stack before
1514 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001515
1516 */
1517
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001518 bool CouldMoveAll;
1519 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001520
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001521 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001522 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001523 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001524
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001525 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001526
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001527 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001528
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001529 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001530
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001531 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001532
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001533 //cerr << "\nInst in UnordVec = " << *DefInst;
1534
1535 // last operand is the def (unless for a store which has no def reg)
1536 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1537
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001538 if( DefOp.opIsDef() &&
1539 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001540
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001541 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001542
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001543 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001544
Chris Lattner7f74a562002-01-20 22:54:45 +00001545 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001546 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001547
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001548 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1549
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001550 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001551 if( UseInst == NULL) continue;
1552
1553 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001554 MachineOperand& UseOp = UseInst->getOperand(0);
1555
1556 if( ! UseOp.opIsDef() &&
1557 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1558
1559 // if use is a register ...
1560
1561 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1562
1563 // if Def and this use are the same, it means that this use
1564 // is destroyed by a def before it is used
1565
1566 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001567
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001568 DefEqUse = true;
1569 CouldMoveAll = false;
1570 DebugPrint = true;
1571 break;
1572 } // if two registers are equal
1573
1574 } // if use is a register
1575
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001576 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001577
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001578 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001579
1580 // after examining all the instructions that follow the DefInst
1581 // if there are no dependencies, we can move it to the OrdVec
1582
1583 // cerr << "Moved to Ord: " << *DefInst;
1584
1585 moveInst2OrdVec(OrdVec, DefInst, PRA);
1586
1587 //OrdVec.push_back(DefInst);
1588
1589 // mark the pos of DefInst with NULL to indicate that it is
1590 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001591 *DefIt = NULL;
1592 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001593
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001595
1596 } // for all instructions in the UnordVec
1597
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001598
Chris Lattner5216cc52002-02-04 05:59:25 +00001599 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001600
Chris Lattner5216cc52002-02-04 05:59:25 +00001601 if (DebugPrint) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001602 cerr << "\nAdded instructions were reordered to:\n";
1603 for(unsigned int i=0; i < OrdVec.size(); i++)
1604 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001605 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001606}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001607
1608
1609
1610
1611
Chris Lattner7f74a562002-01-20 22:54:45 +00001612void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001613 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001614 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001615 MachineOperand& UseOp = UnordInst->getOperand(0);
1616
1617 if( ! UseOp.opIsDef() &&
1618 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1619
1620 // for the use of UnordInst, see whether there is a defining instr
1621 // before in the OrdVec
1622 bool DefEqUse = false;
1623
Chris Lattner7f74a562002-01-20 22:54:45 +00001624 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001625
1626 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1627
1628 MachineInstr *OrdInst = *OrdIt ;
1629
1630 MachineOperand& DefOp =
1631 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1632
1633 if( DefOp.opIsDef() &&
1634 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1635
1636 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1637
1638 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1639
1640 // we are here because there is a preceding def in the OrdVec
1641 // for the use in this intr we are going to insert. This
1642 // happened because the original code was like:
1643 // 1. add %ox %g0 %oy
1644 // 2. add %oy %g0 %ox
1645 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1646 // Now we are processing %ox of 1.
1647 // We have to
1648
1649 const int UReg = DefOp.getMachineRegNum();
1650 const int RegType = getRegType(UReg);
1651 MachineInstr *AdIBef, *AdIAft;
1652
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001653 const int StackOff = PRA.mcInfo.pushTempValue(target,
1654 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001655
1656 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001657 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001658 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1659 OrdIt++; // points to current instr we processed
1660
1661 // Load directly into DReg (%oy)
1662 MachineOperand& DOp=
1663 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1664 assert(DOp.opIsDef() && "Last operand is not the def");
1665 const int DReg = DOp.getMachineRegNum();
1666
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001667 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001668 OrdVec.push_back(AdIAft);
1669
1670 cerr << "\nFixed CIRCULAR references by reordering";
1671
1672 if( DEBUG_RA ) {
1673 cerr << "\nBefore CIRCULAR Reordering:\n";
1674 cerr << *UnordInst;
1675 cerr << *OrdInst;
1676
1677 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1678 for(unsigned i=0; i < OrdVec.size(); i++)
1679 cerr << *(OrdVec[i]);
1680 }
1681
1682 // Do not copy the UseInst to OrdVec
1683 DefEqUse = true;
1684 break;
1685
1686 }// if two registers are equal
1687
1688 } // if Def is a register
1689
1690 } // for each instr in OrdVec
1691
Chris Lattner5216cc52002-02-04 05:59:25 +00001692 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001693
1694 // We didn't find a def in the OrdVec, so just append this inst
1695 OrdVec.push_back( UnordInst );
1696 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1697 }
1698
1699 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001700}