Change references to the Method class to be references to the Function
[oota-llvm.git] / lib / Target / SparcV9 / SparcV9InstrSelection.cpp
1 // $Id$
2 //***************************************************************************
3 // File:
4 //      SparcInstrSelection.cpp
5 // 
6 // Purpose:
7 //      BURS instruction selection for SPARC V9 architecture.      
8 //      
9 // History:
10 //      7/02/01  -  Vikram Adve  -  Created
11 //**************************************************************************/
12
13 #include "SparcInternals.h"
14 #include "SparcInstrSelectionSupport.h"
15 #include "SparcRegClassInfo.h"
16 #include "llvm/CodeGen/InstrSelectionSupport.h"
17 #include "llvm/CodeGen/MachineInstr.h"
18 #include "llvm/CodeGen/InstrForest.h"
19 #include "llvm/CodeGen/InstrSelection.h"
20 #include "llvm/CodeGen/MachineCodeForMethod.h"
21 #include "llvm/CodeGen/MachineCodeForInstruction.h"
22 #include "llvm/DerivedTypes.h"
23 #include "llvm/iTerminators.h"
24 #include "llvm/iMemory.h"
25 #include "llvm/iOther.h"
26 #include "llvm/BasicBlock.h"
27 #include "llvm/Function.h"
28 #include "llvm/ConstantVals.h"
29 #include "Support/MathExtras.h"
30 #include <math.h>
31 using std::vector;
32
33 //************************* Forward Declarations ***************************/
34
35
36 static void SetMemOperands_Internal     (vector<MachineInstr*>& mvec,
37                                          vector<MachineInstr*>::iterator mvecI,
38                                          const InstructionNode* vmInstrNode,
39                                          Value* ptrVal,
40                                          std::vector<Value*>& idxVec,
41                                          const TargetMachine& target);
42
43
44 //************************ Internal Functions ******************************/
45
46
47 static inline MachineOpCode 
48 ChooseBprInstruction(const InstructionNode* instrNode)
49 {
50   MachineOpCode opCode;
51   
52   Instruction* setCCInstr =
53     ((InstructionNode*) instrNode->leftChild())->getInstruction();
54   
55   switch(setCCInstr->getOpcode())
56     {
57     case Instruction::SetEQ: opCode = BRZ;   break;
58     case Instruction::SetNE: opCode = BRNZ;  break;
59     case Instruction::SetLE: opCode = BRLEZ; break;
60     case Instruction::SetGE: opCode = BRGEZ; break;
61     case Instruction::SetLT: opCode = BRLZ;  break;
62     case Instruction::SetGT: opCode = BRGZ;  break;
63     default:
64       assert(0 && "Unrecognized VM instruction!");
65       opCode = INVALID_OPCODE;
66       break; 
67     }
68   
69   return opCode;
70 }
71
72
73 static inline MachineOpCode 
74 ChooseBpccInstruction(const InstructionNode* instrNode,
75                       const BinaryOperator* setCCInstr)
76 {
77   MachineOpCode opCode = INVALID_OPCODE;
78   
79   bool isSigned = setCCInstr->getOperand(0)->getType()->isSigned();
80   
81   if (isSigned)
82     {
83       switch(setCCInstr->getOpcode())
84         {
85         case Instruction::SetEQ: opCode = BE;  break;
86         case Instruction::SetNE: opCode = BNE; break;
87         case Instruction::SetLE: opCode = BLE; break;
88         case Instruction::SetGE: opCode = BGE; break;
89         case Instruction::SetLT: opCode = BL;  break;
90         case Instruction::SetGT: opCode = BG;  break;
91         default:
92           assert(0 && "Unrecognized VM instruction!");
93           break; 
94         }
95     }
96   else
97     {
98       switch(setCCInstr->getOpcode())
99         {
100         case Instruction::SetEQ: opCode = BE;   break;
101         case Instruction::SetNE: opCode = BNE;  break;
102         case Instruction::SetLE: opCode = BLEU; break;
103         case Instruction::SetGE: opCode = BCC;  break;
104         case Instruction::SetLT: opCode = BCS;  break;
105         case Instruction::SetGT: opCode = BGU;  break;
106         default:
107           assert(0 && "Unrecognized VM instruction!");
108           break; 
109         }
110     }
111   
112   return opCode;
113 }
114
115 static inline MachineOpCode 
116 ChooseBFpccInstruction(const InstructionNode* instrNode,
117                        const BinaryOperator* setCCInstr)
118 {
119   MachineOpCode opCode = INVALID_OPCODE;
120   
121   switch(setCCInstr->getOpcode())
122     {
123     case Instruction::SetEQ: opCode = FBE;  break;
124     case Instruction::SetNE: opCode = FBNE; break;
125     case Instruction::SetLE: opCode = FBLE; break;
126     case Instruction::SetGE: opCode = FBGE; break;
127     case Instruction::SetLT: opCode = FBL;  break;
128     case Instruction::SetGT: opCode = FBG;  break;
129     default:
130       assert(0 && "Unrecognized VM instruction!");
131       break; 
132     }
133   
134   return opCode;
135 }
136
137
138 // Create a unique TmpInstruction for a boolean value,
139 // representing the CC register used by a branch on that value.
140 // For now, hack this using a little static cache of TmpInstructions.
141 // Eventually the entire BURG instruction selection should be put
142 // into a separate class that can hold such information.
143 // The static cache is not too bad because the memory for these
144 // TmpInstructions will be freed along with the rest of the Function anyway.
145 // 
146 static TmpInstruction*
147 GetTmpForCC(Value* boolVal, const Function *F, const Type* ccType)
148 {
149   typedef std::hash_map<const Value*, TmpInstruction*> BoolTmpCache;
150   static BoolTmpCache boolToTmpCache;     // Map boolVal -> TmpInstruction*
151   static const Function *lastFunction = 0;// Use to flush cache between funcs
152   
153   assert(boolVal->getType() == Type::BoolTy && "Weird but ok! Delete assert");
154   
155   if (lastFunction != F)
156     {
157       lastFunction = F;
158       boolToTmpCache.clear();
159     }
160   
161   // Look for tmpI and create a new one otherwise.  The new value is
162   // directly written to map using the ref returned by operator[].
163   TmpInstruction*& tmpI = boolToTmpCache[boolVal];
164   if (tmpI == NULL)
165     tmpI = new TmpInstruction(ccType, boolVal);
166   
167   return tmpI;
168 }
169
170
171 static inline MachineOpCode 
172 ChooseBccInstruction(const InstructionNode* instrNode,
173                      bool& isFPBranch)
174 {
175   InstructionNode* setCCNode = (InstructionNode*) instrNode->leftChild();
176   BinaryOperator* setCCInstr = (BinaryOperator*) setCCNode->getInstruction();
177   const Type* setCCType = setCCInstr->getOperand(0)->getType();
178   
179   isFPBranch = (setCCType == Type::FloatTy || setCCType == Type::DoubleTy); 
180   
181   if (isFPBranch) 
182     return ChooseBFpccInstruction(instrNode, setCCInstr);
183   else
184     return ChooseBpccInstruction(instrNode, setCCInstr);
185 }
186
187
188 static inline MachineOpCode 
189 ChooseMovFpccInstruction(const InstructionNode* instrNode)
190 {
191   MachineOpCode opCode = INVALID_OPCODE;
192   
193   switch(instrNode->getInstruction()->getOpcode())
194     {
195     case Instruction::SetEQ: opCode = MOVFE;  break;
196     case Instruction::SetNE: opCode = MOVFNE; break;
197     case Instruction::SetLE: opCode = MOVFLE; break;
198     case Instruction::SetGE: opCode = MOVFGE; break;
199     case Instruction::SetLT: opCode = MOVFL;  break;
200     case Instruction::SetGT: opCode = MOVFG;  break;
201     default:
202       assert(0 && "Unrecognized VM instruction!");
203       break; 
204     }
205   
206   return opCode;
207 }
208
209
210 // Assumes that SUBcc v1, v2 -> v3 has been executed.
211 // In most cases, we want to clear v3 and then follow it by instruction
212 // MOVcc 1 -> v3.
213 // Set mustClearReg=false if v3 need not be cleared before conditional move.
214 // Set valueToMove=0 if we want to conditionally move 0 instead of 1
215 //                      (i.e., we want to test inverse of a condition)
216 // (The latter two cases do not seem to arise because SetNE needs nothing.)
217 // 
218 static MachineOpCode
219 ChooseMovpccAfterSub(const InstructionNode* instrNode,
220                      bool& mustClearReg,
221                      int& valueToMove)
222 {
223   MachineOpCode opCode = INVALID_OPCODE;
224   mustClearReg = true;
225   valueToMove = 1;
226   
227   switch(instrNode->getInstruction()->getOpcode())
228     {
229     case Instruction::SetEQ: opCode = MOVE;  break;
230     case Instruction::SetLE: opCode = MOVLE; break;
231     case Instruction::SetGE: opCode = MOVGE; break;
232     case Instruction::SetLT: opCode = MOVL;  break;
233     case Instruction::SetGT: opCode = MOVG;  break;
234     case Instruction::SetNE: assert(0 && "No move required!"); break;
235     default:                 assert(0 && "Unrecognized VM instr!"); break; 
236     }
237   
238   return opCode;
239 }
240
241 static inline MachineOpCode
242 ChooseConvertToFloatInstr(const InstructionNode* instrNode,
243                           const Type* opType)
244 {
245   MachineOpCode opCode = INVALID_OPCODE;
246   
247   switch(instrNode->getOpLabel())
248     {
249     case ToFloatTy: 
250       if (opType == Type::SByteTy || opType == Type::ShortTy || opType == Type::IntTy)
251         opCode = FITOS;
252       else if (opType == Type::LongTy)
253         opCode = FXTOS;
254       else if (opType == Type::DoubleTy)
255         opCode = FDTOS;
256       else if (opType == Type::FloatTy)
257         ;
258       else
259         assert(0 && "Cannot convert this type to FLOAT on SPARC");
260       break;
261       
262     case ToDoubleTy: 
263       // This is usually used in conjunction with CreateCodeToCopyIntToFloat().
264       // Both functions should treat the integer as a 32-bit value for types
265       // of 4 bytes or less, and as a 64-bit value otherwise.
266       if (opType == Type::SByteTy || opType == Type::UByteTy ||
267           opType == Type::ShortTy || opType == Type::UShortTy ||
268           opType == Type::IntTy   || opType == Type::UIntTy)
269         opCode = FITOD;
270       else if (opType == Type::LongTy || opType == Type::ULongTy)
271         opCode = FXTOD;
272       else if (opType == Type::FloatTy)
273         opCode = FSTOD;
274       else if (opType == Type::DoubleTy)
275         ;
276       else
277         assert(0 && "Cannot convert this type to DOUBLE on SPARC");
278       break;
279       
280     default:
281       break;
282     }
283   
284   return opCode;
285 }
286
287 static inline MachineOpCode 
288 ChooseConvertToIntInstr(const InstructionNode* instrNode,
289                         const Type* opType)
290 {
291   MachineOpCode opCode = INVALID_OPCODE;;
292   
293   int instrType = (int) instrNode->getOpLabel();
294   
295   if (instrType == ToSByteTy || instrType == ToShortTy || instrType == ToIntTy)
296     {
297       switch (opType->getPrimitiveID())
298         {
299         case Type::FloatTyID:   opCode = FSTOI; break;
300         case Type::DoubleTyID:  opCode = FDTOI; break;
301         default:
302           assert(0 && "Non-numeric non-bool type cannot be converted to Int");
303           break;
304         }
305     }
306   else if (instrType == ToLongTy)
307     {
308       switch (opType->getPrimitiveID())
309         {
310         case Type::FloatTyID:   opCode = FSTOX; break;
311         case Type::DoubleTyID:  opCode = FDTOX; break;
312         default:
313           assert(0 && "Non-numeric non-bool type cannot be converted to Long");
314           break;
315         }
316     }
317   else
318       assert(0 && "Should not get here, Mo!");
319   
320   return opCode;
321 }
322
323
324 static inline MachineOpCode 
325 ChooseAddInstructionByType(const Type* resultType)
326 {
327   MachineOpCode opCode = INVALID_OPCODE;
328   
329   if (resultType->isIntegral() ||
330       isa<PointerType>(resultType) ||
331       isa<FunctionType>(resultType) ||
332       resultType == Type::LabelTy ||
333       resultType == Type::BoolTy)
334     {
335       opCode = ADD;
336     }
337   else
338     switch(resultType->getPrimitiveID())
339       {
340       case Type::FloatTyID:  opCode = FADDS; break;
341       case Type::DoubleTyID: opCode = FADDD; break;
342       default: assert(0 && "Invalid type for ADD instruction"); break; 
343       }
344   
345   return opCode;
346 }
347
348
349 static inline MachineOpCode 
350 ChooseAddInstruction(const InstructionNode* instrNode)
351 {
352   return ChooseAddInstructionByType(instrNode->getInstruction()->getType());
353 }
354
355
356 static inline MachineInstr* 
357 CreateMovFloatInstruction(const InstructionNode* instrNode,
358                           const Type* resultType)
359 {
360   MachineInstr* minstr = new MachineInstr((resultType == Type::FloatTy)
361                                           ? FMOVS : FMOVD);
362   minstr->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
363                                instrNode->leftChild()->getValue());
364   minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,
365                                instrNode->getValue());
366   return minstr;
367 }
368
369 static inline MachineInstr* 
370 CreateAddConstInstruction(const InstructionNode* instrNode)
371 {
372   MachineInstr* minstr = NULL;
373   
374   Value* constOp = ((InstrTreeNode*) instrNode->rightChild())->getValue();
375   assert(isa<Constant>(constOp));
376   
377   // Cases worth optimizing are:
378   // (1) Add with 0 for float or double: use an FMOV of appropriate type,
379   //     instead of an FADD (1 vs 3 cycles).  There is no integer MOV.
380   // 
381   const Type* resultType = instrNode->getInstruction()->getType();
382   
383   if (resultType == Type::FloatTy ||
384       resultType == Type::DoubleTy)
385     {
386       double dval = cast<ConstantFP>(constOp)->getValue();
387       if (dval == 0.0)
388         minstr = CreateMovFloatInstruction(instrNode, resultType);
389     }
390   
391   return minstr;
392 }
393
394
395 static inline MachineOpCode 
396 ChooseSubInstructionByType(const Type* resultType)
397 {
398   MachineOpCode opCode = INVALID_OPCODE;
399   
400   if (resultType->isIntegral() ||
401       resultType->isPointerType())
402     {
403       opCode = SUB;
404     }
405   else
406     switch(resultType->getPrimitiveID())
407       {
408       case Type::FloatTyID:  opCode = FSUBS; break;
409       case Type::DoubleTyID: opCode = FSUBD; break;
410       default: assert(0 && "Invalid type for SUB instruction"); break; 
411       }
412   
413   return opCode;
414 }
415
416
417 static inline MachineInstr* 
418 CreateSubConstInstruction(const InstructionNode* instrNode)
419 {
420   MachineInstr* minstr = NULL;
421   
422   Value* constOp = ((InstrTreeNode*) instrNode->rightChild())->getValue();
423   assert(isa<Constant>(constOp));
424   
425   // Cases worth optimizing are:
426   // (1) Sub with 0 for float or double: use an FMOV of appropriate type,
427   //     instead of an FSUB (1 vs 3 cycles).  There is no integer MOV.
428   // 
429   const Type* resultType = instrNode->getInstruction()->getType();
430   
431   if (resultType == Type::FloatTy ||
432       resultType == Type::DoubleTy)
433     {
434       double dval = cast<ConstantFP>(constOp)->getValue();
435       if (dval == 0.0)
436         minstr = CreateMovFloatInstruction(instrNode, resultType);
437     }
438   
439   return minstr;
440 }
441
442
443 static inline MachineOpCode 
444 ChooseFcmpInstruction(const InstructionNode* instrNode)
445 {
446   MachineOpCode opCode = INVALID_OPCODE;
447   
448   Value* operand = ((InstrTreeNode*) instrNode->leftChild())->getValue();
449   switch(operand->getType()->getPrimitiveID()) {
450   case Type::FloatTyID:  opCode = FCMPS; break;
451   case Type::DoubleTyID: opCode = FCMPD; break;
452   default: assert(0 && "Invalid type for FCMP instruction"); break; 
453   }
454   
455   return opCode;
456 }
457
458
459 // Assumes that leftArg and rightArg are both cast instructions.
460 //
461 static inline bool
462 BothFloatToDouble(const InstructionNode* instrNode)
463 {
464   InstrTreeNode* leftArg = instrNode->leftChild();
465   InstrTreeNode* rightArg = instrNode->rightChild();
466   InstrTreeNode* leftArgArg = leftArg->leftChild();
467   InstrTreeNode* rightArgArg = rightArg->leftChild();
468   assert(leftArg->getValue()->getType() == rightArg->getValue()->getType());
469   
470   // Check if both arguments are floats cast to double
471   return (leftArg->getValue()->getType() == Type::DoubleTy &&
472           leftArgArg->getValue()->getType() == Type::FloatTy &&
473           rightArgArg->getValue()->getType() == Type::FloatTy);
474 }
475
476
477 static inline MachineOpCode 
478 ChooseMulInstructionByType(const Type* resultType)
479 {
480   MachineOpCode opCode = INVALID_OPCODE;
481   
482   if (resultType->isIntegral())
483     opCode = MULX;
484   else
485     switch(resultType->getPrimitiveID())
486       {
487       case Type::FloatTyID:  opCode = FMULS; break;
488       case Type::DoubleTyID: opCode = FMULD; break;
489       default: assert(0 && "Invalid type for MUL instruction"); break; 
490       }
491   
492   return opCode;
493 }
494
495
496
497 static inline MachineInstr*
498 CreateIntNegInstruction(const TargetMachine& target,
499                         Value* vreg)
500 {
501   MachineInstr* minstr = new MachineInstr(SUB);
502   minstr->SetMachineOperandReg(0, target.getRegInfo().getZeroRegNum());
503   minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, vreg);
504   minstr->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, vreg);
505   return minstr;
506 }
507
508
509 // Does not create any instructions if we cannot exploit constant to
510 // create a cheaper instruction.
511 // This returns the approximate cost of the instructions generated,
512 // which is used to pick the cheapest when both operands are constant.
513 static inline unsigned int
514 CreateMulConstInstruction(const TargetMachine &target,
515                           Value* lval, Value* rval, Value* destVal,
516                           vector<MachineInstr*>& mvec)
517 {
518   /* An integer multiply is generally more costly than FP multiply */ 
519   unsigned int cost = target.getInstrInfo().minLatency(MULX);
520   MachineInstr* minstr1 = NULL;
521   MachineInstr* minstr2 = NULL;
522   
523   Value* constOp = rval;
524   if (! isa<Constant>(constOp))
525     return cost;
526   
527   // Cases worth optimizing are:
528   // (1) Multiply by 0 or 1 for any type: replace with copy (ADD or FMOV)
529   // (2) Multiply by 2^x for integer types: replace with Shift
530   // 
531   const Type* resultType = destVal->getType();
532   
533   if (resultType->isIntegral() || resultType->isPointerType())
534     {
535       unsigned pow;
536       bool isValidConst;
537       int64_t C = GetConstantValueAsSignedInt(constOp, isValidConst);
538       if (isValidConst)
539         {
540           bool needNeg = false;
541           if (C < 0)
542             {
543               needNeg = true;
544               C = -C;
545             }
546           
547           if (C == 0 || C == 1)
548             {
549               cost = target.getInstrInfo().minLatency(ADD);
550               minstr1 = new MachineInstr(ADD);
551               if (C == 0)
552                 minstr1->SetMachineOperandReg(0,
553                               target.getRegInfo().getZeroRegNum());
554               else
555                 minstr1->SetMachineOperandVal(0,
556                               MachineOperand::MO_VirtualRegister, lval);
557               minstr1->SetMachineOperandReg(1,
558                                         target.getRegInfo().getZeroRegNum());
559             }
560           else if (IsPowerOf2(C, pow))
561             {
562               minstr1 = new MachineInstr((resultType == Type::LongTy)
563                                          ? SLLX : SLL);
564               minstr1->SetMachineOperandVal(0,
565                                 MachineOperand::MO_VirtualRegister, lval);
566               minstr1->SetMachineOperandConst(1,
567                                 MachineOperand::MO_UnextendedImmed, pow);
568             }
569           
570           if (minstr1 && needNeg)
571             { // insert <reg = SUB 0, reg> after the instr to flip the sign
572               minstr2 = CreateIntNegInstruction(target, destVal);
573               cost += target.getInstrInfo().minLatency(minstr2->getOpCode());
574             }
575         }
576     }
577   else
578     {
579       if (resultType == Type::FloatTy ||
580           resultType == Type::DoubleTy)
581         {
582           double dval = cast<ConstantFP>(constOp)->getValue();
583           if (fabs(dval) == 1)
584             {
585               bool needNeg = (dval < 0);
586               
587               MachineOpCode opCode = needNeg
588                 ? (resultType == Type::FloatTy? FNEGS : FNEGD)
589                 : (resultType == Type::FloatTy? FMOVS : FMOVD);
590               
591               minstr1 = new MachineInstr(opCode);
592               minstr1->SetMachineOperandVal(0,
593                                             MachineOperand::MO_VirtualRegister,
594                                             lval);
595             } 
596         }
597     }
598   
599   if (minstr1 != NULL)
600     minstr1->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
601                                   destVal);   
602   
603   if (minstr1)
604     {
605       mvec.push_back(minstr1);
606       cost = target.getInstrInfo().minLatency(minstr1->getOpCode());
607     }
608   if (minstr2)
609     {
610       assert(minstr1 && "Otherwise cost needs to be initialized to 0");
611       cost += target.getInstrInfo().minLatency(minstr2->getOpCode());
612       mvec.push_back(minstr2);
613     }
614   
615   return cost;
616 }
617
618
619 // Does not create any instructions if we cannot exploit constant to
620 // create a cheaper instruction.
621 // 
622 static inline void
623 CreateCheapestMulConstInstruction(const TargetMachine &target,
624                                   Value* lval, Value* rval, Value* destVal,
625                                   vector<MachineInstr*>& mvec)
626 {
627   Value* constOp;
628   if (isa<Constant>(lval) && isa<Constant>(rval))
629     { // both operands are constant: try both orders!
630       vector<MachineInstr*> mvec1, mvec2;
631       unsigned int lcost = CreateMulConstInstruction(target, lval, rval,
632                                                      destVal, mvec1);
633       unsigned int rcost = CreateMulConstInstruction(target, rval, lval,
634                                                      destVal, mvec2);
635       vector<MachineInstr*>& mincostMvec =  (lcost <= rcost)? mvec1 : mvec2;
636       vector<MachineInstr*>& maxcostMvec =  (lcost <= rcost)? mvec2 : mvec1;
637       mvec.insert(mvec.end(), mincostMvec.begin(), mincostMvec.end()); 
638
639       for (unsigned int i=0; i < maxcostMvec.size(); ++i)
640         delete maxcostMvec[i];
641     }
642   else if (isa<Constant>(rval))         // rval is constant, but not lval
643     CreateMulConstInstruction(target, lval, rval, destVal, mvec);
644   else if (isa<Constant>(lval))         // lval is constant, but not rval
645     CreateMulConstInstruction(target, lval, rval, destVal, mvec);
646   
647   // else neither is constant
648   return;
649 }
650
651 // Return NULL if we cannot exploit constant to create a cheaper instruction
652 static inline void
653 CreateMulInstruction(const TargetMachine &target,
654                      Value* lval, Value* rval, Value* destVal,
655                      vector<MachineInstr*>& mvec,
656                      MachineOpCode forceMulOp = INVALID_MACHINE_OPCODE)
657 {
658   unsigned int L = mvec.size();
659   CreateCheapestMulConstInstruction(target, lval, rval, destVal, mvec);
660   if (mvec.size() == L)
661     { // no instructions were added so create MUL reg, reg, reg.
662       // Use FSMULD if both operands are actually floats cast to doubles.
663       // Otherwise, use the default opcode for the appropriate type.
664       MachineOpCode mulOp = ((forceMulOp != INVALID_MACHINE_OPCODE)
665                              ? forceMulOp 
666                              : ChooseMulInstructionByType(destVal->getType()));
667       MachineInstr* M = new MachineInstr(mulOp);
668       M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, lval);
669       M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, rval);
670       M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, destVal);
671       mvec.push_back(M);
672     }
673 }
674
675
676 // Generate a divide instruction for Div or Rem.
677 // For Rem, this assumes that the operand type will be signed if the result
678 // type is signed.  This is correct because they must have the same sign.
679 // 
680 static inline MachineOpCode 
681 ChooseDivInstruction(TargetMachine &target,
682                      const InstructionNode* instrNode)
683 {
684   MachineOpCode opCode = INVALID_OPCODE;
685   
686   const Type* resultType = instrNode->getInstruction()->getType();
687   
688   if (resultType->isIntegral())
689     opCode = resultType->isSigned()? SDIVX : UDIVX;
690   else
691     switch(resultType->getPrimitiveID())
692       {
693       case Type::FloatTyID:  opCode = FDIVS; break;
694       case Type::DoubleTyID: opCode = FDIVD; break;
695       default: assert(0 && "Invalid type for DIV instruction"); break; 
696       }
697   
698   return opCode;
699 }
700
701
702 // Return NULL if we cannot exploit constant to create a cheaper instruction
703 static inline void
704 CreateDivConstInstruction(TargetMachine &target,
705                           const InstructionNode* instrNode,
706                           vector<MachineInstr*>& mvec)
707 {
708   MachineInstr* minstr1 = NULL;
709   MachineInstr* minstr2 = NULL;
710   
711   Value* constOp = ((InstrTreeNode*) instrNode->rightChild())->getValue();
712   if (! isa<Constant>(constOp))
713     return;
714   
715   // Cases worth optimizing are:
716   // (1) Divide by 1 for any type: replace with copy (ADD or FMOV)
717   // (2) Divide by 2^x for integer types: replace with SR[L or A]{X}
718   // 
719   const Type* resultType = instrNode->getInstruction()->getType();
720   
721   if (resultType->isIntegral())
722     {
723       unsigned pow;
724       bool isValidConst;
725       int64_t C = GetConstantValueAsSignedInt(constOp, isValidConst);
726       if (isValidConst)
727         {
728           bool needNeg = false;
729           if (C < 0)
730             {
731               needNeg = true;
732               C = -C;
733             }
734           
735           if (C == 1)
736             {
737               minstr1 = new MachineInstr(ADD);
738               minstr1->SetMachineOperandVal(0,
739                                            MachineOperand::MO_VirtualRegister,
740                                            instrNode->leftChild()->getValue());
741               minstr1->SetMachineOperandReg(1,
742                                         target.getRegInfo().getZeroRegNum());
743             }
744           else if (IsPowerOf2(C, pow))
745             {
746               MachineOpCode opCode= ((resultType->isSigned())
747                                      ? (resultType==Type::LongTy)? SRAX : SRA
748                                      : (resultType==Type::LongTy)? SRLX : SRL);
749               minstr1 = new MachineInstr(opCode);
750               minstr1->SetMachineOperandVal(0,
751                                            MachineOperand::MO_VirtualRegister,
752                                            instrNode->leftChild()->getValue());
753               minstr1->SetMachineOperandConst(1,
754                                           MachineOperand::MO_UnextendedImmed,
755                                           pow);
756             }
757           
758           if (minstr1 && needNeg)
759             { // insert <reg = SUB 0, reg> after the instr to flip the sign
760               minstr2 = CreateIntNegInstruction(target,
761                                                    instrNode->getValue());
762             }
763         }
764     }
765   else
766     {
767       if (resultType == Type::FloatTy ||
768           resultType == Type::DoubleTy)
769         {
770           double dval = cast<ConstantFP>(constOp)->getValue();
771           if (fabs(dval) == 1)
772             {
773               bool needNeg = (dval < 0);
774               
775               MachineOpCode opCode = needNeg
776                 ? (resultType == Type::FloatTy? FNEGS : FNEGD)
777                 : (resultType == Type::FloatTy? FMOVS : FMOVD);
778               
779               minstr1 = new MachineInstr(opCode);
780               minstr1->SetMachineOperandVal(0,
781                                            MachineOperand::MO_VirtualRegister,
782                                            instrNode->leftChild()->getValue());
783             } 
784         }
785     }
786   
787   if (minstr1 != NULL)
788     minstr1->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
789                                  instrNode->getValue());   
790   
791   if (minstr1)
792     mvec.push_back(minstr1);
793   if (minstr2)
794     mvec.push_back(minstr2);
795 }
796
797
798 static void
799 CreateCodeForVariableSizeAlloca(const TargetMachine& target,
800                                 Instruction* result,
801                                 unsigned int tsize,
802                                 Value* numElementsVal,
803                                 vector<MachineInstr*>& getMvec)
804 {
805   MachineInstr* M;
806   
807   // Create a Value to hold the (constant) element size
808   Value* tsizeVal = ConstantSInt::get(Type::IntTy, tsize);
809
810   // Get the constant offset from SP for dynamically allocated storage
811   // and create a temporary Value to hold it.
812   assert(result && result->getParent() && "Result value is not part of a fn?");
813   Function *F = result->getParent()->getParent();
814   MachineCodeForMethod& mcInfo = MachineCodeForMethod::get(F);
815   bool growUp;
816   ConstantSInt* dynamicAreaOffset =
817     ConstantSInt::get(Type::IntTy,
818                       target.getFrameInfo().getDynamicAreaOffset(mcInfo,growUp));
819   assert(! growUp && "Has SPARC v9 stack frame convention changed?");
820
821   // Create a temporary value to hold the result of MUL
822   TmpInstruction* tmpProd = new TmpInstruction(numElementsVal, tsizeVal);
823   MachineCodeForInstruction::get(result).addTemp(tmpProd);
824   
825   // Instruction 1: mul numElements, typeSize -> tmpProd
826   M = new MachineInstr(MULX);
827   M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, numElementsVal);
828   M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, tsizeVal);
829   M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, tmpProd);
830   getMvec.push_back(M);
831         
832   // Instruction 2: sub %sp, tmpProd -> %sp
833   M = new MachineInstr(SUB);
834   M->SetMachineOperandReg(0, target.getRegInfo().getStackPointer());
835   M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, tmpProd);
836   M->SetMachineOperandReg(2, target.getRegInfo().getStackPointer());
837   getMvec.push_back(M);
838   
839   // Instruction 3: add %sp, frameSizeBelowDynamicArea -> result
840   M = new MachineInstr(ADD);
841   M->SetMachineOperandReg(0, target.getRegInfo().getStackPointer());
842   M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, dynamicAreaOffset);
843   M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, result);
844   getMvec.push_back(M);
845 }        
846
847
848 static void
849 CreateCodeForFixedSizeAlloca(const TargetMachine& target,
850                              Instruction* result,
851                              unsigned int tsize,
852                              unsigned int numElements,
853                              vector<MachineInstr*>& getMvec)
854 {
855   assert(result && result->getParent() &&
856          "Result value is not part of a function?");
857   Function *F = result->getParent()->getParent();
858   MachineCodeForMethod &mcInfo = MachineCodeForMethod::get(F);
859
860   // Check if the offset would small enough to use as an immediate in
861   // load/stores (check LDX because all load/stores have the same-size immediate
862   // field).  If not, put the variable in the dynamically sized area of the
863   // frame.
864   unsigned int paddedSizeIgnored;
865   int offsetFromFP = mcInfo.computeOffsetforLocalVar(target, result,
866                                                      paddedSizeIgnored,
867                                                      tsize * numElements);
868   if (! target.getInstrInfo().constantFitsInImmedField(LDX, offsetFromFP))
869     {
870       CreateCodeForVariableSizeAlloca(target, result, tsize, 
871                                       ConstantSInt::get(Type::IntTy,numElements),
872                                       getMvec);
873       return;
874     }
875   
876   // else offset fits in immediate field so go ahead and allocate it.
877   offsetFromFP = mcInfo.allocateLocalVar(target, result, tsize * numElements);
878   
879   // Create a temporary Value to hold the constant offset.
880   // This is needed because it may not fit in the immediate field.
881   ConstantSInt* offsetVal = ConstantSInt::get(Type::IntTy, offsetFromFP);
882   
883   // Instruction 1: add %fp, offsetFromFP -> result
884   MachineInstr* M = new MachineInstr(ADD);
885   M->SetMachineOperandReg(0, target.getRegInfo().getFramePointer());
886   M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, offsetVal); 
887   M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, result);
888   
889   getMvec.push_back(M);
890 }
891
892
893
894 //------------------------------------------------------------------------ 
895 // Function SetOperandsForMemInstr
896 //
897 // Choose addressing mode for the given load or store instruction.
898 // Use [reg+reg] if it is an indexed reference, and the index offset is
899 //               not a constant or if it cannot fit in the offset field.
900 // Use [reg+offset] in all other cases.
901 // 
902 // This assumes that all array refs are "lowered" to one of these forms:
903 //      %x = load (subarray*) ptr, constant     ; single constant offset
904 //      %x = load (subarray*) ptr, offsetVal    ; single non-constant offset
905 // Generally, this should happen via strength reduction + LICM.
906 // Also, strength reduction should take care of using the same register for
907 // the loop index variable and an array index, when that is profitable.
908 //------------------------------------------------------------------------ 
909
910 static void
911 SetOperandsForMemInstr(vector<MachineInstr*>& mvec,
912                        vector<MachineInstr*>::iterator mvecI,
913                        const InstructionNode* vmInstrNode,
914                        const TargetMachine& target)
915 {
916   MemAccessInst* memInst = (MemAccessInst*) vmInstrNode->getInstruction();
917   
918   // Variables to hold the index vector, ptr value, and offset value.
919   // The major work here is to extract these for all 3 instruction types
920   // and then call the common function SetMemOperands_Internal().
921   // 
922   Value* ptrVal = memInst->getPointerOperand();
923   
924   // Start with the index vector of this instruction, if any.
925   vector<Value*> idxVec;
926   idxVec.insert(idxVec.end(), memInst->idx_begin(), memInst->idx_end());
927   
928   // If there is a GetElemPtr instruction to fold in to this instr,
929   // it must be in the left child for Load and GetElemPtr, and in the
930   // right child for Store instructions.
931   InstrTreeNode* ptrChild = (vmInstrNode->getOpLabel() == Instruction::Store
932                              ? vmInstrNode->rightChild()
933                              : vmInstrNode->leftChild()); 
934   
935   // Fold chains of GetElemPtr instructions for structure references.
936   if (isa<StructType>(cast<PointerType>(ptrVal->getType())->getElementType())
937       && (ptrChild->getOpLabel() == Instruction::GetElementPtr ||
938           ptrChild->getOpLabel() == GetElemPtrIdx))
939     {
940       Value* newPtr = FoldGetElemChain((InstructionNode*) ptrChild, idxVec);
941       if (newPtr)
942         ptrVal = newPtr;
943     }
944   
945   SetMemOperands_Internal(mvec, mvecI, vmInstrNode, ptrVal, idxVec, target);
946 }
947
948
949 // Generate the correct operands (and additional instructions if needed)
950 // for the given pointer and given index vector.
951 //
952 static void
953 SetMemOperands_Internal(vector<MachineInstr*>& mvec,
954                         vector<MachineInstr*>::iterator mvecI,
955                         const InstructionNode* vmInstrNode,
956                         Value* ptrVal,
957                         vector<Value*>& idxVec,
958                         const TargetMachine& target)
959 {
960   MemAccessInst* memInst = (MemAccessInst*) vmInstrNode->getInstruction();
961   
962   // Initialize so we default to storing the offset in a register.
963   int64_t smallConstOffset = 0;
964   Value* valueForRegOffset = NULL;
965   MachineOperand::MachineOperandType offsetOpType =MachineOperand::MO_VirtualRegister;
966
967   // Check if there is an index vector and if so, compute the
968   // right offset for structures and for arrays 
969   // 
970   if (idxVec.size() > 0)
971     {
972       unsigned offset = 0;
973       
974       const PointerType* ptrType = cast<PointerType>(ptrVal->getType());
975       
976       // Handle special common case of leading [0] index.
977       bool firstIndexIsZero =
978         bool(isa<ConstantUInt>(idxVec.front()) &&
979              cast<ConstantUInt>(idxVec.front())->getValue() == 0);
980       
981       // This is a real structure reference if the ptr target is a
982       // structure type, and the first offset is [0] (eliminate that offset).
983       if (firstIndexIsZero && ptrType->getElementType()->isStructType())
984         {
985           // Compute the offset value using the index vector. Create a
986           // virtual reg. for it since it may not fit in the immed field.
987           assert(idxVec.size() >= 2);
988           idxVec.erase(idxVec.begin());
989           unsigned offset = target.DataLayout.getIndexedOffset(ptrType,idxVec);
990           valueForRegOffset = ConstantSInt::get(Type::IntTy, offset);
991         }
992       else
993         {
994           // It is an array ref, and must have been lowered to a single offset.
995           assert((memInst->getNumOperands()
996                   == (unsigned) 1 + memInst->getFirstIndexOperandNumber())
997                  && "Array refs must be lowered before Instruction Selection");
998           
999           Value* arrayOffsetVal =  * memInst->idx_begin();
1000           
1001           // If index is 0, the offset value is just 0.  Otherwise, 
1002           // generate a MUL instruction to compute address from index.
1003           // The call to getTypeSize() will fail if size is not constant.
1004           // CreateMulInstruction() folds constants intelligently enough.
1005           // 
1006           if (firstIndexIsZero)
1007             {
1008               offsetOpType = MachineOperand::MO_SignExtendedImmed;
1009               smallConstOffset = 0;
1010             }
1011           else
1012             {
1013               vector<MachineInstr*> mulVec;
1014               Instruction* addr = new TmpInstruction(Type::UIntTy, memInst);
1015               MachineCodeForInstruction::get(memInst).addTemp(addr);
1016               
1017               unsigned int eltSize =
1018                 target.DataLayout.getTypeSize(ptrType->getElementType());
1019               assert(eltSize > 0 && "Invalid or non-const array element size");
1020               ConstantUInt* eltVal = ConstantUInt::get(Type::UIntTy, eltSize);
1021               
1022               CreateMulInstruction(target,
1023                                    arrayOffsetVal, /* lval, not likely const */
1024                                    eltVal,         /* rval, likely constant */
1025                                    addr,           /* result*/
1026                                    mulVec, INVALID_MACHINE_OPCODE);
1027               assert(mulVec.size() > 0 && "No multiply instruction created?");
1028               for (vector<MachineInstr*>::const_iterator I = mulVec.begin();
1029                    I != mulVec.end(); ++I)
1030                 {
1031                   mvecI = mvec.insert(mvecI, *I);   // ptr to inserted value
1032                   ++mvecI;                          // ptr to mem. instr.
1033                 }
1034               
1035               valueForRegOffset = addr;
1036             }
1037         }
1038     }
1039   else
1040     {
1041       offsetOpType = MachineOperand::MO_SignExtendedImmed;
1042       smallConstOffset = 0;
1043     }
1044   
1045   // For STORE:
1046   //   Operand 0 is value, operand 1 is ptr, operand 2 is offset
1047   // For LOAD or GET_ELEMENT_PTR,
1048   //   Operand 0 is ptr, operand 1 is offset, operand 2 is result.
1049   // 
1050   unsigned offsetOpNum, ptrOpNum;
1051   if (memInst->getOpcode() == Instruction::Store)
1052     {
1053       (*mvecI)->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1054                                      vmInstrNode->leftChild()->getValue());
1055       ptrOpNum = 1;
1056       offsetOpNum = 2;
1057     }
1058   else
1059     {
1060       ptrOpNum = 0;
1061       offsetOpNum = 1;
1062       (*mvecI)->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
1063                                      memInst);
1064     }
1065   
1066   (*mvecI)->SetMachineOperandVal(ptrOpNum, MachineOperand::MO_VirtualRegister,
1067                                  ptrVal);
1068   
1069   if (offsetOpType == MachineOperand::MO_VirtualRegister)
1070     {
1071       assert(valueForRegOffset != NULL);
1072       (*mvecI)->SetMachineOperandVal(offsetOpNum, offsetOpType,
1073                                      valueForRegOffset); 
1074     }
1075   else
1076     (*mvecI)->SetMachineOperandConst(offsetOpNum, offsetOpType,
1077                                      smallConstOffset);
1078 }
1079
1080
1081 // 
1082 // Substitute operand `operandNum' of the instruction in node `treeNode'
1083 // in place of the use(s) of that instruction in node `parent'.
1084 // Check both explicit and implicit operands!
1085 // Also make sure to skip over a parent who:
1086 // (1) is a list node in the Burg tree, or
1087 // (2) itself had its results forwarded to its parent
1088 // 
1089 static void
1090 ForwardOperand(InstructionNode* treeNode,
1091                InstrTreeNode*   parent,
1092                int operandNum)
1093 {
1094   assert(treeNode && parent && "Invalid invocation of ForwardOperand");
1095   
1096   Instruction* unusedOp = treeNode->getInstruction();
1097   Value* fwdOp = unusedOp->getOperand(operandNum);
1098
1099   // The parent itself may be a list node, so find the real parent instruction
1100   while (parent->getNodeType() != InstrTreeNode::NTInstructionNode)
1101     {
1102       parent = parent->parent();
1103       assert(parent && "ERROR: Non-instruction node has no parent in tree.");
1104     }
1105   InstructionNode* parentInstrNode = (InstructionNode*) parent;
1106   
1107   Instruction* userInstr = parentInstrNode->getInstruction();
1108   MachineCodeForInstruction &mvec = MachineCodeForInstruction::get(userInstr);
1109
1110   // The parent's mvec would be empty if it was itself forwarded.
1111   // Recursively call ForwardOperand in that case...
1112   //
1113   if (mvec.size() == 0)
1114     {
1115       assert(parent->parent() != NULL &&
1116              "Parent could not have been forwarded, yet has no instructions?");
1117       ForwardOperand(treeNode, parent->parent(), operandNum);
1118     }
1119   else
1120     {
1121       bool fwdSuccessful = false;
1122       for (unsigned i=0, N=mvec.size(); i < N; i++)
1123         {
1124           MachineInstr* minstr = mvec[i];
1125           for (unsigned i=0, numOps=minstr->getNumOperands(); i < numOps; ++i)
1126             {
1127               const MachineOperand& mop = minstr->getOperand(i);
1128               if (mop.getOperandType() == MachineOperand::MO_VirtualRegister &&
1129                   mop.getVRegValue() == unusedOp)
1130                 {
1131                   minstr->SetMachineOperandVal(i,
1132                                 MachineOperand::MO_VirtualRegister, fwdOp);
1133                   fwdSuccessful = true;
1134                 }
1135             }
1136           
1137           for (unsigned i=0,numOps=minstr->getNumImplicitRefs(); i<numOps; ++i)
1138             if (minstr->getImplicitRef(i) == unusedOp)
1139               {
1140                 minstr->setImplicitRef(i, fwdOp,
1141                                        minstr->implicitRefIsDefined(i));
1142                 fwdSuccessful = true;
1143               }
1144         }
1145       assert(fwdSuccessful && "Value to be forwarded is never used!");
1146     }
1147 }
1148
1149
1150 void UltraSparcInstrInfo::
1151 CreateCopyInstructionsByType(const TargetMachine& target,
1152                              Function *F,
1153                              Value* src,
1154                              Instruction* dest,
1155                              vector<MachineInstr*>& minstrVec) const
1156 {
1157   bool loadConstantToReg = false;
1158   
1159   const Type* resultType = dest->getType();
1160   
1161   MachineOpCode opCode = ChooseAddInstructionByType(resultType);
1162   if (opCode == INVALID_OPCODE)
1163     {
1164       assert(0 && "Unsupported result type in CreateCopyInstructionsByType()");
1165       return;
1166     }
1167   
1168   // if `src' is a constant that doesn't fit in the immed field or if it is
1169   // a global variable (i.e., a constant address), generate a load
1170   // instruction instead of an add
1171   // 
1172   if (isa<Constant>(src))
1173     {
1174       unsigned int machineRegNum;
1175       int64_t immedValue;
1176       MachineOperand::MachineOperandType opType =
1177         ChooseRegOrImmed(src, opCode, target, /*canUseImmed*/ true,
1178                          machineRegNum, immedValue);
1179       
1180       if (opType == MachineOperand::MO_VirtualRegister)
1181         loadConstantToReg = true;
1182     }
1183   else if (isa<GlobalValue>(src))
1184     loadConstantToReg = true;
1185   
1186   if (loadConstantToReg)
1187     { // `src' is constant and cannot fit in immed field for the ADD
1188       // Insert instructions to "load" the constant into a register
1189       vector<TmpInstruction*> tempVec;
1190       target.getInstrInfo().CreateCodeToLoadConst(F, src, dest,
1191                                                   minstrVec, tempVec);
1192       for (unsigned i=0; i < tempVec.size(); i++)
1193         MachineCodeForInstruction::get(dest).addTemp(tempVec[i]);
1194     }
1195   else
1196     { // Create an add-with-0 instruction of the appropriate type.
1197       // Make `src' the second operand, in case it is a constant
1198       // Use (unsigned long) 0 for a NULL pointer value.
1199       // 
1200       const Type* zeroValueType =
1201         (resultType->getPrimitiveID() == Type::PointerTyID)? Type::ULongTy
1202                                                            : resultType;
1203       MachineInstr* minstr = new MachineInstr(opCode);
1204       minstr->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1205                                    Constant::getNullConstant(zeroValueType));
1206       minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, src);
1207       minstr->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,dest);
1208       minstrVec.push_back(minstr);
1209     }
1210 }
1211
1212
1213
1214 //******************* Externally Visible Functions *************************/
1215
1216
1217 //------------------------------------------------------------------------ 
1218 // External Function: GetInstructionsForProlog
1219 // External Function: GetInstructionsForEpilog
1220 //
1221 // Purpose:
1222 //   Create prolog and epilog code for procedure entry and exit
1223 //------------------------------------------------------------------------ 
1224
1225 extern unsigned
1226 GetInstructionsForProlog(BasicBlock* entryBB,
1227                          TargetMachine &target,
1228                          MachineInstr** mvec)
1229 {
1230   MachineInstr* M;
1231   const MachineFrameInfo& frameInfo = target.getFrameInfo();
1232   unsigned int N = 0;
1233   
1234   // The second operand is the stack size. If it does not fit in the
1235   // immediate field, we have to use a free register to hold the size.
1236   // We will assume that local register `l0' is unused since the SAVE
1237   // instruction must be the first instruction in each procedure.
1238   // 
1239   Function *F = entryBB->getParent();
1240   MachineCodeForMethod& mcInfo = MachineCodeForMethod::get(F);
1241   unsigned int staticStackSize = mcInfo.getStaticStackSize();
1242   
1243   if (staticStackSize < (unsigned) frameInfo.getMinStackFrameSize())
1244     staticStackSize = (unsigned) frameInfo.getMinStackFrameSize();
1245   
1246   if (unsigned padsz = (staticStackSize %
1247                         (unsigned) frameInfo.getStackFrameSizeAlignment()))
1248     staticStackSize += frameInfo.getStackFrameSizeAlignment() - padsz;
1249   
1250   if (target.getInstrInfo().constantFitsInImmedField(SAVE, staticStackSize))
1251     {
1252       M = new MachineInstr(SAVE);
1253       M->SetMachineOperandReg(0, target.getRegInfo().getStackPointer());
1254       M->SetMachineOperandConst(1, MachineOperand::MO_SignExtendedImmed,
1255                                    - (int) staticStackSize);
1256       M->SetMachineOperandReg(2, target.getRegInfo().getStackPointer());
1257       mvec[N++] = M;
1258     }
1259   else
1260     {
1261       M = new MachineInstr(SETSW);
1262       M->SetMachineOperandConst(0, MachineOperand::MO_SignExtendedImmed,
1263                                 - (int) staticStackSize);
1264       M->SetMachineOperandReg(1, MachineOperand::MO_MachineRegister,
1265                                  target.getRegInfo().getUnifiedRegNum(
1266                                   target.getRegInfo().getRegClassIDOfType(Type::IntTy),
1267                                   SparcIntRegOrder::l0));
1268       mvec[N++] = M;
1269       
1270       M = new MachineInstr(SAVE);
1271       M->SetMachineOperandReg(0, target.getRegInfo().getStackPointer());
1272       M->SetMachineOperandReg(1, MachineOperand::MO_MachineRegister,
1273                                  target.getRegInfo().getUnifiedRegNum(
1274                                   target.getRegInfo().getRegClassIDOfType(Type::IntTy),
1275                                   SparcIntRegOrder::l0));
1276       M->SetMachineOperandReg(2, target.getRegInfo().getStackPointer());
1277       mvec[N++] = M;
1278     }
1279   
1280   return N;
1281 }
1282
1283
1284 extern unsigned
1285 GetInstructionsForEpilog(BasicBlock* anExitBB,
1286                          TargetMachine &target,
1287                          MachineInstr** mvec)
1288 {
1289   mvec[0] = new MachineInstr(RESTORE);
1290   mvec[0]->SetMachineOperandReg(0, target.getRegInfo().getZeroRegNum());
1291   mvec[0]->SetMachineOperandConst(1, MachineOperand::MO_SignExtendedImmed,
1292                              (int64_t)0);
1293   mvec[0]->SetMachineOperandReg(2, target.getRegInfo().getZeroRegNum());
1294   
1295   return 1;
1296 }
1297
1298
1299 //------------------------------------------------------------------------ 
1300 // External Function: ThisIsAChainRule
1301 //
1302 // Purpose:
1303 //   Check if a given BURG rule is a chain rule.
1304 //------------------------------------------------------------------------ 
1305
1306 extern bool
1307 ThisIsAChainRule(int eruleno)
1308 {
1309   switch(eruleno)
1310     {
1311     case 111:   // stmt:  reg
1312     case 113:   // stmt:  bool
1313     case 123:
1314     case 124:
1315     case 125:
1316     case 126:
1317     case 127:
1318     case 128:
1319     case 129:
1320     case 130:
1321     case 131:
1322     case 132:
1323     case 133:
1324     case 155:
1325     case 221:
1326     case 222:
1327     case 241:
1328     case 242:
1329     case 243:
1330     case 244:
1331     case 321:
1332       return true; break;
1333       
1334     default:
1335       return false; break;
1336     }
1337 }
1338
1339
1340 //------------------------------------------------------------------------ 
1341 // External Function: GetInstructionsByRule
1342 //
1343 // Purpose:
1344 //   Choose machine instructions for the SPARC according to the
1345 //   patterns chosen by the BURG-generated parser.
1346 //------------------------------------------------------------------------ 
1347
1348 void
1349 GetInstructionsByRule(InstructionNode* subtreeRoot,
1350                       int ruleForNode,
1351                       short* nts,
1352                       TargetMachine &target,
1353                       vector<MachineInstr*>& mvec)
1354 {
1355   bool checkCast = false;               // initialize here to use fall-through
1356   int nextRule;
1357   int forwardOperandNum = -1;
1358   unsigned int allocaSize = 0;
1359   MachineInstr* M, *M2;
1360   unsigned int L;
1361
1362   mvec.clear(); 
1363   
1364   // If the code for this instruction was folded into the parent (user),
1365   // then do nothing!
1366   if (subtreeRoot->isFoldedIntoParent())
1367     return;
1368   
1369   // 
1370   // Let's check for chain rules outside the switch so that we don't have
1371   // to duplicate the list of chain rule production numbers here again
1372   // 
1373   if (ThisIsAChainRule(ruleForNode))
1374     {
1375       // Chain rules have a single nonterminal on the RHS.
1376       // Get the rule that matches the RHS non-terminal and use that instead.
1377       // 
1378       assert(nts[0] && ! nts[1]
1379              && "A chain rule should have only one RHS non-terminal!");
1380       nextRule = burm_rule(subtreeRoot->state, nts[0]);
1381       nts = burm_nts[nextRule];
1382       GetInstructionsByRule(subtreeRoot, nextRule, nts, target, mvec);
1383     }
1384   else
1385     {
1386       switch(ruleForNode) {
1387       case 1:   // stmt:   Ret
1388       case 2:   // stmt:   RetValue(reg)
1389       {         // NOTE: Prepass of register allocation is responsible
1390                 //       for moving return value to appropriate register.
1391                 // Mark the return-address register as a hidden virtual reg.
1392                 // Mark the return value   register as an implicit ref of
1393                 // the machine instruction.
1394                 // Finally put a NOP in the delay slot.
1395         ReturnInst *returnInstr =
1396           cast<ReturnInst>(subtreeRoot->getInstruction());
1397         assert(returnInstr->getOpcode() == Instruction::Ret);
1398         
1399         Instruction* returnReg = new TmpInstruction(returnInstr);
1400         MachineCodeForInstruction::get(returnInstr).addTemp(returnReg);
1401         
1402         M = new MachineInstr(JMPLRET);
1403         M->SetMachineOperandReg(0, MachineOperand::MO_VirtualRegister,
1404                                       returnReg);
1405         M->SetMachineOperandConst(1,MachineOperand::MO_SignExtendedImmed,
1406                                    (int64_t)8);
1407         M->SetMachineOperandReg(2, target.getRegInfo().getZeroRegNum());
1408         
1409         if (returnInstr->getReturnValue() != NULL)
1410           M->addImplicitRef(returnInstr->getReturnValue());
1411         
1412         mvec.push_back(M);
1413         mvec.push_back(new MachineInstr(NOP));
1414         
1415         break;
1416       }  
1417         
1418       case 3:   // stmt:   Store(reg,reg)
1419       case 4:   // stmt:   Store(reg,ptrreg)
1420         mvec.push_back(new MachineInstr(
1421                          ChooseStoreInstruction(
1422                             subtreeRoot->leftChild()->getValue()->getType())));
1423         SetOperandsForMemInstr(mvec, mvec.end()-1, subtreeRoot, target);
1424         break;
1425
1426       case 5:   // stmt:   BrUncond
1427         M = new MachineInstr(BA);
1428         M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
1429                                       (Value*)NULL);
1430         M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1431              cast<BranchInst>(subtreeRoot->getInstruction())->getSuccessor(0));
1432         mvec.push_back(M);
1433         
1434         // delay slot
1435         mvec.push_back(new MachineInstr(NOP));
1436         break;
1437
1438       case 206: // stmt:   BrCond(setCCconst)
1439       { // setCCconst => boolean was computed with `%b = setCC type reg1 const'
1440         // If the constant is ZERO, we can use the branch-on-integer-register
1441         // instructions and avoid the SUBcc instruction entirely.
1442         // Otherwise this is just the same as case 5, so just fall through.
1443         // 
1444         InstrTreeNode* constNode = subtreeRoot->leftChild()->rightChild();
1445         assert(constNode &&
1446                constNode->getNodeType() ==InstrTreeNode::NTConstNode);
1447         Constant *constVal = cast<Constant>(constNode->getValue());
1448         bool isValidConst;
1449         
1450         if ((constVal->getType()->isIntegral()
1451              || constVal->getType()->isPointerType())
1452             && GetConstantValueAsSignedInt(constVal, isValidConst) == 0
1453             && isValidConst)
1454           {
1455             // That constant is a zero after all...
1456             // Use the left child of setCC as the first argument!
1457             // Mark the setCC node so that no code is generated for it.
1458             InstructionNode* setCCNode = (InstructionNode*)
1459                                          subtreeRoot->leftChild();
1460             assert(setCCNode->getOpLabel() == SetCCOp);
1461             setCCNode->markFoldedIntoParent();
1462             
1463             BranchInst* brInst=cast<BranchInst>(subtreeRoot->getInstruction());
1464             
1465             M = new MachineInstr(ChooseBprInstruction(subtreeRoot));
1466             M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1467                                     setCCNode->leftChild()->getValue());
1468             M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1469                                     brInst->getSuccessor(0));
1470             mvec.push_back(M);
1471             
1472             // delay slot
1473             mvec.push_back(new MachineInstr(NOP));
1474
1475             // false branch
1476             M = new MachineInstr(BA);
1477             M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
1478                                     (Value*) NULL);
1479             M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1480                                     brInst->getSuccessor(1));
1481             mvec.push_back(M);
1482             
1483             // delay slot
1484             mvec.push_back(new MachineInstr(NOP));
1485             
1486             break;
1487           }
1488         // ELSE FALL THROUGH
1489       }
1490
1491       case 6:   // stmt:   BrCond(bool)
1492       { // bool => boolean was computed with some boolean operator
1493         // (SetCC, Not, ...).  We need to check whether the type was a FP,
1494         // signed int or unsigned int, and check the branching condition in
1495         // order to choose the branch to use.
1496         // If it is an integer CC, we also need to find the unique
1497         // TmpInstruction representing that CC.
1498         // 
1499         BranchInst* brInst = cast<BranchInst>(subtreeRoot->getInstruction());
1500         bool isFPBranch;
1501         M = new MachineInstr(ChooseBccInstruction(subtreeRoot, isFPBranch));
1502         
1503         Value* ccValue = GetTmpForCC(subtreeRoot->leftChild()->getValue(),
1504                                      brInst->getParent()->getParent(),
1505                                      isFPBranch? Type::FloatTy : Type::IntTy);
1506         
1507         M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister, ccValue);
1508         M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1509                                    brInst->getSuccessor(0));
1510         mvec.push_back(M);
1511         
1512         // delay slot
1513         mvec.push_back(new MachineInstr(NOP));
1514         
1515         // false branch
1516         M = new MachineInstr(BA);
1517         M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
1518                                    (Value*) NULL);
1519         M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1520                                    brInst->getSuccessor(1));
1521         mvec.push_back(M);
1522         
1523         // delay slot
1524         mvec.push_back(new MachineInstr(NOP));
1525         break;
1526       }
1527         
1528       case 208: // stmt:   BrCond(boolconst)
1529       {
1530         // boolconst => boolean is a constant; use BA to first or second label
1531         Constant* constVal = 
1532           cast<Constant>(subtreeRoot->leftChild()->getValue());
1533         unsigned dest = cast<ConstantBool>(constVal)->getValue()? 0 : 1;
1534         
1535         M = new MachineInstr(BA);
1536         M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
1537                                 (Value*) NULL);
1538         M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1539           ((BranchInst*) subtreeRoot->getInstruction())->getSuccessor(dest));
1540         mvec.push_back(M);
1541         
1542         // delay slot
1543         mvec.push_back(new MachineInstr(NOP));
1544         break;
1545       }
1546         
1547       case   8: // stmt:   BrCond(boolreg)
1548       { // boolreg   => boolean is stored in an existing register.
1549         // Just use the branch-on-integer-register instruction!
1550         // 
1551         M = new MachineInstr(BRNZ);
1552         M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1553                                       subtreeRoot->leftChild()->getValue());
1554         M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1555               ((BranchInst*) subtreeRoot->getInstruction())->getSuccessor(0));
1556         mvec.push_back(M);
1557
1558         // delay slot
1559         mvec.push_back(new MachineInstr(NOP));
1560
1561         // false branch
1562         M = new MachineInstr(BA);
1563         M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
1564                                 (Value*) NULL);
1565         M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
1566               ((BranchInst*) subtreeRoot->getInstruction())->getSuccessor(1));
1567         mvec.push_back(M);
1568         
1569         // delay slot
1570         mvec.push_back(new MachineInstr(NOP));
1571         break;
1572       }  
1573       
1574       case 9:   // stmt:   Switch(reg)
1575         assert(0 && "*** SWITCH instruction is not implemented yet.");
1576         break;
1577
1578       case 10:  // reg:   VRegList(reg, reg)
1579         assert(0 && "VRegList should never be the topmost non-chain rule");
1580         break;
1581
1582       case 21:  // bool:  Not(bool):    Both these are implemented as:
1583       case 421: // reg:   BNot(reg) :        reg = reg XOR-NOT 0
1584         M = new MachineInstr(XNOR);
1585         M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1586                                 subtreeRoot->leftChild()->getValue());
1587         M->SetMachineOperandReg(1, target.getRegInfo().getZeroRegNum());
1588         M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
1589                                 subtreeRoot->getValue());
1590         mvec.push_back(M);
1591         break;
1592
1593       case 322: // reg:   ToBoolTy(bool):
1594       case 22:  // reg:   ToBoolTy(reg):
1595       {
1596         const Type* opType = subtreeRoot->leftChild()->getValue()->getType();
1597         assert(opType->isIntegral() || opType->isPointerType()
1598                || opType == Type::BoolTy);
1599         forwardOperandNum = 0;          // forward first operand to user
1600         break;
1601       }
1602       
1603       case 23:  // reg:   ToUByteTy(reg)
1604       case 25:  // reg:   ToUShortTy(reg)
1605       case 27:  // reg:   ToUIntTy(reg)
1606       case 29:  // reg:   ToULongTy(reg)
1607       {
1608         const Type* opType = subtreeRoot->leftChild()->getValue()->getType();
1609         assert(opType->isIntegral() ||
1610                opType->isPointerType() ||
1611                opType == Type::BoolTy && "Cast is illegal for other types");
1612         forwardOperandNum = 0;          // forward first operand to user
1613         break;
1614       }
1615       
1616       case 24:  // reg:   ToSByteTy(reg)
1617       case 26:  // reg:   ToShortTy(reg)
1618       case 28:  // reg:   ToIntTy(reg)
1619       case 30:  // reg:   ToLongTy(reg)
1620       {
1621         const Type* opType = subtreeRoot->leftChild()->getValue()->getType();
1622         if (opType->isIntegral()
1623             || opType->isPointerType()
1624             || opType == Type::BoolTy)
1625           {
1626             forwardOperandNum = 0;          // forward first operand to user
1627           }
1628         else
1629           {
1630             // If the source operand is an FP type, the int result must be
1631             // copied from float to int register via memory!
1632             Instruction *dest = subtreeRoot->getInstruction();
1633             Value* leftVal = subtreeRoot->leftChild()->getValue();
1634             Value* destForCast;
1635             vector<MachineInstr*> minstrVec;
1636             
1637             if (opType == Type::FloatTy || opType == Type::DoubleTy)
1638               {
1639                 // Create a temporary to represent the INT register
1640                 // into which the FP value will be copied via memory.
1641                 // The type of this temporary will determine the FP
1642                 // register used: single-prec for a 32-bit int or smaller,
1643                 // double-prec for a 64-bit int.
1644                 // 
1645                 const Type* destTypeToUse =
1646                   (dest->getType() == Type::LongTy)? Type::DoubleTy
1647                                                    : Type::FloatTy;
1648                 destForCast = new TmpInstruction(destTypeToUse, leftVal);
1649                 MachineCodeForInstruction &MCFI = 
1650                   MachineCodeForInstruction::get(dest);
1651                 MCFI.addTemp(destForCast);
1652                 
1653                 vector<TmpInstruction*> tempVec;
1654                 target.getInstrInfo().CreateCodeToCopyFloatToInt(
1655                     dest->getParent()->getParent(),
1656                     (TmpInstruction*) destForCast, dest,
1657                     minstrVec, tempVec, target);
1658                 
1659                 for (unsigned i=0; i < tempVec.size(); ++i)
1660                   MCFI.addTemp(tempVec[i]);
1661               }
1662             else
1663               destForCast = leftVal;
1664             
1665             MachineOpCode opCode=ChooseConvertToIntInstr(subtreeRoot, opType);
1666             assert(opCode != INVALID_OPCODE && "Expected to need conversion!");
1667             
1668             M = new MachineInstr(opCode);
1669             M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1670                                     leftVal);
1671             M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,
1672                                     destForCast);
1673             mvec.push_back(M);
1674
1675             // Append the copy code, if any, after the conversion instr.
1676             mvec.insert(mvec.end(), minstrVec.begin(), minstrVec.end());
1677           }
1678         break;
1679       }  
1680       
1681       case  31: // reg:   ToFloatTy(reg):
1682       case  32: // reg:   ToDoubleTy(reg):
1683       case 232: // reg:   ToDoubleTy(Constant):
1684         
1685         // If this instruction has a parent (a user) in the tree 
1686         // and the user is translated as an FsMULd instruction,
1687         // then the cast is unnecessary.  So check that first.
1688         // In the future, we'll want to do the same for the FdMULq instruction,
1689         // so do the check here instead of only for ToFloatTy(reg).
1690         // 
1691         if (subtreeRoot->parent() != NULL &&
1692             MachineCodeForInstruction::get(((InstructionNode*)subtreeRoot->parent())->getInstruction())[0]->getOpCode() == FSMULD)
1693           {
1694             forwardOperandNum = 0;          // forward first operand to user
1695           }
1696         else
1697           {
1698             Value* leftVal = subtreeRoot->leftChild()->getValue();
1699             const Type* opType = leftVal->getType();
1700             MachineOpCode opCode=ChooseConvertToFloatInstr(subtreeRoot,opType);
1701             if (opCode == INVALID_OPCODE)       // no conversion needed
1702               {
1703                 forwardOperandNum = 0;      // forward first operand to user
1704               }
1705             else
1706               {
1707                 // If the source operand is a non-FP type it must be
1708                 // first copied from int to float register via memory!
1709                 Instruction *dest = subtreeRoot->getInstruction();
1710                 Value* srcForCast;
1711                 int n = 0;
1712                 if (opType != Type::FloatTy && opType != Type::DoubleTy)
1713                   {
1714                     // Create a temporary to represent the FP register
1715                     // into which the integer will be copied via memory.
1716                     // The type of this temporary will determine the FP
1717                     // register used: single-prec for a 32-bit int or smaller,
1718                     // double-prec for a 64-bit int.
1719                     // 
1720                     const Type* srcTypeToUse =
1721                       (leftVal->getType() == Type::LongTy)? Type::DoubleTy
1722                                                           : Type::FloatTy;
1723                     
1724                     srcForCast = new TmpInstruction(srcTypeToUse, dest);
1725                     MachineCodeForInstruction &DestMCFI = 
1726                       MachineCodeForInstruction::get(dest);
1727                     DestMCFI.addTemp(srcForCast);
1728                     
1729                     vector<MachineInstr*> minstrVec;
1730                     vector<TmpInstruction*> tempVec;
1731                     target.getInstrInfo().CreateCodeToCopyIntToFloat(
1732                          dest->getParent()->getParent(),
1733                          leftVal, (TmpInstruction*) srcForCast,
1734                          minstrVec, tempVec, target);
1735                     
1736                     mvec.insert(mvec.end(), minstrVec.begin(),minstrVec.end());
1737                     
1738                     for (unsigned i=0; i < tempVec.size(); ++i)
1739                        DestMCFI.addTemp(tempVec[i]);
1740                   }
1741                 else
1742                   srcForCast = leftVal;
1743                 
1744                 M = new MachineInstr(opCode);
1745                 M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
1746                                            srcForCast);
1747                 M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,
1748                                            dest);
1749                 mvec.push_back(M);
1750               }
1751           }
1752         break;
1753
1754       case 19:  // reg:   ToArrayTy(reg):
1755       case 20:  // reg:   ToPointerTy(reg):
1756         forwardOperandNum = 0;          // forward first operand to user
1757         break;
1758
1759       case 233: // reg:   Add(reg, Constant)
1760         M = CreateAddConstInstruction(subtreeRoot);
1761         if (M != NULL)
1762           {
1763             mvec.push_back(M);
1764             break;
1765           }
1766         // ELSE FALL THROUGH
1767         
1768       case 33:  // reg:   Add(reg, reg)
1769         mvec.push_back(new MachineInstr(ChooseAddInstruction(subtreeRoot)));
1770         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1771         break;
1772
1773       case 234: // reg:   Sub(reg, Constant)
1774         M = CreateSubConstInstruction(subtreeRoot);
1775         if (M != NULL)
1776           {
1777             mvec.push_back(M);
1778             break;
1779           }
1780         // ELSE FALL THROUGH
1781         
1782       case 34:  // reg:   Sub(reg, reg)
1783         mvec.push_back(new MachineInstr(ChooseSubInstructionByType(
1784                                    subtreeRoot->getInstruction()->getType())));
1785         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1786         break;
1787
1788       case 135: // reg:   Mul(todouble, todouble)
1789         checkCast = true;
1790         // FALL THROUGH 
1791
1792       case 35:  // reg:   Mul(reg, reg)
1793       {
1794         MachineOpCode forceOp = ((checkCast && BothFloatToDouble(subtreeRoot))
1795                                  ? FSMULD
1796                                  : INVALID_MACHINE_OPCODE);
1797         CreateMulInstruction(target,
1798                              subtreeRoot->leftChild()->getValue(),
1799                              subtreeRoot->rightChild()->getValue(),
1800                              subtreeRoot->getInstruction(),
1801                              mvec, forceOp);
1802         break;
1803       }
1804       case 335: // reg:   Mul(todouble, todoubleConst)
1805         checkCast = true;
1806         // FALL THROUGH 
1807
1808       case 235: // reg:   Mul(reg, Constant)
1809       {
1810         MachineOpCode forceOp = ((checkCast && BothFloatToDouble(subtreeRoot))
1811                                  ? FSMULD
1812                                  : INVALID_MACHINE_OPCODE);
1813         CreateMulInstruction(target,
1814                              subtreeRoot->leftChild()->getValue(),
1815                              subtreeRoot->rightChild()->getValue(),
1816                              subtreeRoot->getInstruction(),
1817                              mvec, forceOp);
1818         break;
1819       }
1820       case 236: // reg:   Div(reg, Constant)
1821         L = mvec.size();
1822         CreateDivConstInstruction(target, subtreeRoot, mvec);
1823         if (mvec.size() > L)
1824           break;
1825         // ELSE FALL THROUGH
1826       
1827       case 36:  // reg:   Div(reg, reg)
1828         mvec.push_back(new MachineInstr(ChooseDivInstruction(target, subtreeRoot)));
1829         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1830         break;
1831
1832       case  37: // reg:   Rem(reg, reg)
1833       case 237: // reg:   Rem(reg, Constant)
1834       {
1835         Instruction* remInstr = subtreeRoot->getInstruction();
1836         
1837         TmpInstruction* quot = new TmpInstruction(
1838                                         subtreeRoot->leftChild()->getValue(),
1839                                         subtreeRoot->rightChild()->getValue());
1840         TmpInstruction* prod = new TmpInstruction(
1841                                         quot,
1842                                         subtreeRoot->rightChild()->getValue());
1843         MachineCodeForInstruction::get(remInstr).addTemp(quot).addTemp(prod); 
1844         
1845         M = new MachineInstr(ChooseDivInstruction(target, subtreeRoot));
1846         Set3OperandsFromInstr(M, subtreeRoot, target);
1847         M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,quot);
1848         mvec.push_back(M);
1849         
1850         M = new MachineInstr(ChooseMulInstructionByType(
1851                                    subtreeRoot->getInstruction()->getType()));
1852         M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,quot);
1853         M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,
1854                                       subtreeRoot->rightChild()->getValue());
1855         M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,prod);
1856         mvec.push_back(M);
1857         
1858         M = new MachineInstr(ChooseSubInstructionByType(
1859                                    subtreeRoot->getInstruction()->getType()));
1860         Set3OperandsFromInstr(M, subtreeRoot, target);
1861         M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,prod);
1862         mvec.push_back(M);
1863         
1864         break;
1865       }
1866       
1867       case  38: // bool:   And(bool, bool)
1868       case 238: // bool:   And(bool, boolconst)
1869       case 338: // reg :   BAnd(reg, reg)
1870       case 538: // reg :   BAnd(reg, Constant)
1871         mvec.push_back(new MachineInstr(AND));
1872         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1873         break;
1874
1875       case 138: // bool:   And(bool, not)
1876       case 438: // bool:   BAnd(bool, not)
1877         mvec.push_back(new MachineInstr(ANDN));
1878         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1879         break;
1880
1881       case  39: // bool:   Or(bool, bool)
1882       case 239: // bool:   Or(bool, boolconst)
1883       case 339: // reg :   BOr(reg, reg)
1884       case 539: // reg :   BOr(reg, Constant)
1885         mvec.push_back(new MachineInstr(ORN));
1886         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1887         break;
1888
1889       case 139: // bool:   Or(bool, not)
1890       case 439: // bool:   BOr(bool, not)
1891         mvec.push_back(new MachineInstr(ORN));
1892         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1893         break;
1894
1895       case  40: // bool:   Xor(bool, bool)
1896       case 240: // bool:   Xor(bool, boolconst)
1897       case 340: // reg :   BXor(reg, reg)
1898       case 540: // reg :   BXor(reg, Constant)
1899         mvec.push_back(new MachineInstr(XOR));
1900         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1901         break;
1902
1903       case 140: // bool:   Xor(bool, not)
1904       case 440: // bool:   BXor(bool, not)
1905         mvec.push_back(new MachineInstr(XNOR));
1906         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
1907         break;
1908
1909       case 41:  // boolconst:   SetCC(reg, Constant)
1910         // 
1911         // If the SetCC was folded into the user (parent), it will be
1912         // caught above.  All other cases are the same as case 42,
1913         // so just fall through.
1914         // 
1915       case 42:  // bool:   SetCC(reg, reg):
1916       {
1917         // This generates a SUBCC instruction, putting the difference in
1918         // a result register, and setting a condition code.
1919         // 
1920         // If the boolean result of the SetCC is used by anything other
1921         // than a single branch instruction, the boolean must be
1922         // computed and stored in the result register.  Otherwise, discard
1923         // the difference (by using %g0) and keep only the condition code.
1924         // 
1925         // To compute the boolean result in a register we use a conditional
1926         // move, unless the result of the SUBCC instruction can be used as
1927         // the bool!  This assumes that zero is FALSE and any non-zero
1928         // integer is TRUE.
1929         // 
1930         InstructionNode* parentNode = (InstructionNode*) subtreeRoot->parent();
1931         Instruction* setCCInstr = subtreeRoot->getInstruction();
1932         bool keepBoolVal = (parentNode == NULL ||
1933                             parentNode->getInstruction()->getOpcode()
1934                                 != Instruction::Br);
1935         bool subValIsBoolVal = setCCInstr->getOpcode() == Instruction::SetNE;
1936         bool keepSubVal = keepBoolVal && subValIsBoolVal;
1937         bool computeBoolVal = keepBoolVal && ! subValIsBoolVal;
1938         
1939         bool mustClearReg;
1940         int valueToMove;
1941         MachineOpCode movOpCode = 0;
1942
1943         // Mark the 4th operand as being a CC register, and as a def
1944         // A TmpInstruction is created to represent the CC "result".
1945         // Unlike other instances of TmpInstruction, this one is used
1946         // by machine code of multiple LLVM instructions, viz.,
1947         // the SetCC and the branch.  Make sure to get the same one!
1948         // Note that we do this even for FP CC registers even though they
1949         // are explicit operands, because the type of the operand
1950         // needs to be a floating point condition code, not an integer
1951         // condition code.  Think of this as casting the bool result to
1952         // a FP condition code register.
1953         // 
1954         Value* leftVal = subtreeRoot->leftChild()->getValue();
1955         bool isFPCompare = (leftVal->getType() == Type::FloatTy || 
1956                             leftVal->getType() == Type::DoubleTy);
1957         
1958         TmpInstruction* tmpForCC = GetTmpForCC(setCCInstr,
1959                                      setCCInstr->getParent()->getParent(),
1960                                      isFPCompare? Type::FloatTy : Type::IntTy);
1961         MachineCodeForInstruction::get(setCCInstr).addTemp(tmpForCC);
1962         
1963         if (! isFPCompare)
1964           {
1965             // Integer condition: dest. should be %g0 or an integer register.
1966             // If result must be saved but condition is not SetEQ then we need
1967             // a separate instruction to compute the bool result, so discard
1968             // result of SUBcc instruction anyway.
1969             // 
1970             M = new MachineInstr(SUBcc);
1971             Set3OperandsFromInstr(M, subtreeRoot, target, ! keepSubVal);
1972             M->SetMachineOperandVal(3, MachineOperand::MO_CCRegister,
1973                                     tmpForCC, /*def*/true);
1974             mvec.push_back(M);
1975             
1976             if (computeBoolVal)
1977               { // recompute bool using the integer condition codes
1978                 movOpCode =
1979                   ChooseMovpccAfterSub(subtreeRoot,mustClearReg,valueToMove);
1980               }
1981           }
1982         else
1983           {
1984             // FP condition: dest of FCMP should be some FCCn register
1985             M = new MachineInstr(ChooseFcmpInstruction(subtreeRoot));
1986             M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
1987                                           tmpForCC);
1988             M->SetMachineOperandVal(1,MachineOperand::MO_VirtualRegister,
1989                                          subtreeRoot->leftChild()->getValue());
1990             M->SetMachineOperandVal(2,MachineOperand::MO_VirtualRegister,
1991                                         subtreeRoot->rightChild()->getValue());
1992             mvec.push_back(M);
1993             
1994             if (computeBoolVal)
1995               {// recompute bool using the FP condition codes
1996                 mustClearReg = true;
1997                 valueToMove = 1;
1998                 movOpCode = ChooseMovFpccInstruction(subtreeRoot);
1999               }
2000           }
2001         
2002         if (computeBoolVal)
2003           {
2004             if (mustClearReg)
2005               {// Unconditionally set register to 0
2006                 M = new MachineInstr(SETHI);
2007                 M->SetMachineOperandConst(0,MachineOperand::MO_UnextendedImmed,
2008                                           (int64_t)0);
2009                 M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,
2010                                         setCCInstr);
2011                 mvec.push_back(M);
2012               }
2013             
2014             // Now conditionally move `valueToMove' (0 or 1) into the register
2015             M = new MachineInstr(movOpCode);
2016             M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
2017                                     tmpForCC);
2018             M->SetMachineOperandConst(1, MachineOperand::MO_UnextendedImmed,
2019                                       valueToMove);
2020             M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
2021                                     setCCInstr);
2022             mvec.push_back(M);
2023           }
2024         break;
2025       }    
2026
2027       case 43:  // boolreg: VReg
2028       case 44:  // boolreg: Constant
2029         break;
2030
2031       case 51:  // reg:   Load(reg)
2032       case 52:  // reg:   Load(ptrreg)
2033       case 53:  // reg:   LoadIdx(reg,reg)
2034       case 54:  // reg:   LoadIdx(ptrreg,reg)
2035         mvec.push_back(new MachineInstr(ChooseLoadInstruction(
2036                                      subtreeRoot->getValue()->getType())));
2037         SetOperandsForMemInstr(mvec, mvec.end()-1, subtreeRoot, target);
2038         break;
2039
2040       case 55:  // reg:   GetElemPtr(reg)
2041       case 56:  // reg:   GetElemPtrIdx(reg,reg)
2042         // If the GetElemPtr was folded into the user (parent), it will be
2043         // caught above.  For other cases, we have to compute the address.
2044         mvec.push_back(new MachineInstr(ADD));
2045         SetOperandsForMemInstr(mvec, mvec.end()-1, subtreeRoot, target);
2046         break;
2047         
2048       case 57:  // reg:  Alloca: Implement as 1 instruction:
2049       {         //          add %fp, offsetFromFP -> result
2050         AllocationInst* instr =
2051           cast<AllocationInst>(subtreeRoot->getInstruction());
2052         unsigned int tsize =
2053           target.findOptimalStorageSize(instr->getAllocatedType());
2054         assert(tsize != 0);
2055         CreateCodeForFixedSizeAlloca(target, instr, tsize, 1, mvec);
2056         break;
2057       }
2058       
2059       case 58:  // reg:   Alloca(reg): Implement as 3 instructions:
2060                 //      mul num, typeSz -> tmp
2061                 //      sub %sp, tmp    -> %sp
2062       {         //      add %sp, frameSizeBelowDynamicArea -> result
2063         AllocationInst* instr =
2064           cast<AllocationInst>(subtreeRoot->getInstruction());
2065         const Type* eltType = instr->getAllocatedType();
2066         
2067         // If #elements is constant, use simpler code for fixed-size allocas
2068         int tsize = (int) target.findOptimalStorageSize(eltType);
2069         Value* numElementsVal = NULL;
2070         bool isArray = instr->isArrayAllocation();
2071         
2072         if (!isArray ||
2073             isa<Constant>(numElementsVal = instr->getArraySize()))
2074           { // total size is constant: generate code for fixed-size alloca
2075             unsigned int numElements = isArray? 
2076               cast<ConstantUInt>(numElementsVal)->getValue() : 1;
2077             CreateCodeForFixedSizeAlloca(target, instr, tsize,
2078                                          numElements, mvec);
2079           }
2080         else // total size is not constant.
2081           CreateCodeForVariableSizeAlloca(target, instr, tsize,
2082                                           numElementsVal, mvec);
2083         break;
2084       }
2085       
2086       case 61:  // reg:   Call
2087       {         // Generate a call-indirect (i.e., jmpl) for now to expose
2088                 // the potential need for registers.  If an absolute address
2089                 // is available, replace this with a CALL instruction.
2090                 // Mark both the indirection register and the return-address
2091                 // register as hidden virtual registers.
2092                 // Also, mark the operands of the Call and return value (if
2093                 // any) as implicit operands of the CALL machine instruction.
2094                 // 
2095         CallInst *callInstr = cast<CallInst>(subtreeRoot->getInstruction());
2096         Value *callee = callInstr->getCalledValue();
2097         
2098         // Create hidden virtual register for return address, with type void*. 
2099         Instruction* retAddrReg =
2100           new TmpInstruction(PointerType::get(Type::VoidTy), callInstr);
2101         MachineCodeForInstruction::get(callInstr).addTemp(retAddrReg);
2102         
2103         // Generate the machine instruction and its operands.
2104         // Use CALL for direct function calls; this optimistically assumes
2105         // the PC-relative address fits in the CALL address field (22 bits).
2106         // Use JMPL for indirect calls.
2107         // 
2108         if (isa<Function>(callee))
2109           { // direct function call
2110             M = new MachineInstr(CALL);
2111             M->SetMachineOperandVal(0, MachineOperand::MO_PCRelativeDisp,
2112                                     callee);
2113           } 
2114         else
2115           { // indirect function call
2116             M = new MachineInstr(JMPLCALL);
2117             M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
2118                                     callee);
2119             M->SetMachineOperandConst(1, MachineOperand::MO_SignExtendedImmed,
2120                                       (int64_t) 0);
2121             M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
2122                                     retAddrReg);
2123           }
2124         
2125         mvec.push_back(M);
2126
2127         // WARNING: Operands 0..N-1 must go in slots 0..N-1 of implicitUses.
2128         //          The result value must go in slot N.  This is assumed
2129         //          in register allocation.
2130         // 
2131         // Add the call operands and return value as implicit refs
2132         for (unsigned i=0, N=callInstr->getNumOperands(); i < N; ++i)
2133           if (callInstr->getOperand(i) != callee)
2134             mvec.back()->addImplicitRef(callInstr->getOperand(i));
2135         
2136         if (callInstr->getType() != Type::VoidTy)
2137           mvec.back()->addImplicitRef(callInstr, /*isDef*/ true);
2138         
2139         // For the CALL instruction, the ret. addr. reg. is also implicit
2140         if (isa<Function>(callee))
2141           mvec.back()->addImplicitRef(retAddrReg, /*isDef*/ true);
2142         
2143         // delay slot
2144         mvec.push_back(new MachineInstr(NOP));
2145         break;
2146       }
2147
2148       case 62:  // reg:   Shl(reg, reg)
2149       { const Type* opType = subtreeRoot->leftChild()->getValue()->getType();
2150         assert(opType->isIntegral()
2151                || opType == Type::BoolTy
2152                || opType->isPointerType()&& "Shl unsupported for other types");
2153         mvec.push_back(new MachineInstr((opType == Type::LongTy)? SLLX : SLL));
2154         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
2155         break;
2156       }
2157       
2158       case 63:  // reg:   Shr(reg, reg)
2159       { const Type* opType = subtreeRoot->leftChild()->getValue()->getType();
2160         assert(opType->isIntegral()
2161                || opType == Type::BoolTy
2162                || opType->isPointerType() &&"Shr unsupported for other types");
2163         mvec.push_back(new MachineInstr((opType->isSigned()
2164                                    ? ((opType == Type::LongTy)? SRAX : SRA)
2165                                    : ((opType == Type::LongTy)? SRLX : SRL))));
2166         Set3OperandsFromInstr(mvec.back(), subtreeRoot, target);
2167         break;
2168       }
2169       
2170       case 64:  // reg:   Phi(reg,reg)
2171         break;                          // don't forward the value
2172
2173 #undef NEED_PHI_MACHINE_INSTRS
2174 #ifdef NEED_PHI_MACHINE_INSTRS
2175       {         // This instruction has variable #operands, so resultPos is 0.
2176         Instruction* phi = subtreeRoot->getInstruction();
2177         M = new MachineInstr(PHI, 1 + phi->getNumOperands());
2178         M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister,
2179                                       subtreeRoot->getValue());
2180         for (unsigned i=0, N=phi->getNumOperands(); i < N; i++)
2181           M->SetMachineOperandVal(i+1, MachineOperand::MO_VirtualRegister,
2182                                   phi->getOperand(i));
2183         mvec.push_back(M);
2184         break;
2185       }  
2186 #endif // NEED_PHI_MACHINE_INSTRS
2187       
2188       
2189       case 71:  // reg:     VReg
2190       case 72:  // reg:     Constant
2191         break;                          // don't forward the value
2192
2193       default:
2194         assert(0 && "Unrecognized BURG rule");
2195         break;
2196       }
2197     }
2198   
2199   if (forwardOperandNum >= 0)
2200     { // We did not generate a machine instruction but need to use operand.
2201       // If user is in the same tree, replace Value in its machine operand.
2202       // If not, insert a copy instruction which should get coalesced away
2203       // by register allocation.
2204       if (subtreeRoot->parent() != NULL)
2205         ForwardOperand(subtreeRoot, subtreeRoot->parent(), forwardOperandNum);
2206       else
2207         {
2208           vector<MachineInstr*> minstrVec;
2209           target.getInstrInfo().CreateCopyInstructionsByType(target, 
2210                 subtreeRoot->getInstruction()->getParent()->getParent(),
2211                 subtreeRoot->getInstruction()->getOperand(forwardOperandNum),
2212                 subtreeRoot->getInstruction(), minstrVec);
2213           assert(minstrVec.size() > 0);
2214           mvec.insert(mvec.end(), minstrVec.begin(), minstrVec.end());
2215         }
2216     }
2217 }
2218
2219