| Index: src/mips/lithium-mips.cc | 
| diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc | 
| index a6ea871520afae4da7490ba21a01ed2d066b620a..1298b4cee6014d7bcafcac9f779d58dc2a793253 100644 | 
| --- a/src/mips/lithium-mips.cc | 
| +++ b/src/mips/lithium-mips.cc | 
| @@ -282,7 +282,18 @@ void LInnerAllocatedObject::PrintDataTo(StringStream* stream) { | 
| } | 
|  | 
|  | 
| -void LCallConstantFunction::PrintDataTo(StringStream* stream) { | 
| +void LCallJSFunction::PrintDataTo(StringStream* stream) { | 
| +  stream->Add("= "); | 
| +  function()->PrintTo(stream); | 
| +  stream->Add("#%d / ", arity()); | 
| +} | 
| + | 
| + | 
| +void LCallWithDescriptor::PrintDataTo(StringStream* stream) { | 
| +  for (int i = 0; i < InputCount(); i++) { | 
| +    InputAt(i)->PrintTo(stream); | 
| +    stream->Add(" "); | 
| +  } | 
| stream->Add("#%d / ", arity()); | 
| } | 
|  | 
| @@ -307,22 +318,6 @@ void LInvokeFunction::PrintDataTo(StringStream* stream) { | 
| } | 
|  | 
|  | 
| -void LCallKeyed::PrintDataTo(StringStream* stream) { | 
| -  stream->Add("[a2] #%d / ", arity()); | 
| -} | 
| - | 
| - | 
| -void LCallNamed::PrintDataTo(StringStream* stream) { | 
| -  SmartArrayPointer<char> name_string = name()->ToCString(); | 
| -  stream->Add("%s #%d / ", name_string.get(), arity()); | 
| -} | 
| - | 
| - | 
| -void LCallKnownGlobal::PrintDataTo(StringStream* stream) { | 
| -  stream->Add("#%d / ", arity()); | 
| -} | 
| - | 
| - | 
| void LCallNew::PrintDataTo(StringStream* stream) { | 
| stream->Add("= "); | 
| constructor()->PrintTo(stream); | 
| @@ -562,8 +557,7 @@ LOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { | 
| } | 
|  | 
|  | 
| -template<int I, int T> | 
| -LInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr, | 
| +LInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, | 
| LUnallocated* result) { | 
| result->set_virtual_register(current_instruction_->id()); | 
| instr->set_result(result); | 
| @@ -571,40 +565,35 @@ LInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr, | 
| } | 
|  | 
|  | 
| -template<int I, int T> | 
| LInstruction* LChunkBuilder::DefineAsRegister( | 
| -    LTemplateInstruction<1, I, T>* instr) { | 
| +    LTemplateResultInstruction<1>* instr) { | 
| return Define(instr, | 
| new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); | 
| } | 
|  | 
|  | 
| -template<int I, int T> | 
| LInstruction* LChunkBuilder::DefineAsSpilled( | 
| -    LTemplateInstruction<1, I, T>* instr, int index) { | 
| +    LTemplateResultInstruction<1>* instr, int index) { | 
| return Define(instr, | 
| new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); | 
| } | 
|  | 
|  | 
| -template<int I, int T> | 
| LInstruction* LChunkBuilder::DefineSameAsFirst( | 
| -    LTemplateInstruction<1, I, T>* instr) { | 
| +    LTemplateResultInstruction<1>* instr) { | 
| return Define(instr, | 
| new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); | 
| } | 
|  | 
|  | 
| -template<int I, int T> | 
| LInstruction* LChunkBuilder::DefineFixed( | 
| -    LTemplateInstruction<1, I, T>* instr, Register reg) { | 
| +    LTemplateResultInstruction<1>* instr, Register reg) { | 
| return Define(instr, ToUnallocated(reg)); | 
| } | 
|  | 
|  | 
| -template<int I, int T> | 
| LInstruction* LChunkBuilder::DefineFixedDouble( | 
| -    LTemplateInstruction<1, I, T>* instr, DoubleRegister reg) { | 
| +    LTemplateResultInstruction<1>* instr, DoubleRegister reg) { | 
| return Define(instr, ToUnallocated(reg)); | 
| } | 
|  | 
| @@ -1080,9 +1069,32 @@ LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { | 
| } | 
|  | 
|  | 
| -LInstruction* LChunkBuilder::DoCallConstantFunction( | 
| -    HCallConstantFunction* instr) { | 
| -  return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, v0), instr); | 
| +LInstruction* LChunkBuilder::DoCallJSFunction( | 
| +    HCallJSFunction* instr) { | 
| +  LOperand* function = UseFixed(instr->function(), a1); | 
| + | 
| +  LCallJSFunction* result = new(zone()) LCallJSFunction(function); | 
| + | 
| +  return MarkAsCall(DefineFixed(result, v0), instr); | 
| +} | 
| + | 
| + | 
| +LInstruction* LChunkBuilder::DoCallWithDescriptor( | 
| +    HCallWithDescriptor* instr) { | 
| +  const CallInterfaceDescriptor* descriptor = instr->descriptor(); | 
| + | 
| +  LOperand* target = UseRegisterOrConstantAtStart(instr->target()); | 
| +  ZoneList<LOperand*> ops(instr->OperandCount(), zone()); | 
| +  ops.Add(target, zone()); | 
| +  for (int i = 1; i < instr->OperandCount(); i++) { | 
| +    LOperand* op = UseFixed(instr->OperandAt(i), | 
| +        descriptor->GetParameterRegister(i - 1)); | 
| +    ops.Add(op, zone()); | 
| +  } | 
| + | 
| +  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( | 
| +      descriptor, ops, zone()); | 
| +  return MarkAsCall(DefineFixed(result, v0), instr); | 
| } | 
|  | 
|  | 
| @@ -1173,26 +1185,6 @@ LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { | 
| } | 
|  | 
|  | 
| -LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | 
| -  ASSERT(instr->key()->representation().IsTagged()); | 
| -  LOperand* context = UseFixed(instr->context(), cp); | 
| -  LOperand* key = UseFixed(instr->key(), a2); | 
| -  return MarkAsCall( | 
| -        DefineFixed(new(zone()) LCallKeyed(context, key), v0), instr); | 
| -} | 
| - | 
| - | 
| -LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | 
| -  LOperand* context = UseFixed(instr->context(), cp); | 
| -  return MarkAsCall(DefineFixed(new(zone()) LCallNamed(context), v0), instr); | 
| -} | 
| - | 
| - | 
| -LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { | 
| -  return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, v0), instr); | 
| -} | 
| - | 
| - | 
| LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 
| LOperand* context = UseFixed(instr->context(), cp); | 
| LOperand* constructor = UseFixed(instr->constructor(), a1); | 
|  |