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

Side by Side Diff: src/mips/lithium-codegen-mips.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/mips/lithium-codegen-mips.h ('k') | src/mips/macro-assembler-mips.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.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
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
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
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
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(&not_applicable); 4430 __ bind(&not_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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/mips/lithium-codegen-mips.h ('k') | src/mips/macro-assembler-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698