Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 1088993003: Replace OVERRIDE->override and FINAL->final since we now require C++11. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x64/lithium-codegen-x64.h ('k') | src/x64/lithium-gap-resolver-x64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X64 7 #if V8_TARGET_ARCH_X64
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
11 #include "src/code-stubs.h" 11 #include "src/code-stubs.h"
12 #include "src/cpu-profiler.h" 12 #include "src/cpu-profiler.h"
13 #include "src/hydrogen-osr.h" 13 #include "src/hydrogen-osr.h"
14 #include "src/ic/ic.h" 14 #include "src/ic/ic.h"
15 #include "src/ic/stub-cache.h" 15 #include "src/ic/stub-cache.h"
16 #include "src/x64/lithium-codegen-x64.h" 16 #include "src/x64/lithium-codegen-x64.h"
17 17
18 namespace v8 { 18 namespace v8 {
19 namespace internal { 19 namespace internal {
20 20
21 21
22 // When invoking builtins, we need to record the safepoint in the middle of 22 // When invoking builtins, we need to record the safepoint in the middle of
23 // the invoke instruction sequence generated by the macro assembler. 23 // the invoke instruction sequence generated by the macro assembler.
24 class SafepointGenerator FINAL : public CallWrapper { 24 class SafepointGenerator final : public CallWrapper {
25 public: 25 public:
26 SafepointGenerator(LCodeGen* codegen, 26 SafepointGenerator(LCodeGen* codegen,
27 LPointerMap* pointers, 27 LPointerMap* pointers,
28 Safepoint::DeoptMode mode) 28 Safepoint::DeoptMode mode)
29 : codegen_(codegen), 29 : codegen_(codegen),
30 pointers_(pointers), 30 pointers_(pointers),
31 deopt_mode_(mode) { } 31 deopt_mode_(mode) { }
32 virtual ~SafepointGenerator() {} 32 virtual ~SafepointGenerator() {}
33 33
34 void BeforeCall(int call_size) const OVERRIDE {} 34 void BeforeCall(int call_size) const override {}
35 35
36 void AfterCall() const OVERRIDE { 36 void AfterCall() const override {
37 codegen_->RecordSafepoint(pointers_, deopt_mode_); 37 codegen_->RecordSafepoint(pointers_, deopt_mode_);
38 } 38 }
39 39
40 private: 40 private:
41 LCodeGen* codegen_; 41 LCodeGen* codegen_;
42 LPointerMap* pointers_; 42 LPointerMap* pointers_;
43 Safepoint::DeoptMode deopt_mode_; 43 Safepoint::DeoptMode deopt_mode_;
44 }; 44 };
45 45
46 46
(...skipping 2664 matching lines...) Expand 10 before | Expand all | Expand 10 after
2711 __ j(zero, &true_value, Label::kNear); 2711 __ j(zero, &true_value, Label::kNear);
2712 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); 2712 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex);
2713 __ jmp(&done, Label::kNear); 2713 __ jmp(&done, Label::kNear);
2714 __ bind(&true_value); 2714 __ bind(&true_value);
2715 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); 2715 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex);
2716 __ bind(&done); 2716 __ bind(&done);
2717 } 2717 }
2718 2718
2719 2719
2720 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { 2720 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
2721 class DeferredInstanceOfKnownGlobal FINAL : public LDeferredCode { 2721 class DeferredInstanceOfKnownGlobal final : public LDeferredCode {
2722 public: 2722 public:
2723 DeferredInstanceOfKnownGlobal(LCodeGen* codegen, 2723 DeferredInstanceOfKnownGlobal(LCodeGen* codegen,
2724 LInstanceOfKnownGlobal* instr) 2724 LInstanceOfKnownGlobal* instr)
2725 : LDeferredCode(codegen), instr_(instr) { } 2725 : LDeferredCode(codegen), instr_(instr) { }
2726 void Generate() OVERRIDE { 2726 void Generate() override {
2727 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); 2727 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_);
2728 } 2728 }
2729 LInstruction* instr() OVERRIDE { return instr_; } 2729 LInstruction* instr() override { return instr_; }
2730 Label* map_check() { return &map_check_; } 2730 Label* map_check() { return &map_check_; }
2731 private: 2731 private:
2732 LInstanceOfKnownGlobal* instr_; 2732 LInstanceOfKnownGlobal* instr_;
2733 Label map_check_; 2733 Label map_check_;
2734 }; 2734 };
2735 2735
2736 DCHECK(ToRegister(instr->context()).is(rsi)); 2736 DCHECK(ToRegister(instr->context()).is(rsi));
2737 DeferredInstanceOfKnownGlobal* deferred; 2737 DeferredInstanceOfKnownGlobal* deferred;
2738 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); 2738 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr);
2739 2739
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
3694 Label is_positive; 3694 Label is_positive;
3695 __ j(not_sign, &is_positive, Label::kNear); 3695 __ j(not_sign, &is_positive, Label::kNear);
3696 __ negp(input_reg); // Sets flags. 3696 __ negp(input_reg); // Sets flags.
3697 DeoptimizeIf(negative, instr, Deoptimizer::kOverflow); 3697 DeoptimizeIf(negative, instr, Deoptimizer::kOverflow);
3698 __ bind(&is_positive); 3698 __ bind(&is_positive);
3699 } 3699 }
3700 3700
3701 3701
3702 void LCodeGen::DoMathAbs(LMathAbs* instr) { 3702 void LCodeGen::DoMathAbs(LMathAbs* instr) {
3703 // Class for deferred case. 3703 // Class for deferred case.
3704 class DeferredMathAbsTaggedHeapNumber FINAL : public LDeferredCode { 3704 class DeferredMathAbsTaggedHeapNumber final : public LDeferredCode {
3705 public: 3705 public:
3706 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr) 3706 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr)
3707 : LDeferredCode(codegen), instr_(instr) { } 3707 : LDeferredCode(codegen), instr_(instr) { }
3708 void Generate() OVERRIDE { 3708 void Generate() override {
3709 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); 3709 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_);
3710 } 3710 }
3711 LInstruction* instr() OVERRIDE { return instr_; } 3711 LInstruction* instr() override { return instr_; }
3712 3712
3713 private: 3713 private:
3714 LMathAbs* instr_; 3714 LMathAbs* instr_;
3715 }; 3715 };
3716 3716
3717 DCHECK(instr->value()->Equals(instr->result())); 3717 DCHECK(instr->value()->Equals(instr->result()));
3718 Representation r = instr->hydrogen()->value()->representation(); 3718 Representation r = instr->hydrogen()->value()->representation();
3719 3719
3720 if (r.IsDouble()) { 3720 if (r.IsDouble()) {
3721 XMMRegister scratch = double_scratch0(); 3721 XMMRegister scratch = double_scratch0();
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after
4578 DCHECK(ToRegister(instr->left()).is(rdx)); 4578 DCHECK(ToRegister(instr->left()).is(rdx));
4579 DCHECK(ToRegister(instr->right()).is(rax)); 4579 DCHECK(ToRegister(instr->right()).is(rax));
4580 StringAddStub stub(isolate(), 4580 StringAddStub stub(isolate(),
4581 instr->hydrogen()->flags(), 4581 instr->hydrogen()->flags(),
4582 instr->hydrogen()->pretenure_flag()); 4582 instr->hydrogen()->pretenure_flag());
4583 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); 4583 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
4584 } 4584 }
4585 4585
4586 4586
4587 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { 4587 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
4588 class DeferredStringCharCodeAt FINAL : public LDeferredCode { 4588 class DeferredStringCharCodeAt final : public LDeferredCode {
4589 public: 4589 public:
4590 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) 4590 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr)
4591 : LDeferredCode(codegen), instr_(instr) { } 4591 : LDeferredCode(codegen), instr_(instr) { }
4592 void Generate() OVERRIDE { codegen()->DoDeferredStringCharCodeAt(instr_); } 4592 void Generate() override { codegen()->DoDeferredStringCharCodeAt(instr_); }
4593 LInstruction* instr() OVERRIDE { return instr_; } 4593 LInstruction* instr() override { return instr_; }
4594 4594
4595 private: 4595 private:
4596 LStringCharCodeAt* instr_; 4596 LStringCharCodeAt* instr_;
4597 }; 4597 };
4598 4598
4599 DeferredStringCharCodeAt* deferred = 4599 DeferredStringCharCodeAt* deferred =
4600 new(zone()) DeferredStringCharCodeAt(this, instr); 4600 new(zone()) DeferredStringCharCodeAt(this, instr);
4601 4601
4602 StringCharLoadGenerator::Generate(masm(), 4602 StringCharLoadGenerator::Generate(masm(),
4603 ToRegister(instr->string()), 4603 ToRegister(instr->string()),
(...skipping 28 matching lines...) Expand all
4632 } 4632 }
4633 CallRuntimeFromDeferred( 4633 CallRuntimeFromDeferred(
4634 Runtime::kStringCharCodeAtRT, 2, instr, instr->context()); 4634 Runtime::kStringCharCodeAtRT, 2, instr, instr->context());
4635 __ AssertSmi(rax); 4635 __ AssertSmi(rax);
4636 __ SmiToInteger32(rax, rax); 4636 __ SmiToInteger32(rax, rax);
4637 __ StoreToSafepointRegisterSlot(result, rax); 4637 __ StoreToSafepointRegisterSlot(result, rax);
4638 } 4638 }
4639 4639
4640 4640
4641 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { 4641 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
4642 class DeferredStringCharFromCode FINAL : public LDeferredCode { 4642 class DeferredStringCharFromCode final : public LDeferredCode {
4643 public: 4643 public:
4644 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) 4644 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr)
4645 : LDeferredCode(codegen), instr_(instr) { } 4645 : LDeferredCode(codegen), instr_(instr) { }
4646 void Generate() OVERRIDE { 4646 void Generate() override {
4647 codegen()->DoDeferredStringCharFromCode(instr_); 4647 codegen()->DoDeferredStringCharFromCode(instr_);
4648 } 4648 }
4649 LInstruction* instr() OVERRIDE { return instr_; } 4649 LInstruction* instr() override { return instr_; }
4650 4650
4651 private: 4651 private:
4652 LStringCharFromCode* instr_; 4652 LStringCharFromCode* instr_;
4653 }; 4653 };
4654 4654
4655 DeferredStringCharFromCode* deferred = 4655 DeferredStringCharFromCode* deferred =
4656 new(zone()) DeferredStringCharFromCode(this, instr); 4656 new(zone()) DeferredStringCharFromCode(this, instr);
4657 4657
4658 DCHECK(instr->hydrogen()->value()->representation().IsInteger32()); 4658 DCHECK(instr->hydrogen()->value()->representation().IsInteger32());
4659 Register char_code = ToRegister(instr->char_code()); 4659 Register char_code = ToRegister(instr->char_code());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4705 4705
4706 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { 4706 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) {
4707 LOperand* input = instr->value(); 4707 LOperand* input = instr->value();
4708 LOperand* output = instr->result(); 4708 LOperand* output = instr->result();
4709 4709
4710 __ LoadUint32(ToDoubleRegister(output), ToRegister(input)); 4710 __ LoadUint32(ToDoubleRegister(output), ToRegister(input));
4711 } 4711 }
4712 4712
4713 4713
4714 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { 4714 void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
4715 class DeferredNumberTagI FINAL : public LDeferredCode { 4715 class DeferredNumberTagI final : public LDeferredCode {
4716 public: 4716 public:
4717 DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) 4717 DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr)
4718 : LDeferredCode(codegen), instr_(instr) { } 4718 : LDeferredCode(codegen), instr_(instr) { }
4719 void Generate() OVERRIDE { 4719 void Generate() override {
4720 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp1(), 4720 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp1(),
4721 instr_->temp2(), SIGNED_INT32); 4721 instr_->temp2(), SIGNED_INT32);
4722 } 4722 }
4723 LInstruction* instr() OVERRIDE { return instr_; } 4723 LInstruction* instr() override { return instr_; }
4724 4724
4725 private: 4725 private:
4726 LNumberTagI* instr_; 4726 LNumberTagI* instr_;
4727 }; 4727 };
4728 4728
4729 LOperand* input = instr->value(); 4729 LOperand* input = instr->value();
4730 DCHECK(input->IsRegister() && input->Equals(instr->result())); 4730 DCHECK(input->IsRegister() && input->Equals(instr->result()));
4731 Register reg = ToRegister(input); 4731 Register reg = ToRegister(input);
4732 4732
4733 if (SmiValuesAre32Bits()) { 4733 if (SmiValuesAre32Bits()) {
4734 __ Integer32ToSmi(reg, reg); 4734 __ Integer32ToSmi(reg, reg);
4735 } else { 4735 } else {
4736 DCHECK(SmiValuesAre31Bits()); 4736 DCHECK(SmiValuesAre31Bits());
4737 DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr); 4737 DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr);
4738 __ Integer32ToSmi(reg, reg); 4738 __ Integer32ToSmi(reg, reg);
4739 __ j(overflow, deferred->entry()); 4739 __ j(overflow, deferred->entry());
4740 __ bind(deferred->exit()); 4740 __ bind(deferred->exit());
4741 } 4741 }
4742 } 4742 }
4743 4743
4744 4744
4745 void LCodeGen::DoNumberTagU(LNumberTagU* instr) { 4745 void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
4746 class DeferredNumberTagU FINAL : public LDeferredCode { 4746 class DeferredNumberTagU final : public LDeferredCode {
4747 public: 4747 public:
4748 DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr) 4748 DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr)
4749 : LDeferredCode(codegen), instr_(instr) { } 4749 : LDeferredCode(codegen), instr_(instr) { }
4750 void Generate() OVERRIDE { 4750 void Generate() override {
4751 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp1(), 4751 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp1(),
4752 instr_->temp2(), UNSIGNED_INT32); 4752 instr_->temp2(), UNSIGNED_INT32);
4753 } 4753 }
4754 LInstruction* instr() OVERRIDE { return instr_; } 4754 LInstruction* instr() override { return instr_; }
4755 4755
4756 private: 4756 private:
4757 LNumberTagU* instr_; 4757 LNumberTagU* instr_;
4758 }; 4758 };
4759 4759
4760 LOperand* input = instr->value(); 4760 LOperand* input = instr->value();
4761 DCHECK(input->IsRegister() && input->Equals(instr->result())); 4761 DCHECK(input->IsRegister() && input->Equals(instr->result()));
4762 Register reg = ToRegister(input); 4762 Register reg = ToRegister(input);
4763 4763
4764 DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr); 4764 DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
4824 } 4824 }
4825 4825
4826 // Done. Put the value in temp_xmm into the value of the allocated heap 4826 // Done. Put the value in temp_xmm into the value of the allocated heap
4827 // number. 4827 // number.
4828 __ bind(&done); 4828 __ bind(&done);
4829 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), temp_xmm); 4829 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), temp_xmm);
4830 } 4830 }
4831 4831
4832 4832
4833 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { 4833 void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
4834 class DeferredNumberTagD FINAL : public LDeferredCode { 4834 class DeferredNumberTagD final : public LDeferredCode {
4835 public: 4835 public:
4836 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) 4836 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr)
4837 : LDeferredCode(codegen), instr_(instr) { } 4837 : LDeferredCode(codegen), instr_(instr) { }
4838 void Generate() OVERRIDE { codegen()->DoDeferredNumberTagD(instr_); } 4838 void Generate() override { codegen()->DoDeferredNumberTagD(instr_); }
4839 LInstruction* instr() OVERRIDE { return instr_; } 4839 LInstruction* instr() override { return instr_; }
4840 4840
4841 private: 4841 private:
4842 LNumberTagD* instr_; 4842 LNumberTagD* instr_;
4843 }; 4843 };
4844 4844
4845 XMMRegister input_reg = ToDoubleRegister(instr->value()); 4845 XMMRegister input_reg = ToDoubleRegister(instr->value());
4846 Register reg = ToRegister(instr->result()); 4846 Register reg = ToRegister(instr->result());
4847 Register tmp = ToRegister(instr->temp()); 4847 Register tmp = ToRegister(instr->temp());
4848 4848
4849 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); 4849 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
5019 __ j(not_zero, done); 5019 __ j(not_zero, done);
5020 __ movmskpd(input_reg, xmm0); 5020 __ movmskpd(input_reg, xmm0);
5021 __ andl(input_reg, Immediate(1)); 5021 __ andl(input_reg, Immediate(1));
5022 DeoptimizeIf(not_zero, instr, Deoptimizer::kMinusZero); 5022 DeoptimizeIf(not_zero, instr, Deoptimizer::kMinusZero);
5023 } 5023 }
5024 } 5024 }
5025 } 5025 }
5026 5026
5027 5027
5028 void LCodeGen::DoTaggedToI(LTaggedToI* instr) { 5028 void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
5029 class DeferredTaggedToI FINAL : public LDeferredCode { 5029 class DeferredTaggedToI final : public LDeferredCode {
5030 public: 5030 public:
5031 DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr) 5031 DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr)
5032 : LDeferredCode(codegen), instr_(instr) { } 5032 : LDeferredCode(codegen), instr_(instr) { }
5033 void Generate() OVERRIDE { codegen()->DoDeferredTaggedToI(instr_, done()); } 5033 void Generate() override { codegen()->DoDeferredTaggedToI(instr_, done()); }
5034 LInstruction* instr() OVERRIDE { return instr_; } 5034 LInstruction* instr() override { return instr_; }
5035 5035
5036 private: 5036 private:
5037 LTaggedToI* instr_; 5037 LTaggedToI* instr_;
5038 }; 5038 };
5039 5039
5040 LOperand* input = instr->value(); 5040 LOperand* input = instr->value();
5041 DCHECK(input->IsRegister()); 5041 DCHECK(input->IsRegister());
5042 DCHECK(input->Equals(instr->result())); 5042 DCHECK(input->Equals(instr->result()));
5043 Register input_reg = ToRegister(input); 5043 Register input_reg = ToRegister(input);
5044 5044
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
5207 RecordSafepointWithRegisters( 5207 RecordSafepointWithRegisters(
5208 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); 5208 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt);
5209 5209
5210 __ testp(rax, Immediate(kSmiTagMask)); 5210 __ testp(rax, Immediate(kSmiTagMask));
5211 } 5211 }
5212 DeoptimizeIf(zero, instr, Deoptimizer::kInstanceMigrationFailed); 5212 DeoptimizeIf(zero, instr, Deoptimizer::kInstanceMigrationFailed);
5213 } 5213 }
5214 5214
5215 5215
5216 void LCodeGen::DoCheckMaps(LCheckMaps* instr) { 5216 void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
5217 class DeferredCheckMaps FINAL : public LDeferredCode { 5217 class DeferredCheckMaps final : public LDeferredCode {
5218 public: 5218 public:
5219 DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object) 5219 DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
5220 : LDeferredCode(codegen), instr_(instr), object_(object) { 5220 : LDeferredCode(codegen), instr_(instr), object_(object) {
5221 SetExit(check_maps()); 5221 SetExit(check_maps());
5222 } 5222 }
5223 void Generate() OVERRIDE { 5223 void Generate() override {
5224 codegen()->DoDeferredInstanceMigration(instr_, object_); 5224 codegen()->DoDeferredInstanceMigration(instr_, object_);
5225 } 5225 }
5226 Label* check_maps() { return &check_maps_; } 5226 Label* check_maps() { return &check_maps_; }
5227 LInstruction* instr() OVERRIDE { return instr_; } 5227 LInstruction* instr() override { return instr_; }
5228 5228
5229 private: 5229 private:
5230 LCheckMaps* instr_; 5230 LCheckMaps* instr_;
5231 Label check_maps_; 5231 Label check_maps_;
5232 Register object_; 5232 Register object_;
5233 }; 5233 };
5234 5234
5235 if (instr->hydrogen()->IsStabilityCheck()) { 5235 if (instr->hydrogen()->IsStabilityCheck()) {
5236 const UniqueSet<Map>* maps = instr->hydrogen()->maps(); 5236 const UniqueSet<Map>* maps = instr->hydrogen()->maps();
5237 for (int i = 0; i < maps->size(); ++i) { 5237 for (int i = 0; i < maps->size(); ++i) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
5339 XMMRegister result_reg = ToDoubleRegister(instr->result()); 5339 XMMRegister result_reg = ToDoubleRegister(instr->result());
5340 XMMRegister xmm_scratch = double_scratch0(); 5340 XMMRegister xmm_scratch = double_scratch0();
5341 __ movd(result_reg, hi_reg); 5341 __ movd(result_reg, hi_reg);
5342 __ psllq(result_reg, 32); 5342 __ psllq(result_reg, 32);
5343 __ movd(xmm_scratch, lo_reg); 5343 __ movd(xmm_scratch, lo_reg);
5344 __ orps(result_reg, xmm_scratch); 5344 __ orps(result_reg, xmm_scratch);
5345 } 5345 }
5346 5346
5347 5347
5348 void LCodeGen::DoAllocate(LAllocate* instr) { 5348 void LCodeGen::DoAllocate(LAllocate* instr) {
5349 class DeferredAllocate FINAL : public LDeferredCode { 5349 class DeferredAllocate final : public LDeferredCode {
5350 public: 5350 public:
5351 DeferredAllocate(LCodeGen* codegen, LAllocate* instr) 5351 DeferredAllocate(LCodeGen* codegen, LAllocate* instr)
5352 : LDeferredCode(codegen), instr_(instr) { } 5352 : LDeferredCode(codegen), instr_(instr) { }
5353 void Generate() OVERRIDE { codegen()->DoDeferredAllocate(instr_); } 5353 void Generate() override { codegen()->DoDeferredAllocate(instr_); }
5354 LInstruction* instr() OVERRIDE { return instr_; } 5354 LInstruction* instr() override { return instr_; }
5355 5355
5356 private: 5356 private:
5357 LAllocate* instr_; 5357 LAllocate* instr_;
5358 }; 5358 };
5359 5359
5360 DeferredAllocate* deferred = 5360 DeferredAllocate* deferred =
5361 new(zone()) DeferredAllocate(this, instr); 5361 new(zone()) DeferredAllocate(this, instr);
5362 5362
5363 Register result = ToRegister(instr->result()); 5363 Register result = ToRegister(instr->result());
5364 Register temp = ToRegister(instr->temp()); 5364 Register temp = ToRegister(instr->temp());
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
5703 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); 5703 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
5704 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 5704 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
5705 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0); 5705 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0);
5706 DCHECK(instr->HasEnvironment()); 5706 DCHECK(instr->HasEnvironment());
5707 LEnvironment* env = instr->environment(); 5707 LEnvironment* env = instr->environment();
5708 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5708 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5709 } 5709 }
5710 5710
5711 5711
5712 void LCodeGen::DoStackCheck(LStackCheck* instr) { 5712 void LCodeGen::DoStackCheck(LStackCheck* instr) {
5713 class DeferredStackCheck FINAL : public LDeferredCode { 5713 class DeferredStackCheck final : public LDeferredCode {
5714 public: 5714 public:
5715 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) 5715 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr)
5716 : LDeferredCode(codegen), instr_(instr) { } 5716 : LDeferredCode(codegen), instr_(instr) { }
5717 void Generate() OVERRIDE { codegen()->DoDeferredStackCheck(instr_); } 5717 void Generate() override { codegen()->DoDeferredStackCheck(instr_); }
5718 LInstruction* instr() OVERRIDE { return instr_; } 5718 LInstruction* instr() override { return instr_; }
5719 5719
5720 private: 5720 private:
5721 LStackCheck* instr_; 5721 LStackCheck* instr_;
5722 }; 5722 };
5723 5723
5724 DCHECK(instr->HasEnvironment()); 5724 DCHECK(instr->HasEnvironment());
5725 LEnvironment* env = instr->environment(); 5725 LEnvironment* env = instr->environment();
5726 // There is no LLazyBailout instruction for stack-checks. We have to 5726 // There is no LLazyBailout instruction for stack-checks. We have to
5727 // prepare for lazy deoptimization explicitly here. 5727 // prepare for lazy deoptimization explicitly here.
5728 if (instr->hydrogen()->is_function_entry()) { 5728 if (instr->hydrogen()->is_function_entry()) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
5839 __ Push(index); 5839 __ Push(index);
5840 __ xorp(rsi, rsi); 5840 __ xorp(rsi, rsi);
5841 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); 5841 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble);
5842 RecordSafepointWithRegisters( 5842 RecordSafepointWithRegisters(
5843 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); 5843 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt);
5844 __ StoreToSafepointRegisterSlot(object, rax); 5844 __ StoreToSafepointRegisterSlot(object, rax);
5845 } 5845 }
5846 5846
5847 5847
5848 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { 5848 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) {
5849 class DeferredLoadMutableDouble FINAL : public LDeferredCode { 5849 class DeferredLoadMutableDouble final : public LDeferredCode {
5850 public: 5850 public:
5851 DeferredLoadMutableDouble(LCodeGen* codegen, 5851 DeferredLoadMutableDouble(LCodeGen* codegen,
5852 LLoadFieldByIndex* instr, 5852 LLoadFieldByIndex* instr,
5853 Register object, 5853 Register object,
5854 Register index) 5854 Register index)
5855 : LDeferredCode(codegen), 5855 : LDeferredCode(codegen),
5856 instr_(instr), 5856 instr_(instr),
5857 object_(object), 5857 object_(object),
5858 index_(index) { 5858 index_(index) {
5859 } 5859 }
5860 void Generate() OVERRIDE { 5860 void Generate() override {
5861 codegen()->DoDeferredLoadMutableDouble(instr_, object_, index_); 5861 codegen()->DoDeferredLoadMutableDouble(instr_, object_, index_);
5862 } 5862 }
5863 LInstruction* instr() OVERRIDE { return instr_; } 5863 LInstruction* instr() override { return instr_; }
5864 5864
5865 private: 5865 private:
5866 LLoadFieldByIndex* instr_; 5866 LLoadFieldByIndex* instr_;
5867 Register object_; 5867 Register object_;
5868 Register index_; 5868 Register index_;
5869 }; 5869 };
5870 5870
5871 Register object = ToRegister(instr->object()); 5871 Register object = ToRegister(instr->object());
5872 Register index = ToRegister(instr->index()); 5872 Register index = ToRegister(instr->index());
5873 5873
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
5916 CallRuntime(Runtime::kPushBlockContext, 2, instr); 5916 CallRuntime(Runtime::kPushBlockContext, 2, instr);
5917 RecordSafepoint(Safepoint::kNoLazyDeopt); 5917 RecordSafepoint(Safepoint::kNoLazyDeopt);
5918 } 5918 }
5919 5919
5920 5920
5921 #undef __ 5921 #undef __
5922 5922
5923 } } // namespace v8::internal 5923 } } // namespace v8::internal
5924 5924
5925 #endif // V8_TARGET_ARCH_X64 5925 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/lithium-codegen-x64.h ('k') | src/x64/lithium-gap-resolver-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698