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

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

Issue 23143007: Revert "Use V8_FINAL and V8_OVERRIDE in various places, fixing bugs revealed by them." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/ia32/lithium-codegen-ia32.h ('k') | src/ia32/lithium-gap-resolver-ia32.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 // 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 30 matching lines...) Expand all
41 41
42 42
43 static SaveFPRegsMode GetSaveFPRegsMode() { 43 static SaveFPRegsMode GetSaveFPRegsMode() {
44 // We don't need to save floating point regs when generating the snapshot 44 // We don't need to save floating point regs when generating the snapshot
45 return CpuFeatures::IsSafeForSnapshot(SSE2) ? kSaveFPRegs : kDontSaveFPRegs; 45 return CpuFeatures::IsSafeForSnapshot(SSE2) ? kSaveFPRegs : kDontSaveFPRegs;
46 } 46 }
47 47
48 48
49 // When invoking builtins, we need to record the safepoint in the middle of 49 // When invoking builtins, we need to record the safepoint in the middle of
50 // the invoke instruction sequence generated by the macro assembler. 50 // the invoke instruction sequence generated by the macro assembler.
51 class SafepointGenerator V8_FINAL : public CallWrapper { 51 class SafepointGenerator : public CallWrapper {
52 public: 52 public:
53 SafepointGenerator(LCodeGen* codegen, 53 SafepointGenerator(LCodeGen* codegen,
54 LPointerMap* pointers, 54 LPointerMap* pointers,
55 Safepoint::DeoptMode mode) 55 Safepoint::DeoptMode mode)
56 : codegen_(codegen), 56 : codegen_(codegen),
57 pointers_(pointers), 57 pointers_(pointers),
58 deopt_mode_(mode) {} 58 deopt_mode_(mode) {}
59 virtual ~SafepointGenerator() {} 59 virtual ~SafepointGenerator() { }
60 60
61 virtual void BeforeCall(int call_size) const V8_OVERRIDE {} 61 virtual void BeforeCall(int call_size) const {}
62 62
63 virtual void AfterCall() const V8_OVERRIDE { 63 virtual void AfterCall() const {
64 codegen_->RecordSafepoint(pointers_, deopt_mode_); 64 codegen_->RecordSafepoint(pointers_, deopt_mode_);
65 } 65 }
66 66
67 private: 67 private:
68 LCodeGen* codegen_; 68 LCodeGen* codegen_;
69 LPointerMap* pointers_; 69 LPointerMap* pointers_;
70 Safepoint::DeoptMode deopt_mode_; 70 Safepoint::DeoptMode deopt_mode_;
71 }; 71 };
72 72
73 73
(...skipping 2735 matching lines...) Expand 10 before | Expand all | Expand 10 after
2809 __ j(zero, &true_value, Label::kNear); 2809 __ j(zero, &true_value, Label::kNear);
2810 __ mov(ToRegister(instr->result()), factory()->false_value()); 2810 __ mov(ToRegister(instr->result()), factory()->false_value());
2811 __ jmp(&done, Label::kNear); 2811 __ jmp(&done, Label::kNear);
2812 __ bind(&true_value); 2812 __ bind(&true_value);
2813 __ mov(ToRegister(instr->result()), factory()->true_value()); 2813 __ mov(ToRegister(instr->result()), factory()->true_value());
2814 __ bind(&done); 2814 __ bind(&done);
2815 } 2815 }
2816 2816
2817 2817
2818 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { 2818 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
2819 class DeferredInstanceOfKnownGlobal V8_FINAL : public LDeferredCode { 2819 class DeferredInstanceOfKnownGlobal: public LDeferredCode {
2820 public: 2820 public:
2821 DeferredInstanceOfKnownGlobal(LCodeGen* codegen, 2821 DeferredInstanceOfKnownGlobal(LCodeGen* codegen,
2822 LInstanceOfKnownGlobal* instr) 2822 LInstanceOfKnownGlobal* instr)
2823 : LDeferredCode(codegen), instr_(instr) { } 2823 : LDeferredCode(codegen), instr_(instr) { }
2824 virtual void Generate() V8_OVERRIDE { 2824 virtual void Generate() {
2825 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); 2825 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_);
2826 } 2826 }
2827 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } 2827 virtual LInstruction* instr() { return instr_; }
2828 Label* map_check() { return &map_check_; } 2828 Label* map_check() { return &map_check_; }
2829 private: 2829 private:
2830 LInstanceOfKnownGlobal* instr_; 2830 LInstanceOfKnownGlobal* instr_;
2831 Label map_check_; 2831 Label map_check_;
2832 }; 2832 };
2833 2833
2834 DeferredInstanceOfKnownGlobal* deferred; 2834 DeferredInstanceOfKnownGlobal* deferred;
2835 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); 2835 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr);
2836 2836
2837 Label done, false_result; 2837 Label done, false_result;
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after
3777 Label is_positive; 3777 Label is_positive;
3778 __ j(not_sign, &is_positive, Label::kNear); 3778 __ j(not_sign, &is_positive, Label::kNear);
3779 __ neg(input_reg); // Sets flags. 3779 __ neg(input_reg); // Sets flags.
3780 DeoptimizeIf(negative, instr->environment()); 3780 DeoptimizeIf(negative, instr->environment());
3781 __ bind(&is_positive); 3781 __ bind(&is_positive);
3782 } 3782 }
3783 3783
3784 3784
3785 void LCodeGen::DoMathAbs(LMathAbs* instr) { 3785 void LCodeGen::DoMathAbs(LMathAbs* instr) {
3786 // Class for deferred case. 3786 // Class for deferred case.
3787 class DeferredMathAbsTaggedHeapNumber V8_FINAL : public LDeferredCode { 3787 class DeferredMathAbsTaggedHeapNumber: public LDeferredCode {
3788 public: 3788 public:
3789 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr) 3789 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr)
3790 : LDeferredCode(codegen), instr_(instr) { } 3790 : LDeferredCode(codegen), instr_(instr) { }
3791 virtual void Generate() V8_OVERRIDE { 3791 virtual void Generate() {
3792 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); 3792 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_);
3793 } 3793 }
3794 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } 3794 virtual LInstruction* instr() { return instr_; }
3795 private: 3795 private:
3796 LMathAbs* instr_; 3796 LMathAbs* instr_;
3797 }; 3797 };
3798 3798
3799 ASSERT(instr->value()->Equals(instr->result())); 3799 ASSERT(instr->value()->Equals(instr->result()));
3800 Representation r = instr->hydrogen()->value()->representation(); 3800 Representation r = instr->hydrogen()->value()->representation();
3801 3801
3802 CpuFeatureScope scope(masm(), SSE2); 3802 CpuFeatureScope scope(masm(), SSE2);
3803 if (r.IsDouble()) { 3803 if (r.IsDouble()) {
3804 XMMRegister scratch = xmm0; 3804 XMMRegister scratch = xmm0;
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
4017 __ CallStub(&stub); 4017 __ CallStub(&stub);
4018 } else { 4018 } else {
4019 ASSERT(exponent_type.IsDouble()); 4019 ASSERT(exponent_type.IsDouble());
4020 MathPowStub stub(MathPowStub::DOUBLE); 4020 MathPowStub stub(MathPowStub::DOUBLE);
4021 __ CallStub(&stub); 4021 __ CallStub(&stub);
4022 } 4022 }
4023 } 4023 }
4024 4024
4025 4025
4026 void LCodeGen::DoRandom(LRandom* instr) { 4026 void LCodeGen::DoRandom(LRandom* instr) {
4027 class DeferredDoRandom V8_FINAL : public LDeferredCode { 4027 class DeferredDoRandom: public LDeferredCode {
4028 public: 4028 public:
4029 DeferredDoRandom(LCodeGen* codegen, LRandom* instr) 4029 DeferredDoRandom(LCodeGen* codegen, LRandom* instr)
4030 : LDeferredCode(codegen), instr_(instr) { } 4030 : LDeferredCode(codegen), instr_(instr) { }
4031 virtual void Generate() V8_OVERRIDE { codegen()->DoDeferredRandom(instr_); } 4031 virtual void Generate() { codegen()->DoDeferredRandom(instr_); }
4032 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } 4032 virtual LInstruction* instr() { return instr_; }
4033 private: 4033 private:
4034 LRandom* instr_; 4034 LRandom* instr_;
4035 }; 4035 };
4036 4036
4037 DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr); 4037 DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr);
4038 4038
4039 CpuFeatureScope scope(masm(), SSE2); 4039 CpuFeatureScope scope(masm(), SSE2);
4040 // Having marked this instruction as a call we can use any 4040 // Having marked this instruction as a call we can use any
4041 // registers. 4041 // registers.
4042 ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); 4042 ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
4752 TransitionElementsKindStub stub(from_kind, to_kind); 4752 TransitionElementsKindStub stub(from_kind, to_kind);
4753 __ CallStub(&stub); 4753 __ CallStub(&stub);
4754 RecordSafepointWithRegisters( 4754 RecordSafepointWithRegisters(
4755 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4755 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4756 } 4756 }
4757 __ bind(&not_applicable); 4757 __ bind(&not_applicable);
4758 } 4758 }
4759 4759
4760 4760
4761 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { 4761 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
4762 class DeferredStringCharCodeAt V8_FINAL : public LDeferredCode { 4762 class DeferredStringCharCodeAt: public LDeferredCode {
4763 public: 4763 public:
4764 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) 4764 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr)
4765 : LDeferredCode(codegen), instr_(instr) { } 4765 : LDeferredCode(codegen), instr_(instr) { }
4766 virtual void Generate() V8_OVERRIDE { 4766 virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); }
4767 codegen()->DoDeferredStringCharCodeAt(instr_); 4767 virtual LInstruction* instr() { return instr_; }
4768 }
4769 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4770 private: 4768 private:
4771 LStringCharCodeAt* instr_; 4769 LStringCharCodeAt* instr_;
4772 }; 4770 };
4773 4771
4774 DeferredStringCharCodeAt* deferred = 4772 DeferredStringCharCodeAt* deferred =
4775 new(zone()) DeferredStringCharCodeAt(this, instr); 4773 new(zone()) DeferredStringCharCodeAt(this, instr);
4776 4774
4777 StringCharLoadGenerator::Generate(masm(), 4775 StringCharLoadGenerator::Generate(masm(),
4778 factory(), 4776 factory(),
4779 ToRegister(instr->string()), 4777 ToRegister(instr->string()),
(...skipping 29 matching lines...) Expand all
4809 } 4807 }
4810 CallRuntimeFromDeferred(Runtime::kStringCharCodeAt, 2, 4808 CallRuntimeFromDeferred(Runtime::kStringCharCodeAt, 2,
4811 instr, instr->context()); 4809 instr, instr->context());
4812 __ AssertSmi(eax); 4810 __ AssertSmi(eax);
4813 __ SmiUntag(eax); 4811 __ SmiUntag(eax);
4814 __ StoreToSafepointRegisterSlot(result, eax); 4812 __ StoreToSafepointRegisterSlot(result, eax);
4815 } 4813 }
4816 4814
4817 4815
4818 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { 4816 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
4819 class DeferredStringCharFromCode V8_FINAL : public LDeferredCode { 4817 class DeferredStringCharFromCode: public LDeferredCode {
4820 public: 4818 public:
4821 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) 4819 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr)
4822 : LDeferredCode(codegen), instr_(instr) { } 4820 : LDeferredCode(codegen), instr_(instr) { }
4823 virtual void Generate() V8_OVERRIDE { 4821 virtual void Generate() { codegen()->DoDeferredStringCharFromCode(instr_); }
4824 codegen()->DoDeferredStringCharFromCode(instr_); 4822 virtual LInstruction* instr() { return instr_; }
4825 }
4826 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4827 private: 4823 private:
4828 LStringCharFromCode* instr_; 4824 LStringCharFromCode* instr_;
4829 }; 4825 };
4830 4826
4831 DeferredStringCharFromCode* deferred = 4827 DeferredStringCharFromCode* deferred =
4832 new(zone()) DeferredStringCharFromCode(this, instr); 4828 new(zone()) DeferredStringCharFromCode(this, instr);
4833 4829
4834 ASSERT(instr->hydrogen()->value()->representation().IsInteger32()); 4830 ASSERT(instr->hydrogen()->value()->representation().IsInteger32());
4835 Register char_code = ToRegister(instr->char_code()); 4831 Register char_code = ToRegister(instr->char_code());
4836 Register result = ToRegister(instr->result()); 4832 Register result = ToRegister(instr->result());
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
4903 LOperand* output = instr->result(); 4899 LOperand* output = instr->result();
4904 LOperand* temp = instr->temp(); 4900 LOperand* temp = instr->temp();
4905 4901
4906 __ LoadUint32(ToDoubleRegister(output), 4902 __ LoadUint32(ToDoubleRegister(output),
4907 ToRegister(input), 4903 ToRegister(input),
4908 ToDoubleRegister(temp)); 4904 ToDoubleRegister(temp));
4909 } 4905 }
4910 4906
4911 4907
4912 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { 4908 void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
4913 class DeferredNumberTagI V8_FINAL : public LDeferredCode { 4909 class DeferredNumberTagI: public LDeferredCode {
4914 public: 4910 public:
4915 DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) 4911 DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr)
4916 : LDeferredCode(codegen), instr_(instr) { } 4912 : LDeferredCode(codegen), instr_(instr) { }
4917 virtual void Generate() V8_OVERRIDE { 4913 virtual void Generate() {
4918 codegen()->DoDeferredNumberTagI(instr_, instr_->value(), SIGNED_INT32); 4914 codegen()->DoDeferredNumberTagI(instr_, instr_->value(), SIGNED_INT32);
4919 } 4915 }
4920 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } 4916 virtual LInstruction* instr() { return instr_; }
4921 private: 4917 private:
4922 LNumberTagI* instr_; 4918 LNumberTagI* instr_;
4923 }; 4919 };
4924 4920
4925 LOperand* input = instr->value(); 4921 LOperand* input = instr->value();
4926 ASSERT(input->IsRegister() && input->Equals(instr->result())); 4922 ASSERT(input->IsRegister() && input->Equals(instr->result()));
4927 Register reg = ToRegister(input); 4923 Register reg = ToRegister(input);
4928 4924
4929 DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr); 4925 DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr);
4930 __ SmiTag(reg); 4926 __ SmiTag(reg);
4931 __ j(overflow, deferred->entry()); 4927 __ j(overflow, deferred->entry());
4932 __ bind(deferred->exit()); 4928 __ bind(deferred->exit());
4933 } 4929 }
4934 4930
4935 4931
4936 void LCodeGen::DoNumberTagU(LNumberTagU* instr) { 4932 void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
4937 class DeferredNumberTagU V8_FINAL : public LDeferredCode { 4933 class DeferredNumberTagU: public LDeferredCode {
4938 public: 4934 public:
4939 DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr) 4935 DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr)
4940 : LDeferredCode(codegen), instr_(instr) { } 4936 : LDeferredCode(codegen), instr_(instr) { }
4941 virtual void Generate() V8_OVERRIDE { 4937 virtual void Generate() {
4942 codegen()->DoDeferredNumberTagI(instr_, instr_->value(), UNSIGNED_INT32); 4938 codegen()->DoDeferredNumberTagI(instr_, instr_->value(), UNSIGNED_INT32);
4943 } 4939 }
4944 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } 4940 virtual LInstruction* instr() { return instr_; }
4945 private: 4941 private:
4946 LNumberTagU* instr_; 4942 LNumberTagU* instr_;
4947 }; 4943 };
4948 4944
4949 LOperand* input = instr->value(); 4945 LOperand* input = instr->value();
4950 ASSERT(input->IsRegister() && input->Equals(instr->result())); 4946 ASSERT(input->IsRegister() && input->Equals(instr->result()));
4951 Register reg = ToRegister(input); 4947 Register reg = ToRegister(input);
4952 4948
4953 DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr); 4949 DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr);
4954 __ cmp(reg, Immediate(Smi::kMaxValue)); 4950 __ cmp(reg, Immediate(Smi::kMaxValue));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
5030 CpuFeatureScope feature_scope(masm(), SSE2); 5026 CpuFeatureScope feature_scope(masm(), SSE2);
5031 __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), xmm0); 5027 __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), xmm0);
5032 } else { 5028 } else {
5033 __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset)); 5029 __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset));
5034 } 5030 }
5035 __ StoreToSafepointRegisterSlot(reg, reg); 5031 __ StoreToSafepointRegisterSlot(reg, reg);
5036 } 5032 }
5037 5033
5038 5034
5039 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { 5035 void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
5040 class DeferredNumberTagD V8_FINAL : public LDeferredCode { 5036 class DeferredNumberTagD: public LDeferredCode {
5041 public: 5037 public:
5042 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) 5038 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr)
5043 : LDeferredCode(codegen), instr_(instr) { } 5039 : LDeferredCode(codegen), instr_(instr) { }
5044 virtual void Generate() V8_OVERRIDE { 5040 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); }
5045 codegen()->DoDeferredNumberTagD(instr_); 5041 virtual LInstruction* instr() { return instr_; }
5046 }
5047 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
5048 private: 5042 private:
5049 LNumberTagD* instr_; 5043 LNumberTagD* instr_;
5050 }; 5044 };
5051 5045
5052 Register reg = ToRegister(instr->result()); 5046 Register reg = ToRegister(instr->result());
5053 5047
5054 bool use_sse2 = CpuFeatures::IsSupported(SSE2); 5048 bool use_sse2 = CpuFeatures::IsSupported(SSE2);
5055 if (!use_sse2) { 5049 if (!use_sse2) {
5056 // Put the value to the top of stack 5050 // Put the value to the top of stack
5057 X87Register src = ToX87Register(instr->value()); 5051 X87Register src = ToX87Register(instr->value());
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
5331 DeoptimizeIf(not_zero, instr->environment()); 5325 DeoptimizeIf(not_zero, instr->environment());
5332 } 5326 }
5333 } else { 5327 } else {
5334 UNREACHABLE(); 5328 UNREACHABLE();
5335 } 5329 }
5336 __ bind(&done); 5330 __ bind(&done);
5337 } 5331 }
5338 5332
5339 5333
5340 void LCodeGen::DoTaggedToI(LTaggedToI* instr) { 5334 void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
5341 class DeferredTaggedToI V8_FINAL : public LDeferredCode { 5335 class DeferredTaggedToI: public LDeferredCode {
5342 public: 5336 public:
5343 DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr) 5337 DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr)
5344 : LDeferredCode(codegen), instr_(instr) { } 5338 : LDeferredCode(codegen), instr_(instr) { }
5345 virtual void Generate() V8_OVERRIDE { 5339 virtual void Generate() { codegen()->DoDeferredTaggedToI(instr_); }
5346 codegen()->DoDeferredTaggedToI(instr_); 5340 virtual LInstruction* instr() { return instr_; }
5347 }
5348 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
5349 private: 5341 private:
5350 LTaggedToI* instr_; 5342 LTaggedToI* instr_;
5351 }; 5343 };
5352 5344
5353 LOperand* input = instr->value(); 5345 LOperand* input = instr->value();
5354 ASSERT(input->IsRegister()); 5346 ASSERT(input->IsRegister());
5355 Register input_reg = ToRegister(input); 5347 Register input_reg = ToRegister(input);
5356 ASSERT(input_reg.is(ToRegister(instr->result()))); 5348 ASSERT(input_reg.is(ToRegister(instr->result())));
5357 5349
5358 DeferredTaggedToI* deferred = new(zone()) DeferredTaggedToI(this, instr); 5350 DeferredTaggedToI* deferred = new(zone()) DeferredTaggedToI(this, instr);
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
5492 DeoptimizeIf(zero, instr->environment()); 5484 DeoptimizeIf(zero, instr->environment());
5493 } 5485 }
5494 // If the negative subtraction overflows into a positive number, there was an 5486 // If the negative subtraction overflows into a positive number, there was an
5495 // overflow --> deopt. 5487 // overflow --> deopt.
5496 DeoptimizeIf(positive, instr->environment()); 5488 DeoptimizeIf(positive, instr->environment());
5497 __ bind(&done); 5489 __ bind(&done);
5498 } 5490 }
5499 5491
5500 5492
5501 void LCodeGen::DoTaggedToINoSSE2(LTaggedToINoSSE2* instr) { 5493 void LCodeGen::DoTaggedToINoSSE2(LTaggedToINoSSE2* instr) {
5502 class DeferredTaggedToINoSSE2 V8_FINAL : public LDeferredCode { 5494 class DeferredTaggedToINoSSE2: public LDeferredCode {
5503 public: 5495 public:
5504 DeferredTaggedToINoSSE2(LCodeGen* codegen, LTaggedToINoSSE2* instr) 5496 DeferredTaggedToINoSSE2(LCodeGen* codegen, LTaggedToINoSSE2* instr)
5505 : LDeferredCode(codegen), instr_(instr) { } 5497 : LDeferredCode(codegen), instr_(instr) { }
5506 virtual void Generate() V8_OVERRIDE { 5498 virtual void Generate() { codegen()->DoDeferredTaggedToINoSSE2(instr_); }
5507 codegen()->DoDeferredTaggedToINoSSE2(instr_); 5499 virtual LInstruction* instr() { return instr_; }
5508 }
5509 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
5510 private: 5500 private:
5511 LTaggedToINoSSE2* instr_; 5501 LTaggedToINoSSE2* instr_;
5512 }; 5502 };
5513 5503
5514 LOperand* input = instr->value(); 5504 LOperand* input = instr->value();
5515 ASSERT(input->IsRegister()); 5505 ASSERT(input->IsRegister());
5516 Register input_reg = ToRegister(input); 5506 Register input_reg = ToRegister(input);
5517 ASSERT(input_reg.is(ToRegister(instr->result()))); 5507 ASSERT(input_reg.is(ToRegister(instr->result())));
5518 5508
5519 DeferredTaggedToINoSSE2* deferred = 5509 DeferredTaggedToINoSSE2* deferred =
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
5731 RecordSafepointWithRegisters( 5721 RecordSafepointWithRegisters(
5732 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); 5722 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt);
5733 5723
5734 __ test(eax, Immediate(kSmiTagMask)); 5724 __ test(eax, Immediate(kSmiTagMask));
5735 } 5725 }
5736 DeoptimizeIf(zero, instr->environment()); 5726 DeoptimizeIf(zero, instr->environment());
5737 } 5727 }
5738 5728
5739 5729
5740 void LCodeGen::DoCheckMaps(LCheckMaps* instr) { 5730 void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
5741 class DeferredCheckMaps V8_FINAL : public LDeferredCode { 5731 class DeferredCheckMaps: public LDeferredCode {
5742 public: 5732 public:
5743 DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object) 5733 DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
5744 : LDeferredCode(codegen), instr_(instr), object_(object) { 5734 : LDeferredCode(codegen), instr_(instr), object_(object) {
5745 SetExit(check_maps()); 5735 SetExit(check_maps());
5746 } 5736 }
5747 virtual void Generate() V8_OVERRIDE { 5737 virtual void Generate() {
5748 codegen()->DoDeferredInstanceMigration(instr_, object_); 5738 codegen()->DoDeferredInstanceMigration(instr_, object_);
5749 } 5739 }
5750 Label* check_maps() { return &check_maps_; } 5740 Label* check_maps() { return &check_maps_; }
5751 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } 5741 virtual LInstruction* instr() { return instr_; }
5752 private: 5742 private:
5753 LCheckMaps* instr_; 5743 LCheckMaps* instr_;
5754 Label check_maps_; 5744 Label check_maps_;
5755 Register object_; 5745 Register object_;
5756 }; 5746 };
5757 5747
5758 if (instr->hydrogen()->CanOmitMapChecks()) return; 5748 if (instr->hydrogen()->CanOmitMapChecks()) return;
5759 5749
5760 LOperand* input = instr->value(); 5750 LOperand* input = instr->value();
5761 ASSERT(input->IsRegister()); 5751 ASSERT(input->IsRegister());
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
5954 if (!input_reg.is(result_reg)) { 5944 if (!input_reg.is(result_reg)) {
5955 __ mov(result_reg, input_reg); 5945 __ mov(result_reg, input_reg);
5956 } 5946 }
5957 __ SmiUntag(result_reg); 5947 __ SmiUntag(result_reg);
5958 __ ClampUint8(result_reg); 5948 __ ClampUint8(result_reg);
5959 __ bind(&done); 5949 __ bind(&done);
5960 } 5950 }
5961 5951
5962 5952
5963 void LCodeGen::DoAllocate(LAllocate* instr) { 5953 void LCodeGen::DoAllocate(LAllocate* instr) {
5964 class DeferredAllocate V8_FINAL : public LDeferredCode { 5954 class DeferredAllocate: public LDeferredCode {
5965 public: 5955 public:
5966 DeferredAllocate(LCodeGen* codegen, LAllocate* instr) 5956 DeferredAllocate(LCodeGen* codegen, LAllocate* instr)
5967 : LDeferredCode(codegen), instr_(instr) { } 5957 : LDeferredCode(codegen), instr_(instr) { }
5968 virtual void Generate() V8_OVERRIDE { 5958 virtual void Generate() { codegen()->DoDeferredAllocate(instr_); }
5969 codegen()->DoDeferredAllocate(instr_); 5959 virtual LInstruction* instr() { return instr_; }
5970 }
5971 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
5972 private: 5960 private:
5973 LAllocate* instr_; 5961 LAllocate* instr_;
5974 }; 5962 };
5975 5963
5976 DeferredAllocate* deferred = 5964 DeferredAllocate* deferred =
5977 new(zone()) DeferredAllocate(this, instr); 5965 new(zone()) DeferredAllocate(this, instr);
5978 5966
5979 Register result = ToRegister(instr->result()); 5967 Register result = ToRegister(instr->result());
5980 Register temp = ToRegister(instr->temp()); 5968 Register temp = ToRegister(instr->temp());
5981 5969
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
6305 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 6293 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
6306 RecordSafepointWithLazyDeopt( 6294 RecordSafepointWithLazyDeopt(
6307 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 6295 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
6308 ASSERT(instr->HasEnvironment()); 6296 ASSERT(instr->HasEnvironment());
6309 LEnvironment* env = instr->environment(); 6297 LEnvironment* env = instr->environment();
6310 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 6298 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
6311 } 6299 }
6312 6300
6313 6301
6314 void LCodeGen::DoStackCheck(LStackCheck* instr) { 6302 void LCodeGen::DoStackCheck(LStackCheck* instr) {
6315 class DeferredStackCheck V8_FINAL : public LDeferredCode { 6303 class DeferredStackCheck: public LDeferredCode {
6316 public: 6304 public:
6317 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) 6305 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr)
6318 : LDeferredCode(codegen), instr_(instr) { } 6306 : LDeferredCode(codegen), instr_(instr) { }
6319 virtual void Generate() V8_OVERRIDE { 6307 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
6320 codegen()->DoDeferredStackCheck(instr_); 6308 virtual LInstruction* instr() { return instr_; }
6321 }
6322 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
6323 private: 6309 private:
6324 LStackCheck* instr_; 6310 LStackCheck* instr_;
6325 }; 6311 };
6326 6312
6327 ASSERT(instr->HasEnvironment()); 6313 ASSERT(instr->HasEnvironment());
6328 LEnvironment* env = instr->environment(); 6314 LEnvironment* env = instr->environment();
6329 // There is no LLazyBailout instruction for stack-checks. We have to 6315 // There is no LLazyBailout instruction for stack-checks. We have to
6330 // prepare for lazy deoptimization explicitly here. 6316 // prepare for lazy deoptimization explicitly here.
6331 if (instr->hydrogen()->is_function_entry()) { 6317 if (instr->hydrogen()->is_function_entry()) {
6332 // Perform stack overflow check. 6318 // Perform stack overflow check.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
6466 FixedArray::kHeaderSize - kPointerSize)); 6452 FixedArray::kHeaderSize - kPointerSize));
6467 __ bind(&done); 6453 __ bind(&done);
6468 } 6454 }
6469 6455
6470 6456
6471 #undef __ 6457 #undef __
6472 6458
6473 } } // namespace v8::internal 6459 } } // namespace v8::internal
6474 6460
6475 #endif // V8_TARGET_ARCH_IA32 6461 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/lithium-codegen-ia32.h ('k') | src/ia32/lithium-gap-resolver-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698