graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File basic-graal Sdiff graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes

graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java

Print this page




  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     /**


graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File