| 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 |