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

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

Issue 408473002: ARM: never record safepoint with doubles (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: 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/arm/lithium-codegen-arm.h ('k') | src/arm/macro-assembler-arm.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/arm/lithium-codegen-arm.h" 7 #include "src/arm/lithium-codegen-arm.h"
8 #include "src/arm/lithium-gap-resolver-arm.h" 8 #include "src/arm/lithium-gap-resolver-arm.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/hydrogen-osr.h" 10 #include "src/hydrogen-osr.h"
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 1048
1049 1049
1050 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, 1050 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers,
1051 int arguments, 1051 int arguments,
1052 Safepoint::DeoptMode deopt_mode) { 1052 Safepoint::DeoptMode deopt_mode) {
1053 RecordSafepoint( 1053 RecordSafepoint(
1054 pointers, Safepoint::kWithRegisters, arguments, deopt_mode); 1054 pointers, Safepoint::kWithRegisters, arguments, deopt_mode);
1055 } 1055 }
1056 1056
1057 1057
1058 void LCodeGen::RecordSafepointWithRegistersAndDoubles(
1059 LPointerMap* pointers,
1060 int arguments,
1061 Safepoint::DeoptMode deopt_mode) {
1062 RecordSafepoint(
1063 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode);
1064 }
1065
1066
1067 void LCodeGen::RecordAndWritePosition(int position) { 1058 void LCodeGen::RecordAndWritePosition(int position) {
1068 if (position == RelocInfo::kNoPosition) return; 1059 if (position == RelocInfo::kNoPosition) return;
1069 masm()->positions_recorder()->RecordPosition(position); 1060 masm()->positions_recorder()->RecordPosition(position);
1070 masm()->positions_recorder()->WriteRecordedPositions(); 1061 masm()->positions_recorder()->WriteRecordedPositions();
1071 } 1062 }
1072 1063
1073 1064
1074 static const char* LabelType(LLabel* label) { 1065 static const char* LabelType(LLabel* label) {
1075 if (label->is_loop_header()) return " (loop header)"; 1066 if (label->is_loop_header()) return " (loop header)";
1076 if (label->is_osr_entry()) return " (OSR entry)"; 1067 if (label->is_osr_entry()) return " (OSR entry)";
(...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after
2876 Label* bool_load) { 2867 Label* bool_load) {
2877 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; 2868 InstanceofStub::Flags flags = InstanceofStub::kNoFlags;
2878 flags = static_cast<InstanceofStub::Flags>( 2869 flags = static_cast<InstanceofStub::Flags>(
2879 flags | InstanceofStub::kArgsInRegisters); 2870 flags | InstanceofStub::kArgsInRegisters);
2880 flags = static_cast<InstanceofStub::Flags>( 2871 flags = static_cast<InstanceofStub::Flags>(
2881 flags | InstanceofStub::kCallSiteInlineCheck); 2872 flags | InstanceofStub::kCallSiteInlineCheck);
2882 flags = static_cast<InstanceofStub::Flags>( 2873 flags = static_cast<InstanceofStub::Flags>(
2883 flags | InstanceofStub::kReturnTrueFalseObject); 2874 flags | InstanceofStub::kReturnTrueFalseObject);
2884 InstanceofStub stub(isolate(), flags); 2875 InstanceofStub stub(isolate(), flags);
2885 2876
2886 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 2877 PushSafepointRegistersScope scope(this);
2887 LoadContextFromDeferred(instr->context()); 2878 LoadContextFromDeferred(instr->context());
2888 2879
2889 __ Move(InstanceofStub::right(), instr->function()); 2880 __ Move(InstanceofStub::right(), instr->function());
2890 2881
2891 int call_size = CallCodeSize(stub.GetCode(), RelocInfo::CODE_TARGET); 2882 int call_size = CallCodeSize(stub.GetCode(), RelocInfo::CODE_TARGET);
2892 int additional_delta = (call_size / Assembler::kInstrSize) + 4; 2883 int additional_delta = (call_size / Assembler::kInstrSize) + 4;
2893 // Make sure that code size is predicable, since we use specific constants 2884 // Make sure that code size is predicable, since we use specific constants
2894 // offsets in the code to find embedded values.. 2885 // offsets in the code to find embedded values..
2895 PredictableCodeSizeScope predictable( 2886 PredictableCodeSizeScope predictable(
2896 masm_, (additional_delta + 1) * Assembler::kInstrSize); 2887 masm_, (additional_delta + 1) * Assembler::kInstrSize);
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after
3689 // Check the sign of the argument. If the argument is positive, just 3680 // Check the sign of the argument. If the argument is positive, just
3690 // return it. 3681 // return it.
3691 __ tst(exponent, Operand(HeapNumber::kSignMask)); 3682 __ tst(exponent, Operand(HeapNumber::kSignMask));
3692 // Move the input to the result if necessary. 3683 // Move the input to the result if necessary.
3693 __ Move(result, input); 3684 __ Move(result, input);
3694 __ b(eq, &done); 3685 __ b(eq, &done);
3695 3686
3696 // Input is negative. Reverse its sign. 3687 // Input is negative. Reverse its sign.
3697 // Preserve the value of all registers. 3688 // Preserve the value of all registers.
3698 { 3689 {
3699 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 3690 PushSafepointRegistersScope scope(this);
3700 3691
3701 // Registers were saved at the safepoint, so we can use 3692 // Registers were saved at the safepoint, so we can use
3702 // many scratch registers. 3693 // many scratch registers.
3703 Register tmp1 = input.is(r1) ? r0 : r1; 3694 Register tmp1 = input.is(r1) ? r0 : r1;
3704 Register tmp2 = input.is(r2) ? r0 : r2; 3695 Register tmp2 = input.is(r2) ? r0 : r2;
3705 Register tmp3 = input.is(r3) ? r0 : r3; 3696 Register tmp3 = input.is(r3) ? r0 : r3;
3706 Register tmp4 = input.is(r4) ? r0 : r4; 3697 Register tmp4 = input.is(r4) ? r0 : r4;
3707 3698
3708 // exponent: floating point exponent value. 3699 // exponent: floating point exponent value.
3709 3700
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
4443 __ str(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); 4434 __ str(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset));
4444 // Write barrier. 4435 // Write barrier.
4445 __ RecordWriteForMap(object_reg, 4436 __ RecordWriteForMap(object_reg,
4446 new_map_reg, 4437 new_map_reg,
4447 scratch, 4438 scratch,
4448 GetLinkRegisterState(), 4439 GetLinkRegisterState(),
4449 kDontSaveFPRegs); 4440 kDontSaveFPRegs);
4450 } else { 4441 } else {
4451 ASSERT(ToRegister(instr->context()).is(cp)); 4442 ASSERT(ToRegister(instr->context()).is(cp));
4452 ASSERT(object_reg.is(r0)); 4443 ASSERT(object_reg.is(r0));
4453 PushSafepointRegistersScope scope( 4444 PushSafepointRegistersScope scope(this);
4454 this, Safepoint::kWithRegistersAndDoubles);
4455 __ Move(r1, to_map); 4445 __ Move(r1, to_map);
4456 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; 4446 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE;
4457 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); 4447 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array);
4458 __ CallStub(&stub); 4448 __ CallStub(&stub);
4459 RecordSafepointWithRegistersAndDoubles( 4449 RecordSafepointWithRegisters(
4460 instr->pointer_map(), 0, Safepoint::kLazyDeopt); 4450 instr->pointer_map(), 0, Safepoint::kLazyDeopt);
4461 } 4451 }
4462 __ bind(&not_applicable); 4452 __ bind(&not_applicable);
4463 } 4453 }
4464 4454
4465 4455
4466 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { 4456 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) {
4467 Register object = ToRegister(instr->object()); 4457 Register object = ToRegister(instr->object());
4468 Register temp = ToRegister(instr->temp()); 4458 Register temp = ToRegister(instr->temp());
4469 Label no_memento_found; 4459 Label no_memento_found;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4512 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { 4502 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) {
4513 Register string = ToRegister(instr->string()); 4503 Register string = ToRegister(instr->string());
4514 Register result = ToRegister(instr->result()); 4504 Register result = ToRegister(instr->result());
4515 Register scratch = scratch0(); 4505 Register scratch = scratch0();
4516 4506
4517 // TODO(3095996): Get rid of this. For now, we need to make the 4507 // TODO(3095996): Get rid of this. For now, we need to make the
4518 // result register contain a valid pointer because it is already 4508 // result register contain a valid pointer because it is already
4519 // contained in the register pointer map. 4509 // contained in the register pointer map.
4520 __ mov(result, Operand::Zero()); 4510 __ mov(result, Operand::Zero());
4521 4511
4522 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4512 PushSafepointRegistersScope scope(this);
4523 __ push(string); 4513 __ push(string);
4524 // Push the index as a smi. This is safe because of the checks in 4514 // Push the index as a smi. This is safe because of the checks in
4525 // DoStringCharCodeAt above. 4515 // DoStringCharCodeAt above.
4526 if (instr->index()->IsConstantOperand()) { 4516 if (instr->index()->IsConstantOperand()) {
4527 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); 4517 int const_index = ToInteger32(LConstantOperand::cast(instr->index()));
4528 __ mov(scratch, Operand(Smi::FromInt(const_index))); 4518 __ mov(scratch, Operand(Smi::FromInt(const_index)));
4529 __ push(scratch); 4519 __ push(scratch);
4530 } else { 4520 } else {
4531 Register index = ToRegister(instr->index()); 4521 Register index = ToRegister(instr->index());
4532 __ SmiTag(index); 4522 __ SmiTag(index);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4575 4565
4576 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { 4566 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) {
4577 Register char_code = ToRegister(instr->char_code()); 4567 Register char_code = ToRegister(instr->char_code());
4578 Register result = ToRegister(instr->result()); 4568 Register result = ToRegister(instr->result());
4579 4569
4580 // TODO(3095996): Get rid of this. For now, we need to make the 4570 // TODO(3095996): Get rid of this. For now, we need to make the
4581 // result register contain a valid pointer because it is already 4571 // result register contain a valid pointer because it is already
4582 // contained in the register pointer map. 4572 // contained in the register pointer map.
4583 __ mov(result, Operand::Zero()); 4573 __ mov(result, Operand::Zero());
4584 4574
4585 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4575 PushSafepointRegistersScope scope(this);
4586 __ SmiTag(char_code); 4576 __ SmiTag(char_code);
4587 __ push(char_code); 4577 __ push(char_code);
4588 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); 4578 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context());
4589 __ StoreToSafepointRegisterSlot(r0, result); 4579 __ StoreToSafepointRegisterSlot(r0, result);
4590 } 4580 }
4591 4581
4592 4582
4593 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { 4583 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
4594 LOperand* input = instr->value(); 4584 LOperand* input = instr->value();
4595 ASSERT(input->IsRegister() || input->IsStackSlot()); 4585 ASSERT(input->IsRegister() || input->IsStackSlot());
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
4708 4698
4709 // Slow case: Call the runtime system to do the number allocation. 4699 // Slow case: Call the runtime system to do the number allocation.
4710 __ bind(&slow); 4700 __ bind(&slow);
4711 { 4701 {
4712 // TODO(3095996): Put a valid pointer value in the stack slot where the 4702 // TODO(3095996): Put a valid pointer value in the stack slot where the
4713 // result register is stored, as this register is in the pointer map, but 4703 // result register is stored, as this register is in the pointer map, but
4714 // contains an integer value. 4704 // contains an integer value.
4715 __ mov(dst, Operand::Zero()); 4705 __ mov(dst, Operand::Zero());
4716 4706
4717 // Preserve the value of all registers. 4707 // Preserve the value of all registers.
4718 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4708 PushSafepointRegistersScope scope(this);
4719 4709
4720 // NumberTagI and NumberTagD use the context from the frame, rather than 4710 // NumberTagI and NumberTagD use the context from the frame, rather than
4721 // the environment's HContext or HInlinedContext value. 4711 // the environment's HContext or HInlinedContext value.
4722 // They only call Runtime::kAllocateHeapNumber. 4712 // They only call Runtime::kAllocateHeapNumber.
4723 // The corresponding HChange instructions are added in a phase that does 4713 // The corresponding HChange instructions are added in a phase that does
4724 // not have easy access to the local context. 4714 // not have easy access to the local context.
4725 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4715 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4726 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 4716 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
4727 RecordSafepointWithRegisters( 4717 RecordSafepointWithRegisters(
4728 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4718 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4773 } 4763 }
4774 4764
4775 4765
4776 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { 4766 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) {
4777 // TODO(3095996): Get rid of this. For now, we need to make the 4767 // TODO(3095996): Get rid of this. For now, we need to make the
4778 // result register contain a valid pointer because it is already 4768 // result register contain a valid pointer because it is already
4779 // contained in the register pointer map. 4769 // contained in the register pointer map.
4780 Register reg = ToRegister(instr->result()); 4770 Register reg = ToRegister(instr->result());
4781 __ mov(reg, Operand::Zero()); 4771 __ mov(reg, Operand::Zero());
4782 4772
4783 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4773 PushSafepointRegistersScope scope(this);
4784 // NumberTagI and NumberTagD use the context from the frame, rather than 4774 // NumberTagI and NumberTagD use the context from the frame, rather than
4785 // the environment's HContext or HInlinedContext value. 4775 // the environment's HContext or HInlinedContext value.
4786 // They only call Runtime::kAllocateHeapNumber. 4776 // They only call Runtime::kAllocateHeapNumber.
4787 // The corresponding HChange instructions are added in a phase that does 4777 // The corresponding HChange instructions are added in a phase that does
4788 // not have easy access to the local context. 4778 // not have easy access to the local context.
4789 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4779 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4790 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 4780 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
4791 RecordSafepointWithRegisters( 4781 RecordSafepointWithRegisters(
4792 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4782 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4793 __ sub(r0, r0, Operand(kHeapObjectTag)); 4783 __ sub(r0, r0, Operand(kHeapObjectTag));
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
5137 __ cmp(reg, ip); 5127 __ cmp(reg, ip);
5138 } else { 5128 } else {
5139 __ cmp(reg, Operand(object)); 5129 __ cmp(reg, Operand(object));
5140 } 5130 }
5141 DeoptimizeIf(ne, instr->environment()); 5131 DeoptimizeIf(ne, instr->environment());
5142 } 5132 }
5143 5133
5144 5134
5145 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { 5135 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
5146 { 5136 {
5147 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5137 PushSafepointRegistersScope scope(this);
5148 __ push(object); 5138 __ push(object);
5149 __ mov(cp, Operand::Zero()); 5139 __ mov(cp, Operand::Zero());
5150 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); 5140 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance);
5151 RecordSafepointWithRegisters( 5141 RecordSafepointWithRegisters(
5152 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); 5142 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt);
5153 __ StoreToSafepointRegisterSlot(r0, scratch0()); 5143 __ StoreToSafepointRegisterSlot(r0, scratch0());
5154 } 5144 }
5155 __ tst(scratch0(), Operand(kSmiTagMask)); 5145 __ tst(scratch0(), Operand(kSmiTagMask));
5156 DeoptimizeIf(eq, instr->environment()); 5146 DeoptimizeIf(eq, instr->environment());
5157 } 5147 }
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
5354 5344
5355 5345
5356 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { 5346 void LCodeGen::DoDeferredAllocate(LAllocate* instr) {
5357 Register result = ToRegister(instr->result()); 5347 Register result = ToRegister(instr->result());
5358 5348
5359 // TODO(3095996): Get rid of this. For now, we need to make the 5349 // TODO(3095996): Get rid of this. For now, we need to make the
5360 // result register contain a valid pointer because it is already 5350 // result register contain a valid pointer because it is already
5361 // contained in the register pointer map. 5351 // contained in the register pointer map.
5362 __ mov(result, Operand(Smi::FromInt(0))); 5352 __ mov(result, Operand(Smi::FromInt(0)));
5363 5353
5364 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5354 PushSafepointRegistersScope scope(this);
5365 if (instr->size()->IsRegister()) { 5355 if (instr->size()->IsRegister()) {
5366 Register size = ToRegister(instr->size()); 5356 Register size = ToRegister(instr->size());
5367 ASSERT(!size.is(result)); 5357 ASSERT(!size.is(result));
5368 __ SmiTag(size); 5358 __ SmiTag(size);
5369 __ push(size); 5359 __ push(size);
5370 } else { 5360 } else {
5371 int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); 5361 int32_t size = ToInteger32(LConstantOperand::cast(instr->size()));
5372 if (size >= 0 && size <= Smi::kMaxValue) { 5362 if (size >= 0 && size <= Smi::kMaxValue) {
5373 __ Push(Smi::FromInt(size)); 5363 __ Push(Smi::FromInt(size));
5374 } else { 5364 } else {
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
5643 // Nothing to see here, move on! 5633 // Nothing to see here, move on!
5644 } 5634 }
5645 5635
5646 5636
5647 void LCodeGen::DoDummyUse(LDummyUse* instr) { 5637 void LCodeGen::DoDummyUse(LDummyUse* instr) {
5648 // Nothing to see here, move on! 5638 // Nothing to see here, move on!
5649 } 5639 }
5650 5640
5651 5641
5652 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { 5642 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
5653 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5643 PushSafepointRegistersScope scope(this);
5654 LoadContextFromDeferred(instr->context()); 5644 LoadContextFromDeferred(instr->context());
5655 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 5645 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
5656 RecordSafepointWithLazyDeopt( 5646 RecordSafepointWithLazyDeopt(
5657 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 5647 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
5658 ASSERT(instr->HasEnvironment()); 5648 ASSERT(instr->HasEnvironment());
5659 LEnvironment* env = instr->environment(); 5649 LEnvironment* env = instr->environment();
5660 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5650 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5661 } 5651 }
5662 5652
5663 5653
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
5790 __ ldr(scratch0(), FieldMemOperand(object, HeapObject::kMapOffset)); 5780 __ ldr(scratch0(), FieldMemOperand(object, HeapObject::kMapOffset));
5791 __ cmp(map, scratch0()); 5781 __ cmp(map, scratch0());
5792 DeoptimizeIf(ne, instr->environment()); 5782 DeoptimizeIf(ne, instr->environment());
5793 } 5783 }
5794 5784
5795 5785
5796 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, 5786 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr,
5797 Register result, 5787 Register result,
5798 Register object, 5788 Register object,
5799 Register index) { 5789 Register index) {
5800 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5790 PushSafepointRegistersScope scope(this);
5801 __ Push(object); 5791 __ Push(object);
5802 __ Push(index); 5792 __ Push(index);
5803 __ mov(cp, Operand::Zero()); 5793 __ mov(cp, Operand::Zero());
5804 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); 5794 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble);
5805 RecordSafepointWithRegisters( 5795 RecordSafepointWithRegisters(
5806 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); 5796 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt);
5807 __ StoreToSafepointRegisterSlot(r0, result); 5797 __ StoreToSafepointRegisterSlot(r0, result);
5808 } 5798 }
5809 5799
5810 5800
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
5879 __ Push(scope_info); 5869 __ Push(scope_info);
5880 __ push(ToRegister(instr->function())); 5870 __ push(ToRegister(instr->function()));
5881 CallRuntime(Runtime::kPushBlockContext, 2, instr); 5871 CallRuntime(Runtime::kPushBlockContext, 2, instr);
5882 RecordSafepoint(Safepoint::kNoLazyDeopt); 5872 RecordSafepoint(Safepoint::kNoLazyDeopt);
5883 } 5873 }
5884 5874
5885 5875
5886 #undef __ 5876 #undef __
5887 5877
5888 } } // namespace v8::internal 5878 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/lithium-codegen-arm.h ('k') | src/arm/macro-assembler-arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698