Chromium Code Reviews| Index: src/ia32/full-codegen-ia32.cc |
| diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
| index 1007a87a25d48cf4227b5a6b64748f8e3b82dd88..9b5699a79dfa12f17b781110b62a3fa18276bce2 100644 |
| --- a/src/ia32/full-codegen-ia32.cc |
| +++ b/src/ia32/full-codegen-ia32.cc |
| @@ -1337,8 +1337,8 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(Variable* var, |
| // All extension objects were empty and it is safe to use a global |
| // load IC call. |
| - __ mov(edx, GlobalObjectOperand()); |
| - __ mov(ecx, var->name()); |
| + __ mov(LoadIC::ReceiverRegister(), GlobalObjectOperand()); |
| + __ mov(LoadIC::NameRegister(), var->name()); |
| ContextualMode mode = (typeof_state == INSIDE_TYPEOF) |
| ? NOT_CONTEXTUAL |
| : CONTEXTUAL; |
| @@ -1420,8 +1420,8 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { |
| Comment cmnt(masm_, "[ Global variable"); |
| // Use inline caching. Variable name is passed in ecx and the global |
|
Jakob Kummerow
2014/06/25 10:59:12
nit: outdated comment. I think you can just delete
mvstanton
2014/06/25 15:10:27
Done.
|
| // object in eax. |
| - __ mov(edx, GlobalObjectOperand()); |
| - __ mov(ecx, var->name()); |
| + __ mov(LoadIC::ReceiverRegister(), GlobalObjectOperand()); |
| + __ mov(LoadIC::NameRegister(), var->name()); |
| CallLoadIC(CONTEXTUAL); |
| context()->Plug(eax); |
| break; |
| @@ -2011,14 +2011,20 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
| // receiver = iter; f = iter.next; arg = received; |
| __ bind(&l_next); |
| - __ mov(ecx, isolate()->factory()->next_string()); // "next" |
| - __ push(ecx); |
| + Register keyedload_receiver = KeyedLoadIC::ReceiverRegister(); |
| + Register keyedload_name = KeyedLoadIC::NameRegister(); |
| + ASSERT(keyedload_receiver.is(edx)); |
| + ASSERT(keyedload_name.is(ecx)); |
| + |
| + __ mov(keyedload_name, |
| + isolate()->factory()->next_string()); // "next" |
| + __ push(keyedload_name); |
| __ push(Operand(esp, 2 * kPointerSize)); // iter |
| __ push(eax); // received |
| // result = receiver[f](arg); |
| __ bind(&l_call); |
| - __ mov(edx, Operand(esp, kPointerSize)); |
| + __ mov(keyedload_receiver, Operand(esp, kPointerSize)); |
| Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
| CallIC(ic, TypeFeedbackId::None()); |
| __ mov(edi, eax); |
| @@ -2032,8 +2038,13 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
| // if (!result.done) goto l_try; |
| __ bind(&l_loop); |
| __ push(eax); // save result |
| - __ mov(edx, eax); // result |
| - __ mov(ecx, isolate()->factory()->done_string()); // "done" |
| + Register load_receiver = LoadIC::ReceiverRegister(); |
| + Register load_name = LoadIC::NameRegister(); |
| + ASSERT(load_receiver.is(edx)); |
| + ASSERT(load_name.is(ecx)); |
| + __ mov(load_receiver, eax); // result |
| + __ mov(load_name, |
| + isolate()->factory()->done_string()); // "done" |
| CallLoadIC(NOT_CONTEXTUAL); // result.done in eax |
| Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate()); |
| CallIC(bool_ic); |
| @@ -2041,8 +2052,9 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
| __ j(zero, &l_try); |
| // result.value |
| - __ pop(edx); // result |
| - __ mov(ecx, isolate()->factory()->value_string()); // "value" |
| + __ pop(load_receiver); // result |
| + __ mov(load_name, |
| + isolate()->factory()->value_string()); // "value" |
| CallLoadIC(NOT_CONTEXTUAL); // result.value in eax |
| context()->DropAndPlug(2, eax); // drop iter and g |
| break; |
| @@ -2202,7 +2214,7 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |
| SetSourcePosition(prop->position()); |
| Literal* key = prop->key()->AsLiteral(); |
| ASSERT(!key->value()->IsSmi()); |
| - __ mov(ecx, Immediate(key->value())); |
| + __ mov(LoadIC::NameRegister(), Immediate(key->value())); |
| CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); |
| } |
| @@ -2500,15 +2512,15 @@ void FullCodeGenerator::VisitProperty(Property* expr) { |
| if (key->IsPropertyName()) { |
| VisitForAccumulatorValue(expr->obj()); |
| - __ mov(edx, result_register()); |
| + __ mov(LoadIC::ReceiverRegister(), result_register()); |
| EmitNamedPropertyLoad(expr); |
| PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| context()->Plug(eax); |
| } else { |
| VisitForStackValue(expr->obj()); |
| VisitForAccumulatorValue(expr->key()); |
| - __ pop(edx); // Object. |
| - __ mov(ecx, result_register()); // Key. |
| + __ pop(KeyedLoadIC::ReceiverRegister()); // Object. |
| + __ mov(KeyedLoadIC::NameRegister(), result_register()); // Key. |
| EmitKeyedPropertyLoad(expr); |
| context()->Plug(eax); |
| } |
| @@ -2541,7 +2553,7 @@ void FullCodeGenerator::EmitCallWithLoadIC(Call* expr) { |
| } else { |
| // Load the function from the receiver. |
| ASSERT(callee->IsProperty()); |
| - __ mov(edx, Operand(esp, 0)); |
| + __ mov(LoadIC::ReceiverRegister(), Operand(esp, 0)); |
| EmitNamedPropertyLoad(callee->AsProperty()); |
| PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); |
| // Push the target function under the receiver. |
| @@ -2563,9 +2575,9 @@ void FullCodeGenerator::EmitKeyedCallWithLoadIC(Call* expr, |
| // Load the function from the receiver. |
| ASSERT(callee->IsProperty()); |
| - __ mov(edx, Operand(esp, 0)); |
| + __ mov(KeyedLoadIC::ReceiverRegister(), Operand(esp, 0)); |
| // Move the key into the right register for the keyed load IC. |
| - __ mov(ecx, eax); |
| + __ mov(KeyedLoadIC::NameRegister(), eax); |
| EmitKeyedPropertyLoad(callee->AsProperty()); |
| PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); |
| @@ -4023,8 +4035,8 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
| __ push(FieldOperand(eax, GlobalObject::kBuiltinsOffset)); |
| // Load the function from the receiver. |
| - __ mov(edx, Operand(esp, 0)); |
| - __ mov(ecx, Immediate(expr->name())); |
| + __ mov(LoadIC::ReceiverRegister(), Operand(esp, 0)); |
| + __ mov(LoadIC::NameRegister(), Immediate(expr->name())); |
| CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId()); |
| // Push the target function under the receiver. |
| @@ -4207,14 +4219,16 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| if (assign_type == NAMED_PROPERTY) { |
| // Put the object both on the stack and in edx. |
| VisitForAccumulatorValue(prop->obj()); |
| + ASSERT(!eax.is(LoadIC::ReceiverRegister())); |
| __ push(eax); |
| - __ mov(edx, eax); |
| + __ mov(LoadIC::ReceiverRegister(), eax); |
| EmitNamedPropertyLoad(prop); |
| } else { |
| VisitForStackValue(prop->obj()); |
| VisitForStackValue(prop->key()); |
| - __ mov(edx, Operand(esp, kPointerSize)); // Object. |
| - __ mov(ecx, Operand(esp, 0)); // Key. |
| + __ mov(KeyedLoadIC::ReceiverRegister(), |
| + Operand(esp, kPointerSize)); // Object. |
| + __ mov(KeyedLoadIC::NameRegister(), Operand(esp, 0)); // Key. |
| EmitKeyedPropertyLoad(prop); |
| } |
| } |
| @@ -4371,8 +4385,8 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { |
| if (proxy != NULL && proxy->var()->IsUnallocated()) { |
| Comment cmnt(masm_, "[ Global variable"); |
| - __ mov(edx, GlobalObjectOperand()); |
| - __ mov(ecx, Immediate(proxy->name())); |
| + __ mov(LoadIC::ReceiverRegister(), GlobalObjectOperand()); |
| + __ mov(LoadIC::NameRegister(), Immediate(proxy->name())); |
| // Use a regular load, not a contextual load, to avoid a reference |
| // error. |
| CallLoadIC(NOT_CONTEXTUAL); |