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

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

Issue 400223002: ARM64: 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/arm64/lithium-codegen-arm64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/arm64/lithium-codegen-arm64.h" 7 #include "src/arm64/lithium-codegen-arm64.h"
8 #include "src/arm64/lithium-gap-resolver-arm64.h" 8 #include "src/arm64/lithium-gap-resolver-arm64.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 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 } 573 }
574 574
575 575
576 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, 576 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers,
577 int arguments, 577 int arguments,
578 Safepoint::DeoptMode deopt_mode) { 578 Safepoint::DeoptMode deopt_mode) {
579 RecordSafepoint(pointers, Safepoint::kWithRegisters, arguments, deopt_mode); 579 RecordSafepoint(pointers, Safepoint::kWithRegisters, arguments, deopt_mode);
580 } 580 }
581 581
582 582
583 void LCodeGen::RecordSafepointWithRegistersAndDoubles(
584 LPointerMap* pointers, int arguments, Safepoint::DeoptMode deopt_mode) {
585 RecordSafepoint(
586 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode);
587 }
588
589
590 bool LCodeGen::GenerateCode() { 583 bool LCodeGen::GenerateCode() {
591 LPhase phase("Z_Code generation", chunk()); 584 LPhase phase("Z_Code generation", chunk());
592 ASSERT(is_unused()); 585 ASSERT(is_unused());
593 status_ = GENERATING; 586 status_ = GENERATING;
594 587
595 // Open a frame scope to indicate that there is a frame on the stack. The 588 // Open a frame scope to indicate that there is a frame on the stack. The
596 // NONE indicates that the scope shouldn't actually generate code to set up 589 // NONE indicates that the scope shouldn't actually generate code to set up
597 // the frame (that is done in GeneratePrologue). 590 // the frame (that is done in GeneratePrologue).
598 FrameScope frame_scope(masm_, StackFrame::NONE); 591 FrameScope frame_scope(masm_, StackFrame::NONE);
599 592
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after
1624 } 1617 }
1625 } 1618 }
1626 1619
1627 1620
1628 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { 1621 void LCodeGen::DoDeferredAllocate(LAllocate* instr) {
1629 // TODO(3095996): Get rid of this. For now, we need to make the 1622 // TODO(3095996): Get rid of this. For now, we need to make the
1630 // result register contain a valid pointer because it is already 1623 // result register contain a valid pointer because it is already
1631 // contained in the register pointer map. 1624 // contained in the register pointer map.
1632 __ Mov(ToRegister(instr->result()), Smi::FromInt(0)); 1625 __ Mov(ToRegister(instr->result()), Smi::FromInt(0));
1633 1626
1634 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 1627 PushSafepointRegistersScope scope(this);
1635 // We're in a SafepointRegistersScope so we can use any scratch registers. 1628 // We're in a SafepointRegistersScope so we can use any scratch registers.
1636 Register size = x0; 1629 Register size = x0;
1637 if (instr->size()->IsConstantOperand()) { 1630 if (instr->size()->IsConstantOperand()) {
1638 __ Mov(size, ToSmi(LConstantOperand::cast(instr->size()))); 1631 __ Mov(size, ToSmi(LConstantOperand::cast(instr->size())));
1639 } else { 1632 } else {
1640 __ SmiTag(size, ToRegister32(instr->size()).X()); 1633 __ SmiTag(size, ToRegister32(instr->size()).X());
1641 } 1634 }
1642 int flags = AllocateDoubleAlignFlag::encode( 1635 int flags = AllocateDoubleAlignFlag::encode(
1643 instr->hydrogen()->MustAllocateDoubleAligned()); 1636 instr->hydrogen()->MustAllocateDoubleAligned());
1644 if (instr->hydrogen()->IsOldPointerSpaceAllocation()) { 1637 if (instr->hydrogen()->IsOldPointerSpaceAllocation()) {
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
2139 2132
2140 2133
2141 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { 2134 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) {
2142 GenerateOsrPrologue(); 2135 GenerateOsrPrologue();
2143 } 2136 }
2144 2137
2145 2138
2146 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { 2139 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
2147 Register temp = ToRegister(instr->temp()); 2140 Register temp = ToRegister(instr->temp());
2148 { 2141 {
2149 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 2142 PushSafepointRegistersScope scope(this);
2150 __ Push(object); 2143 __ Push(object);
2151 __ Mov(cp, 0); 2144 __ Mov(cp, 0);
2152 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); 2145 __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance);
2153 RecordSafepointWithRegisters( 2146 RecordSafepointWithRegisters(
2154 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); 2147 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt);
2155 __ StoreToSafepointRegisterSlot(x0, temp); 2148 __ StoreToSafepointRegisterSlot(x0, temp);
2156 } 2149 }
2157 DeoptimizeIfSmi(temp, instr->environment()); 2150 DeoptimizeIfSmi(temp, instr->environment());
2158 } 2151 }
2159 2152
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
3138 Register result = ToRegister(instr->result()); 3131 Register result = ToRegister(instr->result());
3139 ASSERT(result.Is(x0)); // InstanceofStub returns its result in x0. 3132 ASSERT(result.Is(x0)); // InstanceofStub returns its result in x0.
3140 InstanceofStub::Flags flags = InstanceofStub::kNoFlags; 3133 InstanceofStub::Flags flags = InstanceofStub::kNoFlags;
3141 flags = static_cast<InstanceofStub::Flags>( 3134 flags = static_cast<InstanceofStub::Flags>(
3142 flags | InstanceofStub::kArgsInRegisters); 3135 flags | InstanceofStub::kArgsInRegisters);
3143 flags = static_cast<InstanceofStub::Flags>( 3136 flags = static_cast<InstanceofStub::Flags>(
3144 flags | InstanceofStub::kReturnTrueFalseObject); 3137 flags | InstanceofStub::kReturnTrueFalseObject);
3145 flags = static_cast<InstanceofStub::Flags>( 3138 flags = static_cast<InstanceofStub::Flags>(
3146 flags | InstanceofStub::kCallSiteInlineCheck); 3139 flags | InstanceofStub::kCallSiteInlineCheck);
3147 3140
3148 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 3141 PushSafepointRegistersScope scope(this);
3149 LoadContextFromDeferred(instr->context()); 3142 LoadContextFromDeferred(instr->context());
3150 3143
3151 // Prepare InstanceofStub arguments. 3144 // Prepare InstanceofStub arguments.
3152 ASSERT(ToRegister(instr->value()).Is(InstanceofStub::left())); 3145 ASSERT(ToRegister(instr->value()).Is(InstanceofStub::left()));
3153 __ LoadObject(InstanceofStub::right(), instr->function()); 3146 __ LoadObject(InstanceofStub::right(), instr->function());
3154 3147
3155 InstanceofStub stub(isolate(), flags); 3148 InstanceofStub stub(isolate(), flags);
3156 CallCodeGeneric(stub.GetCode(), 3149 CallCodeGeneric(stub.GetCode(),
3157 RelocInfo::CODE_TARGET, 3150 RelocInfo::CODE_TARGET,
3158 instr, 3151 instr,
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
3787 // input (for abs(+x)) or to a smi (for abs(-SMI_MIN)), so it should already 3780 // input (for abs(+x)) or to a smi (for abs(-SMI_MIN)), so it should already
3788 // be valid. 3781 // be valid.
3789 Label result_ok; 3782 Label result_ok;
3790 Register input = ToRegister(instr->value()); 3783 Register input = ToRegister(instr->value());
3791 __ JumpIfSmi(result, &result_ok); 3784 __ JumpIfSmi(result, &result_ok);
3792 __ Cmp(input, result); 3785 __ Cmp(input, result);
3793 __ Assert(eq, kUnexpectedValue); 3786 __ Assert(eq, kUnexpectedValue);
3794 __ Bind(&result_ok); 3787 __ Bind(&result_ok);
3795 } 3788 }
3796 3789
3797 { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 3790 { PushSafepointRegistersScope scope(this);
3798 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr, 3791 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr,
3799 instr->context()); 3792 instr->context());
3800 __ StoreToSafepointRegisterSlot(x0, result); 3793 __ StoreToSafepointRegisterSlot(x0, result);
3801 } 3794 }
3802 // The inline (non-deferred) code will store result_bits into result. 3795 // The inline (non-deferred) code will store result_bits into result.
3803 } 3796 }
3804 3797
3805 3798
3806 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) { 3799 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) {
3807 // Class for deferred case. 3800 // Class for deferred case.
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
4511 } 4504 }
4512 4505
4513 4506
4514 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { 4507 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) {
4515 // TODO(3095996): Get rid of this. For now, we need to make the 4508 // TODO(3095996): Get rid of this. For now, we need to make the
4516 // result register contain a valid pointer because it is already 4509 // result register contain a valid pointer because it is already
4517 // contained in the register pointer map. 4510 // contained in the register pointer map.
4518 Register result = ToRegister(instr->result()); 4511 Register result = ToRegister(instr->result());
4519 __ Mov(result, 0); 4512 __ Mov(result, 0);
4520 4513
4521 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4514 PushSafepointRegistersScope scope(this);
4522 // NumberTagU and NumberTagD use the context from the frame, rather than 4515 // NumberTagU and NumberTagD use the context from the frame, rather than
4523 // the environment's HContext or HInlinedContext value. 4516 // the environment's HContext or HInlinedContext value.
4524 // They only call Runtime::kAllocateHeapNumber. 4517 // They only call Runtime::kAllocateHeapNumber.
4525 // The corresponding HChange instructions are added in a phase that does 4518 // The corresponding HChange instructions are added in a phase that does
4526 // not have easy access to the local context. 4519 // not have easy access to the local context.
4527 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4520 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4528 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 4521 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
4529 RecordSafepointWithRegisters( 4522 RecordSafepointWithRegisters(
4530 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4523 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4531 __ StoreToSafepointRegisterSlot(x0, result); 4524 __ StoreToSafepointRegisterSlot(x0, result);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4576 } 4569 }
4577 4570
4578 // Slow case: call the runtime system to do the number allocation. 4571 // Slow case: call the runtime system to do the number allocation.
4579 __ Bind(&slow); 4572 __ Bind(&slow);
4580 // TODO(3095996): Put a valid pointer value in the stack slot where the result 4573 // TODO(3095996): Put a valid pointer value in the stack slot where the result
4581 // register is stored, as this register is in the pointer map, but contains an 4574 // register is stored, as this register is in the pointer map, but contains an
4582 // integer value. 4575 // integer value.
4583 __ Mov(dst, 0); 4576 __ Mov(dst, 0);
4584 { 4577 {
4585 // Preserve the value of all registers. 4578 // Preserve the value of all registers.
4586 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4579 PushSafepointRegistersScope scope(this);
4587 4580
4588 // NumberTagU and NumberTagD use the context from the frame, rather than 4581 // NumberTagU and NumberTagD use the context from the frame, rather than
4589 // the environment's HContext or HInlinedContext value. 4582 // the environment's HContext or HInlinedContext value.
4590 // They only call Runtime::kAllocateHeapNumber. 4583 // They only call Runtime::kAllocateHeapNumber.
4591 // The corresponding HChange instructions are added in a phase that does 4584 // The corresponding HChange instructions are added in a phase that does
4592 // not have easy access to the local context. 4585 // not have easy access to the local context.
4593 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4586 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4594 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 4587 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
4595 RecordSafepointWithRegisters( 4588 RecordSafepointWithRegisters(
4596 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4589 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
5019 // TODO(all): if Mov could handle object in new space then it could be used 5012 // TODO(all): if Mov could handle object in new space then it could be used
5020 // here. 5013 // here.
5021 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); 5014 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs());
5022 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); 5015 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags()));
5023 __ Push(cp, scratch1, scratch2); // The context is the first argument. 5016 __ Push(cp, scratch1, scratch2); // The context is the first argument.
5024 CallRuntime(Runtime::kDeclareGlobals, 3, instr); 5017 CallRuntime(Runtime::kDeclareGlobals, 3, instr);
5025 } 5018 }
5026 5019
5027 5020
5028 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { 5021 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
5029 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5022 PushSafepointRegistersScope scope(this);
5030 LoadContextFromDeferred(instr->context()); 5023 LoadContextFromDeferred(instr->context());
5031 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 5024 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
5032 RecordSafepointWithLazyDeopt( 5025 RecordSafepointWithLazyDeopt(
5033 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 5026 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
5034 ASSERT(instr->HasEnvironment()); 5027 ASSERT(instr->HasEnvironment());
5035 LEnvironment* env = instr->environment(); 5028 LEnvironment* env = instr->environment();
5036 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5029 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5037 } 5030 }
5038 5031
5039 5032
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
5474 5467
5475 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { 5468 void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) {
5476 Register string = ToRegister(instr->string()); 5469 Register string = ToRegister(instr->string());
5477 Register result = ToRegister(instr->result()); 5470 Register result = ToRegister(instr->result());
5478 5471
5479 // TODO(3095996): Get rid of this. For now, we need to make the 5472 // TODO(3095996): Get rid of this. For now, we need to make the
5480 // result register contain a valid pointer because it is already 5473 // result register contain a valid pointer because it is already
5481 // contained in the register pointer map. 5474 // contained in the register pointer map.
5482 __ Mov(result, 0); 5475 __ Mov(result, 0);
5483 5476
5484 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5477 PushSafepointRegistersScope scope(this);
5485 __ Push(string); 5478 __ Push(string);
5486 // Push the index as a smi. This is safe because of the checks in 5479 // Push the index as a smi. This is safe because of the checks in
5487 // DoStringCharCodeAt above. 5480 // DoStringCharCodeAt above.
5488 Register index = ToRegister(instr->index()); 5481 Register index = ToRegister(instr->index());
5489 __ SmiTagAndPush(index); 5482 __ SmiTagAndPush(index);
5490 5483
5491 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, 5484 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr,
5492 instr->context()); 5485 instr->context());
5493 __ AssertSmi(x0); 5486 __ AssertSmi(x0);
5494 __ SmiUntag(x0); 5487 __ SmiUntag(x0);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5527 5520
5528 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { 5521 void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) {
5529 Register char_code = ToRegister(instr->char_code()); 5522 Register char_code = ToRegister(instr->char_code());
5530 Register result = ToRegister(instr->result()); 5523 Register result = ToRegister(instr->result());
5531 5524
5532 // TODO(3095996): Get rid of this. For now, we need to make the 5525 // TODO(3095996): Get rid of this. For now, we need to make the
5533 // result register contain a valid pointer because it is already 5526 // result register contain a valid pointer because it is already
5534 // contained in the register pointer map. 5527 // contained in the register pointer map.
5535 __ Mov(result, 0); 5528 __ Mov(result, 0);
5536 5529
5537 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5530 PushSafepointRegistersScope scope(this);
5538 __ SmiTagAndPush(char_code); 5531 __ SmiTagAndPush(char_code);
5539 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); 5532 CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context());
5540 __ StoreToSafepointRegisterSlot(x0, result); 5533 __ StoreToSafepointRegisterSlot(x0, result);
5541 } 5534 }
5542 5535
5543 5536
5544 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { 5537 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) {
5545 ASSERT(ToRegister(instr->context()).is(cp)); 5538 ASSERT(ToRegister(instr->context()).is(cp));
5546 Token::Value op = instr->op(); 5539 Token::Value op = instr->op();
5547 5540
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
5756 } else { 5749 } else {
5757 { 5750 {
5758 UseScratchRegisterScope temps(masm()); 5751 UseScratchRegisterScope temps(masm());
5759 // Use the temp register only in a restricted scope - the codegen checks 5752 // Use the temp register only in a restricted scope - the codegen checks
5760 // that we do not use any register across a call. 5753 // that we do not use any register across a call.
5761 __ CheckMap(object, temps.AcquireX(), from_map, &not_applicable, 5754 __ CheckMap(object, temps.AcquireX(), from_map, &not_applicable,
5762 DONT_DO_SMI_CHECK); 5755 DONT_DO_SMI_CHECK);
5763 } 5756 }
5764 ASSERT(object.is(x0)); 5757 ASSERT(object.is(x0));
5765 ASSERT(ToRegister(instr->context()).is(cp)); 5758 ASSERT(ToRegister(instr->context()).is(cp));
5766 PushSafepointRegistersScope scope( 5759 PushSafepointRegistersScope scope(this);
5767 this, Safepoint::kWithRegistersAndDoubles);
5768 __ Mov(x1, Operand(to_map)); 5760 __ Mov(x1, Operand(to_map));
5769 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; 5761 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE;
5770 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); 5762 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array);
5771 __ CallStub(&stub); 5763 __ CallStub(&stub);
5772 RecordSafepointWithRegistersAndDoubles( 5764 RecordSafepointWithRegisters(
5773 instr->pointer_map(), 0, Safepoint::kLazyDeopt); 5765 instr->pointer_map(), 0, Safepoint::kLazyDeopt);
5774 } 5766 }
5775 __ Bind(&not_applicable); 5767 __ Bind(&not_applicable);
5776 } 5768 }
5777 5769
5778 5770
5779 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { 5771 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) {
5780 Register object = ToRegister(instr->object()); 5772 Register object = ToRegister(instr->object());
5781 Register temp1 = ToRegister(instr->temp1()); 5773 Register temp1 = ToRegister(instr->temp1());
5782 Register temp2 = ToRegister(instr->temp2()); 5774 Register temp2 = ToRegister(instr->temp2());
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
5954 __ Bind(&copy_receiver); 5946 __ Bind(&copy_receiver);
5955 __ Mov(result, receiver); 5947 __ Mov(result, receiver);
5956 __ Bind(&done); 5948 __ Bind(&done);
5957 } 5949 }
5958 5950
5959 5951
5960 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, 5952 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr,
5961 Register result, 5953 Register result,
5962 Register object, 5954 Register object,
5963 Register index) { 5955 Register index) {
5964 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5956 PushSafepointRegistersScope scope(this);
5965 __ Push(object); 5957 __ Push(object);
5966 __ Push(index); 5958 __ Push(index);
5967 __ Mov(cp, 0); 5959 __ Mov(cp, 0);
5968 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); 5960 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble);
5969 RecordSafepointWithRegisters( 5961 RecordSafepointWithRegisters(
5970 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); 5962 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt);
5971 __ StoreToSafepointRegisterSlot(x0, result); 5963 __ StoreToSafepointRegisterSlot(x0, result);
5972 } 5964 }
5973 5965
5974 5966
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
6042 Handle<ScopeInfo> scope_info = instr->scope_info(); 6034 Handle<ScopeInfo> scope_info = instr->scope_info();
6043 __ Push(scope_info); 6035 __ Push(scope_info);
6044 __ Push(ToRegister(instr->function())); 6036 __ Push(ToRegister(instr->function()));
6045 CallRuntime(Runtime::kPushBlockContext, 2, instr); 6037 CallRuntime(Runtime::kPushBlockContext, 2, instr);
6046 RecordSafepoint(Safepoint::kNoLazyDeopt); 6038 RecordSafepoint(Safepoint::kNoLazyDeopt);
6047 } 6039 }
6048 6040
6049 6041
6050 6042
6051 } } // namespace v8::internal 6043 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-codegen-arm64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698