OLD | NEW |
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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 Comment(";;; Allocate local context"); | 181 Comment(";;; Allocate local context"); |
182 bool need_write_barrier = true; | 182 bool need_write_barrier = true; |
183 // Argument to NewContext is the function, which is in r1. | 183 // Argument to NewContext is the function, which is in r1. |
184 if (heap_slots <= FastNewContextStub::kMaximumSlots) { | 184 if (heap_slots <= FastNewContextStub::kMaximumSlots) { |
185 FastNewContextStub stub(isolate(), heap_slots); | 185 FastNewContextStub stub(isolate(), heap_slots); |
186 __ CallStub(&stub); | 186 __ CallStub(&stub); |
187 // Result of FastNewContextStub is always in new space. | 187 // Result of FastNewContextStub is always in new space. |
188 need_write_barrier = false; | 188 need_write_barrier = false; |
189 } else { | 189 } else { |
190 __ push(r1); | 190 __ push(r1); |
191 __ CallRuntime(Runtime::kHiddenNewFunctionContext, 1); | 191 __ CallRuntime(Runtime::kNewFunctionContext, 1); |
192 } | 192 } |
193 RecordSafepoint(Safepoint::kNoLazyDeopt); | 193 RecordSafepoint(Safepoint::kNoLazyDeopt); |
194 // Context is returned in both r0 and cp. It replaces the context | 194 // Context is returned in both r0 and cp. It replaces the context |
195 // passed to us. It's saved in the stack and kept live in cp. | 195 // passed to us. It's saved in the stack and kept live in cp. |
196 __ mov(cp, r0); | 196 __ mov(cp, r0); |
197 __ str(r0, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 197 __ str(r0, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
198 // Copy any necessary parameters into the context. | 198 // Copy any necessary parameters into the context. |
199 int num_parameters = scope()->num_parameters(); | 199 int num_parameters = scope()->num_parameters(); |
200 for (int i = 0; i < num_parameters; i++) { | 200 for (int i = 0; i < num_parameters; i++) { |
201 Variable* var = scope()->parameter(i); | 201 Variable* var = scope()->parameter(i); |
(...skipping 3366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3568 } | 3568 } |
3569 | 3569 |
3570 | 3570 |
3571 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { | 3571 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { |
3572 ASSERT(ToRegister(instr->context()).is(cp)); | 3572 ASSERT(ToRegister(instr->context()).is(cp)); |
3573 __ push(cp); // The context is the first argument. | 3573 __ push(cp); // The context is the first argument. |
3574 __ Move(scratch0(), instr->hydrogen()->pairs()); | 3574 __ Move(scratch0(), instr->hydrogen()->pairs()); |
3575 __ push(scratch0()); | 3575 __ push(scratch0()); |
3576 __ mov(scratch0(), Operand(Smi::FromInt(instr->hydrogen()->flags()))); | 3576 __ mov(scratch0(), Operand(Smi::FromInt(instr->hydrogen()->flags()))); |
3577 __ push(scratch0()); | 3577 __ push(scratch0()); |
3578 CallRuntime(Runtime::kHiddenDeclareGlobals, 3, instr); | 3578 CallRuntime(Runtime::kDeclareGlobals, 3, instr); |
3579 } | 3579 } |
3580 | 3580 |
3581 | 3581 |
3582 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 3582 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
3583 int formal_parameter_count, | 3583 int formal_parameter_count, |
3584 int arity, | 3584 int arity, |
3585 LInstruction* instr, | 3585 LInstruction* instr, |
3586 R1State r1_state) { | 3586 R1State r1_state) { |
3587 bool dont_adapt_arguments = | 3587 bool dont_adapt_arguments = |
3588 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 3588 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3659 // exponent: floating point exponent value. | 3659 // exponent: floating point exponent value. |
3660 | 3660 |
3661 Label allocated, slow; | 3661 Label allocated, slow; |
3662 __ LoadRoot(tmp4, Heap::kHeapNumberMapRootIndex); | 3662 __ LoadRoot(tmp4, Heap::kHeapNumberMapRootIndex); |
3663 __ AllocateHeapNumber(tmp1, tmp2, tmp3, tmp4, &slow); | 3663 __ AllocateHeapNumber(tmp1, tmp2, tmp3, tmp4, &slow); |
3664 __ b(&allocated); | 3664 __ b(&allocated); |
3665 | 3665 |
3666 // Slow case: Call the runtime system to do the number allocation. | 3666 // Slow case: Call the runtime system to do the number allocation. |
3667 __ bind(&slow); | 3667 __ bind(&slow); |
3668 | 3668 |
3669 CallRuntimeFromDeferred(Runtime::kHiddenAllocateHeapNumber, 0, instr, | 3669 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr, |
3670 instr->context()); | 3670 instr->context()); |
3671 // Set the pointer to the new heap number in tmp. | 3671 // Set the pointer to the new heap number in tmp. |
3672 if (!tmp1.is(r0)) __ mov(tmp1, Operand(r0)); | 3672 if (!tmp1.is(r0)) __ mov(tmp1, Operand(r0)); |
3673 // Restore input_reg after call to runtime. | 3673 // Restore input_reg after call to runtime. |
3674 __ LoadFromSafepointRegisterSlot(input, input); | 3674 __ LoadFromSafepointRegisterSlot(input, input); |
3675 __ ldr(exponent, FieldMemOperand(input, HeapNumber::kExponentOffset)); | 3675 __ ldr(exponent, FieldMemOperand(input, HeapNumber::kExponentOffset)); |
3676 | 3676 |
3677 __ bind(&allocated); | 3677 __ bind(&allocated); |
3678 // exponent: floating point exponent value. | 3678 // exponent: floating point exponent value. |
3679 // tmp1: allocated heap number. | 3679 // tmp1: allocated heap number. |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4471 // DoStringCharCodeAt above. | 4471 // DoStringCharCodeAt above. |
4472 if (instr->index()->IsConstantOperand()) { | 4472 if (instr->index()->IsConstantOperand()) { |
4473 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); | 4473 int const_index = ToInteger32(LConstantOperand::cast(instr->index())); |
4474 __ mov(scratch, Operand(Smi::FromInt(const_index))); | 4474 __ mov(scratch, Operand(Smi::FromInt(const_index))); |
4475 __ push(scratch); | 4475 __ push(scratch); |
4476 } else { | 4476 } else { |
4477 Register index = ToRegister(instr->index()); | 4477 Register index = ToRegister(instr->index()); |
4478 __ SmiTag(index); | 4478 __ SmiTag(index); |
4479 __ push(index); | 4479 __ push(index); |
4480 } | 4480 } |
4481 CallRuntimeFromDeferred(Runtime::kHiddenStringCharCodeAt, 2, instr, | 4481 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, |
4482 instr->context()); | 4482 instr->context()); |
4483 __ AssertSmi(r0); | 4483 __ AssertSmi(r0); |
4484 __ SmiUntag(r0); | 4484 __ SmiUntag(r0); |
4485 __ StoreToSafepointRegisterSlot(r0, result); | 4485 __ StoreToSafepointRegisterSlot(r0, result); |
4486 } | 4486 } |
4487 | 4487 |
4488 | 4488 |
4489 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { | 4489 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { |
4490 class DeferredStringCharFromCode V8_FINAL : public LDeferredCode { | 4490 class DeferredStringCharFromCode V8_FINAL : public LDeferredCode { |
4491 public: | 4491 public: |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4658 // TODO(3095996): Put a valid pointer value in the stack slot where the | 4658 // TODO(3095996): Put a valid pointer value in the stack slot where the |
4659 // result register is stored, as this register is in the pointer map, but | 4659 // result register is stored, as this register is in the pointer map, but |
4660 // contains an integer value. | 4660 // contains an integer value. |
4661 __ mov(dst, Operand::Zero()); | 4661 __ mov(dst, Operand::Zero()); |
4662 | 4662 |
4663 // Preserve the value of all registers. | 4663 // Preserve the value of all registers. |
4664 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4664 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
4665 | 4665 |
4666 // NumberTagI and NumberTagD use the context from the frame, rather than | 4666 // NumberTagI and NumberTagD use the context from the frame, rather than |
4667 // the environment's HContext or HInlinedContext value. | 4667 // the environment's HContext or HInlinedContext value. |
4668 // They only call Runtime::kHiddenAllocateHeapNumber. | 4668 // They only call Runtime::kAllocateHeapNumber. |
4669 // The corresponding HChange instructions are added in a phase that does | 4669 // The corresponding HChange instructions are added in a phase that does |
4670 // not have easy access to the local context. | 4670 // not have easy access to the local context. |
4671 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4671 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4672 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber); | 4672 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4673 RecordSafepointWithRegisters( | 4673 RecordSafepointWithRegisters( |
4674 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4674 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4675 __ sub(r0, r0, Operand(kHeapObjectTag)); | 4675 __ sub(r0, r0, Operand(kHeapObjectTag)); |
4676 __ StoreToSafepointRegisterSlot(r0, dst); | 4676 __ StoreToSafepointRegisterSlot(r0, dst); |
4677 } | 4677 } |
4678 | 4678 |
4679 // Done. Put the value in dbl_scratch into the value of the allocated heap | 4679 // Done. Put the value in dbl_scratch into the value of the allocated heap |
4680 // number. | 4680 // number. |
4681 __ bind(&done); | 4681 __ bind(&done); |
4682 __ vstr(dbl_scratch, dst, HeapNumber::kValueOffset); | 4682 __ vstr(dbl_scratch, dst, HeapNumber::kValueOffset); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4722 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4722 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
4723 // TODO(3095996): Get rid of this. For now, we need to make the | 4723 // TODO(3095996): Get rid of this. For now, we need to make the |
4724 // result register contain a valid pointer because it is already | 4724 // result register contain a valid pointer because it is already |
4725 // contained in the register pointer map. | 4725 // contained in the register pointer map. |
4726 Register reg = ToRegister(instr->result()); | 4726 Register reg = ToRegister(instr->result()); |
4727 __ mov(reg, Operand::Zero()); | 4727 __ mov(reg, Operand::Zero()); |
4728 | 4728 |
4729 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4729 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
4730 // NumberTagI and NumberTagD use the context from the frame, rather than | 4730 // NumberTagI and NumberTagD use the context from the frame, rather than |
4731 // the environment's HContext or HInlinedContext value. | 4731 // the environment's HContext or HInlinedContext value. |
4732 // They only call Runtime::kHiddenAllocateHeapNumber. | 4732 // They only call Runtime::kAllocateHeapNumber. |
4733 // The corresponding HChange instructions are added in a phase that does | 4733 // The corresponding HChange instructions are added in a phase that does |
4734 // not have easy access to the local context. | 4734 // not have easy access to the local context. |
4735 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4735 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4736 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber); | 4736 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4737 RecordSafepointWithRegisters( | 4737 RecordSafepointWithRegisters( |
4738 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4738 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4739 __ sub(r0, r0, Operand(kHeapObjectTag)); | 4739 __ sub(r0, r0, Operand(kHeapObjectTag)); |
4740 __ StoreToSafepointRegisterSlot(r0, reg); | 4740 __ StoreToSafepointRegisterSlot(r0, reg); |
4741 } | 4741 } |
4742 | 4742 |
4743 | 4743 |
4744 void LCodeGen::DoSmiTag(LSmiTag* instr) { | 4744 void LCodeGen::DoSmiTag(LSmiTag* instr) { |
4745 HChange* hchange = instr->hydrogen(); | 4745 HChange* hchange = instr->hydrogen(); |
4746 Register input = ToRegister(instr->value()); | 4746 Register input = ToRegister(instr->value()); |
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5340 flags = AllocateTargetSpace::update(flags, OLD_POINTER_SPACE); | 5340 flags = AllocateTargetSpace::update(flags, OLD_POINTER_SPACE); |
5341 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) { | 5341 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) { |
5342 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation()); | 5342 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation()); |
5343 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE); | 5343 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE); |
5344 } else { | 5344 } else { |
5345 flags = AllocateTargetSpace::update(flags, NEW_SPACE); | 5345 flags = AllocateTargetSpace::update(flags, NEW_SPACE); |
5346 } | 5346 } |
5347 __ Push(Smi::FromInt(flags)); | 5347 __ Push(Smi::FromInt(flags)); |
5348 | 5348 |
5349 CallRuntimeFromDeferred( | 5349 CallRuntimeFromDeferred( |
5350 Runtime::kHiddenAllocateInTargetSpace, 2, instr, instr->context()); | 5350 Runtime::kAllocateInTargetSpace, 2, instr, instr->context()); |
5351 __ StoreToSafepointRegisterSlot(r0, result); | 5351 __ StoreToSafepointRegisterSlot(r0, result); |
5352 } | 5352 } |
5353 | 5353 |
5354 | 5354 |
5355 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { | 5355 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { |
5356 ASSERT(ToRegister(instr->value()).is(r0)); | 5356 ASSERT(ToRegister(instr->value()).is(r0)); |
5357 __ push(r0); | 5357 __ push(r0); |
5358 CallRuntime(Runtime::kToFastProperties, 1, instr); | 5358 CallRuntime(Runtime::kToFastProperties, 1, instr); |
5359 } | 5359 } |
5360 | 5360 |
(...skipping 13 matching lines...) Expand all Loading... |
5374 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); | 5374 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
5375 __ cmp(r1, ip); | 5375 __ cmp(r1, ip); |
5376 __ b(ne, &materialized); | 5376 __ b(ne, &materialized); |
5377 | 5377 |
5378 // Create regexp literal using runtime function | 5378 // Create regexp literal using runtime function |
5379 // Result will be in r0. | 5379 // Result will be in r0. |
5380 __ mov(r5, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); | 5380 __ mov(r5, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); |
5381 __ mov(r4, Operand(instr->hydrogen()->pattern())); | 5381 __ mov(r4, Operand(instr->hydrogen()->pattern())); |
5382 __ mov(r3, Operand(instr->hydrogen()->flags())); | 5382 __ mov(r3, Operand(instr->hydrogen()->flags())); |
5383 __ Push(r6, r5, r4, r3); | 5383 __ Push(r6, r5, r4, r3); |
5384 CallRuntime(Runtime::kHiddenMaterializeRegExpLiteral, 4, instr); | 5384 CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr); |
5385 __ mov(r1, r0); | 5385 __ mov(r1, r0); |
5386 | 5386 |
5387 __ bind(&materialized); | 5387 __ bind(&materialized); |
5388 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | 5388 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; |
5389 Label allocated, runtime_allocate; | 5389 Label allocated, runtime_allocate; |
5390 | 5390 |
5391 __ Allocate(size, r0, r2, r3, &runtime_allocate, TAG_OBJECT); | 5391 __ Allocate(size, r0, r2, r3, &runtime_allocate, TAG_OBJECT); |
5392 __ jmp(&allocated); | 5392 __ jmp(&allocated); |
5393 | 5393 |
5394 __ bind(&runtime_allocate); | 5394 __ bind(&runtime_allocate); |
5395 __ mov(r0, Operand(Smi::FromInt(size))); | 5395 __ mov(r0, Operand(Smi::FromInt(size))); |
5396 __ Push(r1, r0); | 5396 __ Push(r1, r0); |
5397 CallRuntime(Runtime::kHiddenAllocateInNewSpace, 1, instr); | 5397 CallRuntime(Runtime::kAllocateInNewSpace, 1, instr); |
5398 __ pop(r1); | 5398 __ pop(r1); |
5399 | 5399 |
5400 __ bind(&allocated); | 5400 __ bind(&allocated); |
5401 // Copy the content into the newly allocated memory. | 5401 // Copy the content into the newly allocated memory. |
5402 __ CopyFields(r0, r1, double_scratch0(), size / kPointerSize); | 5402 __ CopyFields(r0, r1, double_scratch0(), size / kPointerSize); |
5403 } | 5403 } |
5404 | 5404 |
5405 | 5405 |
5406 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { | 5406 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { |
5407 ASSERT(ToRegister(instr->context()).is(cp)); | 5407 ASSERT(ToRegister(instr->context()).is(cp)); |
5408 // Use the fast case closure allocation code that allocates in new | 5408 // Use the fast case closure allocation code that allocates in new |
5409 // space for nested functions that don't need literals cloning. | 5409 // space for nested functions that don't need literals cloning. |
5410 bool pretenure = instr->hydrogen()->pretenure(); | 5410 bool pretenure = instr->hydrogen()->pretenure(); |
5411 if (!pretenure && instr->hydrogen()->has_no_literals()) { | 5411 if (!pretenure && instr->hydrogen()->has_no_literals()) { |
5412 FastNewClosureStub stub(isolate(), | 5412 FastNewClosureStub stub(isolate(), |
5413 instr->hydrogen()->strict_mode(), | 5413 instr->hydrogen()->strict_mode(), |
5414 instr->hydrogen()->is_generator()); | 5414 instr->hydrogen()->is_generator()); |
5415 __ mov(r2, Operand(instr->hydrogen()->shared_info())); | 5415 __ mov(r2, Operand(instr->hydrogen()->shared_info())); |
5416 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 5416 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
5417 } else { | 5417 } else { |
5418 __ mov(r2, Operand(instr->hydrogen()->shared_info())); | 5418 __ mov(r2, Operand(instr->hydrogen()->shared_info())); |
5419 __ mov(r1, Operand(pretenure ? factory()->true_value() | 5419 __ mov(r1, Operand(pretenure ? factory()->true_value() |
5420 : factory()->false_value())); | 5420 : factory()->false_value())); |
5421 __ Push(cp, r2, r1); | 5421 __ Push(cp, r2, r1); |
5422 CallRuntime(Runtime::kHiddenNewClosure, 3, instr); | 5422 CallRuntime(Runtime::kNewClosure, 3, instr); |
5423 } | 5423 } |
5424 } | 5424 } |
5425 | 5425 |
5426 | 5426 |
5427 void LCodeGen::DoTypeof(LTypeof* instr) { | 5427 void LCodeGen::DoTypeof(LTypeof* instr) { |
5428 Register input = ToRegister(instr->value()); | 5428 Register input = ToRegister(instr->value()); |
5429 __ push(input); | 5429 __ push(input); |
5430 CallRuntime(Runtime::kTypeof, 1, instr); | 5430 CallRuntime(Runtime::kTypeof, 1, instr); |
5431 } | 5431 } |
5432 | 5432 |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5599 | 5599 |
5600 | 5600 |
5601 void LCodeGen::DoDummyUse(LDummyUse* instr) { | 5601 void LCodeGen::DoDummyUse(LDummyUse* instr) { |
5602 // Nothing to see here, move on! | 5602 // Nothing to see here, move on! |
5603 } | 5603 } |
5604 | 5604 |
5605 | 5605 |
5606 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 5606 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
5607 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 5607 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
5608 LoadContextFromDeferred(instr->context()); | 5608 LoadContextFromDeferred(instr->context()); |
5609 __ CallRuntimeSaveDoubles(Runtime::kHiddenStackGuard); | 5609 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); |
5610 RecordSafepointWithLazyDeopt( | 5610 RecordSafepointWithLazyDeopt( |
5611 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5611 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
5612 ASSERT(instr->HasEnvironment()); | 5612 ASSERT(instr->HasEnvironment()); |
5613 LEnvironment* env = instr->environment(); | 5613 LEnvironment* env = instr->environment(); |
5614 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 5614 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
5615 } | 5615 } |
5616 | 5616 |
5617 | 5617 |
5618 void LCodeGen::DoStackCheck(LStackCheck* instr) { | 5618 void LCodeGen::DoStackCheck(LStackCheck* instr) { |
5619 class DeferredStackCheck V8_FINAL : public LDeferredCode { | 5619 class DeferredStackCheck V8_FINAL : public LDeferredCode { |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5825 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { | 5825 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { |
5826 Register context = ToRegister(instr->context()); | 5826 Register context = ToRegister(instr->context()); |
5827 __ str(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 5827 __ str(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
5828 } | 5828 } |
5829 | 5829 |
5830 | 5830 |
5831 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { | 5831 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { |
5832 Handle<ScopeInfo> scope_info = instr->scope_info(); | 5832 Handle<ScopeInfo> scope_info = instr->scope_info(); |
5833 __ Push(scope_info); | 5833 __ Push(scope_info); |
5834 __ push(ToRegister(instr->function())); | 5834 __ push(ToRegister(instr->function())); |
5835 CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr); | 5835 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5836 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5836 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5837 } | 5837 } |
5838 | 5838 |
5839 | 5839 |
5840 #undef __ | 5840 #undef __ |
5841 | 5841 |
5842 } } // namespace v8::internal | 5842 } } // namespace v8::internal |
OLD | NEW |