38 @NodeInfo
39 public class BitScanReverseNode extends UnaryNode implements LIRLowerable {
40
41 public static BitScanReverseNode create(ValueNode value) {
42 return new BitScanReverseNode(value);
43 }
44
45 protected BitScanReverseNode(ValueNode value) {
46 super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits()), value);
47 assert value.getKind() == Kind.Int || value.getKind() == Kind.Long;
48 }
49
50 @Override
51 public boolean inferStamp() {
52 IntegerStamp valueStamp = (IntegerStamp) getValue().stamp();
53 int min;
54 int max;
55 long mask = CodeUtil.mask(valueStamp.getBits());
56 int lastAlwaysSetBit = scan(valueStamp.downMask() & mask);
57 if (lastAlwaysSetBit == -1) {
58 min = -1;
59 } else {
60 min = lastAlwaysSetBit;
61 }
62 int lastMaybeSetBit = scan(valueStamp.upMask() & mask);
63 max = lastMaybeSetBit;
64 return updateStamp(StampFactory.forInteger(Kind.Int, min, max));
65 }
66
67 @Override
68 public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
69 if (forValue.isConstant()) {
70 JavaConstant c = forValue.asJavaConstant();
71 if (c.asLong() != 0) {
72 return ConstantNode.forInt(forValue.getKind() == Kind.Int ? scan(c.asInt()) : scan(c.asLong()));
73 }
74 }
75 return this;
76 }
77
78 /**
|
38 @NodeInfo
39 public class BitScanReverseNode extends UnaryNode implements LIRLowerable {
40
41 public static BitScanReverseNode create(ValueNode value) {
42 return new BitScanReverseNode(value);
43 }
44
45 protected BitScanReverseNode(ValueNode value) {
46 super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits()), value);
47 assert value.getKind() == Kind.Int || value.getKind() == Kind.Long;
48 }
49
50 @Override
51 public boolean inferStamp() {
52 IntegerStamp valueStamp = (IntegerStamp) getValue().stamp();
53 int min;
54 int max;
55 long mask = CodeUtil.mask(valueStamp.getBits());
56 int lastAlwaysSetBit = scan(valueStamp.downMask() & mask);
57 if (lastAlwaysSetBit == -1) {
58 int firstMaybeSetBit = BitScanForwardNode.scan(valueStamp.upMask() & mask);
59 min = firstMaybeSetBit;
60 } else {
61 min = lastAlwaysSetBit;
62 }
63 int lastMaybeSetBit = scan(valueStamp.upMask() & mask);
64 max = lastMaybeSetBit;
65 return updateStamp(StampFactory.forInteger(Kind.Int, min, max));
66 }
67
68 @Override
69 public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
70 if (forValue.isConstant()) {
71 JavaConstant c = forValue.asJavaConstant();
72 if (c.asLong() != 0) {
73 return ConstantNode.forInt(forValue.getKind() == Kind.Int ? scan(c.asInt()) : scan(c.asLong()));
74 }
75 }
76 return this;
77 }
78
79 /**
|