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