blob: 0f3f9dc1bbaba27f78bf6e271c43c8dddf68170b [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
132
133}
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
282 // if the LR received the suggested color, NOTHING to be done
283 if( LR->hasSuggestedColor() && LR->hasColor() )
284 if( LR->getSuggestedColor() == LR->getColor() )
285 continue;
286
287 // We are here because the LR did not have a suggested
288 // color or did not receive the suggested color. Now handle
289 // individual cases.
290
291
292 unsigned RegType = getRegType( LR );
293 unsigned RegClassID = (LR->getRegClass())->getID();
294
295
296 // find whether this argument is coming in a register (if not, on stack)
297
298 bool isArgInReg = false;
299 unsigned UniArgReg = InvalidRegNum;
300
301 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
302 isArgInReg = true;
303 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::o0 + argNo );
304 }
305 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
306 isArgInReg = true;
307 UniArgReg = getUnifiedRegNum( RegClassID,
308 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
309 }
310 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
311 isArgInReg = true;
312 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
313 }
314
315
316 if( LR->hasColor() ) {
317
318 // We are here because the LR did not have a suggested
319 // color or did not receive the suggested color but LR got a register.
320 // Now we have to copy %ix reg (or stack pos of arg)
321 // to the register it was colored with.
322
323 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
324
325 // if the arg is coming in a register and goes into a register
326 if( isArgInReg )
327 AdMI = cpReg2RegMI(UniArgReg, UniLRReg, RegType );
328
329 else
330 assert(0 && "TODO: Color an Incoming arg on stack");
331
332 // Now add the instruction
333 FirstAI->InstrnsBefore.push_back( AdMI );
334
335 }
336
337 else { // LR is not colored (i.e., spilled)
338
339 assert(0 && "TODO: Color a spilled arg ");
340
341 }
342
343
344 } // for each incoming argument
345
346}
347
Chris Lattner20b1ea02001-09-14 03:47:57 +0000348
349
350
Ruchira Sasanka91442282001-09-30 23:16:47 +0000351//---------------------------------------------------------------------------
352// This method is called before graph coloring to suggest colors to the
353// outgoing call args and the return value of the call.
354//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000355void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000356 LiveRangeInfo& LRI,
357 vector<RegClass *> RCList) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000358
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000359 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000360
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000361 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000362
Chris Lattner20b1ea02001-09-14 03:47:57 +0000363
Ruchira Sasanka91442282001-09-30 23:16:47 +0000364 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000365 // will be in %o0 if the value is an integer type, or in %f0 if the
366 // value is a float type.
367
Ruchira Sasanka91442282001-09-30 23:16:47 +0000368 // the return value cannot have a LR in machine instruction since it is
369 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000370
Ruchira Sasanka91442282001-09-30 23:16:47 +0000371 // if type is not void, create a new live range and set its
372 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000373
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000374
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000375 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000376
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000377
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000378 if( RetVal ) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000379
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000380 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
381 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000382
383
384 // create a new LR for the return value
385
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000386 LiveRange * RetValLR = new LiveRange();
387 RetValLR->add( RetVal );
388 unsigned RegClassID = getRegClassIDOfValue( RetVal );
389 RetValLR->setRegClass( RCList[RegClassID] );
390 LRI.addLRToMap( RetVal, RetValLR);
391
392 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000393
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000394 if( RegClassID == IntRegClassID )
395 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
396 else if (RegClassID == FloatRegClassID )
397 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
398 else assert( 0 && "Unknown reg class for return value of call\n");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000399
Chris Lattner20b1ea02001-09-14 03:47:57 +0000400 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000401
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000402
Ruchira Sasanka91442282001-09-30 23:16:47 +0000403 // Now suggest colors for arguments (operands) of the call instruction.
404 // Colors are suggested only if the arg number is smaller than the
405 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000406 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000407
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000408 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000409
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000410 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
411
412 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000413
414 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000415 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000416
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000417 // not possible to have a null LR since all args (even consts)
418 // must be defined before
419 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000420 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000421 cerr << " ERROR: In call instr, no LR for arg: " ;
422 printValue(CallArg); cerr << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000423 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000424 assert(0 && "NO LR for call arg");
425 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000426 }
427
428 unsigned RegType = getRegType( LR );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000429
Ruchira Sasanka91442282001-09-30 23:16:47 +0000430 // if the arg is in int class - allocate a reg for an int arg
431 if( RegType == IntRegType ) {
432
433 if( argNo < NumOfIntArgRegs)
434 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
435
436 else if (DEBUG_RA)
437 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000438 cerr << " Regr not suggested for int call arg" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000439
Ruchira Sasanka91442282001-09-30 23:16:47 +0000440 }
441 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
442 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
443
444
445 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
446 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
447
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000448
Ruchira Sasanka91442282001-09-30 23:16:47 +0000449 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000450
Chris Lattner20b1ea02001-09-14 03:47:57 +0000451}
452
453
Ruchira Sasanka91442282001-09-30 23:16:47 +0000454//---------------------------------------------------------------------------
455// After graph coloring, we have call this method to see whehter the return
456// value and the call args received the correct colors. If not, we have
457// to instert copy instructions.
458//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000459
460
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000461void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000462 LiveRangeInfo& LRI,
463 AddedInstrns *const CallAI) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000464
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000465 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
466
Ruchira Sasanka91442282001-09-30 23:16:47 +0000467 // First color the return value of the call.
468 // If there is a LR for the return value, it means this
469 // method returns a value
470
471 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000472
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000473 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000474
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000475 if( RetVal ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000476
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000477 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000478
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000479 if( !RetValLR ) {
480 cerr << "\nNo LR for:";
481 printValue( RetVal );
482 cerr << endl;
483 assert( RetValLR && "ERR:No LR for non-void return value");
484 //return;
485 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000486
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000487 bool recvSugColor = false;
488
489 if( RetValLR->hasSuggestedColor() && RetValLR->hasColor() )
490 if( RetValLR->getSuggestedColor() == RetValLR->getColor())
491 recvSugColor = true;
492
493 // if we didn't receive the suggested color for some reason,
494 // put copy instruction
495
496 if( !recvSugColor ) {
497
498 if( RetValLR->hasColor() ) {
499
500 unsigned RegType = getRegType( RetValLR );
501 unsigned RegClassID = (RetValLR->getRegClass())->getID();
502
503 unsigned
504 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
505 unsigned UniRetReg = InvalidRegNum;
506
507 // find where we receive the return value depending on
508 // register class
509
510 if(RegClassID == IntRegClassID)
511 UniRetReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::o0);
512 else if(RegClassID == FloatRegClassID)
513 UniRetReg = getUnifiedRegNum( RegClassID, SparcFloatRegOrder::f0);
514
515
516 AdMI = cpReg2RegMI(UniRetReg, UniRetLRReg, RegType );
517 CallAI->InstrnsAfter.push_back( AdMI );
518
519
520 } // if LR has color
521 else {
522
523 assert(0 && "LR of return value is splilled");
524 }
525
526
527 } // the LR didn't receive the suggested color
528
529 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000530
531
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000532 // Now color all args of the call instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +0000533
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000534 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000535
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000536 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
537
538 const Value *CallArg = CallMI->getImplicitRef(i);
539
Ruchira Sasanka91442282001-09-30 23:16:47 +0000540 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000541 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000542
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000543 unsigned RegType = getRegType( CallArg );
544 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000545
546 // find whether this argument is coming in a register (if not, on stack)
547
548 bool isArgInReg = false;
549 unsigned UniArgReg = InvalidRegNum;
550
551 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
552 isArgInReg = true;
553 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
554 }
555 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
556 isArgInReg = true;
557 UniArgReg = getUnifiedRegNum(RegClassID,
558 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
559 }
560 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
561 isArgInReg = true;
562 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
Chris Lattner20b1ea02001-09-14 03:47:57 +0000563 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000564
Chris Lattner20b1ea02001-09-14 03:47:57 +0000565
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000566 // not possible to have a null LR since all args (even consts)
567 // must be defined before
568 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000569 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000570 cerr << " ERROR: In call instr, no LR for arg: " ;
571 printValue(CallArg); cerr << endl;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000572 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000573 assert(0 && "NO LR for call arg");
574 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000575 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000576
Ruchira Sasanka91442282001-09-30 23:16:47 +0000577
578 // if the LR received the suggested color, NOTHING to do
579
580 if( LR->hasSuggestedColor() && LR->hasColor() )
581 if( LR->getSuggestedColor() == LR->getColor() )
582 continue;
583
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000584
Ruchira Sasanka91442282001-09-30 23:16:47 +0000585 if( LR->hasColor() ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000586
Ruchira Sasanka91442282001-09-30 23:16:47 +0000587 // We are here because though the LR is allocated a register, it
588 // was not allocated the suggested register. So, we have to copy %ix reg
589 // (or stack pos of arg) to the register it was colored with
590
591
592 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
593
594 if( isArgInReg )
595 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
596
597 else
598 assert(0 && "TODO: Push an outgoing arg on stack");
599
600 // Now add the instruction
601 CallAI->InstrnsBefore.push_back( AdMI );
602
603 }
604
605 else { // LR is not colored (i.e., spilled)
606
607 assert(0 && "TODO: Copy a spilled call arg to an output reg ");
608
609 }
610
611 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000612
613}
614
Ruchira Sasanka91442282001-09-30 23:16:47 +0000615//---------------------------------------------------------------------------
616// This method is called for an LLVM return instruction to identify which
617// values will be returned from this method and to suggest colors.
618//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000619void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000620 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000621
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000622 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000623
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000624 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000625
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000626 // if there is an implicit ref, that has to be the ret value
627 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000628
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000629 // The first implicit operand is the return value of a return instr
630 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000631
632 MachineInstr *AdMI;
633 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000634
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000635 if( !LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000636 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000637 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000638 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000639 assert( LR && "No LR for return value of non-void method");
640 //return;
641 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000642
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000643 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000644
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000645 if( RegClassID == IntRegClassID )
646 LR->setSuggestedColor(SparcIntRegOrder::i0);
647
648 else if ( RegClassID == FloatRegClassID )
649 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000650
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000651 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000652
Ruchira Sasanka91442282001-09-30 23:16:47 +0000653}
654
655//---------------------------------------------------------------------------
656
657//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000658void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000659 LiveRangeInfo& LRI,
660 AddedInstrns *const RetAI) const {
661
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000662 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000663
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000664 // if there is an implicit ref, that has to be the ret value
665 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000666
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000667 // The first implicit operand is the return value of a return instr
668 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000669
670 MachineInstr *AdMI;
671 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
672
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000673 if( ! LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000674 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000675 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000676 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000677 // assert( LR && "No LR for return value of non-void method");
678 return;
679 }
680
Ruchira Sasanka91442282001-09-30 23:16:47 +0000681 unsigned RegClassID = getRegClassIDOfValue(RetVal);
682 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000683
684
685 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000686 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000687 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000688 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000689 CorrectCol = SparcFloatRegOrder::f0;
690 else
691 assert( 0 && "Unknown RegClass");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000692
Ruchira Sasanka91442282001-09-30 23:16:47 +0000693
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000694 // if the LR received the suggested color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000695
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000696 if( LR->hasSuggestedColor() && LR->hasColor() )
697 if( LR->getSuggestedColor() == LR->getColor() )
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000698 if( LR->getColor() == CorrectCol )
699 return;
700
701 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000702
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000703 if( LR->hasColor() ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000704
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000705 // We are here because the LR was allocted a regiter
706 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000707
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000708 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000709
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000710 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000711
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000712 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000713 RetAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000714 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000715 else
716 assert(0 && "TODO: Copy the return value from stack\n");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000717
718 } // if there is a return value
719
720}
721
722
723//---------------------------------------------------------------------------
724// Copy from a register to register. Register number must be the unified
725// register number
726//---------------------------------------------------------------------------
727
728
729MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
730 const unsigned DestReg,
731 const int RegType) const {
732
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000733 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000734 "Invalid Register");
735
736 MachineInstr * MI = NULL;
737
738 switch( RegType ) {
739
740 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000741 case IntCCRegType:
742 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000743 MI = new MachineInstr(ADD, 3);
744 MI->SetMachineOperand(0, SrcReg, false);
745 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
746 MI->SetMachineOperand(2, DestReg, true);
747 break;
748
749 case FPSingleRegType:
750 MI = new MachineInstr(FMOVS, 2);
751 MI->SetMachineOperand(0, SrcReg, false);
752 MI->SetMachineOperand(1, DestReg, true);
753 break;
754
755 case FPDoubleRegType:
756 MI = new MachineInstr(FMOVD, 2);
757 MI->SetMachineOperand(0, SrcReg, false);
758 MI->SetMachineOperand(1, DestReg, true);
759 break;
760
761 default:
762 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000763 }
764
765 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000766}
Chris Lattner20b1ea02001-09-14 03:47:57 +0000767
768
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000769//---------------------------------------------------------------------------
770// Copy from a register to memory. Register number must be the unified
771// register number
772//---------------------------------------------------------------------------
773
774
775MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
776 const unsigned DestPtrReg,
777 const int Offset,
778 const int RegType) const {
779
780
781 MachineInstr * MI = NULL;
782
783 switch( RegType ) {
784
785 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000786 case IntCCRegType:
787 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000788 MI = new MachineInstr(STX, 3);
789 MI->SetMachineOperand(0, DestPtrReg, false);
790 MI->SetMachineOperand(1, SrcReg, false);
791 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
792 (int64_t) Offset, false);
793 break;
794
795 case FPSingleRegType:
796 MI = new MachineInstr(ST, 3);
797 MI->SetMachineOperand(0, DestPtrReg, false);
798 MI->SetMachineOperand(1, SrcReg, false);
799 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
800 (int64_t) Offset, false);
801 break;
802
803 case FPDoubleRegType:
804 MI = new MachineInstr(STD, 3);
805 MI->SetMachineOperand(0, DestPtrReg, false);
806 MI->SetMachineOperand(1, SrcReg, false);
807 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
808 (int64_t) Offset, false);
809 break;
810
811 default:
812 assert(0 && "Unknow RegType");
813 }
814
815 return MI;
816}
817
818
819//---------------------------------------------------------------------------
820// Copy from memory to a reg. Register number must be the unified
821// register number
822//---------------------------------------------------------------------------
823
824
825MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
826 const int Offset,
827 const unsigned DestReg,
828 const int RegType) const {
829
830 MachineInstr * MI = NULL;
831
832 switch( RegType ) {
833
834 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000835 case IntCCRegType:
836 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000837 MI = new MachineInstr(LDX, 3);
838 MI->SetMachineOperand(0, SrcPtrReg, false);
839 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
840 (int64_t) Offset, false);
841 MI->SetMachineOperand(2, DestReg, false);
842 break;
843
844 case FPSingleRegType:
845 MI = new MachineInstr(LD, 3);
846 MI->SetMachineOperand(0, SrcPtrReg, false);
847 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
848 (int64_t) Offset, false);
849 MI->SetMachineOperand(2, DestReg, false);
850
851 break;
852
853 case FPDoubleRegType:
854 MI = new MachineInstr(LDD, 3);
855 MI->SetMachineOperand(0, SrcPtrReg, false);
856 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
857 (int64_t) Offset, false);
858 MI->SetMachineOperand(2, DestReg, false);
859 break;
860
861 default:
862 assert(0 && "Unknow RegType");
863 }
864
865 return MI;
866}
867
868
869
870
871
872
873
Ruchira Sasanka91442282001-09-30 23:16:47 +0000874
875
876//---------------------------------------------------------------------------
877// Only constant/label values are accepted.
878// ***This code is temporary ***
879//---------------------------------------------------------------------------
880
881
882MachineInstr * UltraSparcRegInfo::cpValue2RegMI(Value * Val,
883 const unsigned DestReg,
884 const int RegType) const {
885
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000886 assert( ((int)DestReg != InvalidRegNum) && "Invalid Register");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000887
888 /*
889 unsigned MReg;
890 int64_t Imm;
891
892 MachineOperand::MachineOperandType MOTypeInt =
893 ChooseRegOrImmed(Val, ADD, *UltraSparcInfo, true, MReg, Imm);
894 */
895
896 MachineOperand::MachineOperandType MOType;
897
898 switch( Val->getValueType() ) {
899
900 case Value::ConstantVal:
Chris Lattneref9c23f2001-10-03 14:53:21 +0000901 case Value::GlobalVariableVal:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000902 MOType = MachineOperand:: MO_UnextendedImmed; // TODO**** correct???
903 break;
904
905 case Value::BasicBlockVal:
906 case Value::MethodVal:
907 MOType = MachineOperand::MO_PCRelativeDisp;
908 break;
909
910 default:
Chris Lattner1e23ed72001-10-15 18:15:27 +0000911 cerr << "Value Type: " << Val->getValueType() << endl;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000912 assert(0 && "Unknown val type - Only constants/globals/labels are valid");
913 }
914
915
916
917 MachineInstr * MI = NULL;
918
919 switch( RegType ) {
920
921 case IntRegType:
922 MI = new MachineInstr(ADD);
923 MI->SetMachineOperand(0, MOType, Val, false);
924 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
925 MI->SetMachineOperand(2, DestReg, true);
926 break;
927
928 case FPSingleRegType:
929 assert(0 && "FP const move not yet implemented");
930 MI = new MachineInstr(FMOVS);
931 MI->SetMachineOperand(0, MachineOperand::MO_SignExtendedImmed, Val, false);
932 MI->SetMachineOperand(1, DestReg, true);
933 break;
934
935 case FPDoubleRegType:
936 assert(0 && "FP const move not yet implemented");
937 MI = new MachineInstr(FMOVD);
938 MI->SetMachineOperand(0, MachineOperand::MO_SignExtendedImmed, Val, false);
939 MI->SetMachineOperand(1, DestReg, true);
940 break;
941
942 default:
943 assert(0 && "Unknow RegType");
944 }
945
946 return MI;
947}
948
949
950
951
952
953
954
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000955//---------------------------------------------------------------------------
956// Print the register assigned to a LR
957//---------------------------------------------------------------------------
958
959void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
960
961 unsigned RegClassID = (LR->getRegClass())->getID();
962
Chris Lattner1e23ed72001-10-15 18:15:27 +0000963 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000964
965 if( ! LR->hasColor() ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000966 cerr << " - could not find a color" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000967 return;
968 }
969
970 // if a color is found
971
Chris Lattner1e23ed72001-10-15 18:15:27 +0000972 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000973
974 if( RegClassID == IntRegClassID ) {
975
Chris Lattner1e23ed72001-10-15 18:15:27 +0000976 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
977 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000978 }
979 else if ( RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000980 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000981 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattner1e23ed72001-10-15 18:15:27 +0000982 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
983 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000984 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000985}