| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 
| 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 24 matching lines...) Expand all  Loading... | 
| 35 #include "src/ic/ic.h" | 35 #include "src/ic/ic.h" | 
| 36 #include "src/ic/stub-cache.h" | 36 #include "src/ic/stub-cache.h" | 
| 37 #include "src/mips/lithium-codegen-mips.h" | 37 #include "src/mips/lithium-codegen-mips.h" | 
| 38 #include "src/mips/lithium-gap-resolver-mips.h" | 38 #include "src/mips/lithium-gap-resolver-mips.h" | 
| 39 | 39 | 
| 40 | 40 | 
| 41 namespace v8 { | 41 namespace v8 { | 
| 42 namespace internal { | 42 namespace internal { | 
| 43 | 43 | 
| 44 | 44 | 
| 45 class SafepointGenerator FINAL  : public CallWrapper { | 45 class SafepointGenerator final : public CallWrapper { | 
| 46  public: | 46  public: | 
| 47   SafepointGenerator(LCodeGen* codegen, | 47   SafepointGenerator(LCodeGen* codegen, | 
| 48                      LPointerMap* pointers, | 48                      LPointerMap* pointers, | 
| 49                      Safepoint::DeoptMode mode) | 49                      Safepoint::DeoptMode mode) | 
| 50       : codegen_(codegen), | 50       : codegen_(codegen), | 
| 51         pointers_(pointers), | 51         pointers_(pointers), | 
| 52         deopt_mode_(mode) { } | 52         deopt_mode_(mode) { } | 
| 53   virtual ~SafepointGenerator() {} | 53   virtual ~SafepointGenerator() {} | 
| 54 | 54 | 
| 55   void BeforeCall(int call_size) const OVERRIDE {} | 55   void BeforeCall(int call_size) const override {} | 
| 56 | 56 | 
| 57   void AfterCall() const OVERRIDE { | 57   void AfterCall() const override { | 
| 58     codegen_->RecordSafepoint(pointers_, deopt_mode_); | 58     codegen_->RecordSafepoint(pointers_, deopt_mode_); | 
| 59   } | 59   } | 
| 60 | 60 | 
| 61  private: | 61  private: | 
| 62   LCodeGen* codegen_; | 62   LCodeGen* codegen_; | 
| 63   LPointerMap* pointers_; | 63   LPointerMap* pointers_; | 
| 64   Safepoint::DeoptMode deopt_mode_; | 64   Safepoint::DeoptMode deopt_mode_; | 
| 65 }; | 65 }; | 
| 66 | 66 | 
| 67 | 67 | 
| (...skipping 2644 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2712   __ Branch(&true_label, eq, result, Operand(zero_reg)); | 2712   __ Branch(&true_label, eq, result, Operand(zero_reg)); | 
| 2713   __ li(result, Operand(factory()->false_value())); | 2713   __ li(result, Operand(factory()->false_value())); | 
| 2714   __ Branch(&done); | 2714   __ Branch(&done); | 
| 2715   __ bind(&true_label); | 2715   __ bind(&true_label); | 
| 2716   __ li(result, Operand(factory()->true_value())); | 2716   __ li(result, Operand(factory()->true_value())); | 
| 2717   __ bind(&done); | 2717   __ bind(&done); | 
| 2718 } | 2718 } | 
| 2719 | 2719 | 
| 2720 | 2720 | 
| 2721 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { | 2721 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { | 
| 2722   class DeferredInstanceOfKnownGlobal FINAL : public LDeferredCode { | 2722   class DeferredInstanceOfKnownGlobal final : public LDeferredCode { | 
| 2723    public: | 2723    public: | 
| 2724     DeferredInstanceOfKnownGlobal(LCodeGen* codegen, | 2724     DeferredInstanceOfKnownGlobal(LCodeGen* codegen, | 
| 2725                                   LInstanceOfKnownGlobal* instr) | 2725                                   LInstanceOfKnownGlobal* instr) | 
| 2726         : LDeferredCode(codegen), instr_(instr) { } | 2726         : LDeferredCode(codegen), instr_(instr) { } | 
| 2727     void Generate() OVERRIDE { | 2727     void Generate() override { | 
| 2728       codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); | 2728       codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); | 
| 2729     } | 2729     } | 
| 2730     LInstruction* instr() OVERRIDE { return instr_; } | 2730     LInstruction* instr() override { return instr_; } | 
| 2731     Label* map_check() { return &map_check_; } | 2731     Label* map_check() { return &map_check_; } | 
| 2732 | 2732 | 
| 2733    private: | 2733    private: | 
| 2734     LInstanceOfKnownGlobal* instr_; | 2734     LInstanceOfKnownGlobal* instr_; | 
| 2735     Label map_check_; | 2735     Label map_check_; | 
| 2736   }; | 2736   }; | 
| 2737 | 2737 | 
| 2738   DeferredInstanceOfKnownGlobal* deferred; | 2738   DeferredInstanceOfKnownGlobal* deferred; | 
| 2739   deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); | 2739   deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); | 
| 2740 | 2740 | 
| (...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3662   __ mov(result, input); | 3662   __ mov(result, input); | 
| 3663   __ subu(result, zero_reg, input); | 3663   __ subu(result, zero_reg, input); | 
| 3664   // Overflow if result is still negative, i.e. 0x80000000. | 3664   // Overflow if result is still negative, i.e. 0x80000000. | 
| 3665   DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, result, Operand(zero_reg)); | 3665   DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, result, Operand(zero_reg)); | 
| 3666   __ bind(&done); | 3666   __ bind(&done); | 
| 3667 } | 3667 } | 
| 3668 | 3668 | 
| 3669 | 3669 | 
| 3670 void LCodeGen::DoMathAbs(LMathAbs* instr) { | 3670 void LCodeGen::DoMathAbs(LMathAbs* instr) { | 
| 3671   // Class for deferred case. | 3671   // Class for deferred case. | 
| 3672   class DeferredMathAbsTaggedHeapNumber FINAL : public LDeferredCode { | 3672   class DeferredMathAbsTaggedHeapNumber final : public LDeferredCode { | 
| 3673    public: | 3673    public: | 
| 3674     DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr) | 3674     DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr) | 
| 3675         : LDeferredCode(codegen), instr_(instr) { } | 3675         : LDeferredCode(codegen), instr_(instr) { } | 
| 3676     void Generate() OVERRIDE { | 3676     void Generate() override { | 
| 3677       codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); | 3677       codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); | 
| 3678     } | 3678     } | 
| 3679     LInstruction* instr() OVERRIDE { return instr_; } | 3679     LInstruction* instr() override { return instr_; } | 
| 3680 | 3680 | 
| 3681    private: | 3681    private: | 
| 3682     LMathAbs* instr_; | 3682     LMathAbs* instr_; | 
| 3683   }; | 3683   }; | 
| 3684 | 3684 | 
| 3685   Representation r = instr->hydrogen()->value()->representation(); | 3685   Representation r = instr->hydrogen()->value()->representation(); | 
| 3686   if (r.IsDouble()) { | 3686   if (r.IsDouble()) { | 
| 3687     FPURegister input = ToDoubleRegister(instr->value()); | 3687     FPURegister input = ToDoubleRegister(instr->value()); | 
| 3688     FPURegister result = ToDoubleRegister(instr->result()); | 3688     FPURegister result = ToDoubleRegister(instr->result()); | 
| 3689     __ abs_d(result, input); | 3689     __ abs_d(result, input); | 
| (...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4522   DCHECK(ToRegister(instr->left()).is(a1)); | 4522   DCHECK(ToRegister(instr->left()).is(a1)); | 
| 4523   DCHECK(ToRegister(instr->right()).is(a0)); | 4523   DCHECK(ToRegister(instr->right()).is(a0)); | 
| 4524   StringAddStub stub(isolate(), | 4524   StringAddStub stub(isolate(), | 
| 4525                      instr->hydrogen()->flags(), | 4525                      instr->hydrogen()->flags(), | 
| 4526                      instr->hydrogen()->pretenure_flag()); | 4526                      instr->hydrogen()->pretenure_flag()); | 
| 4527   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 4527   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 
| 4528 } | 4528 } | 
| 4529 | 4529 | 
| 4530 | 4530 | 
| 4531 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { | 4531 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { | 
| 4532   class DeferredStringCharCodeAt FINAL : public LDeferredCode { | 4532   class DeferredStringCharCodeAt final : public LDeferredCode { | 
| 4533    public: | 4533    public: | 
| 4534     DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) | 4534     DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) | 
| 4535         : LDeferredCode(codegen), instr_(instr) { } | 4535         : LDeferredCode(codegen), instr_(instr) { } | 
| 4536     void Generate() OVERRIDE { codegen()->DoDeferredStringCharCodeAt(instr_); } | 4536     void Generate() override { codegen()->DoDeferredStringCharCodeAt(instr_); } | 
| 4537     LInstruction* instr() OVERRIDE { return instr_; } | 4537     LInstruction* instr() override { return instr_; } | 
| 4538 | 4538 | 
| 4539    private: | 4539    private: | 
| 4540     LStringCharCodeAt* instr_; | 4540     LStringCharCodeAt* instr_; | 
| 4541   }; | 4541   }; | 
| 4542 | 4542 | 
| 4543   DeferredStringCharCodeAt* deferred = | 4543   DeferredStringCharCodeAt* deferred = | 
| 4544       new(zone()) DeferredStringCharCodeAt(this, instr); | 4544       new(zone()) DeferredStringCharCodeAt(this, instr); | 
| 4545   StringCharLoadGenerator::Generate(masm(), | 4545   StringCharLoadGenerator::Generate(masm(), | 
| 4546                                     ToRegister(instr->string()), | 4546                                     ToRegister(instr->string()), | 
| 4547                                     ToRegister(instr->index()), | 4547                                     ToRegister(instr->index()), | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 4576   } | 4576   } | 
| 4577   CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, | 4577   CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr, | 
| 4578                           instr->context()); | 4578                           instr->context()); | 
| 4579   __ AssertSmi(v0); | 4579   __ AssertSmi(v0); | 
| 4580   __ SmiUntag(v0); | 4580   __ SmiUntag(v0); | 
| 4581   __ StoreToSafepointRegisterSlot(v0, result); | 4581   __ StoreToSafepointRegisterSlot(v0, result); | 
| 4582 } | 4582 } | 
| 4583 | 4583 | 
| 4584 | 4584 | 
| 4585 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { | 4585 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { | 
| 4586   class DeferredStringCharFromCode FINAL : public LDeferredCode { | 4586   class DeferredStringCharFromCode final : public LDeferredCode { | 
| 4587    public: | 4587    public: | 
| 4588     DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) | 4588     DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) | 
| 4589         : LDeferredCode(codegen), instr_(instr) { } | 4589         : LDeferredCode(codegen), instr_(instr) { } | 
| 4590     void Generate() OVERRIDE { | 4590     void Generate() override { | 
| 4591       codegen()->DoDeferredStringCharFromCode(instr_); | 4591       codegen()->DoDeferredStringCharFromCode(instr_); | 
| 4592     } | 4592     } | 
| 4593     LInstruction* instr() OVERRIDE { return instr_; } | 4593     LInstruction* instr() override { return instr_; } | 
| 4594 | 4594 | 
| 4595    private: | 4595    private: | 
| 4596     LStringCharFromCode* instr_; | 4596     LStringCharFromCode* instr_; | 
| 4597   }; | 4597   }; | 
| 4598 | 4598 | 
| 4599   DeferredStringCharFromCode* deferred = | 4599   DeferredStringCharFromCode* deferred = | 
| 4600       new(zone()) DeferredStringCharFromCode(this, instr); | 4600       new(zone()) DeferredStringCharFromCode(this, instr); | 
| 4601 | 4601 | 
| 4602   DCHECK(instr->hydrogen()->value()->representation().IsInteger32()); | 4602   DCHECK(instr->hydrogen()->value()->representation().IsInteger32()); | 
| 4603   Register char_code = ToRegister(instr->char_code()); | 4603   Register char_code = ToRegister(instr->char_code()); | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4655   LOperand* input = instr->value(); | 4655   LOperand* input = instr->value(); | 
| 4656   LOperand* output = instr->result(); | 4656   LOperand* output = instr->result(); | 
| 4657 | 4657 | 
| 4658   FPURegister dbl_scratch = double_scratch0(); | 4658   FPURegister dbl_scratch = double_scratch0(); | 
| 4659   __ mtc1(ToRegister(input), dbl_scratch); | 4659   __ mtc1(ToRegister(input), dbl_scratch); | 
| 4660   __ Cvt_d_uw(ToDoubleRegister(output), dbl_scratch, f22); | 4660   __ Cvt_d_uw(ToDoubleRegister(output), dbl_scratch, f22); | 
| 4661 } | 4661 } | 
| 4662 | 4662 | 
| 4663 | 4663 | 
| 4664 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { | 4664 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { | 
| 4665   class DeferredNumberTagI FINAL : public LDeferredCode { | 4665   class DeferredNumberTagI final : public LDeferredCode { | 
| 4666    public: | 4666    public: | 
| 4667     DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) | 4667     DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) | 
| 4668         : LDeferredCode(codegen), instr_(instr) { } | 4668         : LDeferredCode(codegen), instr_(instr) { } | 
| 4669     void Generate() OVERRIDE { | 4669     void Generate() override { | 
| 4670       codegen()->DoDeferredNumberTagIU(instr_, | 4670       codegen()->DoDeferredNumberTagIU(instr_, | 
| 4671                                        instr_->value(), | 4671                                        instr_->value(), | 
| 4672                                        instr_->temp1(), | 4672                                        instr_->temp1(), | 
| 4673                                        instr_->temp2(), | 4673                                        instr_->temp2(), | 
| 4674                                        SIGNED_INT32); | 4674                                        SIGNED_INT32); | 
| 4675     } | 4675     } | 
| 4676     LInstruction* instr() OVERRIDE { return instr_; } | 4676     LInstruction* instr() override { return instr_; } | 
| 4677 | 4677 | 
| 4678    private: | 4678    private: | 
| 4679     LNumberTagI* instr_; | 4679     LNumberTagI* instr_; | 
| 4680   }; | 4680   }; | 
| 4681 | 4681 | 
| 4682   Register src = ToRegister(instr->value()); | 4682   Register src = ToRegister(instr->value()); | 
| 4683   Register dst = ToRegister(instr->result()); | 4683   Register dst = ToRegister(instr->result()); | 
| 4684   Register overflow = scratch0(); | 4684   Register overflow = scratch0(); | 
| 4685 | 4685 | 
| 4686   DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr); | 4686   DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr); | 
| 4687   __ SmiTagCheckOverflow(dst, src, overflow); | 4687   __ SmiTagCheckOverflow(dst, src, overflow); | 
| 4688   __ BranchOnOverflow(deferred->entry(), overflow); | 4688   __ BranchOnOverflow(deferred->entry(), overflow); | 
| 4689   __ bind(deferred->exit()); | 4689   __ bind(deferred->exit()); | 
| 4690 } | 4690 } | 
| 4691 | 4691 | 
| 4692 | 4692 | 
| 4693 void LCodeGen::DoNumberTagU(LNumberTagU* instr) { | 4693 void LCodeGen::DoNumberTagU(LNumberTagU* instr) { | 
| 4694   class DeferredNumberTagU FINAL : public LDeferredCode { | 4694   class DeferredNumberTagU final : public LDeferredCode { | 
| 4695    public: | 4695    public: | 
| 4696     DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr) | 4696     DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr) | 
| 4697         : LDeferredCode(codegen), instr_(instr) { } | 4697         : LDeferredCode(codegen), instr_(instr) { } | 
| 4698     void Generate() OVERRIDE { | 4698     void Generate() override { | 
| 4699       codegen()->DoDeferredNumberTagIU(instr_, | 4699       codegen()->DoDeferredNumberTagIU(instr_, | 
| 4700                                        instr_->value(), | 4700                                        instr_->value(), | 
| 4701                                        instr_->temp1(), | 4701                                        instr_->temp1(), | 
| 4702                                        instr_->temp2(), | 4702                                        instr_->temp2(), | 
| 4703                                        UNSIGNED_INT32); | 4703                                        UNSIGNED_INT32); | 
| 4704     } | 4704     } | 
| 4705     LInstruction* instr() OVERRIDE { return instr_; } | 4705     LInstruction* instr() override { return instr_; } | 
| 4706 | 4706 | 
| 4707    private: | 4707    private: | 
| 4708     LNumberTagU* instr_; | 4708     LNumberTagU* instr_; | 
| 4709   }; | 4709   }; | 
| 4710 | 4710 | 
| 4711   Register input = ToRegister(instr->value()); | 4711   Register input = ToRegister(instr->value()); | 
| 4712   Register result = ToRegister(instr->result()); | 4712   Register result = ToRegister(instr->result()); | 
| 4713 | 4713 | 
| 4714   DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr); | 4714   DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr); | 
| 4715   __ Branch(deferred->entry(), hi, input, Operand(Smi::kMaxValue)); | 4715   __ Branch(deferred->entry(), hi, input, Operand(Smi::kMaxValue)); | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4779 | 4779 | 
| 4780   // Done. Put the value in dbl_scratch into the value of the allocated heap | 4780   // Done. Put the value in dbl_scratch into the value of the allocated heap | 
| 4781   // number. | 4781   // number. | 
| 4782   __ bind(&done); | 4782   __ bind(&done); | 
| 4783   __ sdc1(dbl_scratch, MemOperand(dst, HeapNumber::kValueOffset)); | 4783   __ sdc1(dbl_scratch, MemOperand(dst, HeapNumber::kValueOffset)); | 
| 4784   __ Addu(dst, dst, kHeapObjectTag); | 4784   __ Addu(dst, dst, kHeapObjectTag); | 
| 4785 } | 4785 } | 
| 4786 | 4786 | 
| 4787 | 4787 | 
| 4788 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { | 4788 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { | 
| 4789   class DeferredNumberTagD FINAL : public LDeferredCode { | 4789   class DeferredNumberTagD final : public LDeferredCode { | 
| 4790    public: | 4790    public: | 
| 4791     DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) | 4791     DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) | 
| 4792         : LDeferredCode(codegen), instr_(instr) { } | 4792         : LDeferredCode(codegen), instr_(instr) { } | 
| 4793     void Generate() OVERRIDE { codegen()->DoDeferredNumberTagD(instr_); } | 4793     void Generate() override { codegen()->DoDeferredNumberTagD(instr_); } | 
| 4794     LInstruction* instr() OVERRIDE { return instr_; } | 4794     LInstruction* instr() override { return instr_; } | 
| 4795 | 4795 | 
| 4796    private: | 4796    private: | 
| 4797     LNumberTagD* instr_; | 4797     LNumberTagD* instr_; | 
| 4798   }; | 4798   }; | 
| 4799 | 4799 | 
| 4800   DoubleRegister input_reg = ToDoubleRegister(instr->value()); | 4800   DoubleRegister input_reg = ToDoubleRegister(instr->value()); | 
| 4801   Register scratch = scratch0(); | 4801   Register scratch = scratch0(); | 
| 4802   Register reg = ToRegister(instr->result()); | 4802   Register reg = ToRegister(instr->result()); | 
| 4803   Register temp1 = ToRegister(instr->temp()); | 4803   Register temp1 = ToRegister(instr->temp()); | 
| 4804   Register temp2 = ToRegister(instr->temp2()); | 4804   Register temp2 = ToRegister(instr->temp2()); | 
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5007       __ And(scratch1, scratch1, Operand(HeapNumber::kSignMask)); | 5007       __ And(scratch1, scratch1, Operand(HeapNumber::kSignMask)); | 
| 5008       DeoptimizeIf(ne, instr, Deoptimizer::kMinusZero, scratch1, | 5008       DeoptimizeIf(ne, instr, Deoptimizer::kMinusZero, scratch1, | 
| 5009                    Operand(zero_reg)); | 5009                    Operand(zero_reg)); | 
| 5010     } | 5010     } | 
| 5011   } | 5011   } | 
| 5012   __ bind(&done); | 5012   __ bind(&done); | 
| 5013 } | 5013 } | 
| 5014 | 5014 | 
| 5015 | 5015 | 
| 5016 void LCodeGen::DoTaggedToI(LTaggedToI* instr) { | 5016 void LCodeGen::DoTaggedToI(LTaggedToI* instr) { | 
| 5017   class DeferredTaggedToI FINAL : public LDeferredCode { | 5017   class DeferredTaggedToI final : public LDeferredCode { | 
| 5018    public: | 5018    public: | 
| 5019     DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr) | 5019     DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr) | 
| 5020         : LDeferredCode(codegen), instr_(instr) { } | 5020         : LDeferredCode(codegen), instr_(instr) { } | 
| 5021     void Generate() OVERRIDE { codegen()->DoDeferredTaggedToI(instr_); } | 5021     void Generate() override { codegen()->DoDeferredTaggedToI(instr_); } | 
| 5022     LInstruction* instr() OVERRIDE { return instr_; } | 5022     LInstruction* instr() override { return instr_; } | 
| 5023 | 5023 | 
| 5024    private: | 5024    private: | 
| 5025     LTaggedToI* instr_; | 5025     LTaggedToI* instr_; | 
| 5026   }; | 5026   }; | 
| 5027 | 5027 | 
| 5028   LOperand* input = instr->value(); | 5028   LOperand* input = instr->value(); | 
| 5029   DCHECK(input->IsRegister()); | 5029   DCHECK(input->IsRegister()); | 
| 5030   DCHECK(input->Equals(instr->result())); | 5030   DCHECK(input->Equals(instr->result())); | 
| 5031 | 5031 | 
| 5032   Register input_reg = ToRegister(input); | 5032   Register input_reg = ToRegister(input); | 
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5220         instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); | 5220         instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); | 
| 5221     __ StoreToSafepointRegisterSlot(v0, scratch0()); | 5221     __ StoreToSafepointRegisterSlot(v0, scratch0()); | 
| 5222   } | 5222   } | 
| 5223   __ SmiTst(scratch0(), at); | 5223   __ SmiTst(scratch0(), at); | 
| 5224   DeoptimizeIf(eq, instr, Deoptimizer::kInstanceMigrationFailed, at, | 5224   DeoptimizeIf(eq, instr, Deoptimizer::kInstanceMigrationFailed, at, | 
| 5225                Operand(zero_reg)); | 5225                Operand(zero_reg)); | 
| 5226 } | 5226 } | 
| 5227 | 5227 | 
| 5228 | 5228 | 
| 5229 void LCodeGen::DoCheckMaps(LCheckMaps* instr) { | 5229 void LCodeGen::DoCheckMaps(LCheckMaps* instr) { | 
| 5230   class DeferredCheckMaps FINAL : public LDeferredCode { | 5230   class DeferredCheckMaps final : public LDeferredCode { | 
| 5231    public: | 5231    public: | 
| 5232     DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object) | 5232     DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object) | 
| 5233         : LDeferredCode(codegen), instr_(instr), object_(object) { | 5233         : LDeferredCode(codegen), instr_(instr), object_(object) { | 
| 5234       SetExit(check_maps()); | 5234       SetExit(check_maps()); | 
| 5235     } | 5235     } | 
| 5236     void Generate() OVERRIDE { | 5236     void Generate() override { | 
| 5237       codegen()->DoDeferredInstanceMigration(instr_, object_); | 5237       codegen()->DoDeferredInstanceMigration(instr_, object_); | 
| 5238     } | 5238     } | 
| 5239     Label* check_maps() { return &check_maps_; } | 5239     Label* check_maps() { return &check_maps_; } | 
| 5240     LInstruction* instr() OVERRIDE { return instr_; } | 5240     LInstruction* instr() override { return instr_; } | 
| 5241 | 5241 | 
| 5242    private: | 5242    private: | 
| 5243     LCheckMaps* instr_; | 5243     LCheckMaps* instr_; | 
| 5244     Label check_maps_; | 5244     Label check_maps_; | 
| 5245     Register object_; | 5245     Register object_; | 
| 5246   }; | 5246   }; | 
| 5247 | 5247 | 
| 5248   if (instr->hydrogen()->IsStabilityCheck()) { | 5248   if (instr->hydrogen()->IsStabilityCheck()) { | 
| 5249     const UniqueSet<Map>* maps = instr->hydrogen()->maps(); | 5249     const UniqueSet<Map>* maps = instr->hydrogen()->maps(); | 
| 5250     for (int i = 0; i < maps->size(); ++i) { | 5250     for (int i = 0; i < maps->size(); ++i) { | 
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5346 | 5346 | 
| 5347 void LCodeGen::DoConstructDouble(LConstructDouble* instr) { | 5347 void LCodeGen::DoConstructDouble(LConstructDouble* instr) { | 
| 5348   Register hi_reg = ToRegister(instr->hi()); | 5348   Register hi_reg = ToRegister(instr->hi()); | 
| 5349   Register lo_reg = ToRegister(instr->lo()); | 5349   Register lo_reg = ToRegister(instr->lo()); | 
| 5350   DoubleRegister result_reg = ToDoubleRegister(instr->result()); | 5350   DoubleRegister result_reg = ToDoubleRegister(instr->result()); | 
| 5351   __ Move(result_reg, lo_reg, hi_reg); | 5351   __ Move(result_reg, lo_reg, hi_reg); | 
| 5352 } | 5352 } | 
| 5353 | 5353 | 
| 5354 | 5354 | 
| 5355 void LCodeGen::DoAllocate(LAllocate* instr) { | 5355 void LCodeGen::DoAllocate(LAllocate* instr) { | 
| 5356   class DeferredAllocate FINAL : public LDeferredCode { | 5356   class DeferredAllocate final : public LDeferredCode { | 
| 5357    public: | 5357    public: | 
| 5358     DeferredAllocate(LCodeGen* codegen, LAllocate* instr) | 5358     DeferredAllocate(LCodeGen* codegen, LAllocate* instr) | 
| 5359         : LDeferredCode(codegen), instr_(instr) { } | 5359         : LDeferredCode(codegen), instr_(instr) { } | 
| 5360     void Generate() OVERRIDE { codegen()->DoDeferredAllocate(instr_); } | 5360     void Generate() override { codegen()->DoDeferredAllocate(instr_); } | 
| 5361     LInstruction* instr() OVERRIDE { return instr_; } | 5361     LInstruction* instr() override { return instr_; } | 
| 5362 | 5362 | 
| 5363    private: | 5363    private: | 
| 5364     LAllocate* instr_; | 5364     LAllocate* instr_; | 
| 5365   }; | 5365   }; | 
| 5366 | 5366 | 
| 5367   DeferredAllocate* deferred = | 5367   DeferredAllocate* deferred = | 
| 5368       new(zone()) DeferredAllocate(this, instr); | 5368       new(zone()) DeferredAllocate(this, instr); | 
| 5369 | 5369 | 
| 5370   Register result = ToRegister(instr->result()); | 5370   Register result = ToRegister(instr->result()); | 
| 5371   Register scratch = ToRegister(instr->temp1()); | 5371   Register scratch = ToRegister(instr->temp1()); | 
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5750   __ CallRuntimeSaveDoubles(Runtime::kStackGuard); | 5750   __ CallRuntimeSaveDoubles(Runtime::kStackGuard); | 
| 5751   RecordSafepointWithLazyDeopt( | 5751   RecordSafepointWithLazyDeopt( | 
| 5752       instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5752       instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 
| 5753   DCHECK(instr->HasEnvironment()); | 5753   DCHECK(instr->HasEnvironment()); | 
| 5754   LEnvironment* env = instr->environment(); | 5754   LEnvironment* env = instr->environment(); | 
| 5755   safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 5755   safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 
| 5756 } | 5756 } | 
| 5757 | 5757 | 
| 5758 | 5758 | 
| 5759 void LCodeGen::DoStackCheck(LStackCheck* instr) { | 5759 void LCodeGen::DoStackCheck(LStackCheck* instr) { | 
| 5760   class DeferredStackCheck FINAL : public LDeferredCode { | 5760   class DeferredStackCheck final : public LDeferredCode { | 
| 5761    public: | 5761    public: | 
| 5762     DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) | 5762     DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) | 
| 5763         : LDeferredCode(codegen), instr_(instr) { } | 5763         : LDeferredCode(codegen), instr_(instr) { } | 
| 5764     void Generate() OVERRIDE { codegen()->DoDeferredStackCheck(instr_); } | 5764     void Generate() override { codegen()->DoDeferredStackCheck(instr_); } | 
| 5765     LInstruction* instr() OVERRIDE { return instr_; } | 5765     LInstruction* instr() override { return instr_; } | 
| 5766 | 5766 | 
| 5767    private: | 5767    private: | 
| 5768     LStackCheck* instr_; | 5768     LStackCheck* instr_; | 
| 5769   }; | 5769   }; | 
| 5770 | 5770 | 
| 5771   DCHECK(instr->HasEnvironment()); | 5771   DCHECK(instr->HasEnvironment()); | 
| 5772   LEnvironment* env = instr->environment(); | 5772   LEnvironment* env = instr->environment(); | 
| 5773   // There is no LLazyBailout instruction for stack-checks. We have to | 5773   // There is no LLazyBailout instruction for stack-checks. We have to | 
| 5774   // prepare for lazy deoptimization explicitly here. | 5774   // prepare for lazy deoptimization explicitly here. | 
| 5775   if (instr->hydrogen()->is_function_entry()) { | 5775   if (instr->hydrogen()->is_function_entry()) { | 
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5886   __ Push(object, index); | 5886   __ Push(object, index); | 
| 5887   __ mov(cp, zero_reg); | 5887   __ mov(cp, zero_reg); | 
| 5888   __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); | 5888   __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); | 
| 5889   RecordSafepointWithRegisters( | 5889   RecordSafepointWithRegisters( | 
| 5890      instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); | 5890      instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); | 
| 5891   __ StoreToSafepointRegisterSlot(v0, result); | 5891   __ StoreToSafepointRegisterSlot(v0, result); | 
| 5892 } | 5892 } | 
| 5893 | 5893 | 
| 5894 | 5894 | 
| 5895 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { | 5895 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { | 
| 5896   class DeferredLoadMutableDouble FINAL : public LDeferredCode { | 5896   class DeferredLoadMutableDouble final : public LDeferredCode { | 
| 5897    public: | 5897    public: | 
| 5898     DeferredLoadMutableDouble(LCodeGen* codegen, | 5898     DeferredLoadMutableDouble(LCodeGen* codegen, | 
| 5899                               LLoadFieldByIndex* instr, | 5899                               LLoadFieldByIndex* instr, | 
| 5900                               Register result, | 5900                               Register result, | 
| 5901                               Register object, | 5901                               Register object, | 
| 5902                               Register index) | 5902                               Register index) | 
| 5903         : LDeferredCode(codegen), | 5903         : LDeferredCode(codegen), | 
| 5904           instr_(instr), | 5904           instr_(instr), | 
| 5905           result_(result), | 5905           result_(result), | 
| 5906           object_(object), | 5906           object_(object), | 
| 5907           index_(index) { | 5907           index_(index) { | 
| 5908     } | 5908     } | 
| 5909     void Generate() OVERRIDE { | 5909     void Generate() override { | 
| 5910       codegen()->DoDeferredLoadMutableDouble(instr_, result_, object_, index_); | 5910       codegen()->DoDeferredLoadMutableDouble(instr_, result_, object_, index_); | 
| 5911     } | 5911     } | 
| 5912     LInstruction* instr() OVERRIDE { return instr_; } | 5912     LInstruction* instr() override { return instr_; } | 
| 5913 | 5913 | 
| 5914    private: | 5914    private: | 
| 5915     LLoadFieldByIndex* instr_; | 5915     LLoadFieldByIndex* instr_; | 
| 5916     Register result_; | 5916     Register result_; | 
| 5917     Register object_; | 5917     Register object_; | 
| 5918     Register index_; | 5918     Register index_; | 
| 5919   }; | 5919   }; | 
| 5920 | 5920 | 
| 5921   Register object = ToRegister(instr->object()); | 5921   Register object = ToRegister(instr->object()); | 
| 5922   Register index = ToRegister(instr->index()); | 5922   Register index = ToRegister(instr->index()); | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5964   __ li(at, scope_info); | 5964   __ li(at, scope_info); | 
| 5965   __ Push(at, ToRegister(instr->function())); | 5965   __ Push(at, ToRegister(instr->function())); | 
| 5966   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5966   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 
| 5967   RecordSafepoint(Safepoint::kNoLazyDeopt); | 5967   RecordSafepoint(Safepoint::kNoLazyDeopt); | 
| 5968 } | 5968 } | 
| 5969 | 5969 | 
| 5970 | 5970 | 
| 5971 #undef __ | 5971 #undef __ | 
| 5972 | 5972 | 
| 5973 } }  // namespace v8::internal | 5973 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|