| 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 |