| Index: src/x64/fast-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/fast-codegen-x64.cc (revision 3610)
|
| +++ src/x64/fast-codegen-x64.cc (working copy)
|
| @@ -132,6 +132,10 @@
|
| Move(dot_arguments_slot, rcx, rbx, rdx);
|
| }
|
|
|
| + { Comment cmnt(masm_, "[ Declarations");
|
| + VisitDeclarations(fun->scope()->declarations());
|
| + }
|
| +
|
| { Comment cmnt(masm_, "[ Stack check");
|
| Label ok;
|
| __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
|
| @@ -141,10 +145,6 @@
|
| __ bind(&ok);
|
| }
|
|
|
| - { Comment cmnt(masm_, "[ Declarations");
|
| - VisitDeclarations(fun->scope()->declarations());
|
| - }
|
| -
|
| if (FLAG_trace) {
|
| __ CallRuntime(Runtime::kTraceEnter, 0);
|
| }
|
| @@ -817,23 +817,21 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitNamedPropertyLoad(Property* prop,
|
| - Expression::Context context) {
|
| +void FastCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
| SetSourcePosition(prop->position());
|
| Literal* key = prop->key()->AsLiteral();
|
| __ Move(rcx, key->handle());
|
| Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
|
| __ Call(ic, RelocInfo::CODE_TARGET);
|
| - Apply(context, rax);
|
| + __ nop();
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitKeyedPropertyLoad(Property* prop,
|
| - Expression::Context context) {
|
| +void FastCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
| SetSourcePosition(prop->position());
|
| Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
|
| __ Call(ic, RelocInfo::CODE_TARGET);
|
| - Apply(context, rax);
|
| + __ nop();
|
| }
|
|
|
|
|
| @@ -956,6 +954,9 @@
|
| __ CallRuntime(Runtime::kToSlowProperties, 1);
|
| }
|
|
|
| + // Record source code position before IC call.
|
| + SetSourcePosition(expr->position());
|
| +
|
| __ pop(rax);
|
| __ Move(rcx, prop->key()->AsLiteral()->handle());
|
| Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize));
|
| @@ -985,6 +986,9 @@
|
| __ CallRuntime(Runtime::kToSlowProperties, 1);
|
| }
|
|
|
| + // Record source code position before IC call.
|
| + SetSourcePosition(expr->position());
|
| +
|
| __ pop(rax);
|
| Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
|
| __ Call(ic, RelocInfo::CODE_TARGET);
|
| @@ -1010,30 +1014,16 @@
|
| Comment cmnt(masm_, "[ Property");
|
| Expression* key = expr->key();
|
|
|
| - // Record the source position for the property load.
|
| - SetSourcePosition(expr->position());
|
| -
|
| // Evaluate receiver.
|
| Visit(expr->obj());
|
|
|
| if (key->IsPropertyName()) {
|
| - // Do a named property load. The IC expects the property name in rcx
|
| - // and the receiver on the stack.
|
| - __ Move(rcx, key->AsLiteral()->handle());
|
| - Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
|
| - __ call(ic, RelocInfo::CODE_TARGET);
|
| - // By emitting a nop we make sure that we do not have a "test rax,..."
|
| - // instruction after the call it is treated specially by the LoadIC code.
|
| - __ nop();
|
| + EmitNamedPropertyLoad(expr);
|
| + // Drop receiver left on the stack by IC.
|
| DropAndApply(1, expr->context(), rax);
|
| } else {
|
| - // Do a keyed property load.
|
| Visit(expr->key());
|
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
|
| - __ call(ic, RelocInfo::CODE_TARGET);
|
| - // Notice: We must not have a "test rax, ..." instruction after the
|
| - // call. It is treated specially by the LoadIC code.
|
| - __ nop();
|
| + EmitKeyedPropertyLoad(expr);
|
| // Drop key and receiver left on the stack by IC.
|
| DropAndApply(2, expr->context(), rax);
|
| }
|
| @@ -1053,9 +1043,10 @@
|
| // Record source position for debugger.
|
| SetSourcePosition(expr->position());
|
| // Call the IC initialization code.
|
| + InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP;
|
| Handle<Code> ic = CodeGenerator::ComputeCallInitialize(arg_count,
|
| - NOT_IN_LOOP);
|
| - __ call(ic, mode);
|
| + in_loop);
|
| + __ Call(ic, mode);
|
| // Restore context register.
|
| __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
|
| // Discard the function left on TOS.
|
| @@ -1371,12 +1362,13 @@
|
| Visit(prop->obj());
|
| ASSERT_EQ(Expression::kValue, prop->obj()->context());
|
| if (assign_type == NAMED_PROPERTY) {
|
| - EmitNamedPropertyLoad(prop, Expression::kValue);
|
| + EmitNamedPropertyLoad(prop);
|
| } else {
|
| Visit(prop->key());
|
| ASSERT_EQ(Expression::kValue, prop->key()->context());
|
| - EmitKeyedPropertyLoad(prop, Expression::kValue);
|
| + EmitKeyedPropertyLoad(prop);
|
| }
|
| + __ push(rax);
|
| }
|
|
|
| // Convert to number.
|
|
|