From aef02ccccba52d15732e409e6a1ea45f1daa28db Mon Sep 17 00:00:00 2001 From: "lrn@chromium.org" Date: Thu, 10 Dec 2009 14:06:08 +0000 Subject: [PATCH] Fast codegen: Working break and continue. Started framework for all intra-functional outward control transfers, including handling of try/finally. Review URL: http://codereview.chromium.org/466033 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3448 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/fast-codegen-arm.cc | 17 +--- src/arm/macro-assembler-arm.cc | 24 ++++++ src/arm/macro-assembler-arm.h | 6 ++ src/compiler.cc | 2 - src/fast-codegen.cc | 94 +++++++++++++++++++--- src/fast-codegen.h | 163 ++++++++++++++++++++++++++++++++++++++- src/ia32/fast-codegen-ia32.cc | 15 +--- src/ia32/macro-assembler-ia32.cc | 19 +++++ src/ia32/macro-assembler-ia32.h | 9 +++ src/x64/fast-codegen-x64.cc | 16 +--- src/x64/macro-assembler-x64.cc | 15 ++++ src/x64/macro-assembler-x64.h | 6 +- 12 files changed, 327 insertions(+), 59 deletions(-) diff --git a/src/arm/fast-codegen-arm.cc b/src/arm/fast-codegen-arm.cc index 2c264d8..04fff5c 100644 --- a/src/arm/fast-codegen-arm.cc +++ b/src/arm/fast-codegen-arm.cc @@ -521,21 +521,6 @@ void FastCodeGenerator::DeclareGlobals(Handle pairs) { } -void FastCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { - Comment cmnt(masm_, "[ ReturnStatement"); - Expression* expr = stmt->expression(); - // Complete the statement based on the type of the subexpression. - if (expr->AsLiteral() != NULL) { - __ mov(r0, Operand(expr->AsLiteral()->handle())); - } else { - ASSERT_EQ(Expression::kValue, expr->context()); - Visit(expr); - __ pop(r0); - } - EmitReturnSequence(stmt->statement_pos()); -} - - void FastCodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { Comment cmnt(masm_, "[ FunctionLiteral"); @@ -1668,6 +1653,8 @@ void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) { } +Register FastCodeGenerator::result_register() { return r0; } + #undef __ diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index a9567c0..876eec1 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -162,6 +162,21 @@ void MacroAssembler::StackLimitCheck(Label* on_stack_overflow) { } +void MacroAssembler::Drop(int stack_elements, Condition cond) { + if (stack_elements > 0) { + add(sp, sp, Operand(stack_elements * kPointerSize), LeaveCC, cond); + } +} + + +void MacroAssembler::Call(Label* target) { + bl(target); +} + + +void MacroAssembler::Move(Register dst, Handle value) { + mov(dst, Operand(value)); +} void MacroAssembler::SmiJumpTable(Register index, Vector targets) { @@ -628,6 +643,15 @@ void MacroAssembler::PushTryHandler(CodeLocation try_location, } +void MacroAssembler::PopTryHandler() { + ASSERT_EQ(0, StackHandlerConstants::kNextOffset); + pop(r1); + mov(ip, Operand(ExternalReference(Top::k_handler_address))); + add(sp, sp, Operand(StackHandlerConstants::kSize - kPointerSize)); + str(r1, MemOperand(ip)); +} + + Register MacroAssembler::CheckMaps(JSObject* object, Register object_reg, JSObject* holder, Register holder_reg, Register scratch, diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h index 0974329..88bfa9c 100644 --- a/src/arm/macro-assembler-arm.h +++ b/src/arm/macro-assembler-arm.h @@ -64,6 +64,9 @@ class MacroAssembler: public Assembler { void Call(byte* target, RelocInfo::Mode rmode, Condition cond = al); void Call(Handle code, RelocInfo::Mode rmode, Condition cond = al); void Ret(Condition cond = al); + void Drop(int stack_elements, Condition cond = al); + void Call(Label* target); + void Move(Register dst, Handle value); // Jumps to the label at the index given by the Smi in "index". void SmiJumpTable(Register index, Vector targets); // Load an object from the root table. @@ -148,6 +151,9 @@ class MacroAssembler: public Assembler { // On exit, r0 contains TOS (code slot). void PushTryHandler(CodeLocation try_location, HandlerType type); + // Unlink the stack handler on top of the stack from the try handler chain. + // Must preserve the result register. + void PopTryHandler(); // --------------------------------------------------------------------------- // Inline caching support diff --git a/src/compiler.cc b/src/compiler.cc index 6fc8a8f..d8dd650 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -690,12 +690,10 @@ void CodeGenSelector::VisitIfStatement(IfStatement* stmt) { void CodeGenSelector::VisitContinueStatement(ContinueStatement* stmt) { - BAILOUT("ContinueStatement"); } void CodeGenSelector::VisitBreakStatement(BreakStatement* stmt) { - BAILOUT("BreakStatement"); } diff --git a/src/fast-codegen.cc b/src/fast-codegen.cc index b835faf..5c4a70b 100644 --- a/src/fast-codegen.cc +++ b/src/fast-codegen.cc @@ -36,7 +36,7 @@ namespace v8 { namespace internal { -#define __ ACCESS_MASM(masm_) +#define __ ACCESS_MASM(masm()) Handle FastCodeGenerator::MakeCode(FunctionLiteral* fun, Handle