diff options
Diffstat (limited to 'src/compiler/node-matchers.h')
-rw-r--r-- | src/compiler/node-matchers.h | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/compiler/node-matchers.h b/src/compiler/node-matchers.h index c317fdd5..d2bdb8bf 100644 --- a/src/compiler/node-matchers.h +++ b/src/compiler/node-matchers.h @@ -489,13 +489,14 @@ struct BaseWithIndexAndDisplacementMatcher { bool power_of_two_plus_one = false; DisplacementMode displacement_mode = kPositiveDisplacement; int scale = 0; - if (m.HasIndexInput() && left->OwnedBy(node)) { + if (m.HasIndexInput() && left->OwnedByAddressingOperand()) { index = m.IndexInput(); scale = m.scale(); scale_expression = left; power_of_two_plus_one = m.power_of_two_plus_one(); bool match_found = false; - if (right->opcode() == AddMatcher::kSubOpcode && right->OwnedBy(node)) { + if (right->opcode() == AddMatcher::kSubOpcode && + right->OwnedByAddressingOperand()) { AddMatcher right_matcher(right); if (right_matcher.right().HasValue()) { // (S + (B - D)) @@ -506,7 +507,8 @@ struct BaseWithIndexAndDisplacementMatcher { } } if (!match_found) { - if (right->opcode() == AddMatcher::kAddOpcode && right->OwnedBy(node)) { + if (right->opcode() == AddMatcher::kAddOpcode && + right->OwnedByAddressingOperand()) { AddMatcher right_matcher(right); if (right_matcher.right().HasValue()) { // (S + (B + D)) @@ -526,7 +528,8 @@ struct BaseWithIndexAndDisplacementMatcher { } } else { bool match_found = false; - if (left->opcode() == AddMatcher::kSubOpcode && left->OwnedBy(node)) { + if (left->opcode() == AddMatcher::kSubOpcode && + left->OwnedByAddressingOperand()) { AddMatcher left_matcher(left); Node* left_left = left_matcher.left().node(); Node* left_right = left_matcher.right().node(); @@ -551,7 +554,8 @@ struct BaseWithIndexAndDisplacementMatcher { } } if (!match_found) { - if (left->opcode() == AddMatcher::kAddOpcode && left->OwnedBy(node)) { + if (left->opcode() == AddMatcher::kAddOpcode && + left->OwnedByAddressingOperand()) { AddMatcher left_matcher(left); Node* left_left = left_matcher.left().node(); Node* left_right = left_matcher.right().node(); @@ -565,13 +569,19 @@ struct BaseWithIndexAndDisplacementMatcher { displacement = left_right; base = right; } else if (m.right().HasValue()) { - // ((S + B) + D) - index = left_matcher.IndexInput(); - scale = left_matcher.scale(); - scale_expression = left_left; - power_of_two_plus_one = left_matcher.power_of_two_plus_one(); - base = left_right; - displacement = right; + if (left->OwnedBy(node)) { + // ((S + B) + D) + index = left_matcher.IndexInput(); + scale = left_matcher.scale(); + scale_expression = left_left; + power_of_two_plus_one = left_matcher.power_of_two_plus_one(); + base = left_right; + displacement = right; + } else { + // (B + D) + base = left; + displacement = right; + } } else { // (B + B) index = left; @@ -584,10 +594,16 @@ struct BaseWithIndexAndDisplacementMatcher { displacement = left_right; base = right; } else if (m.right().HasValue()) { - // ((B + B) + D) - index = left_left; - base = left_right; - displacement = right; + if (left->OwnedBy(node)) { + // ((B + B) + D) + index = left_left; + base = left_right; + displacement = right; + } else { + // (B + D) + base = left; + displacement = right; + } } else { // (B + B) index = left; |