parent
							
								
									524417357c
								
							
						
					
					
						commit
						43f78bc2da
					
				| 
						 | 
					@ -44,11 +44,11 @@ def Alpha : Target {
 | 
				
			||||||
	//saved regs
 | 
						//saved regs
 | 
				
			||||||
	[R9, R10, R11, R12, R13, R14, 
 | 
						[R9, R10, R11, R12, R13, R14, 
 | 
				
			||||||
	//Frame pointer
 | 
						//Frame pointer
 | 
				
			||||||
	R15, 
 | 
					//	R15, 
 | 
				
			||||||
	//return address
 | 
						//return address
 | 
				
			||||||
	R26, 
 | 
						R26, 
 | 
				
			||||||
	//Stack Pointer
 | 
						//Stack Pointer
 | 
				
			||||||
	R30,
 | 
					//	R30,
 | 
				
			||||||
         F2, F3, F4, F5, F6, F7, F8, F9];
 | 
					         F2, F3, F4, F5, F6, F7, F8, F9];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Pull in Instruction Info:
 | 
					  // Pull in Instruction Info:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -125,16 +125,18 @@ namespace {
 | 
				
			||||||
//be passed at 0(SP).
 | 
					//be passed at 0(SP).
 | 
				
			||||||
//7 ... n  	  	  	0(SP) ... (n-7)*8(SP)
 | 
					//7 ... n  	  	  	0(SP) ... (n-7)*8(SP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //#define FP    $15
 | 
				
			||||||
 | 
					// //#define RA    $26
 | 
				
			||||||
 | 
					// //#define PV    $27
 | 
				
			||||||
 | 
					// //#define GP    $29
 | 
				
			||||||
 | 
					// //#define SP    $30
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
std::vector<SDOperand>
 | 
					std::vector<SDOperand>
 | 
				
			||||||
AlphaTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) 
 | 
					AlphaTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  std::vector<SDOperand> ArgValues;
 | 
					  std::vector<SDOperand> ArgValues;
 | 
				
			||||||
  
 | 
					  std::vector<SDOperand> LS;
 | 
				
			||||||
  // //#define FP    $15
 | 
					  SDOperand Chain = DAG.getRoot();
 | 
				
			||||||
  // //#define RA    $26
 | 
					 | 
				
			||||||
  // //#define PV    $27
 | 
					 | 
				
			||||||
  // //#define GP    $29
 | 
					 | 
				
			||||||
  // //#define SP    $30
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //  assert(0 && "TODO");
 | 
					  //  assert(0 && "TODO");
 | 
				
			||||||
  MachineFunction &MF = DAG.getMachineFunction();
 | 
					  MachineFunction &MF = DAG.getMachineFunction();
 | 
				
			||||||
