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: