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

Side by Side Diff: src/compiler/node-matchers.h

Issue 2620293004: [turbofan] Relax limitation for using BaseWithIndexAndDisplacement for load/stores (Closed)
Patch Set: Fix some test bugs Created 3 years, 10 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/compiler/node.cc ('k') | test/unittests/compiler/node-matchers-unittest.cc » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 #ifndef V8_COMPILER_NODE_MATCHERS_H_ 5 #ifndef V8_COMPILER_NODE_MATCHERS_H_
6 #define V8_COMPILER_NODE_MATCHERS_H_ 6 #define V8_COMPILER_NODE_MATCHERS_H_
7 7
8 #include <cmath> 8 #include <cmath>
9 9
10 // TODO(turbofan): Move ExternalReference out of assembler.h 10 // TODO(turbofan): Move ExternalReference out of assembler.h
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 AddMatcher m(node, options & AddressOption::kAllowInputSwap); 482 AddMatcher m(node, options & AddressOption::kAllowInputSwap);
483 Node* left = m.left().node(); 483 Node* left = m.left().node();
484 Node* right = m.right().node(); 484 Node* right = m.right().node();
485 Node* displacement = nullptr; 485 Node* displacement = nullptr;
486 Node* base = nullptr; 486 Node* base = nullptr;
487 Node* index = nullptr; 487 Node* index = nullptr;
488 Node* scale_expression = nullptr; 488 Node* scale_expression = nullptr;
489 bool power_of_two_plus_one = false; 489 bool power_of_two_plus_one = false;
490 DisplacementMode displacement_mode = kPositiveDisplacement; 490 DisplacementMode displacement_mode = kPositiveDisplacement;
491 int scale = 0; 491 int scale = 0;
492 if (m.HasIndexInput() && left->OwnedBy(node)) { 492 if (m.HasIndexInput() && left->OwnedByAddressingOperand()) {
493 index = m.IndexInput(); 493 index = m.IndexInput();
494 scale = m.scale(); 494 scale = m.scale();
495 scale_expression = left; 495 scale_expression = left;
496 power_of_two_plus_one = m.power_of_two_plus_one(); 496 power_of_two_plus_one = m.power_of_two_plus_one();
497 bool match_found = false; 497 bool match_found = false;
498 if (right->opcode() == AddMatcher::kSubOpcode && right->OwnedBy(node)) { 498 if (right->opcode() == AddMatcher::kSubOpcode &&
499 right->OwnedByAddressingOperand()) {
499 AddMatcher right_matcher(right); 500 AddMatcher right_matcher(right);
500 if (right_matcher.right().HasValue()) { 501 if (right_matcher.right().HasValue()) {
501 // (S + (B - D)) 502 // (S + (B - D))
502 base = right_matcher.left().node(); 503 base = right_matcher.left().node();
503 displacement = right_matcher.right().node(); 504 displacement = right_matcher.right().node();
504 displacement_mode = kNegativeDisplacement; 505 displacement_mode = kNegativeDisplacement;
505 match_found = true; 506 match_found = true;
506 } 507 }
507 } 508 }
508 if (!match_found) { 509 if (!match_found) {
509 if (right->opcode() == AddMatcher::kAddOpcode && right->OwnedBy(node)) { 510 if (right->opcode() == AddMatcher::kAddOpcode &&
511 right->OwnedByAddressingOperand()) {
510 AddMatcher right_matcher(right); 512 AddMatcher right_matcher(right);
511 if (right_matcher.right().HasValue()) { 513 if (right_matcher.right().HasValue()) {
512 // (S + (B + D)) 514 // (S + (B + D))
513 base = right_matcher.left().node(); 515 base = right_matcher.left().node();
514 displacement = right_matcher.right().node(); 516 displacement = right_matcher.right().node();
515 } else { 517 } else {
516 // (S + (B + B)) 518 // (S + (B + B))
517 base = right; 519 base = right;
518 } 520 }
519 } else if (m.right().HasValue()) { 521 } else if (m.right().HasValue()) {
520 // (S + D) 522 // (S + D)
521 displacement = right; 523 displacement = right;
522 } else { 524 } else {
523 // (S + B) 525 // (S + B)
524 base = right; 526 base = right;
525 } 527 }
526 } 528 }
527 } else { 529 } else {
528 bool match_found = false; 530 bool match_found = false;
529 if (left->opcode() == AddMatcher::kSubOpcode && left->OwnedBy(node)) { 531 if (left->opcode() == AddMatcher::kSubOpcode &&
532 left->OwnedByAddressingOperand()) {
530 AddMatcher left_matcher(left); 533 AddMatcher left_matcher(left);
531 Node* left_left = left_matcher.left().node(); 534 Node* left_left = left_matcher.left().node();
532 Node* left_right = left_matcher.right().node(); 535 Node* left_right = left_matcher.right().node();
533 if (left_matcher.right().HasValue()) { 536 if (left_matcher.right().HasValue()) {
534 if (left_matcher.HasIndexInput() && left_left->OwnedBy(left)) { 537 if (left_matcher.HasIndexInput() && left_left->OwnedBy(left)) {
535 // ((S - D) + B) 538 // ((S - D) + B)
536 index = left_matcher.IndexInput(); 539 index = left_matcher.IndexInput();
537 scale = left_matcher.scale(); 540 scale = left_matcher.scale();
538 scale_expression = left_left; 541 scale_expression = left_left;
539 power_of_two_plus_one = left_matcher.power_of_two_plus_one(); 542 power_of_two_plus_one = left_matcher.power_of_two_plus_one();
540 displacement = left_right; 543 displacement = left_right;
541 displacement_mode = kNegativeDisplacement; 544 displacement_mode = kNegativeDisplacement;
542 base = right; 545 base = right;
543 } else { 546 } else {
544 // ((B - D) + B) 547 // ((B - D) + B)
545 index = left_left; 548 index = left_left;
546 displacement = left_right; 549 displacement = left_right;
547 displacement_mode = kNegativeDisplacement; 550 displacement_mode = kNegativeDisplacement;
548 base = right; 551 base = right;
549 } 552 }
550 match_found = true; 553 match_found = true;
551 } 554 }
552 } 555 }
553 if (!match_found) { 556 if (!match_found) {
554 if (left->opcode() == AddMatcher::kAddOpcode && left->OwnedBy(node)) { 557 if (left->opcode() == AddMatcher::kAddOpcode &&
558 left->OwnedByAddressingOperand()) {
555 AddMatcher left_matcher(left); 559 AddMatcher left_matcher(left);
556 Node* left_left = left_matcher.left().node(); 560 Node* left_left = left_matcher.left().node();
557 Node* left_right = left_matcher.right().node(); 561 Node* left_right = left_matcher.right().node();
558 if (left_matcher.HasIndexInput() && left_left->OwnedBy(left)) { 562 if (left_matcher.HasIndexInput() && left_left->OwnedBy(left)) {
559 if (left_matcher.right().HasValue()) { 563 if (left_matcher.right().HasValue()) {
560 // ((S + D) + B) 564 // ((S + D) + B)
561 index = left_matcher.IndexInput(); 565 index = left_matcher.IndexInput();
562 scale = left_matcher.scale(); 566 scale = left_matcher.scale();
563 scale_expression = left_left; 567 scale_expression = left_left;
564 power_of_two_plus_one = left_matcher.power_of_two_plus_one(); 568 power_of_two_plus_one = left_matcher.power_of_two_plus_one();
565 displacement = left_right; 569 displacement = left_right;
566 base = right; 570 base = right;
567 } else if (m.right().HasValue()) { 571 } else if (m.right().HasValue()) {
568 // ((S + B) + D) 572 if (left->OwnedBy(node)) {
569 index = left_matcher.IndexInput(); 573 // ((S + B) + D)
570 scale = left_matcher.scale(); 574 index = left_matcher.IndexInput();
571 scale_expression = left_left; 575 scale = left_matcher.scale();
572 power_of_two_plus_one = left_matcher.power_of_two_plus_one(); 576 scale_expression = left_left;
573 base = left_right; 577 power_of_two_plus_one = left_matcher.power_of_two_plus_one();
574 displacement = right; 578 base = left_right;
579 displacement = right;
580 } else {
581 // (B + D)
582 base = left;
583 displacement = right;
584 }
575 } else { 585 } else {
576 // (B + B) 586 // (B + B)
577 index = left; 587 index = left;
578 base = right; 588 base = right;
579 } 589 }
580 } else { 590 } else {
581 if (left_matcher.right().HasValue()) { 591 if (left_matcher.right().HasValue()) {
582 // ((B + D) + B) 592 // ((B + D) + B)
583 index = left_left; 593 index = left_left;
584 displacement = left_right; 594 displacement = left_right;
585 base = right; 595 base = right;
586 } else if (m.right().HasValue()) { 596 } else if (m.right().HasValue()) {
587 // ((B + B) + D) 597 if (left->OwnedBy(node)) {
588 index = left_left; 598 // ((B + B) + D)
589 base = left_right; 599 index = left_left;
590 displacement = right; 600 base = left_right;
601 displacement = right;
602 } else {
603 // (B + D)
604 base = left;
605 displacement = right;
606 }
591 } else { 607 } else {
592 // (B + B) 608 // (B + B)
593 index = left; 609 index = left;
594 base = right; 610 base = right;
595 } 611 }
596 } 612 }
597 } else { 613 } else {
598 if (m.right().HasValue()) { 614 if (m.right().HasValue()) {
599 // (B + D) 615 // (B + D)
600 base = left; 616 base = left;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 Node* branch_; 718 Node* branch_;
703 Node* if_true_; 719 Node* if_true_;
704 Node* if_false_; 720 Node* if_false_;
705 }; 721 };
706 722
707 } // namespace compiler 723 } // namespace compiler
708 } // namespace internal 724 } // namespace internal
709 } // namespace v8 725 } // namespace v8
710 726
711 #endif // V8_COMPILER_NODE_MATCHERS_H_ 727 #endif // V8_COMPILER_NODE_MATCHERS_H_
OLDNEW
« no previous file with comments | « src/compiler/node.cc ('k') | test/unittests/compiler/node-matchers-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698