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/compiler/machine-operator-reducer.h" | 5 #include "src/compiler/machine-operator-reducer.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/compiler/diamond.h" | 10 #include "src/compiler/diamond.h" |
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 node->ReplaceInput( | 772 node->ReplaceInput( |
773 1, Int32Constant(m.right().Value() & mleft.right().Value())); | 773 1, Int32Constant(m.right().Value() & mleft.right().Value())); |
774 Reduction reduction = ReduceWord32And(node); | 774 Reduction reduction = ReduceWord32And(node); |
775 return reduction.Changed() ? reduction : Changed(node); | 775 return reduction.Changed() ? reduction : Changed(node); |
776 } | 776 } |
777 } | 777 } |
778 if (m.left().IsInt32Add() && m.right().IsNegativePowerOf2()) { | 778 if (m.left().IsInt32Add() && m.right().IsNegativePowerOf2()) { |
779 Int32BinopMatcher mleft(m.left().node()); | 779 Int32BinopMatcher mleft(m.left().node()); |
780 if (mleft.right().HasValue() && | 780 if (mleft.right().HasValue() && |
781 (mleft.right().Value() & m.right().Value()) == mleft.right().Value()) { | 781 (mleft.right().Value() & m.right().Value()) == mleft.right().Value()) { |
782 // (x + K) & K => (x & K) + K | 782 // (x + (K << L)) & (-1 << L) => (x & (-1 << L)) + (K << L) |
783 return Replace(graph()->NewNode( | 783 return Replace(graph()->NewNode( |
784 machine()->Int32Add(), | 784 machine()->Int32Add(), |
785 graph()->NewNode(machine()->Word32And(), mleft.left().node(), | 785 graph()->NewNode(machine()->Word32And(), mleft.left().node(), |
786 m.right().node()), | 786 m.right().node()), |
787 mleft.right().node())); | 787 mleft.right().node())); |
788 } | 788 } |
| 789 if (mleft.left().IsWord32Shl()) { |
| 790 Int32BinopMatcher mleftleft(mleft.left().node()); |
| 791 if (mleftleft.right().Is( |
| 792 base::bits::CountTrailingZeros32(m.right().Value()))) { |
| 793 // (y << L + x) & (-1 << L) => (x & (-1 << L)) + y << L |
| 794 return Replace(graph()->NewNode( |
| 795 machine()->Int32Add(), |
| 796 graph()->NewNode(machine()->Word32And(), mleft.right().node(), |
| 797 m.right().node()), |
| 798 mleftleft.node())); |
| 799 } |
| 800 } |
| 801 if (mleft.right().IsWord32Shl()) { |
| 802 Int32BinopMatcher mleftright(mleft.right().node()); |
| 803 if (mleftright.right().Is( |
| 804 base::bits::CountTrailingZeros32(m.right().Value()))) { |
| 805 // (x + y << L) & (-1 << L) => (x & (-1 << L)) + y << L |
| 806 return Replace(graph()->NewNode( |
| 807 machine()->Int32Add(), |
| 808 graph()->NewNode(machine()->Word32And(), mleft.left().node(), |
| 809 m.right().node()), |
| 810 mleftright.node())); |
| 811 } |
| 812 } |
789 } | 813 } |
790 return NoChange(); | 814 return NoChange(); |
791 } | 815 } |
792 | 816 |
793 | 817 |
794 Reduction MachineOperatorReducer::ReduceWord32Or(Node* node) { | 818 Reduction MachineOperatorReducer::ReduceWord32Or(Node* node) { |
795 DCHECK_EQ(IrOpcode::kWord32Or, node->opcode()); | 819 DCHECK_EQ(IrOpcode::kWord32Or, node->opcode()); |
796 Int32BinopMatcher m(node); | 820 Int32BinopMatcher m(node); |
797 if (m.right().Is(0)) return Replace(m.left().node()); // x | 0 => x | 821 if (m.right().Is(0)) return Replace(m.left().node()); // x | 0 => x |
798 if (m.right().Is(-1)) return Replace(m.right().node()); // x | -1 => -1 | 822 if (m.right().Is(-1)) return Replace(m.right().node()); // x | -1 => -1 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 880 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
857 return jsgraph()->machine(); | 881 return jsgraph()->machine(); |
858 } | 882 } |
859 | 883 |
860 | 884 |
861 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 885 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
862 | 886 |
863 } // namespace compiler | 887 } // namespace compiler |
864 } // namespace internal | 888 } // namespace internal |
865 } // namespace v8 | 889 } // namespace v8 |
OLD | NEW |