Revision: 3473 Author: [email protected] Date: Wed Dec 16 01:51:07 2009 Log: Fast codegen: Implement with.
Review URL: http://codereview.chromium.org/491077 http://code.google.com/p/v8/source/detail?r=3473 Modified: /branches/bleeding_edge/src/arm/fast-codegen-arm.cc /branches/bleeding_edge/src/compiler.cc /branches/bleeding_edge/src/fast-codegen.cc /branches/bleeding_edge/src/fast-codegen.h /branches/bleeding_edge/src/ia32/fast-codegen-ia32.cc /branches/bleeding_edge/src/x64/fast-codegen-x64.cc ======================================= --- /branches/bleeding_edge/src/arm/fast-codegen-arm.cc Mon Dec 14 03:09:25 2009 +++ /branches/bleeding_edge/src/arm/fast-codegen-arm.cc Wed Dec 16 01:51:07 2009 @@ -1689,29 +1689,44 @@ Register FastCodeGenerator::result_register() { return r0; } + + +Register FastCodeGenerator::context_register() { return cp; } + + +void FastCodeGenerator::StoreToFrameField(int frame_offset, Register value) { + ASSERT_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset); + __ str(value, MemOperand(fp, frame_offset)); +} + + +void FastCodeGenerator::LoadContextField(Register dst, int context_index) { + __ ldr(dst, CodeGenerator::ContextOperand(cp, context_index)); +} + // ---------------------------------------------------------------------------- // Non-local control flow support. void FastCodeGenerator::EnterFinallyBlock() { ASSERT(!result_register().is(r1)); + // Store result register while executing finally block. + __ push(result_register()); // Cook return address in link register to stack (smi encoded Code* delta) __ sub(r1, lr, Operand(masm_->CodeObject())); ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize); ASSERT_EQ(0, kSmiTag); __ add(r1, r1, Operand(r1)); // Convert to smi. __ push(r1); - // Store result register while executing finally block. - __ push(result_register()); } void FastCodeGenerator::ExitFinallyBlock() { ASSERT(!result_register().is(r1)); // Restore result register from stack. - __ pop(result_register()); - // Uncook return address and return. __ pop(r1); + // Uncook return address and return. + __ pop(result_register()); ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize); __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. __ add(pc, r1, Operand(masm_->CodeObject())); ======================================= --- /branches/bleeding_edge/src/compiler.cc Mon Dec 14 03:09:25 2009 +++ /branches/bleeding_edge/src/compiler.cc Wed Dec 16 01:51:07 2009 @@ -703,12 +703,12 @@ void CodeGenSelector::VisitWithEnterStatement(WithEnterStatement* stmt) { - BAILOUT("WithEnterStatement"); + ProcessExpression(stmt->expression(), Expression::kValue); } void CodeGenSelector::VisitWithExitStatement(WithExitStatement* stmt) { - BAILOUT("WithExitStatement"); + // Supported. } ======================================= --- /branches/bleeding_edge/src/fast-codegen.cc Mon Dec 14 03:09:25 2009 +++ /branches/bleeding_edge/src/fast-codegen.cc Wed Dec 16 01:51:07 2009 @@ -337,12 +337,31 @@ void FastCodeGenerator::VisitWithEnterStatement(WithEnterStatement* stmt) { - UNREACHABLE(); + Comment cmnt(masm_, "[ WithEnterStatement"); + SetStatementPosition(stmt); + + Visit(stmt->expression()); + if (stmt->is_catch_block()) { + __ CallRuntime(Runtime::kPushCatchContext, 1); + } else { + __ CallRuntime(Runtime::kPushContext, 1); + } + // Both runtime calls return the new context in both the context and the + // result registers. + + // Update local stack frame context field. + StoreToFrameField(StandardFrameConstants::kContextOffset, context_register()); } void FastCodeGenerator::VisitWithExitStatement(WithExitStatement* stmt) { - UNREACHABLE(); + Comment cmnt(masm_, "[ WithExitStatement"); + SetStatementPosition(stmt); + + // Pop context. + LoadContextField(context_register(), Context::PREVIOUS_INDEX); + // Update local stack frame context field. + StoreToFrameField(StandardFrameConstants::kContextOffset, context_register()); } ======================================= --- /branches/bleeding_edge/src/fast-codegen.h Mon Dec 14 03:09:25 2009 +++ /branches/bleeding_edge/src/fast-codegen.h Wed Dec 16 01:51:07 2009 @@ -291,6 +291,15 @@ MacroAssembler* masm() { return masm_; } static Register result_register(); + static Register context_register(); + + // Set fields in the stack frame. Offsets are the frame pointer relative + // offsets defined in, e.g., StandardFrameConstants. + void StoreToFrameField(int frame_offset, Register value); + + // Load a value from the current context. Indices are defined as an enum + // in v8::internal::Context. + void LoadContextField(Register dst, int context_index); // AST node visit functions. #define DECLARE_VISIT(type) virtual void Visit##type(type* node); ======================================= --- /branches/bleeding_edge/src/ia32/fast-codegen-ia32.cc Mon Dec 14 03:09:25 2009 +++ /branches/bleeding_edge/src/ia32/fast-codegen-ia32.cc Wed Dec 16 01:51:07 2009 @@ -1664,6 +1664,21 @@ Register FastCodeGenerator::result_register() { return eax; } + + +Register FastCodeGenerator::context_register() { return esi; } + + +void FastCodeGenerator::StoreToFrameField(int frame_offset, Register value) { + ASSERT_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset); + __ mov(Operand(ebp, frame_offset), value); +} + + +void FastCodeGenerator::LoadContextField(Register dst, int context_index) { + __ mov(dst, CodeGenerator::ContextOperand(esi, context_index)); +} + // ---------------------------------------------------------------------------- // Non-local control flow support. ======================================= --- /branches/bleeding_edge/src/x64/fast-codegen-x64.cc Mon Dec 14 03:09:25 2009 +++ /branches/bleeding_edge/src/x64/fast-codegen-x64.cc Wed Dec 16 01:51:07 2009 @@ -1670,6 +1670,22 @@ Register FastCodeGenerator::result_register() { return rax; } + + +Register FastCodeGenerator::context_register() { return rsi; } + + +void FastCodeGenerator::StoreToFrameField(int frame_offset, Register value) { + ASSERT_EQ(POINTER_SIZE_ALIGN(frame_offset), + static_cast<intptr_t>(frame_offset)); + __ movq(Operand(rbp, frame_offset), value); +} + + +void FastCodeGenerator::LoadContextField(Register dst, int context_index) { + __ movq(dst, CodeGenerator::ContextOperand(rsi, context_index)); +} + // ---------------------------------------------------------------------------- // Non-local control flow support. -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
