blob: 7cdd80bd918f6cbf953fc81a7b960ecc98f3f12b [file] [log] [blame]
Ruchira Sasanka94d86e92001-09-14 20:31:39 +00001#include "llvm/Target/Sparc.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00002#include "SparcInternals.h"
3#include "llvm/Method.h"
4#include "llvm/iTerminators.h"
Ruchira Sasanka91442282001-09-30 23:16:47 +00005#include "llvm/iOther.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00006#include "llvm/CodeGen/InstrScheduling.h"
7#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner20b1ea02001-09-14 03:47:57 +00008
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00009#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
10#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner20b1ea02001-09-14 03:47:57 +000011
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012
13
14
15//---------------------------------------------------------------------------
16// UltraSparcRegInfo
17//---------------------------------------------------------------------------
18
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000019//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000020// Finds the return value of a call instruction
21//---------------------------------------------------------------------------
22
23const Value *
24UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const{
25
26 unsigned OpCode = CallMI->getOpCode();
27 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
28
29 if( OpCode == CALL ) {
30
31 // The one before the last implicit operand is the return value of
32 // a CALL instr
33 if( NumOfImpRefs > 1 )
34 if( CallMI->implicitRefIsDefined(NumOfImpRefs-2) )
35 return CallMI->getImplicitRef(NumOfImpRefs-2);
36
37 }
Vikram S. Adve53fec862001-10-22 13:41:12 +000038 else if( OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000039
40 // The last implicit operand is the return value of a JMPL in
41 if( NumOfImpRefs > 0 )
42 if( CallMI->implicitRefIsDefined(NumOfImpRefs-1) )
43 return CallMI->getImplicitRef(NumOfImpRefs-1);
44 }
45 else
46 assert(0 && "OpCode must be CALL/JMPL for a call instr");
47
48 return NULL;
49
50}
51
52//---------------------------------------------------------------------------
53// Finds the return address of a call instruction
54//---------------------------------------------------------------------------
55
56const Value *
57UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI)const {
58
59 unsigned OpCode = CallMI->getOpCode();
60
61 if( OpCode == CALL) {
62
63 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
64
65 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
66 // The last implicit operand is the return address of a CALL instr
67 return CallMI->getImplicitRef(NumOfImpRefs-1);
68
69 }
Vikram S. Adve53fec862001-10-22 13:41:12 +000070 else if( OpCode == JMPLCALL ) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000071
72 MachineOperand & MO = ( MachineOperand &) CallMI->getOperand(2);
73 return MO.getVRegValue();
74
75 }
76 else
77 assert(0 && "OpCode must be CALL/JMPL for a call instr");
78
79 assert(0 && "There must be a return addr for a call instr");
80
81 return NULL;
82
83}
84
85
86//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +000087// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000088//---------------------------------------------------------------------------
89
90const unsigned
91UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
92
93 unsigned OpCode = CallMI->getOpCode();
94 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
95 int NumArgs = -1;
96
97 if( OpCode == CALL ) {
98
99 switch( NumOfImpRefs ) {
100
101 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
102
103 case 1: NumArgs = 0;
104 break;
105
106 default: // two or more implicit refs
107 if( CallMI->implicitRefIsDefined(NumOfImpRefs-2) )
108 NumArgs = NumOfImpRefs - 2; // i.e., NumOfImpRef-2 is the ret val
109 else
110 NumArgs = NumOfImpRefs - 1;
111 }
112
113 }
Vikram S. Adve53fec862001-10-22 13:41:12 +0000114 else if( OpCode == JMPLCALL ) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000115
116 // The last implicit operand is the return value of a JMPL instr
117 if( NumOfImpRefs > 0 ) {
118 if( CallMI->implicitRefIsDefined(NumOfImpRefs-1) )
119 NumArgs = NumOfImpRefs - 1; // i.e., NumOfImpRef-1 is the ret val
120 else
121 NumArgs = NumOfImpRefs;
122 }
123 else
124 NumArgs = NumOfImpRefs;
125 }
126 else
127 assert(0 && "OpCode must be CALL/JMPL for a call instr");
128
129 assert( (NumArgs != -1) && "Internal error in getCallInstNumArgs" );
130 return (unsigned) NumArgs;
131
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000132
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000133}
134
135
136//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000137// Suggests a register for the ret address in the RET machine instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000138//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +0000139
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000140void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI,
141 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000142
Vikram S. Adve53fec862001-10-22 13:41:12 +0000143 assert( (RetMI->getNumOperands() >= 2)
144 && "JMPL/RETURN must have 3 and 2 operands respectively");
145
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000146 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
147
148 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000149
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000150 // TODO (Optimize):
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000151 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000152 // we have to test later whether it received the suggested color.
153 // In that case, a LR has to be created at the start of method.
154 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000155
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000156 /*
157 const Value *RetAddrVal = MO.getVRegValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000158
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000159 assert( RetAddrVal && "LR for ret address must be created at start");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000160
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000161 LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
162 RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
163 SparcIntRegOrdr::i7) );
164 */
Ruchira Sasanka91442282001-09-30 23:16:47 +0000165
Ruchira Sasanka91442282001-09-30 23:16:47 +0000166
167}
168
169
170//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000171// Suggests a register for the ret address in the JMPL/CALL machine instr
Ruchira Sasanka91442282001-09-30 23:16:47 +0000172//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000173void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
174 LiveRangeInfo& LRI,
175 vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000176
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000177
178 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
179
180 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
181 // create a new LR for the return address and color it
182
183 LiveRange * RetAddrLR = new LiveRange();
184 RetAddrLR->add( RetAddrVal );
185 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
186 RetAddrLR->setRegClass( RCList[RegClassID] );
187 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
188 LRI.addLRToMap( RetAddrVal, RetAddrLR);
189
190
191 /*
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000192 assert( (CallMI->getNumOperands() == 3) && "JMPL must have 3 operands");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000193
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000194 // directly set color since the LR of ret address (if there were one)
195 // will not extend after the call instr
196
197 MachineOperand & MO = ( MachineOperand &) CallMI->getOperand(2);
198 MO.setRegForValue( getUnifiedRegNum( IntRegClassID,SparcIntRegOrder::o7) );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000199
200 */
201
Ruchira Sasanka91442282001-09-30 23:16:47 +0000202}
203
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000204
205
Ruchira Sasanka91442282001-09-30 23:16:47 +0000206
207//---------------------------------------------------------------------------
208// This method will suggest colors to incoming args to a method.
209// If the arg is passed on stack due to the lack of regs, NOTHING will be
210// done - it will be colored (or spilled) as a normal value.
211//---------------------------------------------------------------------------
212
213void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *const Meth,
214 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000215{
216
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000217 // get the argument list
218 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
219 // get an iterator to arg list
220 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
Chris Lattner20b1ea02001-09-14 03:47:57 +0000221
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000222 // for each argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000223 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000224
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000225 // get the LR of arg
226 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000227 assert( LR && "No live range found for method arg");
228
229 unsigned RegType = getRegType( LR );
230
Chris Lattner20b1ea02001-09-14 03:47:57 +0000231
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000232 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka91442282001-09-30 23:16:47 +0000233 if( RegType == IntRegType ) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000234
Ruchira Sasanka91442282001-09-30 23:16:47 +0000235 if( argNo < NumOfIntArgRegs) {
236 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000237
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000238 }
239
240 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000241 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000242 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000243 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000244
Chris Lattner20b1ea02001-09-14 03:47:57 +0000245 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000246 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
247 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
248
249
250 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
251 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
252
Chris Lattner20b1ea02001-09-14 03:47:57 +0000253
Chris Lattner20b1ea02001-09-14 03:47:57 +0000254 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000255
Chris Lattner20b1ea02001-09-14 03:47:57 +0000256}
257
Ruchira Sasanka91442282001-09-30 23:16:47 +0000258//---------------------------------------------------------------------------
259//
260//---------------------------------------------------------------------------
261
262void UltraSparcRegInfo::colorMethodArgs(const Method *const Meth,
263 LiveRangeInfo& LRI,
264 AddedInstrns *const FirstAI) const {
265
266 // get the argument list
267 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
268 // get an iterator to arg list
269 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
270
271 MachineInstr *AdMI;
272
273
274 // for each argument
275 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
276
277 // get the LR of arg
278 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
279 assert( LR && "No live range found for method arg");
280
281
Ruchira Sasanka91442282001-09-30 23:16:47 +0000282 unsigned RegType = getRegType( LR );
283 unsigned RegClassID = (LR->getRegClass())->getID();
284
285
286 // find whether this argument is coming in a register (if not, on stack)
287
288 bool isArgInReg = false;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000289 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000290
291 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
292 isArgInReg = true;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000293 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000294 }
295 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
296 isArgInReg = true;
297 UniArgReg = getUnifiedRegNum( RegClassID,
298 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
299 }
300 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
301 isArgInReg = true;
302 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
303 }
304
305
306 if( LR->hasColor() ) {
307
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000308 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
309
310 // if LR received the correct color, nothing to do
311 if( UniLRReg == UniArgReg )
312 continue;
313
Ruchira Sasanka91442282001-09-30 23:16:47 +0000314 // We are here because the LR did not have a suggested
315 // color or did not receive the suggested color but LR got a register.
316 // Now we have to copy %ix reg (or stack pos of arg)
317 // to the register it was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000318
319 // if the arg is coming in UniArgReg register MUST go into
320 // the UniLRReg register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000321 if( isArgInReg )
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000322 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000323
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000324 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000325
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000326 // Now the arg is coming on stack. Since the LR recieved a register,
327 // we just have to load the arg on stack into that register
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000328 const MachineFrameInfo& frameInfo = target.getFrameInfo();
329 assert(frameInfo.argsOnStackHaveFixedSize());
330
331 bool growUp;
332 int firstArg =
333 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
334 int offsetFromFP =
335 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
336 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
337
338 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000339 UniLRReg, RegType );
340 }
341
342 FirstAI->InstrnsBefore.push_back( AdMI );
343
344 } // if LR received a color
345
346 else {
347
348 // Now, the LR did not receive a color. But it has a stack offset for
349 // spilling.
350
351 // So, if the arg is coming in UniArgReg register, we can just move
352 // that on to the stack pos of LR
353
354
355 if( isArgInReg ) {
356
357 MachineInstr *AdIBef =
358 cpReg2MemMI(UniArgReg, getFramePointer(),
359 LR->getSpillOffFromFP(), RegType );
360
361 FirstAI->InstrnsBefore.push_back( AdMI );
362 }
363
364 else {
365
366 // Now the arg is coming on stack. Since the LR did NOT
367 // recieved a register as well, it is allocated a stack position. We
368 // can simply change the stack poistion of the LR. We can do this,
369 // since this method is called before any other method that makes
370 // uses of the stack pos of the LR (e.g., updateMachineInstr)
371
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000372 const MachineFrameInfo& frameInfo = target.getFrameInfo();
373 assert(frameInfo.argsOnStackHaveFixedSize());
374
375 bool growUp;
376 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
377 int offsetFromFP =
378 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
379 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
380
381 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000382 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000383
384 }
385
Ruchira Sasanka91442282001-09-30 23:16:47 +0000386 } // for each incoming argument
387
388}
389
Chris Lattner20b1ea02001-09-14 03:47:57 +0000390
391
392
Ruchira Sasanka91442282001-09-30 23:16:47 +0000393//---------------------------------------------------------------------------
394// This method is called before graph coloring to suggest colors to the
395// outgoing call args and the return value of the call.
396//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000397void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000398 LiveRangeInfo& LRI,
399 vector<RegClass *> RCList) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000400
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000401 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000402
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000403 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000404
Chris Lattner20b1ea02001-09-14 03:47:57 +0000405
Ruchira Sasanka91442282001-09-30 23:16:47 +0000406 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000407 // will be in %o0 if the value is an integer type, or in %f0 if the
408 // value is a float type.
409
Ruchira Sasanka91442282001-09-30 23:16:47 +0000410 // the return value cannot have a LR in machine instruction since it is
411 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000412
Ruchira Sasanka91442282001-09-30 23:16:47 +0000413 // if type is not void, create a new live range and set its
414 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000415
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000416
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000417 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000418
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000419
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000420 if( RetVal ) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000421
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000422 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
423 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000424
425
426 // create a new LR for the return value
427
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000428 LiveRange * RetValLR = new LiveRange();
429 RetValLR->add( RetVal );
430 unsigned RegClassID = getRegClassIDOfValue( RetVal );
431 RetValLR->setRegClass( RCList[RegClassID] );
432 LRI.addLRToMap( RetVal, RetValLR);
433
434 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000435
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000436 if( RegClassID == IntRegClassID )
437 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
438 else if (RegClassID == FloatRegClassID )
439 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
440 else assert( 0 && "Unknown reg class for return value of call\n");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000441
Chris Lattner20b1ea02001-09-14 03:47:57 +0000442 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000443
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000444
Ruchira Sasanka91442282001-09-30 23:16:47 +0000445 // Now suggest colors for arguments (operands) of the call instruction.
446 // Colors are suggested only if the arg number is smaller than the
447 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000448 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000449
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000450 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000451
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000452 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
453
454 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000455
456 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000457 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000458
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000459 // not possible to have a null LR since all args (even consts)
460 // must be defined before
461 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000462 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000463 cerr << " ERROR: In call instr, no LR for arg: " ;
464 printValue(CallArg); cerr << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000465 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000466 assert(0 && "NO LR for call arg");
467 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000468 }
469
470 unsigned RegType = getRegType( LR );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000471
Ruchira Sasanka91442282001-09-30 23:16:47 +0000472 // if the arg is in int class - allocate a reg for an int arg
473 if( RegType == IntRegType ) {
474
475 if( argNo < NumOfIntArgRegs)
476 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
477
478 else if (DEBUG_RA)
479 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000480 cerr << " Regr not suggested for int call arg" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000481
Ruchira Sasanka91442282001-09-30 23:16:47 +0000482 }
483 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
484 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
485
486
487 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
488 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
489
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000490
Ruchira Sasanka91442282001-09-30 23:16:47 +0000491 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000492
Chris Lattner20b1ea02001-09-14 03:47:57 +0000493}
494
495
Ruchira Sasanka91442282001-09-30 23:16:47 +0000496//---------------------------------------------------------------------------
497// After graph coloring, we have call this method to see whehter the return
498// value and the call args received the correct colors. If not, we have
499// to instert copy instructions.
500//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000501
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000502void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000503 LiveRangeInfo& LRI,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000504 AddedInstrns *const CallAI,
505 PhyRegAlloc &PRA) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000506
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000507 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
508
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000509 // Reset the optional args area in the stack frame
510 // since that is reused for each call
511 //
512 PRA.mcInfo.resetOptionalArgs(target);
513
Ruchira Sasanka91442282001-09-30 23:16:47 +0000514 // First color the return value of the call.
515 // If there is a LR for the return value, it means this
516 // method returns a value
517
518 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000519
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000520 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000521
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000522 if( RetVal ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000523
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000524 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000525
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000526 if( !RetValLR ) {
527 cerr << "\nNo LR for:";
528 printValue( RetVal );
529 cerr << endl;
530 assert( RetValLR && "ERR:No LR for non-void return value");
531 //return;
532 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000533
534 unsigned RegClassID = (RetValLR->getRegClass())->getID();
535 bool recvCorrectColor = false;
536
537 unsigned CorrectCol; // correct color for ret value
538 if(RegClassID == IntRegClassID)
539 CorrectCol = SparcIntRegOrder::o0;
540 else if(RegClassID == FloatRegClassID)
541 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000542 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000543 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000544 return;
545 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000546
547 // if the LR received the correct color, NOTHING to do
548
549 if( RetValLR->hasColor() )
550 if( RetValLR->getColor() == CorrectCol )
551 recvCorrectColor = true;
552
553
554 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000555 // put copy instruction
556
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000557 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000558
559 unsigned RegType = getRegType( RetValLR );
560
561 // the reg that LR must be colored with
562 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000563
564 if( RetValLR->hasColor() ) {
565
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000566 unsigned
567 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000568
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000569 // the return value is coming in UniRetReg but has to go into
570 // the UniRetLRReg
571
572 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000573
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000574 } // if LR has color
575 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000576
577 // if the LR did NOT receive a color, we have to move the return
578 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000579
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000580 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
581 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000582 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000583
584 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000585
586 } // the LR didn't receive the suggested color
587
588 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000589
590
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000591 // Now color all args of the call instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +0000592
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000593 vector <MachineInstr *> AddedInstrnsBefore;
594
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000595 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000596
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000597 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
598
599 const Value *CallArg = CallMI->getImplicitRef(i);
600
Ruchira Sasanka91442282001-09-30 23:16:47 +0000601 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000602 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000603
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000604 unsigned RegType = getRegType( CallArg );
605 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000606
607 // find whether this argument is coming in a register (if not, on stack)
608
609 bool isArgInReg = false;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000610 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000611
612 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
613 isArgInReg = true;
614 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
615 }
616 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
617 isArgInReg = true;
618 UniArgReg = getUnifiedRegNum(RegClassID,
619 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
620 }
621 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
622 isArgInReg = true;
623 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
Chris Lattner20b1ea02001-09-14 03:47:57 +0000624 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000625
Chris Lattner20b1ea02001-09-14 03:47:57 +0000626
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000627 // not possible to have a null LR since all args (even consts)
628 // must be defined before
629 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000630 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000631 cerr << " ERROR: In call instr, no LR for arg: " ;
632 printValue(CallArg); cerr << endl;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000633 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000634 assert(0 && "NO LR for call arg");
635 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000636 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000637
Ruchira Sasanka91442282001-09-30 23:16:47 +0000638
639 // if the LR received the suggested color, NOTHING to do
640
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000641
Ruchira Sasanka91442282001-09-30 23:16:47 +0000642 if( LR->hasColor() ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000643
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000644
645 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
646
647 // if LR received the correct color, nothing to do
648 if( UniLRReg == UniArgReg )
649 continue;
650
Ruchira Sasanka91442282001-09-30 23:16:47 +0000651 // We are here because though the LR is allocated a register, it
652 // was not allocated the suggested register. So, we have to copy %ix reg
653 // (or stack pos of arg) to the register it was colored with
654
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000655 // the LR is colored with UniLRReg but has to go into UniArgReg
656 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000657
658 if( isArgInReg )
659 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
660
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000661 else {
662 // Now, we have to pass the arg on stack. Since LR received a register
663 // we just have to move that register to the stack position where
664 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000665
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000666 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000667
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000668 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000669 }
670
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000671 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +0000672 }
673
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000674 else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000675
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000676 if( isArgInReg ) {
677
678 // Now the LR did NOT recieve a register but has a stack poistion.
679 // Since, the outgoing arg goes in a register we just have to insert
680 // a load instruction to load the LR to outgoing register
681
682
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000683 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000684 UniArgReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000685
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000686 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000687 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000688
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000689 else {
690 // Now, we have to pass the arg on stack. Since LR also did NOT
691 // receive a register we have to move an argument in memory to
692 // outgoing parameter on stack.
693
694 // Optoimize: Optimize when reverse pointers in MahineInstr are
695 // introduced.
696 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
697 // fails, then use the following code. Currently, we cannot call the
698 // above method since we cannot find LVSetBefore without the BB
699
700 int TReg = PRA.getRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000701
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000702 int TmpOff = PRA.mcInfo.pushTempValue(target,
703 target.findOptimalStorageSize(LR->getType()));
704 // getStackOffsets().getNewTmpPosOffFromFP();
705
706 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
707
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000708 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000709
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000710 // Sequence:
711 // (1) Save TReg on stack
712 // (2) Load LR value into TReg from stack pos of LR
713 // (3) Store Treg on outgoing Arg pos on stack
714 // (4) Load the old value of TReg from stack to TReg (restore it)
715
716 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
717 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
718 TReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000719 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000720 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000721
722 // We directly add to CallAI->InstrnsBefore instead of adding to
723 // AddedInstrnsBefore since these instructions must not be
724 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000725
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000726 CallAI->InstrnsBefore.push_back( Ad1 );
727 CallAI->InstrnsBefore.push_back( Ad2 );
728 CallAI->InstrnsBefore.push_back( Ad3 );
729 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000730
731 cerr << "\n Caution: Call arg moved from stack to stack";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000732 }
733
Ruchira Sasanka91442282001-09-30 23:16:47 +0000734 }
735
736 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000737
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000738
739 // if we added any instruction before the call instruction, verify
740 // that they are in the proper order and if not, reorder them
741
742 if( ! AddedInstrnsBefore.empty() ) {
743
744 if( DEBUG_RA) {
745 cerr << "\nCalling reorder with instrns: \n";
746 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
747 cerr << *(AddedInstrnsBefore[i]);
748 }
749
750 vector <MachineInstr *> TmpVec;
751 OrderAddedInstrns(AddedInstrnsBefore, TmpVec);
752
753 if( DEBUG_RA) {
754 cerr << "\nAfter reordering instrns: \n";
755 for(unsigned i=0; i < TmpVec.size(); i++)
756 cerr << *(TmpVec[i]);
757 }
758
759 // copy the results back from TmpVec to InstrnsBefore
760 for(unsigned i=0; i < TmpVec.size(); i++)
761 CallAI->InstrnsBefore.push_back( TmpVec[i] );
762 }
763
764
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000765 // Reset optional args area again to be safe
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000766 PRA.mcInfo.resetOptionalArgs(target);
767
768
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000769}
770
Ruchira Sasanka91442282001-09-30 23:16:47 +0000771//---------------------------------------------------------------------------
772// This method is called for an LLVM return instruction to identify which
773// values will be returned from this method and to suggest colors.
774//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000775void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000776 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000777
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000778 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000779
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000780 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000781
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000782 // if there is an implicit ref, that has to be the ret value
783 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000784
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000785 // The first implicit operand is the return value of a return instr
786 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000787
788 MachineInstr *AdMI;
789 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000790
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000791 if( !LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000792 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000793 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000794 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000795 assert( LR && "No LR for return value of non-void method");
796 //return;
797 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000798
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000799 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000800
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000801 if( RegClassID == IntRegClassID )
802 LR->setSuggestedColor(SparcIntRegOrder::i0);
803
804 else if ( RegClassID == FloatRegClassID )
805 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000806
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000807 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000808
Ruchira Sasanka91442282001-09-30 23:16:47 +0000809}
810
Ruchira Sasanka91442282001-09-30 23:16:47 +0000811
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000812
813//---------------------------------------------------------------------------
814// Colors the return value of a method to %i0 or %f0, if possible. If it is
815// not possilbe to directly color the LR, insert a copy instruction to move
816// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
817// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000818//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000819void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000820 LiveRangeInfo& LRI,
821 AddedInstrns *const RetAI) const {
822
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000823 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000824
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000825 // if there is an implicit ref, that has to be the ret value
826 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000827
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000828 // The first implicit operand is the return value of a return instr
829 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000830
831 MachineInstr *AdMI;
832 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
833
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000834 if( ! LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000835 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000836 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000837 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000838 // assert( LR && "No LR for return value of non-void method");
839 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000840 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000841
Ruchira Sasanka91442282001-09-30 23:16:47 +0000842 unsigned RegClassID = getRegClassIDOfValue(RetVal);
843 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000844
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000845 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000846 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000847 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000848 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000849 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000850 else {
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000851 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000852 return;
853 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000854
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000855 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000856
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000857 if( LR->hasColor() )
858 if( LR->getColor() == CorrectCol )
859 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000860
861 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000862
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000863 if( LR->hasColor() ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000864
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000865 // We are here because the LR was allocted a regiter
866 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000867
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000868 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000869
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000870 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000871
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000872 // the LR received UniLRReg but must be colored with UniRetReg
873 // to pass as the return value
874
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000875 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000876 RetAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000877 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000878 else { // if the LR is spilled
Ruchira Sasanka91442282001-09-30 23:16:47 +0000879
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000880 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
881 UniRetReg, RegType);
882 RetAI->InstrnsBefore.push_back( AdMI );
883 cout << "\nCopied the return value from stack";
884 }
885
Ruchira Sasanka91442282001-09-30 23:16:47 +0000886 } // if there is a return value
887
888}
889
890
891//---------------------------------------------------------------------------
892// Copy from a register to register. Register number must be the unified
893// register number
894//---------------------------------------------------------------------------
895
896
897MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
898 const unsigned DestReg,
899 const int RegType) const {
900
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000901 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000902 "Invalid Register");
903
904 MachineInstr * MI = NULL;
905
906 switch( RegType ) {
907
908 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000909 case IntCCRegType:
910 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000911 MI = new MachineInstr(ADD, 3);
912 MI->SetMachineOperand(0, SrcReg, false);
913 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
914 MI->SetMachineOperand(2, DestReg, true);
915 break;
916
917 case FPSingleRegType:
918 MI = new MachineInstr(FMOVS, 2);
919 MI->SetMachineOperand(0, SrcReg, false);
920 MI->SetMachineOperand(1, DestReg, true);
921 break;
922
923 case FPDoubleRegType:
924 MI = new MachineInstr(FMOVD, 2);
925 MI->SetMachineOperand(0, SrcReg, false);
926 MI->SetMachineOperand(1, DestReg, true);
927 break;
928
929 default:
930 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000931 }
932
933 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000934}
Chris Lattner20b1ea02001-09-14 03:47:57 +0000935
936
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000937//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000938// Copy from a register to memory (i.e., Store). Register number must
939// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000940//---------------------------------------------------------------------------
941
942
943MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
944 const unsigned DestPtrReg,
945 const int Offset,
946 const int RegType) const {
947
948
949 MachineInstr * MI = NULL;
950
951 switch( RegType ) {
952
953 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000954 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000955 MI = new MachineInstr(STX, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000956 MI->SetMachineOperand(0, SrcReg, false);
957 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000958 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
959 (int64_t) Offset, false);
960 break;
961
962 case FPSingleRegType:
963 MI = new MachineInstr(ST, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000964 MI->SetMachineOperand(0, SrcReg, false);
965 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000966 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
967 (int64_t) Offset, false);
968 break;
969
970 case FPDoubleRegType:
971 MI = new MachineInstr(STD, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000972 MI->SetMachineOperand(0, SrcReg, false);
973 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000974 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
975 (int64_t) Offset, false);
976 break;
977
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000978 case IntCCRegType:
979 assert( 0 && "Cannot directly store %ccr to memory");
980
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000981 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000982 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000983 }
984
985 return MI;
986}
987
988
989//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000990// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000991// register number
992//---------------------------------------------------------------------------
993
994
995MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
996 const int Offset,
997 const unsigned DestReg,
998 const int RegType) const {
999
1000 MachineInstr * MI = NULL;
1001
1002 switch( RegType ) {
1003
1004 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001005 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001006 MI = new MachineInstr(LDX, 3);
1007 MI->SetMachineOperand(0, SrcPtrReg, false);
1008 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1009 (int64_t) Offset, false);
1010 MI->SetMachineOperand(2, DestReg, false);
1011 break;
1012
1013 case FPSingleRegType:
1014 MI = new MachineInstr(LD, 3);
1015 MI->SetMachineOperand(0, SrcPtrReg, false);
1016 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1017 (int64_t) Offset, false);
1018 MI->SetMachineOperand(2, DestReg, false);
1019
1020 break;
1021
1022 case FPDoubleRegType:
1023 MI = new MachineInstr(LDD, 3);
1024 MI->SetMachineOperand(0, SrcPtrReg, false);
1025 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1026 (int64_t) Offset, false);
1027 MI->SetMachineOperand(2, DestReg, false);
1028 break;
1029
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001030 case IntCCRegType:
1031 assert( 0 && "Cannot directly load into %ccr from memory");
1032
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001033 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001034 assert(0 && "Unknow RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001035 }
1036
1037 return MI;
1038}
1039
1040
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001041
1042
1043// Following method is Not needed now
1044
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001045MachineInstr* UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001046
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001047 MachineInstr * MI = NULL;
1048
1049 MI = new MachineInstr(ADD, 3);
1050 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1051 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1052 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1053
1054
1055 return MI;
1056
1057}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001058
1059
1060
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001061//----------------------------------------------------------------------------
1062// This method inserts caller saving/restoring instructons before/after
1063// a call machine instruction.
1064//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001065
Ruchira Sasanka91442282001-09-30 23:16:47 +00001066
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001067void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1068 const BasicBlock *BB,
1069 PhyRegAlloc &PRA) const {
1070 // assert( (getInstrInfo()).isCall( MInst->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001071
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001072 // Clear the temp area of the stack
1073 PRA.mcInfo.popAllTempValues(target);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001074
1075 hash_set<unsigned> PushedRegSet;
1076
1077 // Now find the LR of the return value of the call
1078 // The last *implicit operand* is the return value of a call
1079 // Insert it to to he PushedRegSet since we must not save that register
1080 // and restore it after the call.
1081 // We do this because, we look at the LV set *after* the instruction
1082 // to determine, which LRs must be saved across calls. The return value
1083 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001084
1085
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001086 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001087
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001088 if( RetVal ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001089
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001090 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1091 assert( RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001092
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001093 PushedRegSet.insert(
1094 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
1095 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001096 }
1097
1098
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001099 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001100
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001101 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001102
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001103 // for each live var in live variable set after machine inst
1104 for( ; LIt != LVSetAft->end(); ++LIt) {
1105
1106 // get the live range corresponding to live var
1107 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1108
1109 // LR can be null if it is a const since a const
1110 // doesn't have a dominating def - see Assumptions above
1111 if( LR ) {
1112
1113 if( LR->hasColor() ) {
1114
1115 unsigned RCID = (LR->getRegClass())->getID();
1116 unsigned Color = LR->getColor();
1117
1118 if ( isRegVolatile(RCID, Color) ) {
1119
1120 // if the value is in both LV sets (i.e., live before and after
1121 // the call machine instruction)
1122
1123 unsigned Reg = getUnifiedRegNum(RCID, Color);
1124
1125 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1126
1127 // if we haven't already pushed that register
1128
1129 unsigned RegType = getRegType( LR );
1130
1131 // Now get two instructions - to push on stack and pop from stack
1132 // and add them to InstrnsBefore and InstrnsAfter of the
1133 // call instruction
1134
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001135 int StackOff = PRA.mcInfo.pushTempValue(target,
1136 target.findOptimalStorageSize(LR->getType()));
1137
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001138 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001139 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001140
1141
1142 //---- Insert code for pushing the reg on stack ----------
1143
1144 if( RegType == IntCCRegType ) {
1145
1146 // Handle IntCCRegType specially since we cannot directly
1147 // push %ccr on to the stack
1148
1149 const LiveVarSet *LVSetBef =
1150 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1151
1152 // get a free INTEGER register
1153 int FreeIntReg =
1154 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst,
1155 LVSetBef, AdIBefCC, AdIAftCC);
1156
1157 // insert the instructions in reverse order since we are
1158 // adding them to the front of InstrnsBefore
1159
1160 if(AdIAftCC)
1161 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1162
1163 AdICpCC = cpCCR2IntMI(FreeIntReg);
1164 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1165
1166 if(AdIBefCC)
1167 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1168
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001169 if(DEBUG_RA) {
1170 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1171 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1172 cerr << "\t" << *AdICpCC;
1173 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1174 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001175
1176 } else {
1177 // for any other register type, just add the push inst
Vikram S. Adve9576b152001-11-06 05:01:54 +00001178 AdIBef = cpReg2MemMI(Reg, getStackPointer(), StackOff, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001179 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1180 }
1181
1182
1183 //---- Insert code for popping the reg from the stack ----------
1184
1185 if( RegType == IntCCRegType ) {
1186
1187 // Handle IntCCRegType specially since we cannot directly
1188 // pop %ccr on from the stack
1189
1190 // get a free INT register
1191 int FreeIntReg =
1192 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst,
1193 LVSetAft, AdIBefCC, AdIAftCC);
1194
1195 if(AdIBefCC)
1196 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1197
1198 AdICpCC = cpInt2CCRMI(FreeIntReg);
1199 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1200
1201 if(AdIAftCC)
1202 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1203
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001204 if(DEBUG_RA) {
1205
1206 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1207 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1208 cerr << "\t" << *AdICpCC;
1209 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1210 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001211
1212 } else {
1213 // for any other register type, just add the pop inst
Vikram S. Adve9576b152001-11-06 05:01:54 +00001214 AdIAft = cpMem2RegMI(getStackPointer(), StackOff, Reg, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001215 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001216 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001217
1218 PushedRegSet.insert( Reg );
1219
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001220 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001221 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001222 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Adve9576b152001-11-06 05:01:54 +00001223 if( RegType == IntCCRegType )
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001224 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001225 else
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001226 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001227 }
1228 } // if not already pushed
1229
1230 } // if LR has a volatile color
1231
1232 } // if LR has color
1233
1234 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001235
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001236 } // for each value in the LV set after instruction
1237
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001238 // Clear the temp area of the stack
1239 PRA.mcInfo.popAllTempValues(target);
1240
Ruchira Sasanka91442282001-09-30 23:16:47 +00001241}
1242
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001243//---------------------------------------------------------------------------
1244// Copies %ccr into an integer register. IntReg is the UNIFIED register
1245// number.
1246//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001247
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001248MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1249 MachineInstr * MI = NULL;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001250
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001251 MI = new MachineInstr(RDCCR, 2);
1252 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1253 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001254
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001255 return MI;
1256}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001257
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001258//---------------------------------------------------------------------------
1259// Copies an integer register into %ccr. IntReg is the UNIFIED register
1260// number.
1261//---------------------------------------------------------------------------
1262
1263MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1264 MachineInstr * MI = NULL;
1265
1266 MI = new MachineInstr(WRCCR, 3);
1267 MI->SetMachineOperand(0, IntReg, false);
1268 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1269 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1270
1271 return MI;
1272}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001273
1274
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001275
1276
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001277//---------------------------------------------------------------------------
1278// Print the register assigned to a LR
1279//---------------------------------------------------------------------------
1280
1281void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1282
1283 unsigned RegClassID = (LR->getRegClass())->getID();
1284
Chris Lattner1e23ed72001-10-15 18:15:27 +00001285 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001286
1287 if( ! LR->hasColor() ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001288 cerr << " - could not find a color" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001289 return;
1290 }
1291
1292 // if a color is found
1293
Chris Lattner1e23ed72001-10-15 18:15:27 +00001294 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001295
1296 if( RegClassID == IntRegClassID ) {
1297
Chris Lattner1e23ed72001-10-15 18:15:27 +00001298 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1299 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001300 }
1301 else if ( RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001302 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001303 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattner1e23ed72001-10-15 18:15:27 +00001304 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1305 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001306 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001307}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001308
1309//---------------------------------------------------------------------------
1310// This method examines instructions inserted by RegAlloc code before a
1311// machine instruction to detect invalid orders that destroy values before
1312// they are used. If it detects such conditions, it reorders the instructions.
1313//
1314// The unordered instructions come in the UnordVec. These instructions are
1315// instructions inserted by RegAlloc. All suhc instruction MUST have
1316// their USES BEFORE THE DEFS.
1317
1318// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1319// this method is called.
1320
1321// This method uses two vectors for efficiency in accessing
1322
1323//---------------------------------------------------------------------------
1324void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec,
1325 vector<MachineInstr *> &OrdVec) const{
1326
1327 /*
1328 Problem: We can have instructions inserted by RegAlloc like
1329 1. add %ox %g0 %oy
1330 2. add %oy %g0 %oz, where z!=x or z==x
1331
1332 This is wrong since %oy used by 2 is overwritten by 1
1333 */
1334
1335 /* Algorithm:
1336
1337 Round 1:
1338 For each instruction 'Inst' in UnordVec, starting from UnordVec.begin,
1339 let Def be the destination reg of instr.
1340 For each use 'Use' of the following instruction
1341 If Def==Use continue
1342 If no use is found, push back 'Inst' to OrdVec
1343
1344 If no inst is left in UnordVec by the end of Round1, return
1345
1346 Round 2:
1347 For each inst 'Inst' left in UnordVec
1348 For each use 'Use' in Inst
1349 If threre is NO Def for this Use in an inst in OrdVec
1350 push back Inst
1351 Else
1352 push_front a stack save instr mem location "Loc"
1353 push_back a restore inst to load to Use from Loc
1354 discard Inst (assert that one operand is %g0)
1355
1356 */
1357
1358 bool CouldMoveAll = true;
1359
1360
1361 vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
1362
1363 for( ; DefIt != UnordVec.end(); ++DefIt ) {
1364
1365 // for each instruction in the UnordVec do ...
1366
1367 MachineInstr *DefInst = *DefIt;
1368
1369 // cerr << "\nDefInst = " << *DefInst;
1370
1371 for(unsigned OpNumD=0; OpNumD < DefInst->getNumOperands(); ++OpNumD) {
1372
1373 MachineOperand& DefOp = DefInst->getOperand(OpNumD);
1374
1375 if( DefOp.opIsDef() &&
1376 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1377
1378 // If the operand in DefInst is a def ...
1379
1380 bool DefEqUse = false;
1381
1382 vector<MachineInstr *>::iterator UseIt = DefIt;
1383 UseIt++;
1384
1385 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1386
1387 // for each inst (UseInst) that is below the DefInst do ...
1388
1389 MachineInstr *UseInst = *UseIt;
1390
1391 for(unsigned OpNumU=0; OpNumU < UseInst->getNumOperands(); ++OpNumU){
1392
1393 MachineOperand& UseOp = UseInst->getOperand(OpNumU);
1394
1395 if( ! UseOp.opIsDef() &&
1396 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1397
1398 // if use is a register ...
1399
1400 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1401
1402 // if Def and this use are the same, it means that this use
1403 // is destroyed by a def before it is used
1404
1405 DefEqUse = true;
1406 CouldMoveAll = false;
1407
1408 cerr << "\nReordered Ins (Moved up): " << *UseInst;
1409 break;
1410
1411 } // if two registers are equal
1412
1413 } // if use is a register
1414
1415 } // for all uses
1416
1417 }// for all use instructions
1418
1419 if( ! DefEqUse ) {
1420 // cerr << "\nMoved Inst = " << *DefInst;
1421 OrdVec.push_back(DefInst);
1422 *DefIt = NULL;
1423 }
1424 else
1425 break; // exit the loop since we can't move DefInst
1426
1427 } // if Def is a machine register
1428
1429 } // for all Defs in DefInst (there should be only 1)
1430
1431 } // for all instructions in the UnordVec
1432
1433
1434 if( CouldMoveAll ) {
1435 assert( (UnordVec.size() == OrdVec.size()) &&
1436 "Different Vec Sizes after reordering");
1437 return;
1438 }
1439
1440
1441 // We are here because there were two instructions like:
1442 // 1. add %ox %g0 %oy
1443 // 2. add %oy %g0 %oz, where z!=x or z==x
1444 // and hence we could not move 1 to the OrdVec
1445
1446 // cerr << "\nCaution: Added instructions will be RE-ORDERED !@!@!";
1447
1448 vector< MachineInstr *>::iterator UnordIt = UnordVec.begin();
1449
1450 for( ; UnordIt != UnordVec.end(); ++UnordIt ) {
1451
1452 MachineInstr *UnordInst = *UnordIt;
1453 if( UnordInst == NULL ) continue;
1454
1455 for(unsigned OpNumU=0; OpNumU < UnordInst->getNumOperands(); ++OpNumU) {
1456
1457 MachineOperand& UseOp = UnordInst->getOperand(OpNumU);
1458
1459 if( ! UseOp.opIsDef() &&
1460 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1461
1462 if( UseOp.getMachineRegNum() == getZeroRegNum() )
1463 continue;
1464
1465 // for all uses of UnordInst
1466 bool DefEqUse = false;
1467
1468 vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
1469
1470 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1471
1472 MachineInstr *OrdInst = *OrdIt ;
1473
1474 for(unsigned OpNumO=0; OpNumO < OrdInst->getNumOperands(); ++OpNumO){
1475
1476 MachineOperand& DefOp = OrdInst->getOperand(OpNumO);
1477
1478 if( DefOp.opIsDef() &&
1479 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1480
1481 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1482
1483 DefEqUse = true;
1484 assert(0 && "Insert save/restre code for reordering");
1485
1486 } // if two registers are equal
1487
1488 } // if Def is a register
1489
1490 } // for all defs
1491
1492 } // for each instr in OrdVec
1493
1494 if( !DefEqUse ) {
1495 OrdVec.push_back( UnordInst );
1496 cerr << "\nReordered instr (Moved Down): " << *UnordInst;
1497 }
1498
1499 } // if the operand in UnordInst is a use
1500
1501 } // for each use in the UnordInst
1502
1503 } // for each UnordInst in UnordVec
1504
1505}