| 
						 | 
					@ -150,47 +152,59 @@ AlphaTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
 | 
				
			||||||
			 Alpha::R19, Alpha::R20, Alpha::R21};
 | 
								 Alpha::R19, Alpha::R20, Alpha::R21};
 | 
				
			||||||
  unsigned args_float[] = {Alpha::F16, Alpha::F17, Alpha::F18, 
 | 
					  unsigned args_float[] = {Alpha::F16, Alpha::F17, Alpha::F18, 
 | 
				
			||||||
			   Alpha::F19, Alpha::F20, Alpha::F21};
 | 
								   Alpha::F19, Alpha::F20, Alpha::F21};
 | 
				
			||||||
  unsigned argVreg[6];
 | 
					 | 
				
			||||||
  unsigned argPreg[6];
 | 
					 | 
				
			||||||
  unsigned argOpc[6];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int count = 0;
 | 
					  int count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //Def incoming registers
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Function::arg_iterator I = F.arg_begin();
 | 
				
			||||||
 | 
					    Function::arg_iterator E = F.arg_end();
 | 
				
			||||||
 | 
					    for (int i = 0; i < 6; ++i)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (F.isVarArg()) {
 | 
				
			||||||
 | 
					        BuildMI(&BB, Alpha::IDEF, 0, args_int[i]);
 | 
				
			||||||
 | 
					        BuildMI(&BB, Alpha::IDEF, 0, args_float[i]);
 | 
				
			||||||
 | 
					      } else if (I != E)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        if(MVT::isInteger(getValueType(I->getType())))
 | 
				
			||||||
 | 
					          BuildMI(&BB, Alpha::IDEF, 0, args_int[i]);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          BuildMI(&BB, Alpha::IDEF, 0, args_float[i]);
 | 
				
			||||||
 | 
					        ++I;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  BuildMI(&BB, Alpha::IDEF, 0, Alpha::R29);
 | 
				
			||||||
 | 
					  BuildMI(&BB, Alpha::BIS, 2, GP).addReg(Alpha::R29).addReg(Alpha::R29);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I)
 | 
					  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    SDOperand newroot, argt;
 | 
					    SDOperand newroot, argt;
 | 
				
			||||||
    if (count  < 6) {
 | 
					    if (count  < 6) {
 | 
				
			||||||
 | 
					      unsigned Vreg;
 | 
				
			||||||
 | 
					      MVT::ValueType VT = getValueType(I->getType());
 | 
				
			||||||
      switch (getValueType(I->getType())) {
 | 
					      switch (getValueType(I->getType())) {
 | 
				
			||||||
      default: 
 | 
					      default: 
 | 
				
			||||||
        std::cerr << "Unknown Type " << getValueType(I->getType()) << "\n"; 
 | 
					        std::cerr << "Unknown Type " << VT << "\n"; 
 | 
				
			||||||
        abort();
 | 
					        abort();
 | 
				
			||||||
      case MVT::f64:
 | 
					      case MVT::f64:
 | 
				
			||||||
      case MVT::f32:
 | 
					      case MVT::f32:
 | 
				
			||||||
        BuildMI(&BB, Alpha::IDEF, 0, args_float[count]);
 | 
					        Vreg = MF.getSSARegMap()->createVirtualRegister(getRegClassFor(VT));
 | 
				
			||||||
        argVreg[count] = 
 | 
					        BuildMI(&BB, Alpha::CPYS, 2, Vreg).addReg(args_float[count]).addReg(args_float[count]);
 | 
				
			||||||
          MF.getSSARegMap()->createVirtualRegister(
 | 
					        argt = newroot = DAG.getCopyFromReg(Vreg, 
 | 
				
			||||||
                            getRegClassFor(getValueType(I->getType())));
 | 
					 | 
				
			||||||
        argPreg[count] = args_float[count];
 | 
					 | 
				
			||||||
        argOpc[count] = Alpha::CPYS;
 | 
					 | 
				
			||||||
        argt = newroot = DAG.getCopyFromReg(argVreg[count], 
 | 
					 | 
				
			||||||
                                            getValueType(I->getType()), 
 | 
					                                            getValueType(I->getType()), 
 | 
				
			||||||
                                            DAG.getRoot());
 | 
					                                            Chain);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case MVT::i1:
 | 
					      case MVT::i1:
 | 
				
			||||||
      case MVT::i8:
 | 
					      case MVT::i8:
 | 
				
			||||||
      case MVT::i16:
 | 
					      case MVT::i16:
 | 
				
			||||||
      case MVT::i32:
 | 
					      case MVT::i32:
 | 
				
			||||||
      case MVT::i64:
 | 
					      case MVT::i64:
 | 
				
			||||||
        BuildMI(&BB, Alpha::IDEF, 0, args_int[count]);
 | 
					        Vreg = MF.getSSARegMap()->createVirtualRegister(getRegClassFor(MVT::i64));
 | 
				
			||||||
        argVreg[count] = 
 | 
					        BuildMI(&BB, Alpha::BIS, 2, Vreg).addReg(args_int[count]).addReg(args_int[count]);
 | 
				
			||||||
          MF.getSSARegMap()->createVirtualRegister(getRegClassFor(MVT::i64));
 | 
					        argt = newroot = DAG.getCopyFromReg(Vreg, MVT::i64, Chain);
 | 
				
			||||||
        argPreg[count] = args_int[count];
 | 
					 | 
				
			||||||
        argOpc[count] = Alpha::BIS;
 | 
					 | 
				
			||||||
        argt = newroot = 
 | 
					 | 
				
			||||||
          DAG.getCopyFromReg(argVreg[count], MVT::i64, DAG.getRoot());
 | 
					 | 
				
			||||||
        if (getValueType(I->getType()) != MVT::i64)
 | 
					        if (getValueType(I->getType()) != MVT::i64)
 | 
				
			||||||
          argt = 
 | 
					          argt = DAG.getNode(ISD::TRUNCATE, getValueType(I->getType()), newroot);
 | 
				
			||||||
            DAG.getNode(ISD::TRUNCATE, getValueType(I->getType()), newroot);
 | 
					 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else { //more args
 | 
					    } else { //more args
 | 
				
			||||||
| 
						 | 
					@ -204,17 +218,37 @@ AlphaTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
 | 
				
			||||||
                                   DAG.getEntryNode(), FIN);
 | 
					                                   DAG.getEntryNode(), FIN);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ++count;
 | 
					    ++count;
 | 
				
			||||||
    DAG.setRoot(newroot.getValue(1));
 | 
					    LS.push_back(newroot.getValue(1));
 | 
				
			||||||
    ArgValues.push_back(argt);
 | 
					    ArgValues.push_back(argt);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  BuildMI(&BB, Alpha::IDEF, 0, Alpha::R29);
 | 
					  // If the functions takes variable number of arguments, copy all regs to stack
 | 
				
			||||||
  BuildMI(&BB, Alpha::BIS, 2, GP).addReg(Alpha::R29).addReg(Alpha::R29);
 | 
					  if (F.isVarArg()) 
 | 
				
			||||||
  for (int i = 0; i < count && i < 6; ++i) {
 | 
					    for (int i = 0; i < 6; ++i)
 | 
				
			||||||
    BuildMI(&BB, argOpc[i], 2, 
 | 
					    {
 | 
				
			||||||
            argVreg[i]).addReg(argPreg[i]).addReg(argPreg[i]);
 | 
					      unsigned Vreg = MF.getSSARegMap()->createVirtualRegister(getRegClassFor(MVT::i64));
 | 
				
			||||||
  }
 | 
					      BuildMI(&BB, Alpha::BIS, 2, Vreg).addReg(args_int[i]).addReg(args_int[i]);
 | 
				
			||||||
 | 
					      SDOperand argt = DAG.getCopyFromReg(Vreg, MVT::i64, Chain);
 | 
				
			||||||
 | 
					      int FI = MFI->CreateFixedObject(8, -8 * (6 - i));
 | 
				
			||||||
 | 
					      SDOperand SDFI = DAG.getFrameIndex(FI, MVT::i64);
 | 
				
			||||||
 | 
					      LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, argt, SDFI));
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
 | 
					      Vreg = MF.getSSARegMap()->createVirtualRegister(getRegClassFor(MVT::f64));
 | 
				
			||||||
 | 
					      BuildMI(&BB, Alpha::CPYS, 2, Vreg).addReg(args_float[i]).addReg(args_float[i]);
 | 
				
			||||||
 | 
					      argt = DAG.getCopyFromReg(Vreg, MVT::f64, Chain);
 | 
				
			||||||
 | 
					      FI = MFI->CreateFixedObject(8, - 8 * (12 - i));
 | 
				
			||||||
 | 
					      SDFI = DAG.getFrameIndex(FI, MVT::i64);
 | 
				
			||||||
 | 
					      LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, argt, SDFI));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If the function takes variable number of arguments, make a frame index for
 | 
				
			||||||
 | 
					  // the start of the first arg value... for expansion of llvm.va_start.
 | 
				
			||||||
 | 
					  //   if (F.isVarArg())
 | 
				
			||||||
 | 
					  //     VarArgsFrameIndex = MFI->CreateFixedObject(4, ArgOffset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //Set up a token factor with all the stack traffic
 | 
				
			||||||
 | 
					  DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, LS));
 | 
				
			||||||
 | 
					  //return the arguments
 | 
				
			||||||
  return ArgValues;
 | 
					  return ArgValues;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue