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

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

Issue 22796020: Reland "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/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 // 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 21 matching lines...) Expand all
32 #include "x64/lithium-codegen-x64.h" 32 #include "x64/lithium-codegen-x64.h"
33 #include "code-stubs.h" 33 #include "code-stubs.h"
34 #include "stub-cache.h" 34 #include "stub-cache.h"
35 35
36 namespace v8 { 36 namespace v8 {
37 namespace internal { 37 namespace internal {
38 38
39 39
40 // When invoking builtins, we need to record the safepoint in the middle of 40 // When invoking builtins, we need to record the safepoint in the middle of
41 // the invoke instruction sequence generated by the macro assembler. 41 // the invoke instruction sequence generated by the macro assembler.
42 class SafepointGenerator : public CallWrapper { 42 class SafepointGenerator V8_FINAL : public CallWrapper {
43 public: 43 public:
44 SafepointGenerator(LCodeGen* codegen, 44 SafepointGenerator(LCodeGen* codegen,
45 LPointerMap* pointers, 45 LPointerMap* pointers,
46 Safepoint::DeoptMode mode) 46 Safepoint::DeoptMode mode)
47 : codegen_(codegen), 47 : codegen_(codegen),
48 pointers_(pointers), 48 pointers_(pointers),
49 deopt_mode_(mode) { } 49 deopt_mode_(mode) { }
50 virtual ~SafepointGenerator() { } 50 virtual ~SafepointGenerator() {}
51 51
52 virtual void BeforeCall(int call_size) const { 52 virtual void BeforeCall(int call_size) const V8_OVERRIDE {
53 codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size); 53 codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size);
54 } 54 }
55 55
56 virtual void AfterCall() const { 56 virtual void AfterCall() const V8_OVERRIDE {
57 codegen_->RecordSafepoint(pointers_, deopt_mode_); 57 codegen_->RecordSafepoint(pointers_, deopt_mode_);
58 } 58 }
59 59
60 private: 60 private:
61 LCodeGen* codegen_; 61 LCodeGen* codegen_;
62 LPointerMap* pointers_; 62 LPointerMap* pointers_;
63 Safepoint::DeoptMode deopt_mode_; 63 Safepoint::DeoptMode deopt_mode_;
64 }; 64 };
65 65
66 66
(...skipping 2392 matching lines...) Expand 10 before | Expand all | Expand 10 after
2459 __ j(zero, &true_value, Label::kNear); 2459 __ j(zero, &true_value, Label::kNear);
2460 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); 2460 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex);
2461 __ jmp(&done, Label::kNear); 2461 __ jmp(&done, Label::kNear);
2462 __ bind(&true_value); 2462 __ bind(&true_value);
2463 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); 2463 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex);
2464 __ bind(&done); 2464 __ bind(&done);
2465 } 2465 }
2466 2466
2467 2467
2468 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { 2468 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
2469 class DeferredInstanceOfKnownGlobal: public LDeferredCode { 2469 class DeferredInstanceOfKnownGlobal V8_FINAL : public LDeferredCode {
2470 public: 2470 public:
2471 DeferredInstanceOfKnownGlobal(LCodeGen* codegen, 2471 DeferredInstanceOfKnownGlobal(LCodeGen* codegen,
2472 LInstanceOfKnownGlobal* instr) 2472 LInstanceOfKnownGlobal* instr)
2473 : LDeferredCode(codegen), instr_(instr) { } 2473 : LDeferredCode(codegen), instr_(instr) { }
2474 virtual void Generate() { 2474 virtual void Generate() V8_OVERRIDE {
2475 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); 2475 codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_);
2476 } 2476 }
2477 virtual LInstruction* instr() { return instr_; } 2477 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
2478 Label* map_check() { return &map_check_; } 2478 Label* map_check() { return &map_check_; }
2479 private: 2479 private:
2480 LInstanceOfKnownGlobal* instr_; 2480 LInstanceOfKnownGlobal* instr_;
2481 Label map_check_; 2481 Label map_check_;
2482 }; 2482 };
2483 2483
2484 2484
2485 DeferredInstanceOfKnownGlobal* deferred; 2485 DeferredInstanceOfKnownGlobal* deferred;
2486 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); 2486 deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr);
2487 2487
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after
3393 Label is_positive; 3393 Label is_positive;
3394 __ j(not_sign, &is_positive, Label::kNear); 3394 __ j(not_sign, &is_positive, Label::kNear);
3395 __ neg(input_reg); // Sets flags. 3395 __ neg(input_reg); // Sets flags.
3396 DeoptimizeIf(negative, instr->environment()); 3396 DeoptimizeIf(negative, instr->environment());
3397 __ bind(&is_positive); 3397 __ bind(&is_positive);
3398 } 3398 }
3399 3399
3400 3400
3401 void LCodeGen::DoMathAbs(LMathAbs* instr) { 3401 void LCodeGen::DoMathAbs(LMathAbs* instr) {
3402 // Class for deferred case. 3402 // Class for deferred case.
3403 class DeferredMathAbsTaggedHeapNumber: public LDeferredCode { 3403 class DeferredMathAbsTaggedHeapNumber V8_FINAL : public LDeferredCode {
3404 public: 3404 public:
3405 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr) 3405 DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr)
3406 : LDeferredCode(codegen), instr_(instr) { } 3406 : LDeferredCode(codegen), instr_(instr) { }
3407 virtual void Generate() { 3407 virtual void Generate() V8_OVERRIDE {
3408 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); 3408 codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_);
3409 } 3409 }
3410 virtual LInstruction* instr() { return instr_; } 3410 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
3411 private: 3411 private:
3412 LMathAbs* instr_; 3412 LMathAbs* instr_;
3413 }; 3413 };
3414 3414
3415 ASSERT(instr->value()->Equals(instr->result())); 3415 ASSERT(instr->value()->Equals(instr->result()));
3416 Representation r = instr->hydrogen()->value()->representation(); 3416 Representation r = instr->hydrogen()->value()->representation();
3417 3417
3418 if (r.IsDouble()) { 3418 if (r.IsDouble()) {
3419 XMMRegister scratch = xmm0; 3419 XMMRegister scratch = xmm0;
3420 XMMRegister input_reg = ToDoubleRegister(instr->value()); 3420 XMMRegister input_reg = ToDoubleRegister(instr->value());
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
3625 __ CallStub(&stub); 3625 __ CallStub(&stub);
3626 } else { 3626 } else {
3627 ASSERT(exponent_type.IsDouble()); 3627 ASSERT(exponent_type.IsDouble());
3628 MathPowStub stub(MathPowStub::DOUBLE); 3628 MathPowStub stub(MathPowStub::DOUBLE);
3629 __ CallStub(&stub); 3629 __ CallStub(&stub);
3630 } 3630 }
3631 } 3631 }
3632 3632
3633 3633
3634 void LCodeGen::DoRandom(LRandom* instr) { 3634 void LCodeGen::DoRandom(LRandom* instr) {
3635 class DeferredDoRandom: public LDeferredCode { 3635 class DeferredDoRandom V8_FINAL : public LDeferredCode {
3636 public: 3636 public:
3637 DeferredDoRandom(LCodeGen* codegen, LRandom* instr) 3637 DeferredDoRandom(LCodeGen* codegen, LRandom* instr)
3638 : LDeferredCode(codegen), instr_(instr) { } 3638 : LDeferredCode(codegen), instr_(instr) { }
3639 virtual void Generate() { codegen()->DoDeferredRandom(instr_); } 3639 virtual void Generate() V8_OVERRIDE { codegen()->DoDeferredRandom(instr_); }
3640 virtual LInstruction* instr() { return instr_; } 3640 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
3641 private: 3641 private:
3642 LRandom* instr_; 3642 LRandom* instr_;
3643 }; 3643 };
3644 3644
3645 DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr); 3645 DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr);
3646 3646
3647 // Having marked this instruction as a call we can use any 3647 // Having marked this instruction as a call we can use any
3648 // registers. 3648 // registers.
3649 ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); 3649 ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
3650 3650
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
4315 4315
4316 void LCodeGen::DoStringAdd(LStringAdd* instr) { 4316 void LCodeGen::DoStringAdd(LStringAdd* instr) {
4317 EmitPushTaggedOperand(instr->left()); 4317 EmitPushTaggedOperand(instr->left());
4318 EmitPushTaggedOperand(instr->right()); 4318 EmitPushTaggedOperand(instr->right());
4319 StringAddStub stub(instr->hydrogen()->flags()); 4319 StringAddStub stub(instr->hydrogen()->flags());
4320 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 4320 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
4321 } 4321 }
4322 4322
4323 4323
4324 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { 4324 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
4325 class DeferredStringCharCodeAt: public LDeferredCode { 4325 class DeferredStringCharCodeAt V8_FINAL : public LDeferredCode {
4326 public: 4326 public:
4327 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) 4327 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr)
4328 : LDeferredCode(codegen), instr_(instr) { } 4328 : LDeferredCode(codegen), instr_(instr) { }
4329 virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); } 4329 virtual void Generate() V8_OVERRIDE {
4330 virtual LInstruction* instr() { return instr_; } 4330 codegen()->DoDeferredStringCharCodeAt(instr_);
4331 }
4332 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4331 private: 4333 private:
4332 LStringCharCodeAt* instr_; 4334 LStringCharCodeAt* instr_;
4333 }; 4335 };
4334 4336
4335 DeferredStringCharCodeAt* deferred = 4337 DeferredStringCharCodeAt* deferred =
4336 new(zone()) DeferredStringCharCodeAt(this, instr); 4338 new(zone()) DeferredStringCharCodeAt(this, instr);
4337 4339
4338 StringCharLoadGenerator::Generate(masm(), 4340 StringCharLoadGenerator::Generate(masm(),
4339 ToRegister(instr->string()), 4341 ToRegister(instr->string()),
4340 ToRegister(instr->index()), 4342 ToRegister(instr->index()),
(...skipping 26 matching lines...) Expand all
4367 __ push(index); 4369 __ push(index);
4368 } 4370 }
4369 CallRuntimeFromDeferred(Runtime::kStringCharCodeAt, 2, instr); 4371 CallRuntimeFromDeferred(Runtime::kStringCharCodeAt, 2, instr);
4370 __ AssertSmi(rax); 4372 __ AssertSmi(rax);
4371 __ SmiToInteger32(rax, rax); 4373 __ SmiToInteger32(rax, rax);
4372 __ StoreToSafepointRegisterSlot(result, rax); 4374 __ StoreToSafepointRegisterSlot(result, rax);
4373 } 4375 }
4374 4376
4375 4377
4376 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { 4378 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
4377 class DeferredStringCharFromCode: public LDeferredCode { 4379 class DeferredStringCharFromCode V8_FINAL : public LDeferredCode {
4378 public: 4380 public:
4379 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) 4381 DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr)
4380 : LDeferredCode(codegen), instr_(instr) { } 4382 : LDeferredCode(codegen), instr_(instr) { }
4381 virtual void Generate() { codegen()->DoDeferredStringCharFromCode(instr_); } 4383 virtual void Generate() V8_OVERRIDE {
4382 virtual LInstruction* instr() { return instr_; } 4384 codegen()->DoDeferredStringCharFromCode(instr_);
4385 }
4386 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4383 private: 4387 private:
4384 LStringCharFromCode* instr_; 4388 LStringCharFromCode* instr_;
4385 }; 4389 };
4386 4390
4387 DeferredStringCharFromCode* deferred = 4391 DeferredStringCharFromCode* deferred =
4388 new(zone()) DeferredStringCharFromCode(this, instr); 4392 new(zone()) DeferredStringCharFromCode(this, instr);
4389 4393
4390 ASSERT(instr->hydrogen()->value()->representation().IsInteger32()); 4394 ASSERT(instr->hydrogen()->value()->representation().IsInteger32());
4391 Register char_code = ToRegister(instr->char_code()); 4395 Register char_code = ToRegister(instr->char_code());
4392 Register result = ToRegister(instr->result()); 4396 Register result = ToRegister(instr->result());
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
4461 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { 4465 void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
4462 LOperand* input = instr->value(); 4466 LOperand* input = instr->value();
4463 ASSERT(input->IsRegister() && input->Equals(instr->result())); 4467 ASSERT(input->IsRegister() && input->Equals(instr->result()));
4464 Register reg = ToRegister(input); 4468 Register reg = ToRegister(input);
4465 4469
4466 __ Integer32ToSmi(reg, reg); 4470 __ Integer32ToSmi(reg, reg);
4467 } 4471 }
4468 4472
4469 4473
4470 void LCodeGen::DoNumberTagU(LNumberTagU* instr) { 4474 void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
4471 class DeferredNumberTagU: public LDeferredCode { 4475 class DeferredNumberTagU V8_FINAL : public LDeferredCode {
4472 public: 4476 public:
4473 DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr) 4477 DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr)
4474 : LDeferredCode(codegen), instr_(instr) { } 4478 : LDeferredCode(codegen), instr_(instr) { }
4475 virtual void Generate() { 4479 virtual void Generate() V8_OVERRIDE {
4476 codegen()->DoDeferredNumberTagU(instr_); 4480 codegen()->DoDeferredNumberTagU(instr_);
4477 } 4481 }
4478 virtual LInstruction* instr() { return instr_; } 4482 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4479 private: 4483 private:
4480 LNumberTagU* instr_; 4484 LNumberTagU* instr_;
4481 }; 4485 };
4482 4486
4483 LOperand* input = instr->value(); 4487 LOperand* input = instr->value();
4484 ASSERT(input->IsRegister() && input->Equals(instr->result())); 4488 ASSERT(input->IsRegister() && input->Equals(instr->result()));
4485 Register reg = ToRegister(input); 4489 Register reg = ToRegister(input);
4486 4490
4487 DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr); 4491 DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr);
4488 __ cmpl(reg, Immediate(Smi::kMaxValue)); 4492 __ cmpl(reg, Immediate(Smi::kMaxValue));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4524 4528
4525 // Done. Put the value in xmm1 into the value of the allocated heap 4529 // Done. Put the value in xmm1 into the value of the allocated heap
4526 // number. 4530 // number.
4527 __ bind(&done); 4531 __ bind(&done);
4528 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), xmm1); 4532 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), xmm1);
4529 __ StoreToSafepointRegisterSlot(reg, reg); 4533 __ StoreToSafepointRegisterSlot(reg, reg);
4530 } 4534 }
4531 4535
4532 4536
4533 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { 4537 void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
4534 class DeferredNumberTagD: public LDeferredCode { 4538 class DeferredNumberTagD V8_FINAL : public LDeferredCode {
4535 public: 4539 public:
4536 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) 4540 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr)
4537 : LDeferredCode(codegen), instr_(instr) { } 4541 : LDeferredCode(codegen), instr_(instr) { }
4538 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } 4542 virtual void Generate() V8_OVERRIDE {
4539 virtual LInstruction* instr() { return instr_; } 4543 codegen()->DoDeferredNumberTagD(instr_);
4544 }
4545 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4540 private: 4546 private:
4541 LNumberTagD* instr_; 4547 LNumberTagD* instr_;
4542 }; 4548 };
4543 4549
4544 XMMRegister input_reg = ToDoubleRegister(instr->value()); 4550 XMMRegister input_reg = ToDoubleRegister(instr->value());
4545 Register reg = ToRegister(instr->result()); 4551 Register reg = ToRegister(instr->result());
4546 Register tmp = ToRegister(instr->temp()); 4552 Register tmp = ToRegister(instr->temp());
4547 4553
4548 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); 4554 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
4549 if (FLAG_inline_new) { 4555 if (FLAG_inline_new) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
4691 __ movmskpd(input_reg, xmm0); 4697 __ movmskpd(input_reg, xmm0);
4692 __ andl(input_reg, Immediate(1)); 4698 __ andl(input_reg, Immediate(1));
4693 DeoptimizeIf(not_zero, instr->environment()); 4699 DeoptimizeIf(not_zero, instr->environment());
4694 } 4700 }
4695 } 4701 }
4696 __ bind(&done); 4702 __ bind(&done);
4697 } 4703 }
4698 4704
4699 4705
4700 void LCodeGen::DoTaggedToI(LTaggedToI* instr) { 4706 void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
4701 class DeferredTaggedToI: public LDeferredCode { 4707 class DeferredTaggedToI V8_FINAL : public LDeferredCode {
4702 public: 4708 public:
4703 DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr) 4709 DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr)
4704 : LDeferredCode(codegen), instr_(instr) { } 4710 : LDeferredCode(codegen), instr_(instr) { }
4705 virtual void Generate() { codegen()->DoDeferredTaggedToI(instr_); } 4711 virtual void Generate() V8_OVERRIDE {
4706 virtual LInstruction* instr() { return instr_; } 4712 codegen()->DoDeferredTaggedToI(instr_);
4713 }
4714 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4707 private: 4715 private:
4708 LTaggedToI* instr_; 4716 LTaggedToI* instr_;
4709 }; 4717 };
4710 4718
4711 LOperand* input = instr->value(); 4719 LOperand* input = instr->value();
4712 ASSERT(input->IsRegister()); 4720 ASSERT(input->IsRegister());
4713 ASSERT(input->Equals(instr->result())); 4721 ASSERT(input->Equals(instr->result()));
4714 4722
4715 Register input_reg = ToRegister(input); 4723 Register input_reg = ToRegister(input);
4716 DeferredTaggedToI* deferred = new(zone()) DeferredTaggedToI(this, instr); 4724 DeferredTaggedToI* deferred = new(zone()) DeferredTaggedToI(this, instr);
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
4893 PushSafepointRegistersScope scope(this); 4901 PushSafepointRegistersScope scope(this);
4894 __ push(object); 4902 __ push(object);
4895 CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr); 4903 CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr);
4896 __ testq(rax, Immediate(kSmiTagMask)); 4904 __ testq(rax, Immediate(kSmiTagMask));
4897 } 4905 }
4898 DeoptimizeIf(zero, instr->environment()); 4906 DeoptimizeIf(zero, instr->environment());
4899 } 4907 }
4900 4908
4901 4909
4902 void LCodeGen::DoCheckMaps(LCheckMaps* instr) { 4910 void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
4903 class DeferredCheckMaps: public LDeferredCode { 4911 class DeferredCheckMaps V8_FINAL : public LDeferredCode {
4904 public: 4912 public:
4905 DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object) 4913 DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
4906 : LDeferredCode(codegen), instr_(instr), object_(object) { 4914 : LDeferredCode(codegen), instr_(instr), object_(object) {
4907 SetExit(check_maps()); 4915 SetExit(check_maps());
4908 } 4916 }
4909 virtual void Generate() { 4917 virtual void Generate() V8_OVERRIDE {
4910 codegen()->DoDeferredInstanceMigration(instr_, object_); 4918 codegen()->DoDeferredInstanceMigration(instr_, object_);
4911 } 4919 }
4912 Label* check_maps() { return &check_maps_; } 4920 Label* check_maps() { return &check_maps_; }
4913 virtual LInstruction* instr() { return instr_; } 4921 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
4914 private: 4922 private:
4915 LCheckMaps* instr_; 4923 LCheckMaps* instr_;
4916 Label check_maps_; 4924 Label check_maps_;
4917 Register object_; 4925 Register object_;
4918 }; 4926 };
4919 4927
4920 if (instr->hydrogen()->CanOmitMapChecks()) return; 4928 if (instr->hydrogen()->CanOmitMapChecks()) return;
4921 4929
4922 LOperand* input = instr->value(); 4930 LOperand* input = instr->value();
4923 ASSERT(input->IsRegister()); 4931 ASSERT(input->IsRegister());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
4993 // smi 5001 // smi
4994 __ bind(&is_smi); 5002 __ bind(&is_smi);
4995 __ SmiToInteger32(input_reg, input_reg); 5003 __ SmiToInteger32(input_reg, input_reg);
4996 __ ClampUint8(input_reg); 5004 __ ClampUint8(input_reg);
4997 5005
4998 __ bind(&done); 5006 __ bind(&done);
4999 } 5007 }
5000 5008
5001 5009
5002 void LCodeGen::DoAllocate(LAllocate* instr) { 5010 void LCodeGen::DoAllocate(LAllocate* instr) {
5003 class DeferredAllocate: public LDeferredCode { 5011 class DeferredAllocate V8_FINAL : public LDeferredCode {
5004 public: 5012 public:
5005 DeferredAllocate(LCodeGen* codegen, LAllocate* instr) 5013 DeferredAllocate(LCodeGen* codegen, LAllocate* instr)
5006 : LDeferredCode(codegen), instr_(instr) { } 5014 : LDeferredCode(codegen), instr_(instr) { }
5007 virtual void Generate() { codegen()->DoDeferredAllocate(instr_); } 5015 virtual void Generate() V8_OVERRIDE {
5008 virtual LInstruction* instr() { return instr_; } 5016 codegen()->DoDeferredAllocate(instr_);
5017 }
5018 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
5009 private: 5019 private:
5010 LAllocate* instr_; 5020 LAllocate* instr_;
5011 }; 5021 };
5012 5022
5013 DeferredAllocate* deferred = 5023 DeferredAllocate* deferred =
5014 new(zone()) DeferredAllocate(this, instr); 5024 new(zone()) DeferredAllocate(this, instr);
5015 5025
5016 Register result = ToRegister(instr->result()); 5026 Register result = ToRegister(instr->result());
5017 Register temp = ToRegister(instr->temp()); 5027 Register temp = ToRegister(instr->temp());
5018 5028
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
5354 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); 5364 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
5355 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 5365 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
5356 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0); 5366 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0);
5357 ASSERT(instr->HasEnvironment()); 5367 ASSERT(instr->HasEnvironment());
5358 LEnvironment* env = instr->environment(); 5368 LEnvironment* env = instr->environment();
5359 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5369 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5360 } 5370 }
5361 5371
5362 5372
5363 void LCodeGen::DoStackCheck(LStackCheck* instr) { 5373 void LCodeGen::DoStackCheck(LStackCheck* instr) {
5364 class DeferredStackCheck: public LDeferredCode { 5374 class DeferredStackCheck V8_FINAL : public LDeferredCode {
5365 public: 5375 public:
5366 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) 5376 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr)
5367 : LDeferredCode(codegen), instr_(instr) { } 5377 : LDeferredCode(codegen), instr_(instr) { }
5368 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); } 5378 virtual void Generate() V8_OVERRIDE {
5369 virtual LInstruction* instr() { return instr_; } 5379 codegen()->DoDeferredStackCheck(instr_);
5380 }
5381 virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
5370 private: 5382 private:
5371 LStackCheck* instr_; 5383 LStackCheck* instr_;
5372 }; 5384 };
5373 5385
5374 ASSERT(instr->HasEnvironment()); 5386 ASSERT(instr->HasEnvironment());
5375 LEnvironment* env = instr->environment(); 5387 LEnvironment* env = instr->environment();
5376 // There is no LLazyBailout instruction for stack-checks. We have to 5388 // There is no LLazyBailout instruction for stack-checks. We have to
5377 // prepare for lazy deoptimization explicitly here. 5389 // prepare for lazy deoptimization explicitly here.
5378 if (instr->hydrogen()->is_function_entry()) { 5390 if (instr->hydrogen()->is_function_entry()) {
5379 // Perform stack overflow check. 5391 // Perform stack overflow check.
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
5510 FixedArray::kHeaderSize - kPointerSize)); 5522 FixedArray::kHeaderSize - kPointerSize));
5511 __ bind(&done); 5523 __ bind(&done);
5512 } 5524 }
5513 5525
5514 5526
5515 #undef __ 5527 #undef __
5516 5528
5517 } } // namespace v8::internal 5529 } } // namespace v8::internal
5518 5530
5519 #endif // V8_TARGET_ARCH_X64 5531 #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