| Index: src/IceTargetLoweringMIPS32.cpp | 
| diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp | 
| index 68655de975b957750c1c49abb618727c8e661dbc..d2fddf0e456968df4a731afdae04916fd1af89ed 100644 | 
| --- a/src/IceTargetLoweringMIPS32.cpp | 
| +++ b/src/IceTargetLoweringMIPS32.cpp | 
| @@ -559,74 +559,40 @@ void TargetMIPS32::CallingConv::discardUnavailableVFPRegsAndTheirAliases( | 
|  | 
| void TargetMIPS32::lowerArguments() { | 
| VarList &Args = Func->getArgs(); | 
| -  // We are only handling integer registers for now. The Mips o32 ABI is | 
| -  // somewhat complex but will be implemented in its totality through follow | 
| -  // on patches. | 
| -  // | 
| -  unsigned NumGPRRegsUsed = 0; | 
| -  // For each register argument, replace Arg in the argument list with the | 
| -  // home register.  Then generate an instruction in the prolog to copy the | 
| -  // home register to the assigned location of Arg. | 
| +  TargetMIPS32::CallingConv CC; | 
| + | 
| +  // For each register argument, replace Arg in the argument list with the home | 
| +  // register. Then generate an instruction in the prolog to copy the home | 
| +  // register to the assigned location of Arg. | 
| Context.init(Func->getEntryNode()); | 
| Context.setInsertPoint(Context.getCur()); | 
| + | 
| for (SizeT I = 0, E = Args.size(); I < E; ++I) { | 
| Variable *Arg = Args[I]; | 
| Type Ty = Arg->getType(); | 
| -    // TODO(rkotler): handle float/vector types. | 
| -    if (isVectorType(Ty)) { | 
| -      UnimplementedError(getFlags()); | 
| +    RegNumT RegNum; | 
| +    if (!CC.argInReg(Ty, I,&RegNum)) { | 
| continue; | 
| } | 
| -    if (isFloatingType(Ty)) { | 
| -      UnimplementedError(getFlags()); | 
| -      continue; | 
| +    Variable *RegisterArg = Func->makeVariable(Ty); | 
| +    if (BuildDefs::dump()) { | 
| +      RegisterArg->setName(Func, "home_reg:" + Arg->getName()); | 
| } | 
| -    if (Ty == IceType_i64) { | 
| -      if (NumGPRRegsUsed >= MIPS32_MAX_GPR_ARG) | 
| -        continue; | 
| -      auto RegLo = RegNumT::fixme(RegMIPS32::Reg_A0 + NumGPRRegsUsed); | 
| -      auto RegHi = RegNumT::fixme(RegLo + 1); | 
| -      ++NumGPRRegsUsed; | 
| -      // Always start i64 registers at an even register, so this may end | 
| -      // up padding away a register. | 
| -      if (RegLo % 2 != 0) { | 
| -        RegLo = RegNumT::fixme(RegLo + 1); | 
| -        ++NumGPRRegsUsed; | 
| -      } | 
| -      // If this leaves us without room to consume another register, | 
| -      // leave any previously speculatively consumed registers as consumed. | 
| -      if (NumGPRRegsUsed >= MIPS32_MAX_GPR_ARG) | 
| -        continue; | 
| -      // RegHi = RegNumT::fixme(RegMIPS32::Reg_A0 + NumGPRRegsUsed); | 
| -      ++NumGPRRegsUsed; | 
| -      Variable *RegisterArg = Func->makeVariable(Ty); | 
| -      auto *RegisterArg64On32 = llvm::cast<Variable64On32>(RegisterArg); | 
| -      if (BuildDefs::dump()) | 
| -        RegisterArg64On32->setName(Func, "home_reg:" + Arg->getName()); | 
| -      RegisterArg64On32->initHiLo(Func); | 
| -      RegisterArg64On32->setIsArg(); | 
| -      RegisterArg64On32->getLo()->setRegNum(RegLo); | 
| -      RegisterArg64On32->getHi()->setRegNum(RegHi); | 
| -      Arg->setIsArg(false); | 
| -      Args[I] = RegisterArg64On32; | 
| -      Context.insert<InstAssign>(Arg, RegisterArg); | 
| -      continue; | 
| -    } else { | 
| -      assert(Ty == IceType_i32); | 
| -      if (NumGPRRegsUsed >= MIPS32_MAX_GPR_ARG) | 
| -        continue; | 
| -      const auto RegNum = RegNumT::fixme(RegMIPS32::Reg_A0 + NumGPRRegsUsed); | 
| -      ++NumGPRRegsUsed; | 
| -      Variable *RegisterArg = Func->makeVariable(Ty); | 
| -      if (BuildDefs::dump()) { | 
| -        RegisterArg->setName(Func, "home_reg:" + Arg->getName()); | 
| -      } | 
| -      RegisterArg->setRegNum(RegNum); | 
| -      RegisterArg->setIsArg(); | 
| -      Arg->setIsArg(false); | 
| -      Args[I] = RegisterArg; | 
| -      Context.insert<InstAssign>(Arg, RegisterArg); | 
| +    RegisterArg->setIsArg(); | 
| +    Arg->setIsArg(false); | 
| +    Args[I] = RegisterArg; | 
| +    switch (Ty) { | 
| +    default: { RegisterArg->setRegNum(RegNum); } break; | 
| +    case IceType_i64: { | 
| +      auto *RegisterArg64 = llvm::cast<Variable64On32>(RegisterArg); | 
| +      RegisterArg64->initHiLo(Func); | 
| +      RegisterArg64->getLo()->setRegNum( | 
| +          RegNumT::fixme(RegMIPS32::getI64PairFirstGPRNum(RegNum))); | 
| +      RegisterArg64->getHi()->setRegNum( | 
| +          RegNumT::fixme(RegMIPS32::getI64PairSecondGPRNum(RegNum))); | 
| +    } break; | 
| } | 
| +    Context.insert<InstAssign>(Arg, RegisterArg); | 
| } | 
| } | 
|  | 
|  |