OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/hydrogen-osr.h" | 8 #include "src/hydrogen-osr.h" |
9 #include "src/mips64/lithium-codegen-mips64.h" | 9 #include "src/mips64/lithium-codegen-mips64.h" |
10 #include "src/mips64/lithium-gap-resolver-mips64.h" | 10 #include "src/mips64/lithium-gap-resolver-mips64.h" |
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 | 964 |
965 | 965 |
966 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, | 966 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, |
967 int arguments, | 967 int arguments, |
968 Safepoint::DeoptMode deopt_mode) { | 968 Safepoint::DeoptMode deopt_mode) { |
969 RecordSafepoint( | 969 RecordSafepoint( |
970 pointers, Safepoint::kWithRegisters, arguments, deopt_mode); | 970 pointers, Safepoint::kWithRegisters, arguments, deopt_mode); |
971 } | 971 } |
972 | 972 |
973 | 973 |
974 void LCodeGen::RecordSafepointWithRegistersAndDoubles( | |
975 LPointerMap* pointers, | |
976 int arguments, | |
977 Safepoint::DeoptMode deopt_mode) { | |
978 RecordSafepoint( | |
979 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode); | |
980 } | |
981 | |
982 | |
983 void LCodeGen::RecordAndWritePosition(int position) { | 974 void LCodeGen::RecordAndWritePosition(int position) { |
984 if (position == RelocInfo::kNoPosition) return; | 975 if (position == RelocInfo::kNoPosition) return; |
985 masm()->positions_recorder()->RecordPosition(position); | 976 masm()->positions_recorder()->RecordPosition(position); |
986 masm()->positions_recorder()->WriteRecordedPositions(); | 977 masm()->positions_recorder()->WriteRecordedPositions(); |
987 } | 978 } |
988 | 979 |
989 | 980 |
990 static const char* LabelType(LLabel* label) { | 981 static const char* LabelType(LLabel* label) { |
991 if (label->is_loop_header()) return " (loop header)"; | 982 if (label->is_loop_header()) return " (loop header)"; |
992 if (label->is_osr_entry()) return " (OSR entry)"; | 983 if (label->is_osr_entry()) return " (OSR entry)"; |
(...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2764 | 2755 |
2765 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; | 2756 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; |
2766 flags = static_cast<InstanceofStub::Flags>( | 2757 flags = static_cast<InstanceofStub::Flags>( |
2767 flags | InstanceofStub::kArgsInRegisters); | 2758 flags | InstanceofStub::kArgsInRegisters); |
2768 flags = static_cast<InstanceofStub::Flags>( | 2759 flags = static_cast<InstanceofStub::Flags>( |
2769 flags | InstanceofStub::kCallSiteInlineCheck); | 2760 flags | InstanceofStub::kCallSiteInlineCheck); |
2770 flags = static_cast<InstanceofStub::Flags>( | 2761 flags = static_cast<InstanceofStub::Flags>( |
2771 flags | InstanceofStub::kReturnTrueFalseObject); | 2762 flags | InstanceofStub::kReturnTrueFalseObject); |
2772 InstanceofStub stub(isolate(), flags); | 2763 InstanceofStub stub(isolate(), flags); |
2773 | 2764 |
2774 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 2765 PushSafepointRegistersScope scope(this); |
2775 LoadContextFromDeferred(instr->context()); | 2766 LoadContextFromDeferred(instr->context()); |
2776 | 2767 |
2777 // Get the temp register reserved by the instruction. This needs to be a4 as | 2768 // Get the temp register reserved by the instruction. This needs to be a4 as |
2778 // its slot of the pushing of safepoint registers is used to communicate the | 2769 // its slot of the pushing of safepoint registers is used to communicate the |
2779 // offset to the location of the map check. | 2770 // offset to the location of the map check. |
2780 Register temp = ToRegister(instr->temp()); | 2771 Register temp = ToRegister(instr->temp()); |
2781 ASSERT(temp.is(a4)); | 2772 ASSERT(temp.is(a4)); |
2782 __ li(InstanceofStub::right(), instr->function()); | 2773 __ li(InstanceofStub::right(), instr->function()); |
2783 static const int kAdditionalDelta = 13; | 2774 static const int kAdditionalDelta = 13; |
2784 int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; | 2775 int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3646 __ lwu(exponent, FieldMemOperand(input, HeapNumber::kExponentOffset)); | 3637 __ lwu(exponent, FieldMemOperand(input, HeapNumber::kExponentOffset)); |
3647 // Check the sign of the argument. If the argument is positive, just | 3638 // Check the sign of the argument. If the argument is positive, just |
3648 // return it. | 3639 // return it. |
3649 __ Move(result, input); | 3640 __ Move(result, input); |
3650 __ And(at, exponent, Operand(HeapNumber::kSignMask)); | 3641 __ And(at, exponent, Operand(HeapNumber::kSignMask)); |
3651 __ Branch(&done, eq, at, Operand(zero_reg)); | 3642 __ Branch(&done, eq, at, Operand(zero_reg)); |
3652 | 3643 |
3653 // Input is negative. Reverse its sign. | 3644 // Input is negative. Reverse its sign. |
3654 // Preserve the value of all registers. | 3645 // Preserve the value of all registers. |
3655 { | 3646 { |
3656 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 3647 PushSafepointRegistersScope scope(this); |
3657 | 3648 |
3658 // Registers were saved at the safepoint, so we can use | 3649 // Registers were saved at the safepoint, so we can use |
3659 // many scratch registers. | 3650 // many scratch registers. |
3660 Register tmp1 = input.is(a1) ? a0 : a1; | 3651 Register tmp1 = input.is(a1) ? a0 : a1; |
3661 Register tmp2 = input.is(a2) ? a0 : a2; | 3652 Register tmp2 = input.is(a2) ? a0 : a2; |
3662 Register tmp3 = input.is(a3) ? a0 : a3; | 3653 Register tmp3 = input.is(a3) ? a0 : a3; |
3663 Register tmp4 = input.is(a4) ? a0 : a4; | 3654 Register tmp4 = input.is(a4) ? a0 : a4; |
3664 | 3655 |
3665 // exponent: floating point exponent value. | 3656 // exponent: floating point exponent value. |
3666 | 3657 |
(...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4483 __ sd(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); | 4474 __ sd(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); |
4484 // Write barrier. | 4475 // Write barrier. |
4485 __ RecordWriteForMap(object_reg, | 4476 __ RecordWriteForMap(object_reg, |
4486 new_map_reg, | 4477 new_map_reg, |
4487 scratch, | 4478 scratch, |
4488 GetRAState(), | 4479 GetRAState(), |
4489 kDontSaveFPRegs); | 4480 kDontSaveFPRegs); |
4490 } else { | 4481 } else { |
4491 ASSERT(object_reg.is(a0)); | 4482 ASSERT(object_reg.is(a0)); |
4492 ASSERT(ToRegister(instr->context()).is(cp)); | 4483 ASSERT(ToRegister(instr->context()).is(cp)); |
4493 PushSafepointRegistersScope scope( | 4484 PushSafepointRegistersScope scope(this); |
4494 this, Safepoint::kWithRegistersAndDoubles); | |
4495 __ li(a1, Operand(to_map)); | 4485 __ li(a1, Operand(to_map)); |
4496 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; | 4486 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; |
4497 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); | 4487 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); |
4498 __ CallStub(&stub); | 4488 __ CallStub(&stub); |
4499 RecordSafepointWithRegistersAndDoubles( | 4489 RecordSafepointWithRegisters( |
4500 instr->pointer_map(), 0, Safepoint::kLazyDeopt); | 4490 instr->pointer_map(), 0, Safepoint::kLazyDeopt); |
4501 } | 4491 } |
4502 __ bind(¬_applicable); | 4492 __ bind(¬_applicable); |
4503 } | 4493 } |
4504 | 4494 |
4505 | 4495 |
4506 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { | 4496 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { |
4507 Register object = ToRegister(instr->object()); | 4497 Register object = ToRegister(instr->object()); |
4508 Register temp = ToRegister(instr->temp()); | 4498 Register temp = ToRegister(instr->temp()); |
4509 Label no_memento_found; | 4499 Label no_memento_found; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4552 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { | 4542 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { |
4553 Register string = ToRegister(instr->string()); | 4543 Register string = ToRegister(instr->string()); |
4554 Register result = ToRegister(instr->result()); | 4544 Register result = ToRegister(instr->result()); |
4555 Register scratch = scratch0(); | 4545 Register scratch = scratch0(); |
4556 | 4546 |
4557 // TODO(3095996): Get rid of this. For now, we need to make the | 4547 // TODO(3095996): Get rid of this. For now, we need to make the |
4558 // result register contain a valid pointer because it is already | 4548 // result register contain a valid pointer because it is already |
4559 // contained in the register pointer map. | 4549 // contained in the register pointer map. |
4560 __ mov(result, zero_reg); | 4550 __ mov(result, zero_reg); |
4561 | 4551 |
4562 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4552 PushSafepointRegistersScope scope(this); |
4563 __ push(string); | 4553 __ push(string); |
4564 // Push the index as a smi. This is safe because of the checks in | 4554 // Push the index as a smi. This is safe because of the checks in |
4565 // DoStringCharCodeAt above. | 4555 // DoStringCharCodeAt above. |
4566 if (instr->index()->IsConstantOperand()) { | 4556 if (instr->index()->IsConstantOperand()) { |
4567 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); | 4557 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); |
4568 __ Daddu(scratch, zero_reg, Operand(Smi::FromInt(const_index))); | 4558 __ Daddu(scratch, zero_reg, Operand(Smi::FromInt(const_index))); |
4569 __ push(scratch); | 4559 __ push(scratch); |
4570 } else { | 4560 } else { |
4571 Register index = ToRegister(instr->index()); | 4561 Register index = ToRegister(instr->index()); |
4572 __ SmiTag(index); | 4562 __ SmiTag(index); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4616 | 4606 |
4617 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { | 4607 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { |
4618 Register char_code = ToRegister(instr->char_code()); | 4608 Register char_code = ToRegister(instr->char_code()); |
4619 Register result = ToRegister(instr->result()); | 4609 Register result = ToRegister(instr->result()); |
4620 | 4610 |
4621 // TODO(3095996): Get rid of this. For now, we need to make the | 4611 // TODO(3095996): Get rid of this. For now, we need to make the |
4622 // result register contain a valid pointer because it is already | 4612 // result register contain a valid pointer because it is already |
4623 // contained in the register pointer map. | 4613 // contained in the register pointer map. |
4624 __ mov(result, zero_reg); | 4614 __ mov(result, zero_reg); |
4625 | 4615 |
4626 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4616 PushSafepointRegistersScope scope(this); |
4627 __ SmiTag(char_code); | 4617 __ SmiTag(char_code); |
4628 __ push(char_code); | 4618 __ push(char_code); |
4629 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); | 4619 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); |
4630 __ StoreToSafepointRegisterSlot(v0, result); | 4620 __ StoreToSafepointRegisterSlot(v0, result); |
4631 } | 4621 } |
4632 | 4622 |
4633 | 4623 |
4634 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { | 4624 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { |
4635 LOperand* input = instr->value(); | 4625 LOperand* input = instr->value(); |
4636 ASSERT(input->IsRegister() || input->IsStackSlot()); | 4626 ASSERT(input->IsRegister() || input->IsStackSlot()); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4720 } | 4710 } |
4721 | 4711 |
4722 // Slow case: Call the runtime system to do the number allocation. | 4712 // Slow case: Call the runtime system to do the number allocation. |
4723 __ bind(&slow); | 4713 __ bind(&slow); |
4724 { | 4714 { |
4725 // TODO(3095996): Put a valid pointer value in the stack slot where the | 4715 // TODO(3095996): Put a valid pointer value in the stack slot where the |
4726 // result register is stored, as this register is in the pointer map, but | 4716 // result register is stored, as this register is in the pointer map, but |
4727 // contains an integer value. | 4717 // contains an integer value. |
4728 __ mov(dst, zero_reg); | 4718 __ mov(dst, zero_reg); |
4729 // Preserve the value of all registers. | 4719 // Preserve the value of all registers. |
4730 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4720 PushSafepointRegistersScope scope(this); |
4731 | 4721 |
4732 // NumberTagI and NumberTagD use the context from the frame, rather than | 4722 // NumberTagI and NumberTagD use the context from the frame, rather than |
4733 // the environment's HContext or HInlinedContext value. | 4723 // the environment's HContext or HInlinedContext value. |
4734 // They only call Runtime::kAllocateHeapNumber. | 4724 // They only call Runtime::kAllocateHeapNumber. |
4735 // The corresponding HChange instructions are added in a phase that does | 4725 // The corresponding HChange instructions are added in a phase that does |
4736 // not have easy access to the local context. | 4726 // not have easy access to the local context. |
4737 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4727 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4738 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4728 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4739 RecordSafepointWithRegisters( | 4729 RecordSafepointWithRegisters( |
4740 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4730 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4783 } | 4773 } |
4784 | 4774 |
4785 | 4775 |
4786 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4776 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
4787 // TODO(3095996): Get rid of this. For now, we need to make the | 4777 // TODO(3095996): Get rid of this. For now, we need to make the |
4788 // result register contain a valid pointer because it is already | 4778 // result register contain a valid pointer because it is already |
4789 // contained in the register pointer map. | 4779 // contained in the register pointer map. |
4790 Register reg = ToRegister(instr->result()); | 4780 Register reg = ToRegister(instr->result()); |
4791 __ mov(reg, zero_reg); | 4781 __ mov(reg, zero_reg); |
4792 | 4782 |
4793 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4783 PushSafepointRegistersScope scope(this); |
4794 // NumberTagI and NumberTagD use the context from the frame, rather than | 4784 // NumberTagI and NumberTagD use the context from the frame, rather than |
4795 // the environment's HContext or HInlinedContext value. | 4785 // the environment's HContext or HInlinedContext value. |
4796 // They only call Runtime::kAllocateHeapNumber. | 4786 // They only call Runtime::kAllocateHeapNumber. |
4797 // The corresponding HChange instructions are added in a phase that does | 4787 // The corresponding HChange instructions are added in a phase that does |
4798 // not have easy access to the local context. | 4788 // not have easy access to the local context. |
4799 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4789 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4800 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4790 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4801 RecordSafepointWithRegisters( | 4791 RecordSafepointWithRegisters( |
4802 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4792 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4803 __ Dsubu(v0, v0, kHeapObjectTag); | 4793 __ Dsubu(v0, v0, kHeapObjectTag); |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5161 Operand(at)); | 5151 Operand(at)); |
5162 } else { | 5152 } else { |
5163 DeoptimizeIf(ne, instr->environment(), reg, | 5153 DeoptimizeIf(ne, instr->environment(), reg, |
5164 Operand(object)); | 5154 Operand(object)); |
5165 } | 5155 } |
5166 } | 5156 } |
5167 | 5157 |
5168 | 5158 |
5169 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { | 5159 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { |
5170 { | 5160 { |
5171 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5161 PushSafepointRegistersScope scope(this); |
5172 __ push(object); | 5162 __ push(object); |
5173 __ mov(cp, zero_reg); | 5163 __ mov(cp, zero_reg); |
5174 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); | 5164 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); |
5175 RecordSafepointWithRegisters( | 5165 RecordSafepointWithRegisters( |
5176 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); | 5166 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); |
5177 __ StoreToSafepointRegisterSlot(v0, scratch0()); | 5167 __ StoreToSafepointRegisterSlot(v0, scratch0()); |
5178 } | 5168 } |
5179 __ SmiTst(scratch0(), at); | 5169 __ SmiTst(scratch0(), at); |
5180 DeoptimizeIf(eq, instr->environment(), at, Operand(zero_reg)); | 5170 DeoptimizeIf(eq, instr->environment(), at, Operand(zero_reg)); |
5181 } | 5171 } |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5373 | 5363 |
5374 | 5364 |
5375 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { | 5365 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { |
5376 Register result = ToRegister(instr->result()); | 5366 Register result = ToRegister(instr->result()); |
5377 | 5367 |
5378 // TODO(3095996): Get rid of this. For now, we need to make the | 5368 // TODO(3095996): Get rid of this. For now, we need to make the |
5379 // result register contain a valid pointer because it is already | 5369 // result register contain a valid pointer because it is already |
5380 // contained in the register pointer map. | 5370 // contained in the register pointer map. |
5381 __ mov(result, zero_reg); | 5371 __ mov(result, zero_reg); |
5382 | 5372 |
5383 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5373 PushSafepointRegistersScope scope(this); |
5384 if (instr->size()->IsRegister()) { | 5374 if (instr->size()->IsRegister()) { |
5385 Register size = ToRegister(instr->size()); | 5375 Register size = ToRegister(instr->size()); |
5386 ASSERT(!size.is(result)); | 5376 ASSERT(!size.is(result)); |
5387 __ SmiTag(size); | 5377 __ SmiTag(size); |
5388 __ push(size); | 5378 __ push(size); |
5389 } else { | 5379 } else { |
5390 int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); | 5380 int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); |
5391 if (size >= 0 && size <= Smi::kMaxValue) { | 5381 if (size >= 0 && size <= Smi::kMaxValue) { |
5392 __ li(v0, Operand(Smi::FromInt(size))); | 5382 __ li(v0, Operand(Smi::FromInt(size))); |
5393 __ Push(v0); | 5383 __ Push(v0); |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5704 // Nothing to see here, move on! | 5694 // Nothing to see here, move on! |
5705 } | 5695 } |
5706 | 5696 |
5707 | 5697 |
5708 void LCodeGen::DoDummyUse(LDummyUse* instr) { | 5698 void LCodeGen::DoDummyUse(LDummyUse* instr) { |
5709 // Nothing to see here, move on! | 5699 // Nothing to see here, move on! |
5710 } | 5700 } |
5711 | 5701 |
5712 | 5702 |
5713 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 5703 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
5714 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5704 PushSafepointRegistersScope scope(this); |
5715 LoadContextFromDeferred(instr->context()); | 5705 LoadContextFromDeferred(instr->context()); |
5716 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); | 5706 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); |
5717 RecordSafepointWithLazyDeopt( | 5707 RecordSafepointWithLazyDeopt( |
5718 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5708 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
5719 ASSERT(instr->HasEnvironment()); | 5709 ASSERT(instr->HasEnvironment()); |
5720 LEnvironment* env = instr->environment(); | 5710 LEnvironment* env = instr->environment(); |
5721 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 5711 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
5722 } | 5712 } |
5723 | 5713 |
5724 | 5714 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5846 Register map = ToRegister(instr->map()); | 5836 Register map = ToRegister(instr->map()); |
5847 __ ld(scratch0(), FieldMemOperand(object, HeapObject::kMapOffset)); | 5837 __ ld(scratch0(), FieldMemOperand(object, HeapObject::kMapOffset)); |
5848 DeoptimizeIf(ne, instr->environment(), map, Operand(scratch0())); | 5838 DeoptimizeIf(ne, instr->environment(), map, Operand(scratch0())); |
5849 } | 5839 } |
5850 | 5840 |
5851 | 5841 |
5852 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, | 5842 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, |
5853 Register result, | 5843 Register result, |
5854 Register object, | 5844 Register object, |
5855 Register index) { | 5845 Register index) { |
5856 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5846 PushSafepointRegistersScope scope(this); |
5857 __ Push(object, index); | 5847 __ Push(object, index); |
5858 __ mov(cp, zero_reg); | 5848 __ mov(cp, zero_reg); |
5859 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); | 5849 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); |
5860 RecordSafepointWithRegisters( | 5850 RecordSafepointWithRegisters( |
5861 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); | 5851 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); |
5862 __ StoreToSafepointRegisterSlot(v0, result); | 5852 __ StoreToSafepointRegisterSlot(v0, result); |
5863 } | 5853 } |
5864 | 5854 |
5865 | 5855 |
5866 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { | 5856 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5932 __ li(at, scope_info); | 5922 __ li(at, scope_info); |
5933 __ Push(at, ToRegister(instr->function())); | 5923 __ Push(at, ToRegister(instr->function())); |
5934 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5924 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5935 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5925 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5936 } | 5926 } |
5937 | 5927 |
5938 | 5928 |
5939 #undef __ | 5929 #undef __ |
5940 | 5930 |
5941 } } // namespace v8::internal | 5931 } } // namespace v8::internal |
OLD | NEW |