OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 | 1009 |
1010 | 1010 |
1011 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, | 1011 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, |
1012 int arguments, | 1012 int arguments, |
1013 Safepoint::DeoptMode deopt_mode) { | 1013 Safepoint::DeoptMode deopt_mode) { |
1014 RecordSafepoint( | 1014 RecordSafepoint( |
1015 pointers, Safepoint::kWithRegisters, arguments, deopt_mode); | 1015 pointers, Safepoint::kWithRegisters, arguments, deopt_mode); |
1016 } | 1016 } |
1017 | 1017 |
1018 | 1018 |
1019 void LCodeGen::RecordSafepointWithRegistersAndDoubles( | |
1020 LPointerMap* pointers, | |
1021 int arguments, | |
1022 Safepoint::DeoptMode deopt_mode) { | |
1023 RecordSafepoint( | |
1024 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode); | |
1025 } | |
1026 | |
1027 | |
1028 void LCodeGen::RecordAndWritePosition(int position) { | 1019 void LCodeGen::RecordAndWritePosition(int position) { |
1029 if (position == RelocInfo::kNoPosition) return; | 1020 if (position == RelocInfo::kNoPosition) return; |
1030 masm()->positions_recorder()->RecordPosition(position); | 1021 masm()->positions_recorder()->RecordPosition(position); |
1031 masm()->positions_recorder()->WriteRecordedPositions(); | 1022 masm()->positions_recorder()->WriteRecordedPositions(); |
1032 } | 1023 } |
1033 | 1024 |
1034 | 1025 |
1035 static const char* LabelType(LLabel* label) { | 1026 static const char* LabelType(LLabel* label) { |
1036 if (label->is_loop_header()) return " (loop header)"; | 1027 if (label->is_loop_header()) return " (loop header)"; |
1037 if (label->is_osr_entry()) return " (OSR entry)"; | 1028 if (label->is_osr_entry()) return " (OSR entry)"; |
(...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2796 | 2787 |
2797 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; | 2788 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; |
2798 flags = static_cast<InstanceofStub::Flags>( | 2789 flags = static_cast<InstanceofStub::Flags>( |
2799 flags | InstanceofStub::kArgsInRegisters); | 2790 flags | InstanceofStub::kArgsInRegisters); |
2800 flags = static_cast<InstanceofStub::Flags>( | 2791 flags = static_cast<InstanceofStub::Flags>( |
2801 flags | InstanceofStub::kCallSiteInlineCheck); | 2792 flags | InstanceofStub::kCallSiteInlineCheck); |
2802 flags = static_cast<InstanceofStub::Flags>( | 2793 flags = static_cast<InstanceofStub::Flags>( |
2803 flags | InstanceofStub::kReturnTrueFalseObject); | 2794 flags | InstanceofStub::kReturnTrueFalseObject); |
2804 InstanceofStub stub(isolate(), flags); | 2795 InstanceofStub stub(isolate(), flags); |
2805 | 2796 |
2806 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 2797 PushSafepointRegistersScope scope(this); |
2807 LoadContextFromDeferred(instr->context()); | 2798 LoadContextFromDeferred(instr->context()); |
2808 | 2799 |
2809 // Get the temp register reserved by the instruction. This needs to be t0 as | 2800 // Get the temp register reserved by the instruction. This needs to be t0 as |
2810 // its slot of the pushing of safepoint registers is used to communicate the | 2801 // its slot of the pushing of safepoint registers is used to communicate the |
2811 // offset to the location of the map check. | 2802 // offset to the location of the map check. |
2812 Register temp = ToRegister(instr->temp()); | 2803 Register temp = ToRegister(instr->temp()); |
2813 ASSERT(temp.is(t0)); | 2804 ASSERT(temp.is(t0)); |
2814 __ li(InstanceofStub::right(), instr->function()); | 2805 __ li(InstanceofStub::right(), instr->function()); |
2815 static const int kAdditionalDelta = 7; | 2806 static const int kAdditionalDelta = 7; |
2816 int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; | 2807 int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3619 __ lw(exponent, FieldMemOperand(input, HeapNumber::kExponentOffset)); | 3610 __ lw(exponent, FieldMemOperand(input, HeapNumber::kExponentOffset)); |
3620 // Check the sign of the argument. If the argument is positive, just | 3611 // Check the sign of the argument. If the argument is positive, just |
3621 // return it. | 3612 // return it. |
3622 __ Move(result, input); | 3613 __ Move(result, input); |
3623 __ And(at, exponent, Operand(HeapNumber::kSignMask)); | 3614 __ And(at, exponent, Operand(HeapNumber::kSignMask)); |
3624 __ Branch(&done, eq, at, Operand(zero_reg)); | 3615 __ Branch(&done, eq, at, Operand(zero_reg)); |
3625 | 3616 |
3626 // Input is negative. Reverse its sign. | 3617 // Input is negative. Reverse its sign. |
3627 // Preserve the value of all registers. | 3618 // Preserve the value of all registers. |
3628 { | 3619 { |
3629 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 3620 PushSafepointRegistersScope scope(this); |
3630 | 3621 |
3631 // Registers were saved at the safepoint, so we can use | 3622 // Registers were saved at the safepoint, so we can use |
3632 // many scratch registers. | 3623 // many scratch registers. |
3633 Register tmp1 = input.is(a1) ? a0 : a1; | 3624 Register tmp1 = input.is(a1) ? a0 : a1; |
3634 Register tmp2 = input.is(a2) ? a0 : a2; | 3625 Register tmp2 = input.is(a2) ? a0 : a2; |
3635 Register tmp3 = input.is(a3) ? a0 : a3; | 3626 Register tmp3 = input.is(a3) ? a0 : a3; |
3636 Register tmp4 = input.is(t0) ? a0 : t0; | 3627 Register tmp4 = input.is(t0) ? a0 : t0; |
3637 | 3628 |
3638 // exponent: floating point exponent value. | 3629 // exponent: floating point exponent value. |
3639 | 3630 |
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4421 __ sw(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); | 4412 __ sw(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); |
4422 // Write barrier. | 4413 // Write barrier. |
4423 __ RecordWriteForMap(object_reg, | 4414 __ RecordWriteForMap(object_reg, |
4424 new_map_reg, | 4415 new_map_reg, |
4425 scratch, | 4416 scratch, |
4426 GetRAState(), | 4417 GetRAState(), |
4427 kDontSaveFPRegs); | 4418 kDontSaveFPRegs); |
4428 } else { | 4419 } else { |
4429 ASSERT(object_reg.is(a0)); | 4420 ASSERT(object_reg.is(a0)); |
4430 ASSERT(ToRegister(instr->context()).is(cp)); | 4421 ASSERT(ToRegister(instr->context()).is(cp)); |
4431 PushSafepointRegistersScope scope( | 4422 PushSafepointRegistersScope scope(this); |
4432 this, Safepoint::kWithRegistersAndDoubles); | |
4433 __ li(a1, Operand(to_map)); | 4423 __ li(a1, Operand(to_map)); |
4434 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; | 4424 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; |
4435 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); | 4425 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); |
4436 __ CallStub(&stub); | 4426 __ CallStub(&stub); |
4437 RecordSafepointWithRegistersAndDoubles( | 4427 RecordSafepointWithRegisters( |
4438 instr->pointer_map(), 0, Safepoint::kLazyDeopt); | 4428 instr->pointer_map(), 0, Safepoint::kLazyDeopt); |
4439 } | 4429 } |
4440 __ bind(¬_applicable); | 4430 __ bind(¬_applicable); |
4441 } | 4431 } |
4442 | 4432 |
4443 | 4433 |
4444 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { | 4434 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { |
4445 Register object = ToRegister(instr->object()); | 4435 Register object = ToRegister(instr->object()); |
4446 Register temp = ToRegister(instr->temp()); | 4436 Register temp = ToRegister(instr->temp()); |
4447 Label no_memento_found; | 4437 Label no_memento_found; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4490 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { | 4480 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { |
4491 Register string = ToRegister(instr->string()); | 4481 Register string = ToRegister(instr->string()); |
4492 Register result = ToRegister(instr->result()); | 4482 Register result = ToRegister(instr->result()); |
4493 Register scratch = scratch0(); | 4483 Register scratch = scratch0(); |
4494 | 4484 |
4495 // TODO(3095996): Get rid of this. For now, we need to make the | 4485 // TODO(3095996): Get rid of this. For now, we need to make the |
4496 // result register contain a valid pointer because it is already | 4486 // result register contain a valid pointer because it is already |
4497 // contained in the register pointer map. | 4487 // contained in the register pointer map. |
4498 __ mov(result, zero_reg); | 4488 __ mov(result, zero_reg); |
4499 | 4489 |
4500 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4490 PushSafepointRegistersScope scope(this); |
4501 __ push(string); | 4491 __ push(string); |
4502 // Push the index as a smi. This is safe because of the checks in | 4492 // Push the index as a smi. This is safe because of the checks in |
4503 // DoStringCharCodeAt above. | 4493 // DoStringCharCodeAt above. |
4504 if (instr->index()->IsConstantOperand()) { | 4494 if (instr->index()->IsConstantOperand()) { |
4505 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); | 4495 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); |
4506 __ Addu(scratch, zero_reg, Operand(Smi::FromInt(const_index))); | 4496 __ Addu(scratch, zero_reg, Operand(Smi::FromInt(const_index))); |
4507 __ push(scratch); | 4497 __ push(scratch); |
4508 } else { | 4498 } else { |
4509 Register index = ToRegister(instr->index()); | 4499 Register index = ToRegister(instr->index()); |
4510 __ SmiTag(index); | 4500 __ SmiTag(index); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4554 | 4544 |
4555 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { | 4545 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { |
4556 Register char_code = ToRegister(instr->char_code()); | 4546 Register char_code = ToRegister(instr->char_code()); |
4557 Register result = ToRegister(instr->result()); | 4547 Register result = ToRegister(instr->result()); |
4558 | 4548 |
4559 // TODO(3095996): Get rid of this. For now, we need to make the | 4549 // TODO(3095996): Get rid of this. For now, we need to make the |
4560 // result register contain a valid pointer because it is already | 4550 // result register contain a valid pointer because it is already |
4561 // contained in the register pointer map. | 4551 // contained in the register pointer map. |
4562 __ mov(result, zero_reg); | 4552 __ mov(result, zero_reg); |
4563 | 4553 |
4564 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4554 PushSafepointRegistersScope scope(this); |
4565 __ SmiTag(char_code); | 4555 __ SmiTag(char_code); |
4566 __ push(char_code); | 4556 __ push(char_code); |
4567 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); | 4557 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); |
4568 __ StoreToSafepointRegisterSlot(v0, result); | 4558 __ StoreToSafepointRegisterSlot(v0, result); |
4569 } | 4559 } |
4570 | 4560 |
4571 | 4561 |
4572 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { | 4562 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { |
4573 LOperand* input = instr->value(); | 4563 LOperand* input = instr->value(); |
4574 ASSERT(input->IsRegister() || input->IsStackSlot()); | 4564 ASSERT(input->IsRegister() || input->IsStackSlot()); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4687 | 4677 |
4688 // Slow case: Call the runtime system to do the number allocation. | 4678 // Slow case: Call the runtime system to do the number allocation. |
4689 __ bind(&slow); | 4679 __ bind(&slow); |
4690 { | 4680 { |
4691 // TODO(3095996): Put a valid pointer value in the stack slot where the | 4681 // TODO(3095996): Put a valid pointer value in the stack slot where the |
4692 // result register is stored, as this register is in the pointer map, but | 4682 // result register is stored, as this register is in the pointer map, but |
4693 // contains an integer value. | 4683 // contains an integer value. |
4694 __ mov(dst, zero_reg); | 4684 __ mov(dst, zero_reg); |
4695 | 4685 |
4696 // Preserve the value of all registers. | 4686 // Preserve the value of all registers. |
4697 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4687 PushSafepointRegistersScope scope(this); |
4698 | 4688 |
4699 // NumberTagI and NumberTagD use the context from the frame, rather than | 4689 // NumberTagI and NumberTagD use the context from the frame, rather than |
4700 // the environment's HContext or HInlinedContext value. | 4690 // the environment's HContext or HInlinedContext value. |
4701 // They only call Runtime::kAllocateHeapNumber. | 4691 // They only call Runtime::kAllocateHeapNumber. |
4702 // The corresponding HChange instructions are added in a phase that does | 4692 // The corresponding HChange instructions are added in a phase that does |
4703 // not have easy access to the local context. | 4693 // not have easy access to the local context. |
4704 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4694 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4705 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4695 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4706 RecordSafepointWithRegisters( | 4696 RecordSafepointWithRegisters( |
4707 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4697 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4753 } | 4743 } |
4754 | 4744 |
4755 | 4745 |
4756 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4746 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
4757 // TODO(3095996): Get rid of this. For now, we need to make the | 4747 // TODO(3095996): Get rid of this. For now, we need to make the |
4758 // result register contain a valid pointer because it is already | 4748 // result register contain a valid pointer because it is already |
4759 // contained in the register pointer map. | 4749 // contained in the register pointer map. |
4760 Register reg = ToRegister(instr->result()); | 4750 Register reg = ToRegister(instr->result()); |
4761 __ mov(reg, zero_reg); | 4751 __ mov(reg, zero_reg); |
4762 | 4752 |
4763 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4753 PushSafepointRegistersScope scope(this); |
4764 // NumberTagI and NumberTagD use the context from the frame, rather than | 4754 // NumberTagI and NumberTagD use the context from the frame, rather than |
4765 // the environment's HContext or HInlinedContext value. | 4755 // the environment's HContext or HInlinedContext value. |
4766 // They only call Runtime::kAllocateHeapNumber. | 4756 // They only call Runtime::kAllocateHeapNumber. |
4767 // The corresponding HChange instructions are added in a phase that does | 4757 // The corresponding HChange instructions are added in a phase that does |
4768 // not have easy access to the local context. | 4758 // not have easy access to the local context. |
4769 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4759 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4770 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4760 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4771 RecordSafepointWithRegisters( | 4761 RecordSafepointWithRegisters( |
4772 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4762 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4773 __ Subu(v0, v0, kHeapObjectTag); | 4763 __ Subu(v0, v0, kHeapObjectTag); |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5132 Operand(at)); | 5122 Operand(at)); |
5133 } else { | 5123 } else { |
5134 DeoptimizeIf(ne, instr->environment(), reg, | 5124 DeoptimizeIf(ne, instr->environment(), reg, |
5135 Operand(object)); | 5125 Operand(object)); |
5136 } | 5126 } |
5137 } | 5127 } |
5138 | 5128 |
5139 | 5129 |
5140 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { | 5130 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { |
5141 { | 5131 { |
5142 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5132 PushSafepointRegistersScope scope(this); |
5143 __ push(object); | 5133 __ push(object); |
5144 __ mov(cp, zero_reg); | 5134 __ mov(cp, zero_reg); |
5145 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); | 5135 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); |
5146 RecordSafepointWithRegisters( | 5136 RecordSafepointWithRegisters( |
5147 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); | 5137 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); |
5148 __ StoreToSafepointRegisterSlot(v0, scratch0()); | 5138 __ StoreToSafepointRegisterSlot(v0, scratch0()); |
5149 } | 5139 } |
5150 __ SmiTst(scratch0(), at); | 5140 __ SmiTst(scratch0(), at); |
5151 DeoptimizeIf(eq, instr->environment(), at, Operand(zero_reg)); | 5141 DeoptimizeIf(eq, instr->environment(), at, Operand(zero_reg)); |
5152 } | 5142 } |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5344 | 5334 |
5345 | 5335 |
5346 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { | 5336 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { |
5347 Register result = ToRegister(instr->result()); | 5337 Register result = ToRegister(instr->result()); |
5348 | 5338 |
5349 // TODO(3095996): Get rid of this. For now, we need to make the | 5339 // TODO(3095996): Get rid of this. For now, we need to make the |
5350 // result register contain a valid pointer because it is already | 5340 // result register contain a valid pointer because it is already |
5351 // contained in the register pointer map. | 5341 // contained in the register pointer map. |
5352 __ mov(result, zero_reg); | 5342 __ mov(result, zero_reg); |
5353 | 5343 |
5354 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5344 PushSafepointRegistersScope scope(this); |
5355 if (instr->size()->IsRegister()) { | 5345 if (instr->size()->IsRegister()) { |
5356 Register size = ToRegister(instr->size()); | 5346 Register size = ToRegister(instr->size()); |
5357 ASSERT(!size.is(result)); | 5347 ASSERT(!size.is(result)); |
5358 __ SmiTag(size); | 5348 __ SmiTag(size); |
5359 __ push(size); | 5349 __ push(size); |
5360 } else { | 5350 } else { |
5361 int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); | 5351 int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); |
5362 if (size >= 0 && size <= Smi::kMaxValue) { | 5352 if (size >= 0 && size <= Smi::kMaxValue) { |
5363 __ Push(Smi::FromInt(size)); | 5353 __ Push(Smi::FromInt(size)); |
5364 } else { | 5354 } else { |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5673 // Nothing to see here, move on! | 5663 // Nothing to see here, move on! |
5674 } | 5664 } |
5675 | 5665 |
5676 | 5666 |
5677 void LCodeGen::DoDummyUse(LDummyUse* instr) { | 5667 void LCodeGen::DoDummyUse(LDummyUse* instr) { |
5678 // Nothing to see here, move on! | 5668 // Nothing to see here, move on! |
5679 } | 5669 } |
5680 | 5670 |
5681 | 5671 |
5682 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 5672 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
5683 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5673 PushSafepointRegistersScope scope(this); |
5684 LoadContextFromDeferred(instr->context()); | 5674 LoadContextFromDeferred(instr->context()); |
5685 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); | 5675 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); |
5686 RecordSafepointWithLazyDeopt( | 5676 RecordSafepointWithLazyDeopt( |
5687 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5677 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
5688 ASSERT(instr->HasEnvironment()); | 5678 ASSERT(instr->HasEnvironment()); |
5689 LEnvironment* env = instr->environment(); | 5679 LEnvironment* env = instr->environment(); |
5690 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 5680 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
5691 } | 5681 } |
5692 | 5682 |
5693 | 5683 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5815 Register map = ToRegister(instr->map()); | 5805 Register map = ToRegister(instr->map()); |
5816 __ lw(scratch0(), FieldMemOperand(object, HeapObject::kMapOffset)); | 5806 __ lw(scratch0(), FieldMemOperand(object, HeapObject::kMapOffset)); |
5817 DeoptimizeIf(ne, instr->environment(), map, Operand(scratch0())); | 5807 DeoptimizeIf(ne, instr->environment(), map, Operand(scratch0())); |
5818 } | 5808 } |
5819 | 5809 |
5820 | 5810 |
5821 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, | 5811 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, |
5822 Register result, | 5812 Register result, |
5823 Register object, | 5813 Register object, |
5824 Register index) { | 5814 Register index) { |
5825 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5815 PushSafepointRegistersScope scope(this); |
5826 __ Push(object, index); | 5816 __ Push(object, index); |
5827 __ mov(cp, zero_reg); | 5817 __ mov(cp, zero_reg); |
5828 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); | 5818 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); |
5829 RecordSafepointWithRegisters( | 5819 RecordSafepointWithRegisters( |
5830 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); | 5820 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); |
5831 __ StoreToSafepointRegisterSlot(v0, result); | 5821 __ StoreToSafepointRegisterSlot(v0, result); |
5832 } | 5822 } |
5833 | 5823 |
5834 | 5824 |
5835 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { | 5825 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5903 __ li(at, scope_info); | 5893 __ li(at, scope_info); |
5904 __ Push(at, ToRegister(instr->function())); | 5894 __ Push(at, ToRegister(instr->function())); |
5905 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5895 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5906 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5896 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5907 } | 5897 } |
5908 | 5898 |
5909 | 5899 |
5910 #undef __ | 5900 #undef __ |
5911 | 5901 |
5912 } } // namespace v8::internal | 5902 } } // namespace v8::internal |
OLD | NEW |