OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
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 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 return; | 546 return; |
547 } | 547 } |
548 | 548 |
549 if (cc == no_condition) { | 549 if (cc == no_condition) { |
550 __ Jump(entry, RelocInfo::RUNTIME_ENTRY); | 550 __ Jump(entry, RelocInfo::RUNTIME_ENTRY); |
551 } else { | 551 } else { |
552 // We often have several deopts to the same entry, reuse the last | 552 // We often have several deopts to the same entry, reuse the last |
553 // jump entry if this is the case. | 553 // jump entry if this is the case. |
554 if (jump_table_.is_empty() || | 554 if (jump_table_.is_empty() || |
555 jump_table_.last().address != entry) { | 555 jump_table_.last().address != entry) { |
556 jump_table_.Add(JumpTableEntry(entry)); | 556 jump_table_.Add(JumpTableEntry(entry), zone()); |
557 } | 557 } |
558 __ j(cc, &jump_table_.last().label); | 558 __ j(cc, &jump_table_.last().label); |
559 } | 559 } |
560 } | 560 } |
561 | 561 |
562 | 562 |
563 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { | 563 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { |
564 int length = deoptimizations_.length(); | 564 int length = deoptimizations_.length(); |
565 if (length == 0) return; | 565 if (length == 0) return; |
566 Handle<DeoptimizationInputData> data = | 566 Handle<DeoptimizationInputData> data = |
(...skipping 24 matching lines...) Expand all Loading... |
591 } | 591 } |
592 code->set_deoptimization_data(*data); | 592 code->set_deoptimization_data(*data); |
593 } | 593 } |
594 | 594 |
595 | 595 |
596 int LCodeGen::DefineDeoptimizationLiteral(Handle<Object> literal) { | 596 int LCodeGen::DefineDeoptimizationLiteral(Handle<Object> literal) { |
597 int result = deoptimization_literals_.length(); | 597 int result = deoptimization_literals_.length(); |
598 for (int i = 0; i < deoptimization_literals_.length(); ++i) { | 598 for (int i = 0; i < deoptimization_literals_.length(); ++i) { |
599 if (deoptimization_literals_[i].is_identical_to(literal)) return i; | 599 if (deoptimization_literals_[i].is_identical_to(literal)) return i; |
600 } | 600 } |
601 deoptimization_literals_.Add(literal); | 601 deoptimization_literals_.Add(literal, zone()); |
602 return result; | 602 return result; |
603 } | 603 } |
604 | 604 |
605 | 605 |
606 void LCodeGen::PopulateDeoptimizationLiteralsWithInlinedFunctions() { | 606 void LCodeGen::PopulateDeoptimizationLiteralsWithInlinedFunctions() { |
607 ASSERT(deoptimization_literals_.length() == 0); | 607 ASSERT(deoptimization_literals_.length() == 0); |
608 | 608 |
609 const ZoneList<Handle<JSFunction> >* inlined_closures = | 609 const ZoneList<Handle<JSFunction> >* inlined_closures = |
610 chunk()->inlined_closures(); | 610 chunk()->inlined_closures(); |
611 | 611 |
(...skipping 28 matching lines...) Expand all Loading... |
640 | 640 |
641 const ZoneList<LOperand*>* operands = pointers->GetNormalizedOperands(); | 641 const ZoneList<LOperand*>* operands = pointers->GetNormalizedOperands(); |
642 | 642 |
643 Safepoint safepoint = safepoints_.DefineSafepoint(masm(), | 643 Safepoint safepoint = safepoints_.DefineSafepoint(masm(), |
644 kind, arguments, deopt_mode); | 644 kind, arguments, deopt_mode); |
645 for (int i = 0; i < operands->length(); i++) { | 645 for (int i = 0; i < operands->length(); i++) { |
646 LOperand* pointer = operands->at(i); | 646 LOperand* pointer = operands->at(i); |
647 if (pointer->IsStackSlot()) { | 647 if (pointer->IsStackSlot()) { |
648 safepoint.DefinePointerSlot(pointer->index(), zone()); | 648 safepoint.DefinePointerSlot(pointer->index(), zone()); |
649 } else if (pointer->IsRegister() && (kind & Safepoint::kWithRegisters)) { | 649 } else if (pointer->IsRegister() && (kind & Safepoint::kWithRegisters)) { |
650 safepoint.DefinePointerRegister(ToRegister(pointer)); | 650 safepoint.DefinePointerRegister(ToRegister(pointer), zone()); |
651 } | 651 } |
652 } | 652 } |
653 if (kind & Safepoint::kWithRegisters) { | 653 if (kind & Safepoint::kWithRegisters) { |
654 // Register rsi always contains a pointer to the context. | 654 // Register rsi always contains a pointer to the context. |
655 safepoint.DefinePointerRegister(rsi); | 655 safepoint.DefinePointerRegister(rsi, zone()); |
656 } | 656 } |
657 } | 657 } |
658 | 658 |
659 | 659 |
660 void LCodeGen::RecordSafepoint(LPointerMap* pointers, | 660 void LCodeGen::RecordSafepoint(LPointerMap* pointers, |
661 Safepoint::DeoptMode deopt_mode) { | 661 Safepoint::DeoptMode deopt_mode) { |
662 RecordSafepoint(pointers, Safepoint::kSimple, 0, deopt_mode); | 662 RecordSafepoint(pointers, Safepoint::kSimple, 0, deopt_mode); |
663 } | 663 } |
664 | 664 |
665 | 665 |
666 void LCodeGen::RecordSafepoint(Safepoint::DeoptMode deopt_mode) { | 666 void LCodeGen::RecordSafepoint(Safepoint::DeoptMode deopt_mode) { |
667 LPointerMap empty_pointers(RelocInfo::kNoPosition); | 667 LPointerMap empty_pointers(RelocInfo::kNoPosition, zone()); |
668 RecordSafepoint(&empty_pointers, deopt_mode); | 668 RecordSafepoint(&empty_pointers, deopt_mode); |
669 } | 669 } |
670 | 670 |
671 | 671 |
672 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, | 672 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers, |
673 int arguments, | 673 int arguments, |
674 Safepoint::DeoptMode deopt_mode) { | 674 Safepoint::DeoptMode deopt_mode) { |
675 RecordSafepoint(pointers, Safepoint::kWithRegisters, arguments, deopt_mode); | 675 RecordSafepoint(pointers, Safepoint::kWithRegisters, arguments, deopt_mode); |
676 } | 676 } |
677 | 677 |
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1935 } | 1935 } |
1936 virtual LInstruction* instr() { return instr_; } | 1936 virtual LInstruction* instr() { return instr_; } |
1937 Label* map_check() { return &map_check_; } | 1937 Label* map_check() { return &map_check_; } |
1938 private: | 1938 private: |
1939 LInstanceOfKnownGlobal* instr_; | 1939 LInstanceOfKnownGlobal* instr_; |
1940 Label map_check_; | 1940 Label map_check_; |
1941 }; | 1941 }; |
1942 | 1942 |
1943 | 1943 |
1944 DeferredInstanceOfKnownGlobal* deferred; | 1944 DeferredInstanceOfKnownGlobal* deferred; |
1945 deferred = new DeferredInstanceOfKnownGlobal(this, instr); | 1945 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); |
1946 | 1946 |
1947 Label done, false_result; | 1947 Label done, false_result; |
1948 Register object = ToRegister(instr->InputAt(0)); | 1948 Register object = ToRegister(instr->InputAt(0)); |
1949 | 1949 |
1950 // A Smi is not an instance of anything. | 1950 // A Smi is not an instance of anything. |
1951 __ JumpIfSmi(object, &false_result); | 1951 __ JumpIfSmi(object, &false_result); |
1952 | 1952 |
1953 // This is the inlined call site instanceof cache. The two occurences of the | 1953 // This is the inlined call site instanceof cache. The two occurences of the |
1954 // hole value will be patched to the last map/result pair generated by the | 1954 // hole value will be patched to the last map/result pair generated by the |
1955 // instanceof stub. | 1955 // instanceof stub. |
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2873 if (r.IsDouble()) { | 2873 if (r.IsDouble()) { |
2874 XMMRegister scratch = xmm0; | 2874 XMMRegister scratch = xmm0; |
2875 XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0)); | 2875 XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0)); |
2876 __ xorps(scratch, scratch); | 2876 __ xorps(scratch, scratch); |
2877 __ subsd(scratch, input_reg); | 2877 __ subsd(scratch, input_reg); |
2878 __ andpd(input_reg, scratch); | 2878 __ andpd(input_reg, scratch); |
2879 } else if (r.IsInteger32()) { | 2879 } else if (r.IsInteger32()) { |
2880 EmitIntegerMathAbs(instr); | 2880 EmitIntegerMathAbs(instr); |
2881 } else { // Tagged case. | 2881 } else { // Tagged case. |
2882 DeferredMathAbsTaggedHeapNumber* deferred = | 2882 DeferredMathAbsTaggedHeapNumber* deferred = |
2883 new DeferredMathAbsTaggedHeapNumber(this, instr); | 2883 new(zone()) DeferredMathAbsTaggedHeapNumber(this, instr); |
2884 Register input_reg = ToRegister(instr->InputAt(0)); | 2884 Register input_reg = ToRegister(instr->InputAt(0)); |
2885 // Smi check. | 2885 // Smi check. |
2886 __ JumpIfNotSmi(input_reg, deferred->entry()); | 2886 __ JumpIfNotSmi(input_reg, deferred->entry()); |
2887 __ SmiToInteger32(input_reg, input_reg); | 2887 __ SmiToInteger32(input_reg, input_reg); |
2888 EmitIntegerMathAbs(instr); | 2888 EmitIntegerMathAbs(instr); |
2889 __ Integer32ToSmi(input_reg, input_reg); | 2889 __ Integer32ToSmi(input_reg, input_reg); |
2890 __ bind(deferred->exit()); | 2890 __ bind(deferred->exit()); |
2891 } | 2891 } |
2892 } | 2892 } |
2893 | 2893 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3065 class DeferredDoRandom: public LDeferredCode { | 3065 class DeferredDoRandom: public LDeferredCode { |
3066 public: | 3066 public: |
3067 DeferredDoRandom(LCodeGen* codegen, LRandom* instr) | 3067 DeferredDoRandom(LCodeGen* codegen, LRandom* instr) |
3068 : LDeferredCode(codegen), instr_(instr) { } | 3068 : LDeferredCode(codegen), instr_(instr) { } |
3069 virtual void Generate() { codegen()->DoDeferredRandom(instr_); } | 3069 virtual void Generate() { codegen()->DoDeferredRandom(instr_); } |
3070 virtual LInstruction* instr() { return instr_; } | 3070 virtual LInstruction* instr() { return instr_; } |
3071 private: | 3071 private: |
3072 LRandom* instr_; | 3072 LRandom* instr_; |
3073 }; | 3073 }; |
3074 | 3074 |
3075 DeferredDoRandom* deferred = new DeferredDoRandom(this, instr); | 3075 DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr); |
3076 | 3076 |
3077 // Having marked this instruction as a call we can use any | 3077 // Having marked this instruction as a call we can use any |
3078 // registers. | 3078 // registers. |
3079 ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); | 3079 ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); |
3080 | 3080 |
3081 // Choose the right register for the first argument depending on | 3081 // Choose the right register for the first argument depending on |
3082 // calling convention. | 3082 // calling convention. |
3083 #ifdef _WIN64 | 3083 #ifdef _WIN64 |
3084 ASSERT(ToRegister(instr->InputAt(0)).is(rcx)); | 3084 ASSERT(ToRegister(instr->InputAt(0)).is(rcx)); |
3085 Register global_object = rcx; | 3085 Register global_object = rcx; |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3607 public: | 3607 public: |
3608 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) | 3608 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) |
3609 : LDeferredCode(codegen), instr_(instr) { } | 3609 : LDeferredCode(codegen), instr_(instr) { } |
3610 virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); } | 3610 virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); } |
3611 virtual LInstruction* instr() { return instr_; } | 3611 virtual LInstruction* instr() { return instr_; } |
3612 private: | 3612 private: |
3613 LStringCharCodeAt* instr_; | 3613 LStringCharCodeAt* instr_; |
3614 }; | 3614 }; |
3615 | 3615 |
3616 DeferredStringCharCodeAt* deferred = | 3616 DeferredStringCharCodeAt* deferred = |
3617 new DeferredStringCharCodeAt(this, instr); | 3617 new(zone()) DeferredStringCharCodeAt(this, instr); |
3618 | 3618 |
3619 StringCharLoadGenerator::Generate(masm(), | 3619 StringCharLoadGenerator::Generate(masm(), |
3620 ToRegister(instr->string()), | 3620 ToRegister(instr->string()), |
3621 ToRegister(instr->index()), | 3621 ToRegister(instr->index()), |
3622 ToRegister(instr->result()), | 3622 ToRegister(instr->result()), |
3623 deferred->entry()); | 3623 deferred->entry()); |
3624 __ bind(deferred->exit()); | 3624 __ bind(deferred->exit()); |
3625 } | 3625 } |
3626 | 3626 |
3627 | 3627 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3661 public: | 3661 public: |
3662 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) | 3662 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) |
3663 : LDeferredCode(codegen), instr_(instr) { } | 3663 : LDeferredCode(codegen), instr_(instr) { } |
3664 virtual void Generate() { codegen()->DoDeferredStringCharFromCode(instr_); } | 3664 virtual void Generate() { codegen()->DoDeferredStringCharFromCode(instr_); } |
3665 virtual LInstruction* instr() { return instr_; } | 3665 virtual LInstruction* instr() { return instr_; } |
3666 private: | 3666 private: |
3667 LStringCharFromCode* instr_; | 3667 LStringCharFromCode* instr_; |
3668 }; | 3668 }; |
3669 | 3669 |
3670 DeferredStringCharFromCode* deferred = | 3670 DeferredStringCharFromCode* deferred = |
3671 new DeferredStringCharFromCode(this, instr); | 3671 new(zone()) DeferredStringCharFromCode(this, instr); |
3672 | 3672 |
3673 ASSERT(instr->hydrogen()->value()->representation().IsInteger32()); | 3673 ASSERT(instr->hydrogen()->value()->representation().IsInteger32()); |
3674 Register char_code = ToRegister(instr->char_code()); | 3674 Register char_code = ToRegister(instr->char_code()); |
3675 Register result = ToRegister(instr->result()); | 3675 Register result = ToRegister(instr->result()); |
3676 ASSERT(!char_code.is(result)); | 3676 ASSERT(!char_code.is(result)); |
3677 | 3677 |
3678 __ cmpl(char_code, Immediate(String::kMaxAsciiCharCode)); | 3678 __ cmpl(char_code, Immediate(String::kMaxAsciiCharCode)); |
3679 __ j(above, deferred->entry()); | 3679 __ j(above, deferred->entry()); |
3680 __ LoadRoot(result, Heap::kSingleCharacterStringCacheRootIndex); | 3680 __ LoadRoot(result, Heap::kSingleCharacterStringCacheRootIndex); |
3681 __ movq(result, FieldOperand(result, | 3681 __ movq(result, FieldOperand(result, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3741 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } | 3741 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } |
3742 virtual LInstruction* instr() { return instr_; } | 3742 virtual LInstruction* instr() { return instr_; } |
3743 private: | 3743 private: |
3744 LNumberTagD* instr_; | 3744 LNumberTagD* instr_; |
3745 }; | 3745 }; |
3746 | 3746 |
3747 XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0)); | 3747 XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0)); |
3748 Register reg = ToRegister(instr->result()); | 3748 Register reg = ToRegister(instr->result()); |
3749 Register tmp = ToRegister(instr->TempAt(0)); | 3749 Register tmp = ToRegister(instr->TempAt(0)); |
3750 | 3750 |
3751 DeferredNumberTagD* deferred = new DeferredNumberTagD(this, instr); | 3751 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); |
3752 if (FLAG_inline_new) { | 3752 if (FLAG_inline_new) { |
3753 __ AllocateHeapNumber(reg, tmp, deferred->entry()); | 3753 __ AllocateHeapNumber(reg, tmp, deferred->entry()); |
3754 } else { | 3754 } else { |
3755 __ jmp(deferred->entry()); | 3755 __ jmp(deferred->entry()); |
3756 } | 3756 } |
3757 __ bind(deferred->exit()); | 3757 __ bind(deferred->exit()); |
3758 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), input_reg); | 3758 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), input_reg); |
3759 } | 3759 } |
3760 | 3760 |
3761 | 3761 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3901 virtual LInstruction* instr() { return instr_; } | 3901 virtual LInstruction* instr() { return instr_; } |
3902 private: | 3902 private: |
3903 LTaggedToI* instr_; | 3903 LTaggedToI* instr_; |
3904 }; | 3904 }; |
3905 | 3905 |
3906 LOperand* input = instr->InputAt(0); | 3906 LOperand* input = instr->InputAt(0); |
3907 ASSERT(input->IsRegister()); | 3907 ASSERT(input->IsRegister()); |
3908 ASSERT(input->Equals(instr->result())); | 3908 ASSERT(input->Equals(instr->result())); |
3909 | 3909 |
3910 Register input_reg = ToRegister(input); | 3910 Register input_reg = ToRegister(input); |
3911 DeferredTaggedToI* deferred = new DeferredTaggedToI(this, instr); | 3911 DeferredTaggedToI* deferred = new(zone()) DeferredTaggedToI(this, instr); |
3912 __ JumpIfNotSmi(input_reg, deferred->entry()); | 3912 __ JumpIfNotSmi(input_reg, deferred->entry()); |
3913 __ SmiToInteger32(input_reg, input_reg); | 3913 __ SmiToInteger32(input_reg, input_reg); |
3914 __ bind(deferred->exit()); | 3914 __ bind(deferred->exit()); |
3915 } | 3915 } |
3916 | 3916 |
3917 | 3917 |
3918 void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { | 3918 void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { |
3919 LOperand* input = instr->InputAt(0); | 3919 LOperand* input = instr->InputAt(0); |
3920 ASSERT(input->IsRegister()); | 3920 ASSERT(input->IsRegister()); |
3921 LOperand* result = instr->result(); | 3921 LOperand* result = instr->result(); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4155 class DeferredAllocateObject: public LDeferredCode { | 4155 class DeferredAllocateObject: public LDeferredCode { |
4156 public: | 4156 public: |
4157 DeferredAllocateObject(LCodeGen* codegen, LAllocateObject* instr) | 4157 DeferredAllocateObject(LCodeGen* codegen, LAllocateObject* instr) |
4158 : LDeferredCode(codegen), instr_(instr) { } | 4158 : LDeferredCode(codegen), instr_(instr) { } |
4159 virtual void Generate() { codegen()->DoDeferredAllocateObject(instr_); } | 4159 virtual void Generate() { codegen()->DoDeferredAllocateObject(instr_); } |
4160 virtual LInstruction* instr() { return instr_; } | 4160 virtual LInstruction* instr() { return instr_; } |
4161 private: | 4161 private: |
4162 LAllocateObject* instr_; | 4162 LAllocateObject* instr_; |
4163 }; | 4163 }; |
4164 | 4164 |
4165 DeferredAllocateObject* deferred = new DeferredAllocateObject(this, instr); | 4165 DeferredAllocateObject* deferred = |
| 4166 new(zone()) DeferredAllocateObject(this, instr); |
4166 | 4167 |
4167 Register result = ToRegister(instr->result()); | 4168 Register result = ToRegister(instr->result()); |
4168 Register scratch = ToRegister(instr->TempAt(0)); | 4169 Register scratch = ToRegister(instr->TempAt(0)); |
4169 Handle<JSFunction> constructor = instr->hydrogen()->constructor(); | 4170 Handle<JSFunction> constructor = instr->hydrogen()->constructor(); |
4170 Handle<Map> initial_map(constructor->initial_map()); | 4171 Handle<Map> initial_map(constructor->initial_map()); |
4171 int instance_size = initial_map->instance_size(); | 4172 int instance_size = initial_map->instance_size(); |
4172 ASSERT(initial_map->pre_allocated_property_fields() + | 4173 ASSERT(initial_map->pre_allocated_property_fields() + |
4173 initial_map->unused_property_fields() - | 4174 initial_map->unused_property_fields() - |
4174 initial_map->inobject_properties() == 0); | 4175 initial_map->inobject_properties() == 0); |
4175 | 4176 |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4777 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 4778 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
4778 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); | 4779 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
4779 last_lazy_deopt_pc_ = masm()->pc_offset(); | 4780 last_lazy_deopt_pc_ = masm()->pc_offset(); |
4780 __ bind(&done); | 4781 __ bind(&done); |
4781 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); | 4782 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
4782 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 4783 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
4783 } else { | 4784 } else { |
4784 ASSERT(instr->hydrogen()->is_backwards_branch()); | 4785 ASSERT(instr->hydrogen()->is_backwards_branch()); |
4785 // Perform stack overflow check if this goto needs it before jumping. | 4786 // Perform stack overflow check if this goto needs it before jumping. |
4786 DeferredStackCheck* deferred_stack_check = | 4787 DeferredStackCheck* deferred_stack_check = |
4787 new DeferredStackCheck(this, instr); | 4788 new(zone()) DeferredStackCheck(this, instr); |
4788 __ CompareRoot(rsp, Heap::kStackLimitRootIndex); | 4789 __ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
4789 __ j(below, deferred_stack_check->entry()); | 4790 __ j(below, deferred_stack_check->entry()); |
4790 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); | 4791 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
4791 last_lazy_deopt_pc_ = masm()->pc_offset(); | 4792 last_lazy_deopt_pc_ = masm()->pc_offset(); |
4792 __ bind(instr->done_label()); | 4793 __ bind(instr->done_label()); |
4793 deferred_stack_check->SetExit(instr->done_label()); | 4794 deferred_stack_check->SetExit(instr->done_label()); |
4794 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); | 4795 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
4795 // Don't record a deoptimization index for the safepoint here. | 4796 // Don't record a deoptimization index for the safepoint here. |
4796 // This will be done explicitly when emitting call and the safepoint in | 4797 // This will be done explicitly when emitting call and the safepoint in |
4797 // the deferred code. | 4798 // the deferred code. |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4895 FixedArray::kHeaderSize - kPointerSize)); | 4896 FixedArray::kHeaderSize - kPointerSize)); |
4896 __ bind(&done); | 4897 __ bind(&done); |
4897 } | 4898 } |
4898 | 4899 |
4899 | 4900 |
4900 #undef __ | 4901 #undef __ |
4901 | 4902 |
4902 } } // namespace v8::internal | 4903 } } // namespace v8::internal |
4903 | 4904 |
4904 #endif // V8_TARGET_ARCH_X64 | 4905 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |