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