Chromium Code Reviews| 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);; |
|
dusmil.imgtec
2014/07/22 11:15:01
Extra semicolon.
Remove others in this file.
balazs.kilvady
2014/07/22 11:30:44
Done.
| |
| 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 |