OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/hydrogen-osr.h" | 10 #include "src/hydrogen-osr.h" |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 } | 573 } |
574 | 574 |
575 | 575 |
576 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, | 576 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, |
577 int arguments, | 577 int arguments, |
578 Safepoint::DeoptMode deopt_mode) { | 578 Safepoint::DeoptMode deopt_mode) { |
579 RecordSafepoint(pointers, Safepoint::kWithRegisters, arguments, deopt_mode); | 579 RecordSafepoint(pointers, Safepoint::kWithRegisters, arguments, deopt_mode); |
580 } | 580 } |
581 | 581 |
582 | 582 |
583 void LCodeGen::RecordSafepointWithRegistersAndDoubles( | |
584 LPointerMap* pointers, int arguments, Safepoint::DeoptMode deopt_mode) { | |
585 RecordSafepoint( | |
586 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode); | |
587 } | |
588 | |
589 | |
590 bool LCodeGen::GenerateCode() { | 583 bool LCodeGen::GenerateCode() { |
591 LPhase phase("Z_Code generation", chunk()); | 584 LPhase phase("Z_Code generation", chunk()); |
592 ASSERT(is_unused()); | 585 ASSERT(is_unused()); |
593 status_ = GENERATING; | 586 status_ = GENERATING; |
594 | 587 |
595 // Open a frame scope to indicate that there is a frame on the stack. The | 588 // Open a frame scope to indicate that there is a frame on the stack. The |
596 // NONE indicates that the scope shouldn't actually generate code to set up | 589 // NONE indicates that the scope shouldn't actually generate code to set up |
597 // the frame (that is done in GeneratePrologue). | 590 // the frame (that is done in GeneratePrologue). |
598 FrameScope frame_scope(masm_, StackFrame::NONE); | 591 FrameScope frame_scope(masm_, StackFrame::NONE); |
599 | 592 |
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1624 } | 1617 } |
1625 } | 1618 } |
1626 | 1619 |
1627 | 1620 |
1628 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { | 1621 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { |
1629 // TODO(3095996): Get rid of this. For now, we need to make the | 1622 // TODO(3095996): Get rid of this. For now, we need to make the |
1630 // result register contain a valid pointer because it is already | 1623 // result register contain a valid pointer because it is already |
1631 // contained in the register pointer map. | 1624 // contained in the register pointer map. |
1632 __ Mov(ToRegister(instr->result()), Smi::FromInt(0)); | 1625 __ Mov(ToRegister(instr->result()), Smi::FromInt(0)); |
1633 | 1626 |
1634 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 1627 PushSafepointRegistersScope scope(this); |
1635 // We're in a SafepointRegistersScope so we can use any scratch registers. | 1628 // We're in a SafepointRegistersScope so we can use any scratch registers. |
1636 Register size = x0; | 1629 Register size = x0; |
1637 if (instr->size()->IsConstantOperand()) { | 1630 if (instr->size()->IsConstantOperand()) { |
1638 __ Mov(size, ToSmi(LConstantOperand::cast(instr->size()))); | 1631 __ Mov(size, ToSmi(LConstantOperand::cast(instr->size()))); |
1639 } else { | 1632 } else { |
1640 __ SmiTag(size, ToRegister32(instr->size()).X()); | 1633 __ SmiTag(size, ToRegister32(instr->size()).X()); |
1641 } | 1634 } |
1642 int flags = AllocateDoubleAlignFlag::encode( | 1635 int flags = AllocateDoubleAlignFlag::encode( |
1643 instr->hydrogen()->MustAllocateDoubleAligned()); | 1636 instr->hydrogen()->MustAllocateDoubleAligned()); |
1644 if (instr->hydrogen()->IsOldPointerSpaceAllocation()) { | 1637 if (instr->hydrogen()->IsOldPointerSpaceAllocation()) { |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2139 | 2132 |
2140 | 2133 |
2141 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { | 2134 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { |
2142 GenerateOsrPrologue(); | 2135 GenerateOsrPrologue(); |
2143 } | 2136 } |
2144 | 2137 |
2145 | 2138 |
2146 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { | 2139 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { |
2147 Register temp = ToRegister(instr->temp()); | 2140 Register temp = ToRegister(instr->temp()); |
2148 { | 2141 { |
2149 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 2142 PushSafepointRegistersScope scope(this); |
2150 __ Push(object); | 2143 __ Push(object); |
2151 __ Mov(cp, 0); | 2144 __ Mov(cp, 0); |
2152 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); | 2145 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); |
2153 RecordSafepointWithRegisters( | 2146 RecordSafepointWithRegisters( |
2154 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); | 2147 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); |
2155 __ StoreToSafepointRegisterSlot(x0, temp); | 2148 __ StoreToSafepointRegisterSlot(x0, temp); |
2156 } | 2149 } |
2157 DeoptimizeIfSmi(temp, instr->environment()); | 2150 DeoptimizeIfSmi(temp, instr->environment()); |
2158 } | 2151 } |
2159 | 2152 |
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3138 Register result = ToRegister(instr->result()); | 3131 Register result = ToRegister(instr->result()); |
3139 ASSERT(result.Is(x0)); // InstanceofStub returns its result in x0. | 3132 ASSERT(result.Is(x0)); // InstanceofStub returns its result in x0. |
3140 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; | 3133 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; |
3141 flags = static_cast<InstanceofStub::Flags>( | 3134 flags = static_cast<InstanceofStub::Flags>( |
3142 flags | InstanceofStub::kArgsInRegisters); | 3135 flags | InstanceofStub::kArgsInRegisters); |
3143 flags = static_cast<InstanceofStub::Flags>( | 3136 flags = static_cast<InstanceofStub::Flags>( |
3144 flags | InstanceofStub::kReturnTrueFalseObject); | 3137 flags | InstanceofStub::kReturnTrueFalseObject); |
3145 flags = static_cast<InstanceofStub::Flags>( | 3138 flags = static_cast<InstanceofStub::Flags>( |
3146 flags | InstanceofStub::kCallSiteInlineCheck); | 3139 flags | InstanceofStub::kCallSiteInlineCheck); |
3147 | 3140 |
3148 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 3141 PushSafepointRegistersScope scope(this); |
3149 LoadContextFromDeferred(instr->context()); | 3142 LoadContextFromDeferred(instr->context()); |
3150 | 3143 |
3151 // Prepare InstanceofStub arguments. | 3144 // Prepare InstanceofStub arguments. |
3152 ASSERT(ToRegister(instr->value()).Is(InstanceofStub::left())); | 3145 ASSERT(ToRegister(instr->value()).Is(InstanceofStub::left())); |
3153 __ LoadObject(InstanceofStub::right(), instr->function()); | 3146 __ LoadObject(InstanceofStub::right(), instr->function()); |
3154 | 3147 |
3155 InstanceofStub stub(isolate(), flags); | 3148 InstanceofStub stub(isolate(), flags); |
3156 CallCodeGeneric(stub.GetCode(), | 3149 CallCodeGeneric(stub.GetCode(), |
3157 RelocInfo::CODE_TARGET, | 3150 RelocInfo::CODE_TARGET, |
3158 instr, | 3151 instr, |
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3787 // input (for abs(+x)) or to a smi (for abs(-SMI_MIN)), so it should already | 3780 // input (for abs(+x)) or to a smi (for abs(-SMI_MIN)), so it should already |
3788 // be valid. | 3781 // be valid. |
3789 Label result_ok; | 3782 Label result_ok; |
3790 Register input = ToRegister(instr->value()); | 3783 Register input = ToRegister(instr->value()); |
3791 __ JumpIfSmi(result, &result_ok); | 3784 __ JumpIfSmi(result, &result_ok); |
3792 __ Cmp(input, result); | 3785 __ Cmp(input, result); |
3793 __ Assert(eq, kUnexpectedValue); | 3786 __ Assert(eq, kUnexpectedValue); |
3794 __ Bind(&result_ok); | 3787 __ Bind(&result_ok); |
3795 } | 3788 } |
3796 | 3789 |
3797 { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 3790 { PushSafepointRegistersScope scope(this); |
3798 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr, | 3791 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr, |
3799 instr->context()); | 3792 instr->context()); |
3800 __ StoreToSafepointRegisterSlot(x0, result); | 3793 __ StoreToSafepointRegisterSlot(x0, result); |
3801 } | 3794 } |
3802 // The inline (non-deferred) code will store result_bits into result. | 3795 // The inline (non-deferred) code will store result_bits into result. |
3803 } | 3796 } |
3804 | 3797 |
3805 | 3798 |
3806 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) { | 3799 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) { |
3807 // Class for deferred case. | 3800 // Class for deferred case. |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4511 } | 4504 } |
4512 | 4505 |
4513 | 4506 |
4514 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4507 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
4515 // TODO(3095996): Get rid of this. For now, we need to make the | 4508 // TODO(3095996): Get rid of this. For now, we need to make the |
4516 // result register contain a valid pointer because it is already | 4509 // result register contain a valid pointer because it is already |
4517 // contained in the register pointer map. | 4510 // contained in the register pointer map. |
4518 Register result = ToRegister(instr->result()); | 4511 Register result = ToRegister(instr->result()); |
4519 __ Mov(result, 0); | 4512 __ Mov(result, 0); |
4520 | 4513 |
4521 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4514 PushSafepointRegistersScope scope(this); |
4522 // NumberTagU and NumberTagD use the context from the frame, rather than | 4515 // NumberTagU and NumberTagD use the context from the frame, rather than |
4523 // the environment's HContext or HInlinedContext value. | 4516 // the environment's HContext or HInlinedContext value. |
4524 // They only call Runtime::kAllocateHeapNumber. | 4517 // They only call Runtime::kAllocateHeapNumber. |
4525 // The corresponding HChange instructions are added in a phase that does | 4518 // The corresponding HChange instructions are added in a phase that does |
4526 // not have easy access to the local context. | 4519 // not have easy access to the local context. |
4527 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4520 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4528 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4521 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4529 RecordSafepointWithRegisters( | 4522 RecordSafepointWithRegisters( |
4530 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4523 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4531 __ StoreToSafepointRegisterSlot(x0, result); | 4524 __ StoreToSafepointRegisterSlot(x0, result); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4576 } | 4569 } |
4577 | 4570 |
4578 // Slow case: call the runtime system to do the number allocation. | 4571 // Slow case: call the runtime system to do the number allocation. |
4579 __ Bind(&slow); | 4572 __ Bind(&slow); |
4580 // TODO(3095996): Put a valid pointer value in the stack slot where the result | 4573 // TODO(3095996): Put a valid pointer value in the stack slot where the result |
4581 // register is stored, as this register is in the pointer map, but contains an | 4574 // register is stored, as this register is in the pointer map, but contains an |
4582 // integer value. | 4575 // integer value. |
4583 __ Mov(dst, 0); | 4576 __ Mov(dst, 0); |
4584 { | 4577 { |
4585 // Preserve the value of all registers. | 4578 // Preserve the value of all registers. |
4586 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4579 PushSafepointRegistersScope scope(this); |
4587 | 4580 |
4588 // NumberTagU and NumberTagD use the context from the frame, rather than | 4581 // NumberTagU and NumberTagD use the context from the frame, rather than |
4589 // the environment's HContext or HInlinedContext value. | 4582 // the environment's HContext or HInlinedContext value. |
4590 // They only call Runtime::kAllocateHeapNumber. | 4583 // They only call Runtime::kAllocateHeapNumber. |
4591 // The corresponding HChange instructions are added in a phase that does | 4584 // The corresponding HChange instructions are added in a phase that does |
4592 // not have easy access to the local context. | 4585 // not have easy access to the local context. |
4593 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4586 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4594 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4587 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4595 RecordSafepointWithRegisters( | 4588 RecordSafepointWithRegisters( |
4596 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4589 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5019 // TODO(all): if Mov could handle object in new space then it could be used | 5012 // TODO(all): if Mov could handle object in new space then it could be used |
5020 // here. | 5013 // here. |
5021 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); | 5014 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); |
5022 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); | 5015 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); |
5023 __ Push(cp, scratch1, scratch2); // The context is the first argument. | 5016 __ Push(cp, scratch1, scratch2); // The context is the first argument. |
5024 CallRuntime(Runtime::kDeclareGlobals, 3, instr); | 5017 CallRuntime(Runtime::kDeclareGlobals, 3, instr); |
5025 } | 5018 } |
5026 | 5019 |
5027 | 5020 |
5028 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 5021 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
5029 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5022 PushSafepointRegistersScope scope(this); |
5030 LoadContextFromDeferred(instr->context()); | 5023 LoadContextFromDeferred(instr->context()); |
5031 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); | 5024 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); |
5032 RecordSafepointWithLazyDeopt( | 5025 RecordSafepointWithLazyDeopt( |
5033 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5026 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
5034 ASSERT(instr->HasEnvironment()); | 5027 ASSERT(instr->HasEnvironment()); |
5035 LEnvironment* env = instr->environment(); | 5028 LEnvironment* env = instr->environment(); |
5036 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 5029 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
5037 } | 5030 } |
5038 | 5031 |
5039 | 5032 |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5474 | 5467 |
5475 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { | 5468 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { |
5476 Register string = ToRegister(instr->string()); | 5469 Register string = ToRegister(instr->string()); |
5477 Register result = ToRegister(instr->result()); | 5470 Register result = ToRegister(instr->result()); |
5478 | 5471 |
5479 // TODO(3095996): Get rid of this. For now, we need to make the | 5472 // TODO(3095996): Get rid of this. For now, we need to make the |
5480 // result register contain a valid pointer because it is already | 5473 // result register contain a valid pointer because it is already |
5481 // contained in the register pointer map. | 5474 // contained in the register pointer map. |
5482 __ Mov(result, 0); | 5475 __ Mov(result, 0); |
5483 | 5476 |
5484 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5477 PushSafepointRegistersScope scope(this); |
5485 __ Push(string); | 5478 __ Push(string); |
5486 // Push the index as a smi. This is safe because of the checks in | 5479 // Push the index as a smi. This is safe because of the checks in |
5487 // DoStringCharCodeAt above. | 5480 // DoStringCharCodeAt above. |
5488 Register index = ToRegister(instr->index()); | 5481 Register index = ToRegister(instr->index()); |
5489 __ SmiTagAndPush(index); | 5482 __ SmiTagAndPush(index); |
5490 | 5483 |
5491 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, | 5484 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, |
5492 instr->context()); | 5485 instr->context()); |
5493 __ AssertSmi(x0); | 5486 __ AssertSmi(x0); |
5494 __ SmiUntag(x0); | 5487 __ SmiUntag(x0); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5527 | 5520 |
5528 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { | 5521 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { |
5529 Register char_code = ToRegister(instr->char_code()); | 5522 Register char_code = ToRegister(instr->char_code()); |
5530 Register result = ToRegister(instr->result()); | 5523 Register result = ToRegister(instr->result()); |
5531 | 5524 |
5532 // TODO(3095996): Get rid of this. For now, we need to make the | 5525 // TODO(3095996): Get rid of this. For now, we need to make the |
5533 // result register contain a valid pointer because it is already | 5526 // result register contain a valid pointer because it is already |
5534 // contained in the register pointer map. | 5527 // contained in the register pointer map. |
5535 __ Mov(result, 0); | 5528 __ Mov(result, 0); |
5536 | 5529 |
5537 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5530 PushSafepointRegistersScope scope(this); |
5538 __ SmiTagAndPush(char_code); | 5531 __ SmiTagAndPush(char_code); |
5539 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); | 5532 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); |
5540 __ StoreToSafepointRegisterSlot(x0, result); | 5533 __ StoreToSafepointRegisterSlot(x0, result); |
5541 } | 5534 } |
5542 | 5535 |
5543 | 5536 |
5544 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { | 5537 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { |
5545 ASSERT(ToRegister(instr->context()).is(cp)); | 5538 ASSERT(ToRegister(instr->context()).is(cp)); |
5546 Token::Value op = instr->op(); | 5539 Token::Value op = instr->op(); |
5547 | 5540 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5756 } else { | 5749 } else { |
5757 { | 5750 { |
5758 UseScratchRegisterScope temps(masm()); | 5751 UseScratchRegisterScope temps(masm()); |
5759 // Use the temp register only in a restricted scope - the codegen checks | 5752 // Use the temp register only in a restricted scope - the codegen checks |
5760 // that we do not use any register across a call. | 5753 // that we do not use any register across a call. |
5761 __ CheckMap(object, temps.AcquireX(), from_map, ¬_applicable, | 5754 __ CheckMap(object, temps.AcquireX(), from_map, ¬_applicable, |
5762 DONT_DO_SMI_CHECK); | 5755 DONT_DO_SMI_CHECK); |
5763 } | 5756 } |
5764 ASSERT(object.is(x0)); | 5757 ASSERT(object.is(x0)); |
5765 ASSERT(ToRegister(instr->context()).is(cp)); | 5758 ASSERT(ToRegister(instr->context()).is(cp)); |
5766 PushSafepointRegistersScope scope( | 5759 PushSafepointRegistersScope scope(this); |
5767 this, Safepoint::kWithRegistersAndDoubles); | |
5768 __ Mov(x1, Operand(to_map)); | 5760 __ Mov(x1, Operand(to_map)); |
5769 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; | 5761 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; |
5770 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); | 5762 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); |
5771 __ CallStub(&stub); | 5763 __ CallStub(&stub); |
5772 RecordSafepointWithRegistersAndDoubles( | 5764 RecordSafepointWithRegisters( |
5773 instr->pointer_map(), 0, Safepoint::kLazyDeopt); | 5765 instr->pointer_map(), 0, Safepoint::kLazyDeopt); |
5774 } | 5766 } |
5775 __ Bind(¬_applicable); | 5767 __ Bind(¬_applicable); |
5776 } | 5768 } |
5777 | 5769 |
5778 | 5770 |
5779 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { | 5771 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { |
5780 Register object = ToRegister(instr->object()); | 5772 Register object = ToRegister(instr->object()); |
5781 Register temp1 = ToRegister(instr->temp1()); | 5773 Register temp1 = ToRegister(instr->temp1()); |
5782 Register temp2 = ToRegister(instr->temp2()); | 5774 Register temp2 = ToRegister(instr->temp2()); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5954 __ Bind(©_receiver); | 5946 __ Bind(©_receiver); |
5955 __ Mov(result, receiver); | 5947 __ Mov(result, receiver); |
5956 __ Bind(&done); | 5948 __ Bind(&done); |
5957 } | 5949 } |
5958 | 5950 |
5959 | 5951 |
5960 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, | 5952 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, |
5961 Register result, | 5953 Register result, |
5962 Register object, | 5954 Register object, |
5963 Register index) { | 5955 Register index) { |
5964 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5956 PushSafepointRegistersScope scope(this); |
5965 __ Push(object); | 5957 __ Push(object); |
5966 __ Push(index); | 5958 __ Push(index); |
5967 __ Mov(cp, 0); | 5959 __ Mov(cp, 0); |
5968 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); | 5960 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); |
5969 RecordSafepointWithRegisters( | 5961 RecordSafepointWithRegisters( |
5970 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); | 5962 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); |
5971 __ StoreToSafepointRegisterSlot(x0, result); | 5963 __ StoreToSafepointRegisterSlot(x0, result); |
5972 } | 5964 } |
5973 | 5965 |
5974 | 5966 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6042 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6034 Handle<ScopeInfo> scope_info = instr->scope_info(); |
6043 __ Push(scope_info); | 6035 __ Push(scope_info); |
6044 __ Push(ToRegister(instr->function())); | 6036 __ Push(ToRegister(instr->function())); |
6045 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6037 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
6046 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6038 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6047 } | 6039 } |
6048 | 6040 |
6049 | 6041 |
6050 | 6042 |
6051 } } // namespace v8::internal | 6043 } } // namespace v8::internal |
OLD | NEW |