Mercurial > hg > truffle
comparison graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java @ 11352:8185c119d731
"always set" bit mask on IntegerStamps
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Fri, 16 Aug 2013 13:15:42 +0200 |
parents | ef6915cf1e59 |
children | 9088d13767f3 |
comparison
equal
deleted
inserted
replaced
11314:dc14bcf752ea | 11352:8185c119d731 |
---|---|
41 private static final Stamp virtualStamp = new GenericStamp(GenericStampType.Virtual); | 41 private static final Stamp virtualStamp = new GenericStamp(GenericStampType.Virtual); |
42 private static final Stamp conditionStamp = new GenericStamp(GenericStampType.Condition); | 42 private static final Stamp conditionStamp = new GenericStamp(GenericStampType.Condition); |
43 private static final Stamp voidStamp = new GenericStamp(GenericStampType.Void); | 43 private static final Stamp voidStamp = new GenericStamp(GenericStampType.Void); |
44 private static final Stamp nodeIntrinsicStamp = new ObjectStamp(null, false, false, false); | 44 private static final Stamp nodeIntrinsicStamp = new ObjectStamp(null, false, false, false); |
45 private static final Stamp wordStamp = new ObjectStamp(null, false, false, false); | 45 private static final Stamp wordStamp = new ObjectStamp(null, false, false, false); |
46 private static final Stamp positiveInt = forInteger(Kind.Int, 0, Integer.MAX_VALUE, Integer.MAX_VALUE); | 46 private static final Stamp positiveInt = forInteger(Kind.Int, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE); |
47 | 47 |
48 private static void setCache(Kind kind, Stamp stamp) { | 48 private static void setCache(Kind kind, Stamp stamp) { |
49 stampCache[kind.ordinal()] = stamp; | 49 stampCache[kind.ordinal()] = stamp; |
50 } | 50 } |
51 | 51 |
115 | 115 |
116 public static Stamp illegal() { | 116 public static Stamp illegal() { |
117 return IllegalStamp.ILLEGAL; | 117 return IllegalStamp.ILLEGAL; |
118 } | 118 } |
119 | 119 |
120 public static Stamp forInteger(Kind kind, long lowerBound, long upperBound, long mask) { | 120 public static IntegerStamp forInteger(Kind kind, long lowerBound, long upperBound, long downMask, long upMask) { |
121 return new IntegerStamp(kind, lowerBound, upperBound, mask); | 121 return new IntegerStamp(kind, lowerBound, upperBound, downMask, upMask); |
122 } | 122 } |
123 | 123 |
124 public static Stamp forInteger(Kind kind, long lowerBound, long upperBound) { | 124 public static IntegerStamp forInteger(Kind kind, long lowerBound, long upperBound) { |
125 long mask; | 125 long defaultMask = IntegerStamp.defaultMask(kind); |
126 if (lowerBound < 0) { | 126 if (lowerBound == upperBound) { |
127 mask = IntegerStamp.defaultMask(kind); | 127 return new IntegerStamp(kind, lowerBound, lowerBound, lowerBound & defaultMask, lowerBound & defaultMask); |
128 } | |
129 final long downMask; | |
130 final long upMask; | |
131 if (lowerBound >= 0) { | |
132 int upperBoundLeadingZeros = Long.numberOfLeadingZeros(upperBound); | |
133 long differentBits = lowerBound ^ upperBound; | |
134 int sameBitCount = Long.numberOfLeadingZeros(differentBits << upperBoundLeadingZeros); | |
135 | |
136 upMask = upperBound | -1L >>> (upperBoundLeadingZeros + sameBitCount); | |
137 downMask = upperBound & ~(-1L >>> (upperBoundLeadingZeros + sameBitCount)); | |
128 } else { | 138 } else { |
129 mask = -1 >>> Long.numberOfLeadingZeros(upperBound); | 139 if (upperBound >= 0) { |
130 } | 140 upMask = defaultMask; |
131 return forInteger(kind, lowerBound, upperBound, mask); | 141 downMask = 0; |
132 } | 142 } else { |
133 | 143 int lowerBoundLeadingOnes = Long.numberOfLeadingZeros(~lowerBound); |
134 public static Stamp forFloat(Kind kind, double lowerBound, double upperBound, boolean nonNaN) { | 144 long differentBits = lowerBound ^ upperBound; |
145 int sameBitCount = Long.numberOfLeadingZeros(differentBits << lowerBoundLeadingOnes); | |
146 | |
147 upMask = lowerBound | -1L >>> (lowerBoundLeadingOnes + sameBitCount) | ~(-1L >>> lowerBoundLeadingOnes); | |
148 downMask = lowerBound & ~(-1L >>> (lowerBoundLeadingOnes + sameBitCount)) | ~(-1L >>> lowerBoundLeadingOnes); | |
149 } | |
150 } | |
151 return forInteger(kind, lowerBound, upperBound, downMask & defaultMask, upMask & defaultMask); | |
152 } | |
153 | |
154 public static FloatStamp forFloat(Kind kind, double lowerBound, double upperBound, boolean nonNaN) { | |
135 return new FloatStamp(kind, lowerBound, upperBound, nonNaN); | 155 return new FloatStamp(kind, lowerBound, upperBound, nonNaN); |
136 } | 156 } |
137 | 157 |
138 public static Stamp forConstant(Constant value) { | 158 public static Stamp forConstant(Constant value) { |
139 Kind kind = value.getKind(); | 159 Kind kind = value.getKind(); |
142 case Byte: | 162 case Byte: |
143 case Char: | 163 case Char: |
144 case Short: | 164 case Short: |
145 case Int: | 165 case Int: |
146 case Long: | 166 case Long: |
147 return forInteger(kind.getStackKind(), value.asLong(), value.asLong(), value.asLong() & IntegerStamp.defaultMask(kind)); | 167 long mask = value.asLong() & IntegerStamp.defaultMask(kind); |
168 return forInteger(kind.getStackKind(), value.asLong(), value.asLong(), mask, mask); | |
148 case Float: | 169 case Float: |
149 return forFloat(kind, value.asFloat(), value.asFloat(), !Float.isNaN(value.asFloat())); | 170 return forFloat(kind, value.asFloat(), value.asFloat(), !Float.isNaN(value.asFloat())); |
150 case Double: | 171 case Double: |
151 return forFloat(kind, value.asDouble(), value.asDouble(), !Double.isNaN(value.asDouble())); | 172 return forFloat(kind, value.asDouble(), value.asDouble(), !Double.isNaN(value.asDouble())); |
152 default: | 173 default: |