Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: src/mips64/lithium-codegen-mips64.cc

Issue 404143002: MIPS: Never record safepoint with doubles. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix semicolons. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mips64/lithium-codegen-mips64.h ('k') | src/mips64/macro-assembler-mips64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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(&not_applicable); 4492 __ bind(&not_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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/mips64/lithium-codegen-mips64.h ('k') | src/mips64/macro-assembler-mips64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698