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

Side by Side Diff: src/x87/lithium-codegen-x87.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/x87/lithium-codegen-x87.h ('k') | src/x87/lithium-gap-resolver-x87.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
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/codegen.h" 12 #include "src/codegen.h"
13 #include "src/cpu-profiler.h" 13 #include "src/cpu-profiler.h"
14 #include "src/deoptimizer.h" 14 #include "src/deoptimizer.h"
15 #include "src/hydrogen-osr.h" 15 #include "src/hydrogen-osr.h"
16 #include "src/ic/ic.h" 16 #include "src/ic/ic.h"
17 #include "src/ic/stub-cache.h" 17 #include "src/ic/stub-cache.h"
18 #include "src/x87/lithium-codegen-x87.h" 18 #include "src/x87/lithium-codegen-x87.h"
19 19
20 namespace v8 { 20 namespace v8 {
21 namespace internal { 21 namespace internal {
22 22
23 23
24 // When invoking builtins, we need to record the safepoint in the middle of 24 // When invoking builtins, we need to record the safepoint in the middle of
25 // the invoke instruction sequence generated by the macro assembler. 25 // the invoke instruction sequence generated by the macro assembler.
26 class SafepointGenerator FINAL : public CallWrapper { 26 class SafepointGenerator final : public CallWrapper {
27 public: 27 public:
28 SafepointGenerator(LCodeGen* codegen, 28 SafepointGenerator(LCodeGen* codegen,
29 LPointerMap* pointers, 29 LPointerMap* pointers,
30 Safepoint::DeoptMode mode) 30 Safepoint::DeoptMode mode)
31 : codegen_(codegen), 31 : codegen_(codegen),
32 pointers_(pointers), 32 pointers_(pointers),
33 deopt_mode_(mode) {} 33 deopt_mode_(mode) {}
34 virtual ~SafepointGenerator() {} 34 virtual ~SafepointGenerator() {}
35 35
36 void BeforeCall(int call_size) const OVERRIDE {} 36 void BeforeCall(int call_size) const override {}
37 37
38 void AfterCall() const OVERRIDE { 38 void AfterCall() const override {
39 codegen_->RecordSafepoint(pointers_, deopt_mode_); 39 codegen_->RecordSafepoint(pointers_, deopt_mode_);
40 } 40 }
41 41
42 private: 42 private:
43 LCodeGen* codegen_; 43 LCodeGen* codegen_;
44 LPointerMap* pointers_; 44 LPointerMap* pointers_;
45 Safepoint::DeoptMode deopt_mode_; 45 Safepoint::DeoptMode deopt_mode_;
46 }; 46 };
47 47
48 48
(...skipping 2890 matching lines...) Expand 10 before | Expand all | Expand 10 after
2939 __ j(zero, &true_value, Label::kNear); 2939 __ j(zero, &true_value, Label::kNear);
2940 __ mov(ToRegister(instr->result()), factory()->false_value()); 2940 __ mov(ToRegister(instr->result()), factory()->false_value());
2941 __ jmp(&done, Label::kNear); 2941 __ jmp(&done, Label::kNear);
2942 __ bind(&true_value); 2942 __ bind(&true_value);
2943 __ mov(ToRegister(instr->result()), factory()->true_value()); 2943 __ mov(ToRegister(instr->result()), factory()->true_value());
2944 __ bind(&done); 2944 __ bind(&done);
2945 } 2945 }
2946 2946
2947 2947
2948 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { 2948 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
2949 class DeferredInstanceOfKnownGlobal FINAL : public LDeferredCode { 2949 class DeferredInstanceOfKnownGlobal final : public LDeferredCode {
2950 public: 2950 public:
2951 DeferredInstanceOfKnownGlobal(LCodeGen* codegen, 2951 DeferredInstanceOfKnownGlobal(LCodeGen* codegen,
2952 LInstanceOfKnownGlobal* instr, 2952 LInstanceOfKnownGlobal* instr,
2953 const X87Stack& x87_stack) 2953 const X87Stack& x87_stack)
2954 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 2954 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
2955 void Generate() OVERRIDE { 2955 void Generate() override {
2956 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); 2956 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_);
2957 } 2957 }
2958 LInstruction* instr() OVERRIDE { return instr_; } 2958 LInstruction* instr() override { return instr_; }
2959 Label* map_check() { return &map_check_; } 2959 Label* map_check() { return &map_check_; }
2960 private: 2960 private:
2961 LInstanceOfKnownGlobal* instr_; 2961 LInstanceOfKnownGlobal* instr_;
2962 Label map_check_; 2962 Label map_check_;
2963 }; 2963 };
2964 2964
2965 DeferredInstanceOfKnownGlobal* deferred; 2965 DeferredInstanceOfKnownGlobal* deferred;
2966 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr, x87_stack_); 2966 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr, x87_stack_);
2967 2967
2968 Label done, false_result; 2968 Label done, false_result;
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after
3871 Label is_positive; 3871 Label is_positive;
3872 __ j(not_sign, &is_positive, Label::kNear); 3872 __ j(not_sign, &is_positive, Label::kNear);
3873 __ neg(input_reg); // Sets flags. 3873 __ neg(input_reg); // Sets flags.
3874 DeoptimizeIf(negative, instr, Deoptimizer::kOverflow); 3874 DeoptimizeIf(negative, instr, Deoptimizer::kOverflow);
3875 __ bind(&is_positive); 3875 __ bind(&is_positive);
3876 } 3876 }
3877 3877
3878 3878
3879 void LCodeGen::DoMathAbs(LMathAbs* instr) { 3879 void LCodeGen::DoMathAbs(LMathAbs* instr) {
3880 // Class for deferred case. 3880 // Class for deferred case.
3881 class DeferredMathAbsTaggedHeapNumber FINAL : public LDeferredCode { 3881 class DeferredMathAbsTaggedHeapNumber final : public LDeferredCode {
3882 public: 3882 public:
3883 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, 3883 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen,
3884 LMathAbs* instr, 3884 LMathAbs* instr,
3885 const X87Stack& x87_stack) 3885 const X87Stack& x87_stack)
3886 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 3886 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
3887 void Generate() OVERRIDE { 3887 void Generate() override {
3888 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); 3888 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_);
3889 } 3889 }
3890 LInstruction* instr() OVERRIDE { return instr_; } 3890 LInstruction* instr() override { return instr_; }
3891 3891
3892 private: 3892 private:
3893 LMathAbs* instr_; 3893 LMathAbs* instr_;
3894 }; 3894 };
3895 3895
3896 DCHECK(instr->value()->Equals(instr->result())); 3896 DCHECK(instr->value()->Equals(instr->result()));
3897 Representation r = instr->hydrogen()->value()->representation(); 3897 Representation r = instr->hydrogen()->value()->representation();
3898 3898
3899 if (r.IsDouble()) { 3899 if (r.IsDouble()) {
3900 X87Register value = ToX87Register(instr->value()); 3900 X87Register value = ToX87Register(instr->value());
(...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after
4829 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); 4829 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array);
4830 __ CallStub(&stub); 4830 __ CallStub(&stub);
4831 RecordSafepointWithLazyDeopt(instr, 4831 RecordSafepointWithLazyDeopt(instr,
4832 RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 4832 RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
4833 } 4833 }
4834 __ bind(&not_applicable); 4834 __ bind(&not_applicable);
4835 } 4835 }
4836 4836
4837 4837
4838 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { 4838 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
4839 class DeferredStringCharCodeAt FINAL : public LDeferredCode { 4839 class DeferredStringCharCodeAt final : public LDeferredCode {
4840 public: 4840 public:
4841 DeferredStringCharCodeAt(LCodeGen* codegen, 4841 DeferredStringCharCodeAt(LCodeGen* codegen,
4842 LStringCharCodeAt* instr, 4842 LStringCharCodeAt* instr,
4843 const X87Stack& x87_stack) 4843 const X87Stack& x87_stack)
4844 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 4844 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
4845 void Generate() OVERRIDE { codegen()->DoDeferredStringCharCodeAt(instr_); } 4845 void Generate() override { codegen()->DoDeferredStringCharCodeAt(instr_); }
4846 LInstruction* instr() OVERRIDE { return instr_; } 4846 LInstruction* instr() override { return instr_; }
4847 4847
4848 private: 4848 private:
4849 LStringCharCodeAt* instr_; 4849 LStringCharCodeAt* instr_;
4850 }; 4850 };
4851 4851
4852 DeferredStringCharCodeAt* deferred = 4852 DeferredStringCharCodeAt* deferred =
4853 new(zone()) DeferredStringCharCodeAt(this, instr, x87_stack_); 4853 new(zone()) DeferredStringCharCodeAt(this, instr, x87_stack_);
4854 4854
4855 StringCharLoadGenerator::Generate(masm(), 4855 StringCharLoadGenerator::Generate(masm(),
4856 factory(), 4856 factory(),
(...skipping 30 matching lines...) Expand all
4887 } 4887 }
4888 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, 4888 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2,
4889 instr, instr->context()); 4889 instr, instr->context());
4890 __ AssertSmi(eax); 4890 __ AssertSmi(eax);
4891 __ SmiUntag(eax); 4891 __ SmiUntag(eax);
4892 __ StoreToSafepointRegisterSlot(result, eax); 4892 __ StoreToSafepointRegisterSlot(result, eax);
4893 } 4893 }
4894 4894
4895 4895
4896 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { 4896 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
4897 class DeferredStringCharFromCode FINAL : public LDeferredCode { 4897 class DeferredStringCharFromCode final : public LDeferredCode {
4898 public: 4898 public:
4899 DeferredStringCharFromCode(LCodeGen* codegen, 4899 DeferredStringCharFromCode(LCodeGen* codegen,
4900 LStringCharFromCode* instr, 4900 LStringCharFromCode* instr,
4901 const X87Stack& x87_stack) 4901 const X87Stack& x87_stack)
4902 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 4902 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
4903 void Generate() OVERRIDE { 4903 void Generate() override {
4904 codegen()->DoDeferredStringCharFromCode(instr_); 4904 codegen()->DoDeferredStringCharFromCode(instr_);
4905 } 4905 }
4906 LInstruction* instr() OVERRIDE { return instr_; } 4906 LInstruction* instr() override { return instr_; }
4907 4907
4908 private: 4908 private:
4909 LStringCharFromCode* instr_; 4909 LStringCharFromCode* instr_;
4910 }; 4910 };
4911 4911
4912 DeferredStringCharFromCode* deferred = 4912 DeferredStringCharFromCode* deferred =
4913 new(zone()) DeferredStringCharFromCode(this, instr, x87_stack_); 4913 new(zone()) DeferredStringCharFromCode(this, instr, x87_stack_);
4914 4914
4915 DCHECK(instr->hydrogen()->value()->representation().IsInteger32()); 4915 DCHECK(instr->hydrogen()->value()->representation().IsInteger32());
4916 Register char_code = ToRegister(instr->char_code()); 4916 Register char_code = ToRegister(instr->char_code());
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
4977 LOperand* input = instr->value(); 4977 LOperand* input = instr->value();
4978 LOperand* output = instr->result(); 4978 LOperand* output = instr->result();
4979 X87Register res = ToX87Register(output); 4979 X87Register res = ToX87Register(output);
4980 X87PrepareToWrite(res); 4980 X87PrepareToWrite(res);
4981 __ LoadUint32NoSSE2(ToRegister(input)); 4981 __ LoadUint32NoSSE2(ToRegister(input));
4982 X87CommitWrite(res); 4982 X87CommitWrite(res);
4983 } 4983 }
4984 4984
4985 4985
4986 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { 4986 void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
4987 class DeferredNumberTagI FINAL : public LDeferredCode { 4987 class DeferredNumberTagI final : public LDeferredCode {
4988 public: 4988 public:
4989 DeferredNumberTagI(LCodeGen* codegen, 4989 DeferredNumberTagI(LCodeGen* codegen,
4990 LNumberTagI* instr, 4990 LNumberTagI* instr,
4991 const X87Stack& x87_stack) 4991 const X87Stack& x87_stack)
4992 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 4992 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
4993 void Generate() OVERRIDE { 4993 void Generate() override {
4994 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(), 4994 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(),
4995 SIGNED_INT32); 4995 SIGNED_INT32);
4996 } 4996 }
4997 LInstruction* instr() OVERRIDE { return instr_; } 4997 LInstruction* instr() override { return instr_; }
4998 4998
4999 private: 4999 private:
5000 LNumberTagI* instr_; 5000 LNumberTagI* instr_;
5001 }; 5001 };
5002 5002
5003 LOperand* input = instr->value(); 5003 LOperand* input = instr->value();
5004 DCHECK(input->IsRegister() && input->Equals(instr->result())); 5004 DCHECK(input->IsRegister() && input->Equals(instr->result()));
5005 Register reg = ToRegister(input); 5005 Register reg = ToRegister(input);
5006 5006
5007 DeferredNumberTagI* deferred = 5007 DeferredNumberTagI* deferred =
5008 new(zone()) DeferredNumberTagI(this, instr, x87_stack_); 5008 new(zone()) DeferredNumberTagI(this, instr, x87_stack_);
5009 __ SmiTag(reg); 5009 __ SmiTag(reg);
5010 __ j(overflow, deferred->entry()); 5010 __ j(overflow, deferred->entry());
5011 __ bind(deferred->exit()); 5011 __ bind(deferred->exit());
5012 } 5012 }
5013 5013
5014 5014
5015 void LCodeGen::DoNumberTagU(LNumberTagU* instr) { 5015 void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
5016 class DeferredNumberTagU FINAL : public LDeferredCode { 5016 class DeferredNumberTagU final : public LDeferredCode {
5017 public: 5017 public:
5018 DeferredNumberTagU(LCodeGen* codegen, 5018 DeferredNumberTagU(LCodeGen* codegen,
5019 LNumberTagU* instr, 5019 LNumberTagU* instr,
5020 const X87Stack& x87_stack) 5020 const X87Stack& x87_stack)
5021 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 5021 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
5022 void Generate() OVERRIDE { 5022 void Generate() override {
5023 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(), 5023 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(),
5024 UNSIGNED_INT32); 5024 UNSIGNED_INT32);
5025 } 5025 }
5026 LInstruction* instr() OVERRIDE { return instr_; } 5026 LInstruction* instr() override { return instr_; }
5027 5027
5028 private: 5028 private:
5029 LNumberTagU* instr_; 5029 LNumberTagU* instr_;
5030 }; 5030 };
5031 5031
5032 LOperand* input = instr->value(); 5032 LOperand* input = instr->value();
5033 DCHECK(input->IsRegister() && input->Equals(instr->result())); 5033 DCHECK(input->IsRegister() && input->Equals(instr->result()));
5034 Register reg = ToRegister(input); 5034 Register reg = ToRegister(input);
5035 5035
5036 DeferredNumberTagU* deferred = 5036 DeferredNumberTagU* deferred =
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
5096 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 5096 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
5097 __ StoreToSafepointRegisterSlot(reg, eax); 5097 __ StoreToSafepointRegisterSlot(reg, eax);
5098 } 5098 }
5099 5099
5100 __ bind(&done); 5100 __ bind(&done);
5101 __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset)); 5101 __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset));
5102 } 5102 }
5103 5103
5104 5104
5105 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { 5105 void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
5106 class DeferredNumberTagD FINAL : public LDeferredCode { 5106 class DeferredNumberTagD final : public LDeferredCode {
5107 public: 5107 public:
5108 DeferredNumberTagD(LCodeGen* codegen, 5108 DeferredNumberTagD(LCodeGen* codegen,
5109 LNumberTagD* instr, 5109 LNumberTagD* instr,
5110 const X87Stack& x87_stack) 5110 const X87Stack& x87_stack)
5111 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 5111 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
5112 void Generate() OVERRIDE { codegen()->DoDeferredNumberTagD(instr_); } 5112 void Generate() override { codegen()->DoDeferredNumberTagD(instr_); }
5113 LInstruction* instr() OVERRIDE { return instr_; } 5113 LInstruction* instr() override { return instr_; }
5114 5114
5115 private: 5115 private:
5116 LNumberTagD* instr_; 5116 LNumberTagD* instr_;
5117 }; 5117 };
5118 5118
5119 Register reg = ToRegister(instr->result()); 5119 Register reg = ToRegister(instr->result());
5120 5120
5121 // Put the value to the top of stack 5121 // Put the value to the top of stack
5122 X87Register src = ToX87Register(instr->value()); 5122 X87Register src = ToX87Register(instr->value());
5123 // Don't use X87LoadForUsage here, which is only used by Instruction which 5123 // Don't use X87LoadForUsage here, which is only used by Instruction which
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
5343 __ FCmp(); 5343 __ FCmp();
5344 __ pop(input_reg); 5344 __ pop(input_reg);
5345 DeoptimizeIf(not_equal, instr, Deoptimizer::kLostPrecision); 5345 DeoptimizeIf(not_equal, instr, Deoptimizer::kLostPrecision);
5346 DeoptimizeIf(parity_even, instr, Deoptimizer::kNaN); 5346 DeoptimizeIf(parity_even, instr, Deoptimizer::kNaN);
5347 } 5347 }
5348 } 5348 }
5349 } 5349 }
5350 5350
5351 5351
5352 void LCodeGen::DoTaggedToI(LTaggedToI* instr) { 5352 void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
5353 class DeferredTaggedToI FINAL : public LDeferredCode { 5353 class DeferredTaggedToI final : public LDeferredCode {
5354 public: 5354 public:
5355 DeferredTaggedToI(LCodeGen* codegen, 5355 DeferredTaggedToI(LCodeGen* codegen,
5356 LTaggedToI* instr, 5356 LTaggedToI* instr,
5357 const X87Stack& x87_stack) 5357 const X87Stack& x87_stack)
5358 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 5358 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
5359 void Generate() OVERRIDE { codegen()->DoDeferredTaggedToI(instr_, done()); } 5359 void Generate() override { codegen()->DoDeferredTaggedToI(instr_, done()); }
5360 LInstruction* instr() OVERRIDE { return instr_; } 5360 LInstruction* instr() override { return instr_; }
5361 5361
5362 private: 5362 private:
5363 LTaggedToI* instr_; 5363 LTaggedToI* instr_;
5364 }; 5364 };
5365 5365
5366 LOperand* input = instr->value(); 5366 LOperand* input = instr->value();
5367 DCHECK(input->IsRegister()); 5367 DCHECK(input->IsRegister());
5368 Register input_reg = ToRegister(input); 5368 Register input_reg = ToRegister(input);
5369 DCHECK(input_reg.is(ToRegister(instr->result()))); 5369 DCHECK(input_reg.is(ToRegister(instr->result())));
5370 5370
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
5544 RecordSafepointWithRegisters( 5544 RecordSafepointWithRegisters(
5545 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); 5545 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt);
5546 5546
5547 __ test(eax, Immediate(kSmiTagMask)); 5547 __ test(eax, Immediate(kSmiTagMask));
5548 } 5548 }
5549 DeoptimizeIf(zero, instr, Deoptimizer::kInstanceMigrationFailed); 5549 DeoptimizeIf(zero, instr, Deoptimizer::kInstanceMigrationFailed);
5550 } 5550 }
5551 5551
5552 5552
5553 void LCodeGen::DoCheckMaps(LCheckMaps* instr) { 5553 void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
5554 class DeferredCheckMaps FINAL : public LDeferredCode { 5554 class DeferredCheckMaps final : public LDeferredCode {
5555 public: 5555 public:
5556 DeferredCheckMaps(LCodeGen* codegen, 5556 DeferredCheckMaps(LCodeGen* codegen,
5557 LCheckMaps* instr, 5557 LCheckMaps* instr,
5558 Register object, 5558 Register object,
5559 const X87Stack& x87_stack) 5559 const X87Stack& x87_stack)
5560 : LDeferredCode(codegen, x87_stack), instr_(instr), object_(object) { 5560 : LDeferredCode(codegen, x87_stack), instr_(instr), object_(object) {
5561 SetExit(check_maps()); 5561 SetExit(check_maps());
5562 } 5562 }
5563 void Generate() OVERRIDE { 5563 void Generate() override {
5564 codegen()->DoDeferredInstanceMigration(instr_, object_); 5564 codegen()->DoDeferredInstanceMigration(instr_, object_);
5565 } 5565 }
5566 Label* check_maps() { return &check_maps_; } 5566 Label* check_maps() { return &check_maps_; }
5567 LInstruction* instr() OVERRIDE { return instr_; } 5567 LInstruction* instr() override { return instr_; }
5568 5568
5569 private: 5569 private:
5570 LCheckMaps* instr_; 5570 LCheckMaps* instr_;
5571 Label check_maps_; 5571 Label check_maps_;
5572 Register object_; 5572 Register object_;
5573 }; 5573 };
5574 5574
5575 if (instr->hydrogen()->IsStabilityCheck()) { 5575 if (instr->hydrogen()->IsStabilityCheck()) {
5576 const UniqueSet<Map>* maps = instr->hydrogen()->maps(); 5576 const UniqueSet<Map>* maps = instr->hydrogen()->maps();
5577 for (int i = 0; i < maps->size(); ++i) { 5577 for (int i = 0; i < maps->size(); ++i) {
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
5771 __ sub(esp, Immediate(kDoubleSize)); 5771 __ sub(esp, Immediate(kDoubleSize));
5772 __ mov(Operand(esp, 0), lo_reg); 5772 __ mov(Operand(esp, 0), lo_reg);
5773 __ mov(Operand(esp, kPointerSize), hi_reg); 5773 __ mov(Operand(esp, kPointerSize), hi_reg);
5774 __ fld_d(Operand(esp, 0)); 5774 __ fld_d(Operand(esp, 0));
5775 __ add(esp, Immediate(kDoubleSize)); 5775 __ add(esp, Immediate(kDoubleSize));
5776 X87CommitWrite(result_reg); 5776 X87CommitWrite(result_reg);
5777 } 5777 }
5778 5778
5779 5779
5780 void LCodeGen::DoAllocate(LAllocate* instr) { 5780 void LCodeGen::DoAllocate(LAllocate* instr) {
5781 class DeferredAllocate FINAL : public LDeferredCode { 5781 class DeferredAllocate final : public LDeferredCode {
5782 public: 5782 public:
5783 DeferredAllocate(LCodeGen* codegen, 5783 DeferredAllocate(LCodeGen* codegen,
5784 LAllocate* instr, 5784 LAllocate* instr,
5785 const X87Stack& x87_stack) 5785 const X87Stack& x87_stack)
5786 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 5786 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
5787 void Generate() OVERRIDE { codegen()->DoDeferredAllocate(instr_); } 5787 void Generate() override { codegen()->DoDeferredAllocate(instr_); }
5788 LInstruction* instr() OVERRIDE { return instr_; } 5788 LInstruction* instr() override { return instr_; }
5789 5789
5790 private: 5790 private:
5791 LAllocate* instr_; 5791 LAllocate* instr_;
5792 }; 5792 };
5793 5793
5794 DeferredAllocate* deferred = 5794 DeferredAllocate* deferred =
5795 new(zone()) DeferredAllocate(this, instr, x87_stack_); 5795 new(zone()) DeferredAllocate(this, instr, x87_stack_);
5796 5796
5797 Register result = ToRegister(instr->result()); 5797 Register result = ToRegister(instr->result());
5798 Register temp = ToRegister(instr->temp()); 5798 Register temp = ToRegister(instr->temp());
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
6131 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 6131 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
6132 RecordSafepointWithLazyDeopt( 6132 RecordSafepointWithLazyDeopt(
6133 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 6133 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
6134 DCHECK(instr->HasEnvironment()); 6134 DCHECK(instr->HasEnvironment());
6135 LEnvironment* env = instr->environment(); 6135 LEnvironment* env = instr->environment();
6136 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 6136 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
6137 } 6137 }
6138 6138
6139 6139
6140 void LCodeGen::DoStackCheck(LStackCheck* instr) { 6140 void LCodeGen::DoStackCheck(LStackCheck* instr) {
6141 class DeferredStackCheck FINAL : public LDeferredCode { 6141 class DeferredStackCheck final : public LDeferredCode {
6142 public: 6142 public:
6143 DeferredStackCheck(LCodeGen* codegen, 6143 DeferredStackCheck(LCodeGen* codegen,
6144 LStackCheck* instr, 6144 LStackCheck* instr,
6145 const X87Stack& x87_stack) 6145 const X87Stack& x87_stack)
6146 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 6146 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
6147 void Generate() OVERRIDE { codegen()->DoDeferredStackCheck(instr_); } 6147 void Generate() override { codegen()->DoDeferredStackCheck(instr_); }
6148 LInstruction* instr() OVERRIDE { return instr_; } 6148 LInstruction* instr() override { return instr_; }
6149 6149
6150 private: 6150 private:
6151 LStackCheck* instr_; 6151 LStackCheck* instr_;
6152 }; 6152 };
6153 6153
6154 DCHECK(instr->HasEnvironment()); 6154 DCHECK(instr->HasEnvironment());
6155 LEnvironment* env = instr->environment(); 6155 LEnvironment* env = instr->environment();
6156 // There is no LLazyBailout instruction for stack-checks. We have to 6156 // There is no LLazyBailout instruction for stack-checks. We have to
6157 // prepare for lazy deoptimization explicitly here. 6157 // prepare for lazy deoptimization explicitly here.
6158 if (instr->hydrogen()->is_function_entry()) { 6158 if (instr->hydrogen()->is_function_entry()) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
6269 __ push(index); 6269 __ push(index);
6270 __ xor_(esi, esi); 6270 __ xor_(esi, esi);
6271 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); 6271 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble);
6272 RecordSafepointWithRegisters( 6272 RecordSafepointWithRegisters(
6273 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt); 6273 instr->pointer_map(), 2, Safepoint::kNoLazyDeopt);
6274 __ StoreToSafepointRegisterSlot(object, eax); 6274 __ StoreToSafepointRegisterSlot(object, eax);
6275 } 6275 }
6276 6276
6277 6277
6278 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { 6278 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) {
6279 class DeferredLoadMutableDouble FINAL : public LDeferredCode { 6279 class DeferredLoadMutableDouble final : public LDeferredCode {
6280 public: 6280 public:
6281 DeferredLoadMutableDouble(LCodeGen* codegen, 6281 DeferredLoadMutableDouble(LCodeGen* codegen,
6282 LLoadFieldByIndex* instr, 6282 LLoadFieldByIndex* instr,
6283 Register object, 6283 Register object,
6284 Register index, 6284 Register index,
6285 const X87Stack& x87_stack) 6285 const X87Stack& x87_stack)
6286 : LDeferredCode(codegen, x87_stack), 6286 : LDeferredCode(codegen, x87_stack),
6287 instr_(instr), 6287 instr_(instr),
6288 object_(object), 6288 object_(object),
6289 index_(index) { 6289 index_(index) {
6290 } 6290 }
6291 void Generate() OVERRIDE { 6291 void Generate() override {
6292 codegen()->DoDeferredLoadMutableDouble(instr_, object_, index_); 6292 codegen()->DoDeferredLoadMutableDouble(instr_, object_, index_);
6293 } 6293 }
6294 LInstruction* instr() OVERRIDE { return instr_; } 6294 LInstruction* instr() override { return instr_; }
6295 6295
6296 private: 6296 private:
6297 LLoadFieldByIndex* instr_; 6297 LLoadFieldByIndex* instr_;
6298 Register object_; 6298 Register object_;
6299 Register index_; 6299 Register index_;
6300 }; 6300 };
6301 6301
6302 Register object = ToRegister(instr->object()); 6302 Register object = ToRegister(instr->object());
6303 Register index = ToRegister(instr->index()); 6303 Register index = ToRegister(instr->index());
6304 6304
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
6346 CallRuntime(Runtime::kPushBlockContext, 2, instr); 6346 CallRuntime(Runtime::kPushBlockContext, 2, instr);
6347 RecordSafepoint(Safepoint::kNoLazyDeopt); 6347 RecordSafepoint(Safepoint::kNoLazyDeopt);
6348 } 6348 }
6349 6349
6350 6350
6351 #undef __ 6351 #undef __
6352 6352
6353 } } // namespace v8::internal 6353 } } // namespace v8::internal
6354 6354
6355 #endif // V8_TARGET_ARCH_X87 6355 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « src/x87/lithium-codegen-x87.h ('k') | src/x87/lithium-gap-resolver-x87.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698