31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
33 import org.graalvm.compiler.lir.gen.ArithmeticLIRGeneratorTool;
34 import org.graalvm.compiler.nodeinfo.NodeInfo;
35 import org.graalvm.compiler.nodes.ConstantNode;
36 import org.graalvm.compiler.nodes.NodeView;
37 import org.graalvm.compiler.nodes.ValueNode;
38 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
39
40 import jdk.vm.ci.code.CodeUtil;
41
42 @NodeInfo(shortName = ">>")
43 public final class RightShiftNode extends ShiftNode<Shr> {
44
45 public static final NodeClass<RightShiftNode> TYPE = NodeClass.create(RightShiftNode.class);
46
47 public RightShiftNode(ValueNode x, ValueNode y) {
48 super(TYPE, ArithmeticOpTable::getShr, x, y);
49 }
50
51 public static ValueNode create(ValueNode x, ValueNode y, NodeView view) {
52 ArithmeticOpTable.ShiftOp<Shr> op = ArithmeticOpTable.forStamp(x.stamp(view)).getShr();
53 Stamp stamp = op.foldStamp(x.stamp(view), (IntegerStamp) y.stamp(view));
54 ValueNode value = ShiftNode.canonical(op, stamp, x, y, view);
55 if (value != null) {
56 return value;
57 }
58
59 return canonical(null, op, stamp, x, y, view);
60 }
61
62 @Override
63 public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
64 NodeView view = NodeView.from(tool);
65 ValueNode ret = super.canonical(tool, forX, forY);
66 if (ret != this) {
67 return ret;
68 }
69
70 return canonical(this, getArithmeticOp(), stamp(view), forX, forY, view);
|
31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
33 import org.graalvm.compiler.lir.gen.ArithmeticLIRGeneratorTool;
34 import org.graalvm.compiler.nodeinfo.NodeInfo;
35 import org.graalvm.compiler.nodes.ConstantNode;
36 import org.graalvm.compiler.nodes.NodeView;
37 import org.graalvm.compiler.nodes.ValueNode;
38 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
39
40 import jdk.vm.ci.code.CodeUtil;
41
42 @NodeInfo(shortName = ">>")
43 public final class RightShiftNode extends ShiftNode<Shr> {
44
45 public static final NodeClass<RightShiftNode> TYPE = NodeClass.create(RightShiftNode.class);
46
47 public RightShiftNode(ValueNode x, ValueNode y) {
48 super(TYPE, ArithmeticOpTable::getShr, x, y);
49 }
50
51 public static ValueNode create(ValueNode x, int y, NodeView view) {
52 if (y == 0) {
53 return x;
54 }
55 return create(x, ConstantNode.forInt(y), view);
56 }
57
58 public static ValueNode create(ValueNode x, ValueNode y, NodeView view) {
59 ArithmeticOpTable.ShiftOp<Shr> op = ArithmeticOpTable.forStamp(x.stamp(view)).getShr();
60 Stamp stamp = op.foldStamp(x.stamp(view), (IntegerStamp) y.stamp(view));
61 ValueNode value = ShiftNode.canonical(op, stamp, x, y, view);
62 if (value != null) {
63 return value;
64 }
65
66 return canonical(null, op, stamp, x, y, view);
67 }
68
69 @Override
70 public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
71 NodeView view = NodeView.from(tool);
72 ValueNode ret = super.canonical(tool, forX, forY);
73 if (ret != this) {
74 return ret;
75 }
76
77 return canonical(this, getArithmeticOp(), stamp(view), forX, forY, view);
|