OLD | NEW |
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 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 Comment(";;; Allocate local context"); | 696 Comment(";;; Allocate local context"); |
697 bool need_write_barrier = true; | 697 bool need_write_barrier = true; |
698 // Argument to NewContext is the function, which is in x1. | 698 // Argument to NewContext is the function, which is in x1. |
699 if (heap_slots <= FastNewContextStub::kMaximumSlots) { | 699 if (heap_slots <= FastNewContextStub::kMaximumSlots) { |
700 FastNewContextStub stub(isolate(), heap_slots); | 700 FastNewContextStub stub(isolate(), heap_slots); |
701 __ CallStub(&stub); | 701 __ CallStub(&stub); |
702 // Result of FastNewContextStub is always in new space. | 702 // Result of FastNewContextStub is always in new space. |
703 need_write_barrier = false; | 703 need_write_barrier = false; |
704 } else { | 704 } else { |
705 __ Push(x1); | 705 __ Push(x1); |
706 __ CallRuntime(Runtime::kHiddenNewFunctionContext, 1); | 706 __ CallRuntime(Runtime::kNewFunctionContext, 1); |
707 } | 707 } |
708 RecordSafepoint(Safepoint::kNoLazyDeopt); | 708 RecordSafepoint(Safepoint::kNoLazyDeopt); |
709 // Context is returned in x0. It replaces the context passed to us. It's | 709 // Context is returned in x0. It replaces the context passed to us. It's |
710 // saved in the stack and kept live in cp. | 710 // saved in the stack and kept live in cp. |
711 __ Mov(cp, x0); | 711 __ Mov(cp, x0); |
712 __ Str(x0, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 712 __ Str(x0, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
713 // Copy any necessary parameters into the context. | 713 // Copy any necessary parameters into the context. |
714 int num_parameters = scope()->num_parameters(); | 714 int num_parameters = scope()->num_parameters(); |
715 for (int i = 0; i < num_parameters; i++) { | 715 for (int i = 0; i < num_parameters; i++) { |
716 Variable* var = scope()->parameter(i); | 716 Variable* var = scope()->parameter(i); |
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1648 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) { | 1648 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) { |
1649 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation()); | 1649 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation()); |
1650 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE); | 1650 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE); |
1651 } else { | 1651 } else { |
1652 flags = AllocateTargetSpace::update(flags, NEW_SPACE); | 1652 flags = AllocateTargetSpace::update(flags, NEW_SPACE); |
1653 } | 1653 } |
1654 __ Mov(x10, Smi::FromInt(flags)); | 1654 __ Mov(x10, Smi::FromInt(flags)); |
1655 __ Push(size, x10); | 1655 __ Push(size, x10); |
1656 | 1656 |
1657 CallRuntimeFromDeferred( | 1657 CallRuntimeFromDeferred( |
1658 Runtime::kHiddenAllocateInTargetSpace, 2, instr, instr->context()); | 1658 Runtime::kAllocateInTargetSpace, 2, instr, instr->context()); |
1659 __ StoreToSafepointRegisterSlot(x0, ToRegister(instr->result())); | 1659 __ StoreToSafepointRegisterSlot(x0, ToRegister(instr->result())); |
1660 } | 1660 } |
1661 | 1661 |
1662 | 1662 |
1663 void LCodeGen::DoApplyArguments(LApplyArguments* instr) { | 1663 void LCodeGen::DoApplyArguments(LApplyArguments* instr) { |
1664 Register receiver = ToRegister(instr->receiver()); | 1664 Register receiver = ToRegister(instr->receiver()); |
1665 Register function = ToRegister(instr->function()); | 1665 Register function = ToRegister(instr->function()); |
1666 Register length = ToRegister32(instr->length()); | 1666 Register length = ToRegister32(instr->length()); |
1667 | 1667 |
1668 Register elements = ToRegister(instr->elements()); | 1668 Register elements = ToRegister(instr->elements()); |
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2874 FastNewClosureStub stub(isolate(), | 2874 FastNewClosureStub stub(isolate(), |
2875 instr->hydrogen()->strict_mode(), | 2875 instr->hydrogen()->strict_mode(), |
2876 instr->hydrogen()->is_generator()); | 2876 instr->hydrogen()->is_generator()); |
2877 __ Mov(x2, Operand(instr->hydrogen()->shared_info())); | 2877 __ Mov(x2, Operand(instr->hydrogen()->shared_info())); |
2878 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 2878 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
2879 } else { | 2879 } else { |
2880 __ Mov(x2, Operand(instr->hydrogen()->shared_info())); | 2880 __ Mov(x2, Operand(instr->hydrogen()->shared_info())); |
2881 __ Mov(x1, Operand(pretenure ? factory()->true_value() | 2881 __ Mov(x1, Operand(pretenure ? factory()->true_value() |
2882 : factory()->false_value())); | 2882 : factory()->false_value())); |
2883 __ Push(cp, x2, x1); | 2883 __ Push(cp, x2, x1); |
2884 CallRuntime(Runtime::kHiddenNewClosure, 3, instr); | 2884 CallRuntime(Runtime::kNewClosure, 3, instr); |
2885 } | 2885 } |
2886 } | 2886 } |
2887 | 2887 |
2888 | 2888 |
2889 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { | 2889 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { |
2890 Register map = ToRegister(instr->map()); | 2890 Register map = ToRegister(instr->map()); |
2891 Register result = ToRegister(instr->result()); | 2891 Register result = ToRegister(instr->result()); |
2892 Label load_cache, done; | 2892 Label load_cache, done; |
2893 | 2893 |
2894 __ EnumLengthUntagged(result, map); | 2894 __ EnumLengthUntagged(result, map); |
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3798 // be valid. | 3798 // be valid. |
3799 Label result_ok; | 3799 Label result_ok; |
3800 Register input = ToRegister(instr->value()); | 3800 Register input = ToRegister(instr->value()); |
3801 __ JumpIfSmi(result, &result_ok); | 3801 __ JumpIfSmi(result, &result_ok); |
3802 __ Cmp(input, result); | 3802 __ Cmp(input, result); |
3803 __ Assert(eq, kUnexpectedValue); | 3803 __ Assert(eq, kUnexpectedValue); |
3804 __ Bind(&result_ok); | 3804 __ Bind(&result_ok); |
3805 } | 3805 } |
3806 | 3806 |
3807 { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 3807 { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
3808 CallRuntimeFromDeferred(Runtime::kHiddenAllocateHeapNumber, 0, instr, | 3808 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr, |
3809 instr->context()); | 3809 instr->context()); |
3810 __ StoreToSafepointRegisterSlot(x0, result); | 3810 __ StoreToSafepointRegisterSlot(x0, result); |
3811 } | 3811 } |
3812 // The inline (non-deferred) code will store result_bits into result. | 3812 // The inline (non-deferred) code will store result_bits into result. |
3813 } | 3813 } |
3814 | 3814 |
3815 | 3815 |
3816 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) { | 3816 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) { |
3817 // Class for deferred case. | 3817 // Class for deferred case. |
3818 class DeferredMathAbsTagged: public LDeferredCode { | 3818 class DeferredMathAbsTagged: public LDeferredCode { |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4524 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4524 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
4525 // TODO(3095996): Get rid of this. For now, we need to make the | 4525 // TODO(3095996): Get rid of this. For now, we need to make the |
4526 // result register contain a valid pointer because it is already | 4526 // result register contain a valid pointer because it is already |
4527 // contained in the register pointer map. | 4527 // contained in the register pointer map. |
4528 Register result = ToRegister(instr->result()); | 4528 Register result = ToRegister(instr->result()); |
4529 __ Mov(result, 0); | 4529 __ Mov(result, 0); |
4530 | 4530 |
4531 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4531 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
4532 // NumberTagU and NumberTagD use the context from the frame, rather than | 4532 // NumberTagU and NumberTagD use the context from the frame, rather than |
4533 // the environment's HContext or HInlinedContext value. | 4533 // the environment's HContext or HInlinedContext value. |
4534 // They only call Runtime::kHiddenAllocateHeapNumber. | 4534 // They only call Runtime::kAllocateHeapNumber. |
4535 // The corresponding HChange instructions are added in a phase that does | 4535 // The corresponding HChange instructions are added in a phase that does |
4536 // not have easy access to the local context. | 4536 // not have easy access to the local context. |
4537 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4537 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4538 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber); | 4538 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4539 RecordSafepointWithRegisters( | 4539 RecordSafepointWithRegisters( |
4540 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4540 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4541 __ StoreToSafepointRegisterSlot(x0, result); | 4541 __ StoreToSafepointRegisterSlot(x0, result); |
4542 } | 4542 } |
4543 | 4543 |
4544 | 4544 |
4545 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { | 4545 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
4546 class DeferredNumberTagD: public LDeferredCode { | 4546 class DeferredNumberTagD: public LDeferredCode { |
4547 public: | 4547 public: |
4548 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) | 4548 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4590 // TODO(3095996): Put a valid pointer value in the stack slot where the result | 4590 // TODO(3095996): Put a valid pointer value in the stack slot where the result |
4591 // register is stored, as this register is in the pointer map, but contains an | 4591 // register is stored, as this register is in the pointer map, but contains an |
4592 // integer value. | 4592 // integer value. |
4593 __ Mov(dst, 0); | 4593 __ Mov(dst, 0); |
4594 { | 4594 { |
4595 // Preserve the value of all registers. | 4595 // Preserve the value of all registers. |
4596 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4596 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
4597 | 4597 |
4598 // NumberTagU and NumberTagD use the context from the frame, rather than | 4598 // NumberTagU and NumberTagD use the context from the frame, rather than |
4599 // the environment's HContext or HInlinedContext value. | 4599 // the environment's HContext or HInlinedContext value. |
4600 // They only call Runtime::kHiddenAllocateHeapNumber. | 4600 // They only call Runtime::kAllocateHeapNumber. |
4601 // The corresponding HChange instructions are added in a phase that does | 4601 // The corresponding HChange instructions are added in a phase that does |
4602 // not have easy access to the local context. | 4602 // not have easy access to the local context. |
4603 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4603 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4604 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber); | 4604 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4605 RecordSafepointWithRegisters( | 4605 RecordSafepointWithRegisters( |
4606 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4606 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4607 __ StoreToSafepointRegisterSlot(x0, dst); | 4607 __ StoreToSafepointRegisterSlot(x0, dst); |
4608 } | 4608 } |
4609 | 4609 |
4610 // Convert number to floating point and store in the newly allocated heap | 4610 // Convert number to floating point and store in the newly allocated heap |
4611 // number. | 4611 // number. |
4612 __ Bind(&convert_and_store); | 4612 __ Bind(&convert_and_store); |
4613 DoubleRegister dbl_scratch = double_scratch(); | 4613 DoubleRegister dbl_scratch = double_scratch(); |
4614 __ Ucvtf(dbl_scratch, src); | 4614 __ Ucvtf(dbl_scratch, src); |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5024 Register scratch1 = x5; | 5024 Register scratch1 = x5; |
5025 Register scratch2 = x6; | 5025 Register scratch2 = x6; |
5026 ASSERT(instr->IsMarkedAsCall()); | 5026 ASSERT(instr->IsMarkedAsCall()); |
5027 | 5027 |
5028 ASM_UNIMPLEMENTED_BREAK("DoDeclareGlobals"); | 5028 ASM_UNIMPLEMENTED_BREAK("DoDeclareGlobals"); |
5029 // TODO(all): if Mov could handle object in new space then it could be used | 5029 // TODO(all): if Mov could handle object in new space then it could be used |
5030 // here. | 5030 // here. |
5031 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); | 5031 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); |
5032 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); | 5032 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); |
5033 __ Push(cp, scratch1, scratch2); // The context is the first argument. | 5033 __ Push(cp, scratch1, scratch2); // The context is the first argument. |
5034 CallRuntime(Runtime::kHiddenDeclareGlobals, 3, instr); | 5034 CallRuntime(Runtime::kDeclareGlobals, 3, instr); |
5035 } | 5035 } |
5036 | 5036 |
5037 | 5037 |
5038 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 5038 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
5039 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5039 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
5040 LoadContextFromDeferred(instr->context()); | 5040 LoadContextFromDeferred(instr->context()); |
5041 __ CallRuntimeSaveDoubles(Runtime::kHiddenStackGuard); | 5041 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); |
5042 RecordSafepointWithLazyDeopt( | 5042 RecordSafepointWithLazyDeopt( |
5043 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5043 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
5044 ASSERT(instr->HasEnvironment()); | 5044 ASSERT(instr->HasEnvironment()); |
5045 LEnvironment* env = instr->environment(); | 5045 LEnvironment* env = instr->environment(); |
5046 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 5046 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
5047 } | 5047 } |
5048 | 5048 |
5049 | 5049 |
5050 void LCodeGen::DoStackCheck(LStackCheck* instr) { | 5050 void LCodeGen::DoStackCheck(LStackCheck* instr) { |
5051 class DeferredStackCheck: public LDeferredCode { | 5051 class DeferredStackCheck: public LDeferredCode { |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5491 // contained in the register pointer map. | 5491 // contained in the register pointer map. |
5492 __ Mov(result, 0); | 5492 __ Mov(result, 0); |
5493 | 5493 |
5494 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5494 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
5495 __ Push(string); | 5495 __ Push(string); |
5496 // Push the index as a smi. This is safe because of the checks in | 5496 // Push the index as a smi. This is safe because of the checks in |
5497 // DoStringCharCodeAt above. | 5497 // DoStringCharCodeAt above. |
5498 Register index = ToRegister(instr->index()); | 5498 Register index = ToRegister(instr->index()); |
5499 __ SmiTagAndPush(index); | 5499 __ SmiTagAndPush(index); |
5500 | 5500 |
5501 CallRuntimeFromDeferred(Runtime::kHiddenStringCharCodeAt, 2, instr, | 5501 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, |
5502 instr->context()); | 5502 instr->context()); |
5503 __ AssertSmi(x0); | 5503 __ AssertSmi(x0); |
5504 __ SmiUntag(x0); | 5504 __ SmiUntag(x0); |
5505 __ StoreToSafepointRegisterSlot(x0, result); | 5505 __ StoreToSafepointRegisterSlot(x0, result); |
5506 } | 5506 } |
5507 | 5507 |
5508 | 5508 |
5509 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { | 5509 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { |
5510 class DeferredStringCharFromCode: public LDeferredCode { | 5510 class DeferredStringCharFromCode: public LDeferredCode { |
5511 public: | 5511 public: |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5715 __ LoadObject(x7, instr->hydrogen()->literals()); | 5715 __ LoadObject(x7, instr->hydrogen()->literals()); |
5716 __ Ldr(x1, FieldMemOperand(x7, literal_offset)); | 5716 __ Ldr(x1, FieldMemOperand(x7, literal_offset)); |
5717 __ JumpIfNotRoot(x1, Heap::kUndefinedValueRootIndex, &materialized); | 5717 __ JumpIfNotRoot(x1, Heap::kUndefinedValueRootIndex, &materialized); |
5718 | 5718 |
5719 // Create regexp literal using runtime function | 5719 // Create regexp literal using runtime function |
5720 // Result will be in x0. | 5720 // Result will be in x0. |
5721 __ Mov(x12, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); | 5721 __ Mov(x12, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); |
5722 __ Mov(x11, Operand(instr->hydrogen()->pattern())); | 5722 __ Mov(x11, Operand(instr->hydrogen()->pattern())); |
5723 __ Mov(x10, Operand(instr->hydrogen()->flags())); | 5723 __ Mov(x10, Operand(instr->hydrogen()->flags())); |
5724 __ Push(x7, x12, x11, x10); | 5724 __ Push(x7, x12, x11, x10); |
5725 CallRuntime(Runtime::kHiddenMaterializeRegExpLiteral, 4, instr); | 5725 CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr); |
5726 __ Mov(x1, x0); | 5726 __ Mov(x1, x0); |
5727 | 5727 |
5728 __ Bind(&materialized); | 5728 __ Bind(&materialized); |
5729 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | 5729 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; |
5730 Label allocated, runtime_allocate; | 5730 Label allocated, runtime_allocate; |
5731 | 5731 |
5732 __ Allocate(size, x0, x10, x11, &runtime_allocate, TAG_OBJECT); | 5732 __ Allocate(size, x0, x10, x11, &runtime_allocate, TAG_OBJECT); |
5733 __ B(&allocated); | 5733 __ B(&allocated); |
5734 | 5734 |
5735 __ Bind(&runtime_allocate); | 5735 __ Bind(&runtime_allocate); |
5736 __ Mov(x0, Smi::FromInt(size)); | 5736 __ Mov(x0, Smi::FromInt(size)); |
5737 __ Push(x1, x0); | 5737 __ Push(x1, x0); |
5738 CallRuntime(Runtime::kHiddenAllocateInNewSpace, 1, instr); | 5738 CallRuntime(Runtime::kAllocateInNewSpace, 1, instr); |
5739 __ Pop(x1); | 5739 __ Pop(x1); |
5740 | 5740 |
5741 __ Bind(&allocated); | 5741 __ Bind(&allocated); |
5742 // Copy the content into the newly allocated memory. | 5742 // Copy the content into the newly allocated memory. |
5743 __ CopyFields(x0, x1, CPURegList(x10, x11, x12), size / kPointerSize); | 5743 __ CopyFields(x0, x1, CPURegList(x10, x11, x12), size / kPointerSize); |
5744 } | 5744 } |
5745 | 5745 |
5746 | 5746 |
5747 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { | 5747 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { |
5748 Register object = ToRegister(instr->object()); | 5748 Register object = ToRegister(instr->object()); |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6045 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { | 6045 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { |
6046 Register context = ToRegister(instr->context()); | 6046 Register context = ToRegister(instr->context()); |
6047 __ Str(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 6047 __ Str(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
6048 } | 6048 } |
6049 | 6049 |
6050 | 6050 |
6051 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { | 6051 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { |
6052 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6052 Handle<ScopeInfo> scope_info = instr->scope_info(); |
6053 __ Push(scope_info); | 6053 __ Push(scope_info); |
6054 __ Push(ToRegister(instr->function())); | 6054 __ Push(ToRegister(instr->function())); |
6055 CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr); | 6055 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
6056 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6056 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6057 } | 6057 } |
6058 | 6058 |
6059 | 6059 |
6060 | 6060 |
6061 } } // namespace v8::internal | 6061 } } // namespace v8::internal |
OLD | NEW |