Index: src/ia32/lithium-ia32.cc |
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc |
index 2eb387a128a5f52f2c95451358419e3347056469..2e8ca36bce995af96ce58ad1cf965471ac3b47c5 100644 |
--- a/src/ia32/lithium-ia32.cc |
+++ b/src/ia32/lithium-ia32.cc |
@@ -307,7 +307,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()); |
} |
@@ -334,22 +345,6 @@ void LInvokeFunction::PrintDataTo(StringStream* stream) { |
} |
-void LCallKeyed::PrintDataTo(StringStream* stream) { |
- stream->Add("[ecx] #%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("= "); |
context()->PrintTo(stream); |
@@ -619,8 +614,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); |
@@ -628,41 +622,36 @@ 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, |
+ 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, |
+LInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr, |
Register reg) { |
return Define(instr, ToUnallocated(reg)); |
} |
-template<int I, int T> |
LInstruction* LChunkBuilder::DefineFixedDouble( |
- LTemplateInstruction<1, I, T>* instr, |
+ LTemplateResultInstruction<1>* instr, |
XMMRegister reg) { |
return Define(instr, ToUnallocated(reg)); |
} |
@@ -1162,9 +1151,32 @@ LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { |
} |
-LInstruction* LChunkBuilder::DoCallConstantFunction( |
- HCallConstantFunction* instr) { |
- return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, eax), instr); |
+LInstruction* LChunkBuilder::DoCallJSFunction( |
+ HCallJSFunction* instr) { |
+ LOperand* function = UseFixed(instr->function(), edi); |
+ |
+ LCallJSFunction* result = new(zone()) LCallJSFunction(function); |
+ |
+ return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
+} |
+ |
+ |
+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, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
} |
@@ -1249,27 +1261,6 @@ LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { |
} |
-LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
- ASSERT(instr->key()->representation().IsTagged()); |
- LOperand* context = UseFixed(instr->context(), esi); |
- LOperand* key = UseFixed(instr->key(), ecx); |
- LCallKeyed* result = new(zone()) LCallKeyed(context, key); |
- return MarkAsCall(DefineFixed(result, eax), instr); |
-} |
- |
- |
-LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
- LOperand* context = UseFixed(instr->context(), esi); |
- LCallNamed* result = new(zone()) LCallNamed(context); |
- return MarkAsCall(DefineFixed(result, eax), instr); |
-} |
- |
- |
-LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { |
- return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, eax), instr); |
-} |
- |
- |
LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
LOperand* context = UseFixed(instr->context(), esi); |
LOperand* constructor = UseFixed(instr->constructor(), edi); |