| OLD | NEW |
| 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 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/compiler/access-builder.h" | 6 #include "src/compiler/access-builder.h" |
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/js-typed-lowering.h" | 8 #include "src/compiler/js-typed-lowering.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 // Insert an boolean not to invert the value. | 174 // Insert an boolean not to invert the value. |
| 175 Node* value = graph()->NewNode(simplified()->BooleanNot(), node_); | 175 Node* value = graph()->NewNode(simplified()->BooleanNot(), node_); |
| 176 node_->ReplaceUses(value); | 176 node_->ReplaceUses(value); |
| 177 // Note: ReplaceUses() smashes all uses, so smash it back here. | 177 // Note: ReplaceUses() smashes all uses, so smash it back here. |
| 178 value->ReplaceInput(0, node_); | 178 value->ReplaceInput(0, node_); |
| 179 return lowering_->Replace(value); | 179 return lowering_->Replace(value); |
| 180 } | 180 } |
| 181 return lowering_->Changed(node_); | 181 return lowering_->Changed(node_); |
| 182 } | 182 } |
| 183 | 183 |
| 184 Reduction ChangeToStringComparisonOperator(const Operator* op, |
| 185 bool invert = false) { |
| 186 if (node_->op()->ControlInputCount() > 0) { |
| 187 lowering_->RelaxControls(node_); |
| 188 } |
| 189 // String comparison operators need effect and control inputs, so copy them |
| 190 // over. |
| 191 Node* effect = NodeProperties::GetEffectInput(node_); |
| 192 Node* control = NodeProperties::GetControlInput(node_); |
| 193 node_->ReplaceInput(2, effect); |
| 194 node_->ReplaceInput(3, control); |
| 195 |
| 196 node_->TrimInputCount(4); |
| 197 NodeProperties::ChangeOp(node_, op); |
| 198 |
| 199 if (invert) { |
| 200 // Insert a boolean-not to invert the value. |
| 201 Node* value = graph()->NewNode(simplified()->BooleanNot(), node_); |
| 202 node_->ReplaceUses(value); |
| 203 // Note: ReplaceUses() smashes all uses, so smash it back here. |
| 204 value->ReplaceInput(0, node_); |
| 205 return lowering_->Replace(value); |
| 206 } |
| 207 return lowering_->Changed(node_); |
| 208 } |
| 209 |
| 184 Reduction ChangeToPureOperator(const Operator* op, Type* type) { | 210 Reduction ChangeToPureOperator(const Operator* op, Type* type) { |
| 185 return ChangeToPureOperator(op, false, type); | 211 return ChangeToPureOperator(op, false, type); |
| 186 } | 212 } |
| 187 | 213 |
| 188 bool IsStrong() { return is_strong(OpParameter<LanguageMode>(node_)); } | 214 bool IsStrong() { return is_strong(OpParameter<LanguageMode>(node_)); } |
| 189 | 215 |
| 190 bool OneInputIs(Type* t) { return left_type()->Is(t) || right_type()->Is(t); } | 216 bool OneInputIs(Type* t) { return left_type()->Is(t) || right_type()->Is(t); } |
| 191 | 217 |
| 192 bool BothInputsAre(Type* t) { | 218 bool BothInputsAre(Type* t) { |
| 193 return left_type()->Is(t) && right_type()->Is(t); | 219 return left_type()->Is(t) && right_type()->Is(t); |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 case IrOpcode::kJSLessThanOrEqual: | 522 case IrOpcode::kJSLessThanOrEqual: |
| 497 stringOp = simplified()->StringLessThanOrEqual(); | 523 stringOp = simplified()->StringLessThanOrEqual(); |
| 498 break; | 524 break; |
| 499 case IrOpcode::kJSGreaterThanOrEqual: | 525 case IrOpcode::kJSGreaterThanOrEqual: |
| 500 stringOp = simplified()->StringLessThanOrEqual(); | 526 stringOp = simplified()->StringLessThanOrEqual(); |
| 501 r.SwapInputs(); // a >= b => b <= a | 527 r.SwapInputs(); // a >= b => b <= a |
| 502 break; | 528 break; |
| 503 default: | 529 default: |
| 504 return NoChange(); | 530 return NoChange(); |
| 505 } | 531 } |
| 506 return r.ChangeToPureOperator(stringOp); | 532 r.ChangeToStringComparisonOperator(stringOp); |
| 533 return Changed(node); |
| 507 } | 534 } |
| 508 if (r.OneInputCannotBe(Type::StringOrReceiver())) { | 535 if (r.OneInputCannotBe(Type::StringOrReceiver())) { |
| 509 const Operator* less_than; | 536 const Operator* less_than; |
| 510 const Operator* less_than_or_equal; | 537 const Operator* less_than_or_equal; |
| 511 if (r.BothInputsAre(Type::Unsigned32())) { | 538 if (r.BothInputsAre(Type::Unsigned32())) { |
| 512 less_than = machine()->Uint32LessThan(); | 539 less_than = machine()->Uint32LessThan(); |
| 513 less_than_or_equal = machine()->Uint32LessThanOrEqual(); | 540 less_than_or_equal = machine()->Uint32LessThanOrEqual(); |
| 514 } else if (r.BothInputsAre(Type::Signed32())) { | 541 } else if (r.BothInputsAre(Type::Signed32())) { |
| 515 less_than = machine()->Int32LessThan(); | 542 less_than = machine()->Int32LessThan(); |
| 516 less_than_or_equal = machine()->Int32LessThanOrEqual(); | 543 less_than_or_equal = machine()->Int32LessThanOrEqual(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 } | 577 } |
| 551 | 578 |
| 552 | 579 |
| 553 Reduction JSTypedLowering::ReduceJSEqual(Node* node, bool invert) { | 580 Reduction JSTypedLowering::ReduceJSEqual(Node* node, bool invert) { |
| 554 JSBinopReduction r(this, node); | 581 JSBinopReduction r(this, node); |
| 555 | 582 |
| 556 if (r.BothInputsAre(Type::Number())) { | 583 if (r.BothInputsAre(Type::Number())) { |
| 557 return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); | 584 return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); |
| 558 } | 585 } |
| 559 if (r.BothInputsAre(Type::String())) { | 586 if (r.BothInputsAre(Type::String())) { |
| 560 return r.ChangeToPureOperator(simplified()->StringEqual(), invert); | 587 return r.ChangeToStringComparisonOperator(simplified()->StringEqual(), |
| 588 invert); |
| 561 } | 589 } |
| 562 if (r.BothInputsAre(Type::Receiver())) { | 590 if (r.BothInputsAre(Type::Receiver())) { |
| 563 return r.ChangeToPureOperator( | 591 return r.ChangeToPureOperator( |
| 564 simplified()->ReferenceEqual(Type::Receiver()), invert); | 592 simplified()->ReferenceEqual(Type::Receiver()), invert); |
| 565 } | 593 } |
| 566 // TODO(turbofan): js-typed-lowering of Equal(undefined) | 594 // TODO(turbofan): js-typed-lowering of Equal(undefined) |
| 567 // TODO(turbofan): js-typed-lowering of Equal(null) | 595 // TODO(turbofan): js-typed-lowering of Equal(null) |
| 568 // TODO(turbofan): js-typed-lowering of Equal(boolean) | 596 // TODO(turbofan): js-typed-lowering of Equal(boolean) |
| 569 return NoChange(); | 597 return NoChange(); |
| 570 } | 598 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 } | 635 } |
| 608 if (r.OneInputIs(Type::Receiver())) { | 636 if (r.OneInputIs(Type::Receiver())) { |
| 609 return r.ChangeToPureOperator( | 637 return r.ChangeToPureOperator( |
| 610 simplified()->ReferenceEqual(Type::Receiver()), invert); | 638 simplified()->ReferenceEqual(Type::Receiver()), invert); |
| 611 } | 639 } |
| 612 if (r.BothInputsAre(Type::Unique())) { | 640 if (r.BothInputsAre(Type::Unique())) { |
| 613 return r.ChangeToPureOperator(simplified()->ReferenceEqual(Type::Unique()), | 641 return r.ChangeToPureOperator(simplified()->ReferenceEqual(Type::Unique()), |
| 614 invert); | 642 invert); |
| 615 } | 643 } |
| 616 if (r.BothInputsAre(Type::String())) { | 644 if (r.BothInputsAre(Type::String())) { |
| 617 return r.ChangeToPureOperator(simplified()->StringEqual(), invert); | 645 return r.ChangeToStringComparisonOperator(simplified()->StringEqual(), |
| 646 invert); |
| 618 } | 647 } |
| 619 if (r.BothInputsAre(Type::Number())) { | 648 if (r.BothInputsAre(Type::Number())) { |
| 620 return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); | 649 return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); |
| 621 } | 650 } |
| 622 // TODO(turbofan): js-typed-lowering of StrictEqual(mixed types) | 651 // TODO(turbofan): js-typed-lowering of StrictEqual(mixed types) |
| 623 return NoChange(); | 652 return NoChange(); |
| 624 } | 653 } |
| 625 | 654 |
| 626 | 655 |
| 627 Reduction JSTypedLowering::ReduceJSUnaryNot(Node* node) { | 656 Reduction JSTypedLowering::ReduceJSUnaryNot(Node* node) { |
| (...skipping 1126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1754 } | 1783 } |
| 1755 | 1784 |
| 1756 | 1785 |
| 1757 MachineOperatorBuilder* JSTypedLowering::machine() const { | 1786 MachineOperatorBuilder* JSTypedLowering::machine() const { |
| 1758 return jsgraph()->machine(); | 1787 return jsgraph()->machine(); |
| 1759 } | 1788 } |
| 1760 | 1789 |
| 1761 } // namespace compiler | 1790 } // namespace compiler |
| 1762 } // namespace internal | 1791 } // namespace internal |
| 1763 } // namespace v8 | 1792 } // namespace v8 |
| OLD | NEW |