50 import org.graalvm.compiler.nodes.calc.NegateNode; 51 import org.graalvm.compiler.nodes.calc.NotNode; 52 import org.graalvm.compiler.nodes.calc.ObjectEqualsNode; 53 import org.graalvm.compiler.nodes.calc.OrNode; 54 import org.graalvm.compiler.nodes.calc.PointerEqualsNode; 55 import org.graalvm.compiler.nodes.calc.ReinterpretNode; 56 import org.graalvm.compiler.nodes.calc.RightShiftNode; 57 import org.graalvm.compiler.nodes.calc.SignExtendNode; 58 import org.graalvm.compiler.nodes.calc.SubNode; 59 import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode; 60 import org.graalvm.compiler.nodes.calc.XorNode; 61 import org.graalvm.compiler.nodes.calc.ZeroExtendNode; 62 import org.graalvm.compiler.nodes.java.LogicCompareAndSwapNode; 63 import org.graalvm.compiler.nodes.java.ValueCompareAndSwapNode; 64 import org.graalvm.compiler.nodes.memory.FloatingReadNode; 65 import org.graalvm.compiler.nodes.memory.ReadNode; 66 import org.graalvm.compiler.nodes.memory.WriteNode; 67 68 import jdk.vm.ci.meta.Value; 69 70 @MatchableNode(nodeClass = ConstantNode.class, shareable = true) 71 @MatchableNode(nodeClass = FloatConvertNode.class, inputs = {"value"}) 72 @MatchableNode(nodeClass = FloatingReadNode.class, inputs = {"address"}) 73 @MatchableNode(nodeClass = IfNode.class, inputs = {"condition"}) 74 @MatchableNode(nodeClass = SubNode.class, inputs = {"x", "y"}) 75 @MatchableNode(nodeClass = LeftShiftNode.class, inputs = {"x", "y"}) 76 @MatchableNode(nodeClass = NarrowNode.class, inputs = {"value"}) 77 @MatchableNode(nodeClass = ReadNode.class, inputs = {"address"}) 78 @MatchableNode(nodeClass = ReinterpretNode.class, inputs = {"value"}) 79 @MatchableNode(nodeClass = SignExtendNode.class, inputs = {"value"}) 80 @MatchableNode(nodeClass = UnsignedRightShiftNode.class, inputs = {"x", "y"}) 81 @MatchableNode(nodeClass = WriteNode.class, inputs = {"address", "value"}) 82 @MatchableNode(nodeClass = ZeroExtendNode.class, inputs = {"value"}) 83 @MatchableNode(nodeClass = AndNode.class, inputs = {"x", "y"}, commutative = true) 84 @MatchableNode(nodeClass = NegateNode.class, inputs = {"value"}) 85 @MatchableNode(nodeClass = NotNode.class, inputs = {"value"}) 86 @MatchableNode(nodeClass = FloatEqualsNode.class, inputs = {"x", "y"}, commutative = true) 87 @MatchableNode(nodeClass = FloatLessThanNode.class, inputs = {"x", "y"}, commutative = true) 88 @MatchableNode(nodeClass = PointerEqualsNode.class, inputs = {"x", "y"}, commutative = true) 89 @MatchableNode(nodeClass = AddNode.class, inputs = {"x", "y"}, commutative = true) 90 @MatchableNode(nodeClass = IntegerBelowNode.class, inputs = {"x", "y"}, commutative = true) 91 @MatchableNode(nodeClass = IntegerEqualsNode.class, inputs = {"x", "y"}, commutative = true) 92 @MatchableNode(nodeClass = IntegerLessThanNode.class, inputs = {"x", "y"}, commutative = true) 93 @MatchableNode(nodeClass = MulNode.class, inputs = {"x", "y"}, commutative = true) 94 @MatchableNode(nodeClass = IntegerTestNode.class, inputs = {"x", "y"}, commutative = true) 95 @MatchableNode(nodeClass = ObjectEqualsNode.class, inputs = {"x", "y"}, commutative = true) 96 @MatchableNode(nodeClass = OrNode.class, inputs = {"x", "y"}, commutative = true) 97 @MatchableNode(nodeClass = XorNode.class, inputs = {"x", "y"}, commutative = true) 98 @MatchableNode(nodeClass = PiNode.class, inputs = {"object"}) 99 @MatchableNode(nodeClass = LogicCompareAndSwapNode.class, inputs = {"address", "expectedValue", "newValue"}) 100 @MatchableNode(nodeClass = ValueCompareAndSwapNode.class, inputs = {"address", "expectedValue", "newValue"}) 101 @MatchableNode(nodeClass = RightShiftNode.class, inputs = {"x", "y"}) 102 public abstract class NodeMatchRules { 103 104 NodeLIRBuilder lirBuilder; 105 protected final LIRGeneratorTool gen; 106 107 protected NodeMatchRules(LIRGeneratorTool gen) { 108 this.gen = gen; 109 } 110 111 protected LIRGeneratorTool getLIRGeneratorTool() { 112 return gen; 113 } 114 115 /* 116 * For now we do not want to expose the full lirBuilder to subclasses, so we delegate the few 117 * methods that are actually needed. If the list grows too long, exposing lirBuilder might be 118 * the better approach. 119 */ 120 121 protected final Value operand(Node node) { | 50 import org.graalvm.compiler.nodes.calc.NegateNode; 51 import org.graalvm.compiler.nodes.calc.NotNode; 52 import org.graalvm.compiler.nodes.calc.ObjectEqualsNode; 53 import org.graalvm.compiler.nodes.calc.OrNode; 54 import org.graalvm.compiler.nodes.calc.PointerEqualsNode; 55 import org.graalvm.compiler.nodes.calc.ReinterpretNode; 56 import org.graalvm.compiler.nodes.calc.RightShiftNode; 57 import org.graalvm.compiler.nodes.calc.SignExtendNode; 58 import org.graalvm.compiler.nodes.calc.SubNode; 59 import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode; 60 import org.graalvm.compiler.nodes.calc.XorNode; 61 import org.graalvm.compiler.nodes.calc.ZeroExtendNode; 62 import org.graalvm.compiler.nodes.java.LogicCompareAndSwapNode; 63 import org.graalvm.compiler.nodes.java.ValueCompareAndSwapNode; 64 import org.graalvm.compiler.nodes.memory.FloatingReadNode; 65 import org.graalvm.compiler.nodes.memory.ReadNode; 66 import org.graalvm.compiler.nodes.memory.WriteNode; 67 68 import jdk.vm.ci.meta.Value; 69 70 @MatchableNode(nodeClass = ConstantNode.class, shareable = true, ignoresSideEffects = true) 71 @MatchableNode(nodeClass = FloatConvertNode.class, inputs = {"value"}, ignoresSideEffects = true) 72 @MatchableNode(nodeClass = FloatingReadNode.class, inputs = {"address"}) 73 @MatchableNode(nodeClass = IfNode.class, inputs = {"condition"}) 74 @MatchableNode(nodeClass = SubNode.class, inputs = {"x", "y"}, ignoresSideEffects = true) 75 @MatchableNode(nodeClass = LeftShiftNode.class, inputs = {"x", "y"}, ignoresSideEffects = true) 76 @MatchableNode(nodeClass = NarrowNode.class, inputs = {"value"}, ignoresSideEffects = true) 77 @MatchableNode(nodeClass = ReadNode.class, inputs = {"address"}) 78 @MatchableNode(nodeClass = ReinterpretNode.class, inputs = {"value"}, ignoresSideEffects = true) 79 @MatchableNode(nodeClass = SignExtendNode.class, inputs = {"value"}, ignoresSideEffects = true) 80 @MatchableNode(nodeClass = UnsignedRightShiftNode.class, inputs = {"x", "y"}, ignoresSideEffects = true) 81 @MatchableNode(nodeClass = WriteNode.class, inputs = {"address", "value"}) 82 @MatchableNode(nodeClass = ZeroExtendNode.class, inputs = {"value"}, ignoresSideEffects = true) 83 @MatchableNode(nodeClass = AndNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 84 @MatchableNode(nodeClass = NegateNode.class, inputs = {"value"}, ignoresSideEffects = true) 85 @MatchableNode(nodeClass = NotNode.class, inputs = {"value"}, ignoresSideEffects = true) 86 @MatchableNode(nodeClass = FloatEqualsNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 87 @MatchableNode(nodeClass = FloatLessThanNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 88 @MatchableNode(nodeClass = PointerEqualsNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 89 @MatchableNode(nodeClass = AddNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 90 @MatchableNode(nodeClass = IntegerBelowNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 91 @MatchableNode(nodeClass = IntegerEqualsNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 92 @MatchableNode(nodeClass = IntegerLessThanNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 93 @MatchableNode(nodeClass = MulNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 94 @MatchableNode(nodeClass = IntegerTestNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 95 @MatchableNode(nodeClass = ObjectEqualsNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 96 @MatchableNode(nodeClass = OrNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 97 @MatchableNode(nodeClass = XorNode.class, inputs = {"x", "y"}, commutative = true, ignoresSideEffects = true) 98 @MatchableNode(nodeClass = PiNode.class, inputs = {"object"}, ignoresSideEffects = true) 99 @MatchableNode(nodeClass = LogicCompareAndSwapNode.class, inputs = {"address", "expectedValue", "newValue"}) 100 @MatchableNode(nodeClass = ValueCompareAndSwapNode.class, inputs = {"address", "expectedValue", "newValue"}) 101 @MatchableNode(nodeClass = RightShiftNode.class, inputs = {"x", "y"}, ignoresSideEffects = true) 102 public abstract class NodeMatchRules { 103 104 NodeLIRBuilder lirBuilder; 105 protected final LIRGeneratorTool gen; 106 107 protected NodeMatchRules(LIRGeneratorTool gen) { 108 this.gen = gen; 109 } 110 111 protected LIRGeneratorTool getLIRGeneratorTool() { 112 return gen; 113 } 114 115 /* 116 * For now we do not want to expose the full lirBuilder to subclasses, so we delegate the few 117 * methods that are actually needed. If the list grows too long, exposing lirBuilder might be 118 * the better approach. 119 */ 120 121 protected final Value operand(Node node) { |