Chromium Code Reviews| Index: src/x64/lithium-codegen-x64.cc |
| =================================================================== |
| --- src/x64/lithium-codegen-x64.cc (revision 6907) |
| +++ src/x64/lithium-codegen-x64.cc (working copy) |
| @@ -322,8 +322,7 @@ |
| Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const { |
| Handle<Object> 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::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); |
|
Lasse Reichstein
2011/02/23 11:22:36
Would it be faster to make a macro for loading tru
|
| - |
| __ 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 @@ |
| } |
| +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. |