From a4ffbdc61bbd5266e6aa49dad0d963e4797f72aa Mon Sep 17 00:00:00 2001 From: "ager@chromium.org" Date: Wed, 23 Feb 2011 10:10:47 +0000 Subject: [PATCH] x64: Implement delete property in lithium backend. Review URL: http://codereview.chromium.org/6570005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6907 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/lithium-ia32.cc | 4 +-- src/x64/lithium-codegen-x64.cc | 61 +++++++++++++++++++++++++++++++++--------- src/x64/lithium-codegen-x64.h | 7 +++++ src/x64/lithium-x64.cc | 5 ++-- 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc index 58f7fd4..f009167 100644 --- a/src/ia32/lithium-ia32.cc +++ b/src/ia32/lithium-ia32.cc @@ -1940,8 +1940,8 @@ LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { - LDeleteProperty* result = new LDeleteProperty(Use(instr->object()), - UseOrConstant(instr->key())); + LDeleteProperty* result = + new LDeleteProperty(Use(instr->object()), UseOrConstant(instr->key())); return MarkAsCall(DefineFixed(result, eax), instr); } diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index eae931c..ccc4e4b 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -2190,18 +2190,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { void LCodeGen::DoPushArgument(LPushArgument* instr) { LOperand* argument = instr->InputAt(0); if (argument->IsConstantOperand()) { - LConstantOperand* const_op = LConstantOperand::cast(argument); - Handle literal = chunk_->LookupLiteral(const_op); - Representation r = chunk_->LookupLiteralRepresentation(const_op); - if (r.IsInteger32()) { - ASSERT(literal->IsNumber()); - __ push(Immediate(static_cast(literal->Number()))); - } else if (r.IsDouble()) { - Abort("unsupported double immediate"); - } else { - ASSERT(r.IsTagged()); - __ Push(literal); - } + EmitPushConstantOperand(argument); } else if (argument->IsRegister()) { __ push(ToRegister(argument)); } else { @@ -3243,6 +3232,23 @@ void LCodeGen::EmitIsConstructCall(Register temp) { } +void LCodeGen::EmitPushConstantOperand(LOperand* operand) { + ASSERT(operand->IsConstantOperand()); + LConstantOperand* const_op = LConstantOperand::cast(operand); + Handle literal = chunk_->LookupLiteral(const_op); + Representation r = chunk_->LookupLiteralRepresentation(const_op); + if (r.IsInteger32()) { + ASSERT(literal->IsNumber()); + __ push(Immediate(static_cast(literal->Number()))); + } else if (r.IsDouble()) { + Abort("unsupported double immediate"); + } else { + ASSERT(r.IsTagged()); + __ Push(literal); + } +} + + void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) { Register input = ToRegister(instr->InputAt(0)); int true_block = chunk_->LookupDestination(instr->true_block_id()); @@ -3335,7 +3341,36 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) { void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) { - Abort("Unimplemented: %s", "DoDeleteProperty"); + LOperand* obj = instr->object(); + LOperand* key = instr->key(); + // Push object. + if (obj->IsRegister()) { + __ push(ToRegister(obj)); + } else { + __ push(ToOperand(obj)); + } + // Push key. + if (key->IsConstantOperand()) { + EmitPushConstantOperand(key); + } else if (key->IsRegister()) { + __ push(ToRegister(key)); + } else { + __ push(ToOperand(key)); + } + ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment()); + LPointerMap* pointers = instr->pointer_map(); + LEnvironment* env = instr->deoptimization_environment(); + RecordPosition(pointers->position()); + RegisterEnvironmentForDeoptimization(env); + // Create safepoint generator that will also ensure enough space in the + // reloc info for patching in deoptimization (since this is invoking a + // builtin) + SafepointGenerator safepoint_generator(this, + pointers, + env->deoptimization_index(), + true); + __ Push(Smi::FromInt(strict_mode_flag())); + __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, &safepoint_generator); } diff --git a/src/x64/lithium-codegen-x64.h b/src/x64/lithium-codegen-x64.h index c99fa29..52409f2 100644 --- a/src/x64/lithium-codegen-x64.h +++ b/src/x64/lithium-codegen-x64.h @@ -117,6 +117,10 @@ class LCodeGen BASE_EMBEDDED { bool is_done() const { return status_ == DONE; } bool is_aborted() const { return status_ == ABORTED; } + int strict_mode_flag() const { + return info_->is_strict() ? kStrictMode : kNonStrictMode; + } + LChunk* chunk() const { return chunk_; } Scope* scope() const { return scope_; } HGraph* graph() const { return chunk_->graph(); } @@ -226,6 +230,9 @@ class LCodeGen BASE_EMBEDDED { // Caller should branch on equal condition. void EmitIsConstructCall(Register temp); + // Emits code for pushing a constant operand. + void EmitPushConstantOperand(LOperand* operand); + LChunk* const chunk_; MacroAssembler* const masm_; CompilationInfo* const info_; diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index d5fd35d..c8f7b91 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -1883,8 +1883,9 @@ LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { - Abort("Unimplemented: %s", "DoDeleteProperty"); - return NULL; + LDeleteProperty* result = + new LDeleteProperty(Use(instr->object()), UseOrConstant(instr->key())); + return MarkAsCall(DefineFixed(result, rax), instr); } -- 2.7.4