From: whesse@chromium.org Date: Wed, 23 Feb 2011 11:29:11 +0000 (+0000) Subject: X64 Crankshaft: Add Typeof and TypeofIs to x64 lithium. Fix presubmit. X-Git-Tag: upstream/4.7.83~20110 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=65443b38796580cbf4fba5d441781edbf7fb2046;p=platform%2Fupstream%2Fv8.git X64 Crankshaft: Add Typeof and TypeofIs to x64 lithium. Fix presubmit. Review URL: http://codereview.chromium.org/6568004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6912 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index ccc4e4b..d36fdfb 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -322,8 +322,7 @@ int LCodeGen::ToInteger32(LConstantOperand* op) const { Handle LCodeGen::ToHandle(LConstantOperand* op) const { Handle literal = chunk_->LookupLiteral(op); - Representation r = chunk_->LookupLiteralRepresentation(op); - ASSERT(r.IsTagged()); + ASSERT(chunk_->LookupLiteralRepresentation(op).IsTagged()); return literal; } @@ -3175,63 +3174,42 @@ void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { void LCodeGen::DoTypeof(LTypeof* instr) { - Abort("Unimplemented: %s", "DoTypeof"); + LOperand* input = instr->InputAt(0); + if (input->IsConstantOperand()) { + __ Push(ToHandle(LConstantOperand::cast(input))); + } else if (input->IsRegister()) { + __ push(ToRegister(input)); + } else { + ASSERT(input->IsStackSlot()); + __ push(ToOperand(input)); + } + CallRuntime(Runtime::kTypeof, 1, instr); } void LCodeGen::DoTypeofIs(LTypeofIs* instr) { - Abort("Unimplemented: %s", "DoTypeofIs"); -} - - -void LCodeGen::DoIsConstructCall(LIsConstructCall* instr) { + Register input = ToRegister(instr->InputAt(0)); Register result = ToRegister(instr->result()); - NearLabel true_label; - NearLabel false_label; + Label true_label; + Label false_label; NearLabel done; - EmitIsConstructCall(result); - __ j(equal, &true_label); - + Condition final_branch_condition = EmitTypeofIs(&true_label, + &false_label, + input, + instr->type_literal()); + __ j(final_branch_condition, &true_label); + __ bind(&false_label); __ LoadRoot(result, Heap::kFalseValueRootIndex); __ jmp(&done); __ bind(&true_label); __ LoadRoot(result, Heap::kTrueValueRootIndex); - __ bind(&done); } -void LCodeGen::DoIsConstructCallAndBranch(LIsConstructCallAndBranch* instr) { - Register temp = ToRegister(instr->TempAt(0)); - int true_block = chunk_->LookupDestination(instr->true_block_id()); - int false_block = chunk_->LookupDestination(instr->false_block_id()); - - EmitIsConstructCall(temp); - EmitBranch(true_block, false_block, equal); -} - - -void LCodeGen::EmitIsConstructCall(Register temp) { - // Get the frame pointer for the calling frame. - __ movq(temp, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); - - // Skip the arguments adaptor frame if it exists. - NearLabel check_frame_marker; - __ SmiCompare(Operand(temp, StandardFrameConstants::kContextOffset), - Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); - __ j(not_equal, &check_frame_marker); - __ movq(temp, Operand(rax, StandardFrameConstants::kCallerFPOffset)); - - // Check the marker in the calling frame. - __ bind(&check_frame_marker); - __ SmiCompare(Operand(temp, StandardFrameConstants::kMarkerOffset), - Smi::FromInt(StackFrame::CONSTRUCT)); -} - - void LCodeGen::EmitPushConstantOperand(LOperand* operand) { ASSERT(operand->IsConstantOperand()); LConstantOperand* const_op = LConstantOperand::cast(operand); @@ -3329,6 +3307,54 @@ Condition LCodeGen::EmitTypeofIs(Label* true_label, } +void LCodeGen::DoIsConstructCall(LIsConstructCall* instr) { + Register result = ToRegister(instr->result()); + NearLabel true_label; + NearLabel false_label; + NearLabel done; + + EmitIsConstructCall(result); + __ j(equal, &true_label); + + __ LoadRoot(result, Heap::kFalseValueRootIndex); + __ jmp(&done); + + __ bind(&true_label); + __ LoadRoot(result, Heap::kTrueValueRootIndex); + + + __ bind(&done); +} + + +void LCodeGen::DoIsConstructCallAndBranch(LIsConstructCallAndBranch* instr) { + Register temp = ToRegister(instr->TempAt(0)); + int true_block = chunk_->LookupDestination(instr->true_block_id()); + int false_block = chunk_->LookupDestination(instr->false_block_id()); + + EmitIsConstructCall(temp); + EmitBranch(true_block, false_block, equal); +} + + +void LCodeGen::EmitIsConstructCall(Register temp) { + // Get the frame pointer for the calling frame. + __ movq(temp, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); + + // Skip the arguments adaptor frame if it exists. + NearLabel check_frame_marker; + __ SmiCompare(Operand(temp, StandardFrameConstants::kContextOffset), + Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); + __ j(not_equal, &check_frame_marker); + __ movq(temp, Operand(rax, StandardFrameConstants::kCallerFPOffset)); + + // Check the marker in the calling frame. + __ bind(&check_frame_marker); + __ SmiCompare(Operand(temp, StandardFrameConstants::kMarkerOffset), + Smi::FromInt(StackFrame::CONSTRUCT)); +} + + void LCodeGen::DoLazyBailout(LLazyBailout* instr) { // No code for lazy bailout instruction. Used to capture environment after a // call for populating the safepoint data with deoptimization data. diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index bfa3ed4..892a421 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -1951,14 +1951,13 @@ LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { - Abort("Unimplemented: %s", "DoTypeof"); - return NULL; + LTypeof* result = new LTypeof(UseAtStart(instr->value())); + return MarkAsCall(DefineFixed(result, rax), instr); } LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { - Abort("Unimplemented: %s", "DoTypeofIs"); - return NULL; + return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); }