blob: b28ce51b9896b74e3dce3429fc70f6dcb8355eb5 [file] [log] [blame]
Ruchira Sasankadfdab462001-09-14 20:31:39 +00001#include "llvm/Target/Sparc.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00002#include "SparcInternals.h"
3#include "llvm/Method.h"
4#include "llvm/iTerminators.h"
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00005#include "llvm/iOther.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00006#include "llvm/CodeGen/InstrScheduling.h"
7#include "llvm/CodeGen/InstrSelection.h"
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00008
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00009#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
10#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000011
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012
13
14
15//---------------------------------------------------------------------------
16// UltraSparcRegInfo
17//---------------------------------------------------------------------------
18
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000019//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +000038 else if( OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +000070 else if( OpCode == JMPLCALL ) {
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +000087// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +0000114 else if( OpCode == JMPLCALL ) {
Ruchira Sasanka24729a32001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000137// Suggests a register for the ret address in the RET machine instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000138//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000139
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000140void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI,
141 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000142
Vikram S. Adve84982772001-10-22 13:41:12 +0000143 assert( (RetMI->getNumOperands() >= 2)
144 && "JMPL/RETURN must have 3 and 2 operands respectively");
145
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000146 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
147
148 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000149
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000150 // TODO (Optimize):
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000151 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000155
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000156 /*
157 const Value *RetAddrVal = MO.getVRegValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000158
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000159 assert( RetAddrVal && "LR for ret address must be created at start");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000160
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000161 LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
162 RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
163 SparcIntRegOrdr::i7) );
164 */
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000165
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000166
167}
168
169
170//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000171// Suggests a register for the ret address in the JMPL/CALL machine instr
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000172//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000173void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
174 LiveRangeInfo& LRI,
175 vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000176
Ruchira Sasanka24729a32001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000192 assert( (CallMI->getNumOperands() == 3) && "JMPL must have 3 operands");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000193
Ruchira Sasanka086bf0f2001-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 Sasanka24729a32001-10-21 16:43:41 +0000199
200 */
201
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000202}
203
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000204
205
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000215{
216
Ruchira Sasankadfc6c882001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000221
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000222 // for each argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000223 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000224
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000225 // get the LR of arg
226 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000227 assert( LR && "No live range found for method arg");
228
229 unsigned RegType = getRegType( LR );
230
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000231
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000232 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000233 if( RegType == IntRegType ) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000234
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000235 if( argNo < NumOfIntArgRegs) {
236 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000237
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000238 }
239
240 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000241 // Do NOTHING as this will be colored as a normal value.
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000242 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000243 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000244
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000245 }
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000253
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000254 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000255
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000256}
257
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000348
349
350
Ruchira Sasanka5867c7a2001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000355void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000356 LiveRangeInfo& LRI,
357 vector<RegClass *> RCList) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000358
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000359 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000360
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000361 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000362
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000363
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000364 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-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 Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000370
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000373
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000374
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000375 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000376
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000377
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000378 if( RetVal ) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000379
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000380 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
381 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000382
383
384 // create a new LR for the return value
385
Ruchira Sasanka24729a32001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000393
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000399
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000400 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000401
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000402
Ruchira Sasanka5867c7a2001-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 Sasanka24729a32001-10-21 16:43:41 +0000406 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000407
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000408 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000409
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000413
414 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000415 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000416
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000420 if( DEBUG_RA) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000421 cerr << " ERROR: In call instr, no LR for arg: " ;
422 printValue(CallArg); cerr << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000423 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000424 assert(0 && "NO LR for call arg");
425 // continue;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000426 }
427
428 unsigned RegType = getRegType( LR );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000429
Ruchira Sasanka5867c7a2001-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 Lattnerf3f1e452001-10-15 18:15:27 +0000438 cerr << " Regr not suggested for int call arg" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000439
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000448
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000450
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000451}
452
453
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000459
460
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000461void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000462 LiveRangeInfo& LRI,
463 AddedInstrns *const CallAI) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000464
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000465 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
466
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000472
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000473 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000474
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000475 if( RetVal ) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000476
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000477 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000478
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000486
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000530
531
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000532 // Now color all args of the call instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000533
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000534 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000535
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000540 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000541 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000542
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000543 unsigned RegType = getRegType( CallArg );
544 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000563 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000564
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000565
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000569 if( DEBUG_RA) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000570 cerr << " ERROR: In call instr, no LR for arg: " ;
571 printValue(CallArg); cerr << endl;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000572 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000573 assert(0 && "NO LR for call arg");
574 // continue;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000575 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000576
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000584
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000585 if( LR->hasColor() ) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000586
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000612
613}
614
Ruchira Sasanka5867c7a2001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000619void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000620 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000621
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000622 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000623
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000624
625 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000626
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000627 // if there is an implicit ref, that has to be the ret value
628 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000629
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000630 // The first implicit operand is the return value of a return instr
631 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000632
633 MachineInstr *AdMI;
634 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000635
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000636 if( !LR ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000637 cerr << "\nNo LR for:";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000638 printValue( RetVal );
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000639 cerr << endl;
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000640 assert( LR && "No LR for return value of non-void method");
641 //return;
642 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000643
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000644 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000645
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000646 if( RegClassID == IntRegClassID )
647 LR->setSuggestedColor(SparcIntRegOrder::i0);
648
649 else if ( RegClassID == FloatRegClassID )
650 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000651
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000652 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000653
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000654}
655
656//---------------------------------------------------------------------------
657
658//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000659void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000660 LiveRangeInfo& LRI,
661 AddedInstrns *const RetAI) const {
662
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000663 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000664
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000665 // if there is an implicit ref, that has to be the ret value
666 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000667
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000668 // The first implicit operand is the return value of a return instr
669 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000670
671 MachineInstr *AdMI;
672 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
673
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000674 if( ! LR ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000675 cerr << "\nNo LR for:";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000676 printValue( RetVal );
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000677 cerr << endl;
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000678 // assert( LR && "No LR for return value of non-void method");
679 return;
680 }
681
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000682 unsigned RegClassID = getRegClassIDOfValue(RetVal);
683 unsigned RegType = getRegType( RetVal );
684 unsigned UniRetReg = InvalidRegNum;
685
686 if(RegClassID == IntRegClassID)
687 UniRetReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 );
688 else if(RegClassID == FloatRegClassID)
689 UniRetReg = getUnifiedRegNum( RegClassID, SparcFloatRegOrder::f0);
690
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000691
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000692
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000693 // if the LR received the suggested color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000694
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000695 if( LR->hasSuggestedColor() && LR->hasColor() )
696 if( LR->getSuggestedColor() == LR->getColor() )
697 return;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000698
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000699 if( LR->hasColor() ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000700
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000701 // We are here because the LR was allocted a regiter, but NOT
702 // the correct register.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000703
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000704 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000705
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000706 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000707
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000708 if(RegClassID == IntRegClassID)
709 UniRetReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0);
710 else if(RegClassID == FloatRegClassID)
711 UniRetReg = getUnifiedRegNum( RegClassID, SparcFloatRegOrder::f0);
712
713 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000714
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000715 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000716 else
717 assert(0 && "TODO: Copy the return value from stack\n");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000718
719 } // if there is a return value
720
721}
722
723
724//---------------------------------------------------------------------------
725// Copy from a register to register. Register number must be the unified
726// register number
727//---------------------------------------------------------------------------
728
729
730MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
731 const unsigned DestReg,
732 const int RegType) const {
733
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000734 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000735 "Invalid Register");
736
737 MachineInstr * MI = NULL;
738
739 switch( RegType ) {
740
741 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000742 case IntCCRegType:
743 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000744 MI = new MachineInstr(ADD, 3);
745 MI->SetMachineOperand(0, SrcReg, false);
746 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
747 MI->SetMachineOperand(2, DestReg, true);
748 break;
749
750 case FPSingleRegType:
751 MI = new MachineInstr(FMOVS, 2);
752 MI->SetMachineOperand(0, SrcReg, false);
753 MI->SetMachineOperand(1, DestReg, true);
754 break;
755
756 case FPDoubleRegType:
757 MI = new MachineInstr(FMOVD, 2);
758 MI->SetMachineOperand(0, SrcReg, false);
759 MI->SetMachineOperand(1, DestReg, true);
760 break;
761
762 default:
763 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000764 }
765
766 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000767}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000768
769
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000770//---------------------------------------------------------------------------
771// Copy from a register to memory. Register number must be the unified
772// register number
773//---------------------------------------------------------------------------
774
775
776MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
777 const unsigned DestPtrReg,
778 const int Offset,
779 const int RegType) const {
780
781
782 MachineInstr * MI = NULL;
783
784 switch( RegType ) {
785
786 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000787 case IntCCRegType:
788 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000789 MI = new MachineInstr(STX, 3);
790 MI->SetMachineOperand(0, DestPtrReg, false);
791 MI->SetMachineOperand(1, SrcReg, false);
792 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
793 (int64_t) Offset, false);
794 break;
795
796 case FPSingleRegType:
797 MI = new MachineInstr(ST, 3);
798 MI->SetMachineOperand(0, DestPtrReg, false);
799 MI->SetMachineOperand(1, SrcReg, false);
800 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
801 (int64_t) Offset, false);
802 break;
803
804 case FPDoubleRegType:
805 MI = new MachineInstr(STD, 3);
806 MI->SetMachineOperand(0, DestPtrReg, false);
807 MI->SetMachineOperand(1, SrcReg, false);
808 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
809 (int64_t) Offset, false);
810 break;
811
812 default:
813 assert(0 && "Unknow RegType");
814 }
815
816 return MI;
817}
818
819
820//---------------------------------------------------------------------------
821// Copy from memory to a reg. Register number must be the unified
822// register number
823//---------------------------------------------------------------------------
824
825
826MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
827 const int Offset,
828 const unsigned DestReg,
829 const int RegType) const {
830
831 MachineInstr * MI = NULL;
832
833 switch( RegType ) {
834
835 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000836 case IntCCRegType:
837 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000838 MI = new MachineInstr(LDX, 3);
839 MI->SetMachineOperand(0, SrcPtrReg, false);
840 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
841 (int64_t) Offset, false);
842 MI->SetMachineOperand(2, DestReg, false);
843 break;
844
845 case FPSingleRegType:
846 MI = new MachineInstr(LD, 3);
847 MI->SetMachineOperand(0, SrcPtrReg, false);
848 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
849 (int64_t) Offset, false);
850 MI->SetMachineOperand(2, DestReg, false);
851
852 break;
853
854 case FPDoubleRegType:
855 MI = new MachineInstr(LDD, 3);
856 MI->SetMachineOperand(0, SrcPtrReg, false);
857 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
858 (int64_t) Offset, false);
859 MI->SetMachineOperand(2, DestReg, false);
860 break;
861
862 default:
863 assert(0 && "Unknow RegType");
864 }
865
866 return MI;
867}
868
869
870
871
872
873
874
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000875
876
877//---------------------------------------------------------------------------
878// Only constant/label values are accepted.
879// ***This code is temporary ***
880//---------------------------------------------------------------------------
881
882
883MachineInstr * UltraSparcRegInfo::cpValue2RegMI(Value * Val,
884 const unsigned DestReg,
885 const int RegType) const {
886
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000887 assert( ((int)DestReg != InvalidRegNum) && "Invalid Register");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000888
889 /*
890 unsigned MReg;
891 int64_t Imm;
892
893 MachineOperand::MachineOperandType MOTypeInt =
894 ChooseRegOrImmed(Val, ADD, *UltraSparcInfo, true, MReg, Imm);
895 */
896
897 MachineOperand::MachineOperandType MOType;
898
899 switch( Val->getValueType() ) {
900
901 case Value::ConstantVal:
Chris Lattner7fac0702001-10-03 14:53:21 +0000902 case Value::GlobalVariableVal:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000903 MOType = MachineOperand:: MO_UnextendedImmed; // TODO**** correct???
904 break;
905
906 case Value::BasicBlockVal:
907 case Value::MethodVal:
908 MOType = MachineOperand::MO_PCRelativeDisp;
909 break;
910
911 default:
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000912 cerr << "Value Type: " << Val->getValueType() << endl;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000913 assert(0 && "Unknown val type - Only constants/globals/labels are valid");
914 }
915
916
917
918 MachineInstr * MI = NULL;
919
920 switch( RegType ) {
921
922 case IntRegType:
923 MI = new MachineInstr(ADD);
924 MI->SetMachineOperand(0, MOType, Val, false);
925 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
926 MI->SetMachineOperand(2, DestReg, true);
927 break;
928
929 case FPSingleRegType:
930 assert(0 && "FP const move not yet implemented");
931 MI = new MachineInstr(FMOVS);
932 MI->SetMachineOperand(0, MachineOperand::MO_SignExtendedImmed, Val, false);
933 MI->SetMachineOperand(1, DestReg, true);
934 break;
935
936 case FPDoubleRegType:
937 assert(0 && "FP const move not yet implemented");
938 MI = new MachineInstr(FMOVD);
939 MI->SetMachineOperand(0, MachineOperand::MO_SignExtendedImmed, Val, false);
940 MI->SetMachineOperand(1, DestReg, true);
941 break;
942
943 default:
944 assert(0 && "Unknow RegType");
945 }
946
947 return MI;
948}
949
950
951
952
953
954
955
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000956//---------------------------------------------------------------------------
957// Print the register assigned to a LR
958//---------------------------------------------------------------------------
959
960void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
961
962 unsigned RegClassID = (LR->getRegClass())->getID();
963
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000964 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000965
966 if( ! LR->hasColor() ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000967 cerr << " - could not find a color" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000968 return;
969 }
970
971 // if a color is found
972
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000973 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000974
975 if( RegClassID == IntRegClassID ) {
976
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000977 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
978 cerr << "]" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000979 }
980 else if ( RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000981 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000982 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000983 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
984 cerr << "]" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000985 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000986}