Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1308)

Side by Side Diff: src/types.h

Issue 788313002: Reland of "Avoid number range holes in bitset types." (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/typer.cc ('k') | src/types.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_TYPES_H_ 5 #ifndef V8_TYPES_H_
6 #define V8_TYPES_H_ 6 #define V8_TYPES_H_
7 7
8 #include "src/conversions.h" 8 #include "src/conversions.h"
9 #include "src/factory.h" 9 #include "src/factory.h"
10 #include "src/handles.h" 10 #include "src/handles.h"
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 kUntaggedUnsigned32) \ 181 kUntaggedUnsigned32) \
182 V(UntaggedIntegral8, kUntaggedSigned8 | kUntaggedUnsigned8) \ 182 V(UntaggedIntegral8, kUntaggedSigned8 | kUntaggedUnsigned8) \
183 V(UntaggedIntegral16, kUntaggedSigned16 | kUntaggedUnsigned16) \ 183 V(UntaggedIntegral16, kUntaggedSigned16 | kUntaggedUnsigned16) \
184 V(UntaggedIntegral32, kUntaggedSigned32 | kUntaggedUnsigned32) \ 184 V(UntaggedIntegral32, kUntaggedSigned32 | kUntaggedUnsigned32) \
185 V(UntaggedIntegral, kUntaggedBit | kUntaggedSigned | kUntaggedUnsigned) \ 185 V(UntaggedIntegral, kUntaggedBit | kUntaggedSigned | kUntaggedUnsigned) \
186 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \ 186 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \
187 V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \ 187 V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \
188 V(Untagged, kUntaggedNumber | kUntaggedPointer) \ 188 V(Untagged, kUntaggedNumber | kUntaggedPointer) \
189 V(Tagged, kTaggedSigned | kTaggedPointer) 189 V(Tagged, kTaggedSigned | kTaggedPointer)
190 190
191 #define INTERNAL_BITSET_TYPE_LIST(V) \
192 V(OtherUnsigned31, 1u << 1 | REPRESENTATION(kTagged | kUntaggedNumber)) \
193 V(OtherUnsigned32, 1u << 2 | REPRESENTATION(kTagged | kUntaggedNumber)) \
194 V(OtherSigned32, 1u << 3 | REPRESENTATION(kTagged | kUntaggedNumber)) \
195 V(OtherNumber, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber))
196
191 #define SEMANTIC_BITSET_TYPE_LIST(V) \ 197 #define SEMANTIC_BITSET_TYPE_LIST(V) \
192 V(Null, 1u << 1 | REPRESENTATION(kTaggedPointer)) \ 198 V(NegativeSignedSmall, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \
193 V(Undefined, 1u << 2 | REPRESENTATION(kTaggedPointer)) \ 199 V(Null, 1u << 6 | REPRESENTATION(kTaggedPointer)) \
194 V(Boolean, 1u << 3 | REPRESENTATION(kTaggedPointer)) \ 200 V(Undefined, 1u << 7 | REPRESENTATION(kTaggedPointer)) \
195 V(UnsignedSmall, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 201 V(Boolean, 1u << 8 | REPRESENTATION(kTaggedPointer)) \
196 V(OtherSignedSmall, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 202 V(UnsignedSmall, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \
197 V(OtherUnsigned31, 1u << 6 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 203 V(MinusZero, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \
198 V(OtherUnsigned32, 1u << 7 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 204 V(NaN, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \
199 V(OtherSigned32, 1u << 8 | REPRESENTATION(kTagged | kUntaggedNumber)) \
200 V(MinusZero, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \
201 V(NaN, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \
202 V(OtherNumber, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \
203 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \ 205 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \
204 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \ 206 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \
205 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \ 207 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \
206 V(Undetectable, 1u << 15 | REPRESENTATION(kTaggedPointer)) \ 208 V(Undetectable, 1u << 15 | REPRESENTATION(kTaggedPointer)) \
207 V(Array, 1u << 16 | REPRESENTATION(kTaggedPointer)) \ 209 V(Array, 1u << 16 | REPRESENTATION(kTaggedPointer)) \
208 V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \ 210 V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \
209 V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \ 211 V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \
210 V(Internal, 1u << 19 | REPRESENTATION(kTagged | kUntagged)) \ 212 V(Internal, 1u << 19 | REPRESENTATION(kTagged | kUntagged)) \
211 \ 213 \
212 V(SignedSmall, kUnsignedSmall | kOtherSignedSmall) \ 214 V(SignedSmall, kUnsignedSmall | kNegativeSignedSmall) \
213 V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \ 215 V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \
216 V(NegativeSigned32, kNegativeSignedSmall | kOtherSigned32) \
217 V(NonNegativeSigned32, kUnsignedSmall | kOtherUnsigned31) \
214 V(Unsigned32, kUnsignedSmall | kOtherUnsigned31 | kOtherUnsigned32) \ 218 V(Unsigned32, kUnsignedSmall | kOtherUnsigned31 | kOtherUnsigned32) \
215 V(Integral32, kSigned32 | kUnsigned32) \ 219 V(Integral32, kSigned32 | kUnsigned32) \
216 V(OrderedNumber, kIntegral32 | kMinusZero | kOtherNumber) \ 220 V(PlainNumber, kIntegral32 | kOtherNumber) \
221 V(OrderedNumber, kPlainNumber | kMinusZero) \
217 V(Number, kOrderedNumber | kNaN) \ 222 V(Number, kOrderedNumber | kNaN) \
218 V(String, kInternalizedString | kOtherString) \ 223 V(String, kInternalizedString | kOtherString) \
219 V(UniqueName, kSymbol | kInternalizedString) \ 224 V(UniqueName, kSymbol | kInternalizedString) \
220 V(Name, kSymbol | kString) \ 225 V(Name, kSymbol | kString) \
221 V(NumberOrString, kNumber | kString) \ 226 V(NumberOrString, kNumber | kString) \
222 V(PlainPrimitive, kNumberOrString | kBoolean | kNull | kUndefined) \ 227 V(PlainPrimitive, kNumberOrString | kBoolean | kNull | kUndefined) \
223 V(Primitive, kSymbol | kPlainPrimitive) \ 228 V(Primitive, kSymbol | kPlainPrimitive) \
224 V(DetectableObject, kArray | kOtherObject) \ 229 V(DetectableObject, kArray | kOtherObject) \
225 V(DetectableReceiver, kDetectableObject | kProxy) \ 230 V(DetectableReceiver, kDetectableObject | kProxy) \
226 V(Detectable, kDetectableReceiver | kNumber | kName) \ 231 V(Detectable, kDetectableReceiver | kNumber | kName) \
227 V(Object, kDetectableObject | kUndetectable) \ 232 V(Object, kDetectableObject | kUndetectable) \
228 V(Receiver, kObject | kProxy) \ 233 V(Receiver, kObject | kProxy) \
229 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \ 234 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \
230 kReceiver) \ 235 kReceiver) \
231 V(NonNumber, kUnique | kString | kInternal) \ 236 V(NonNumber, kUnique | kString | kInternal) \
232 V(Any, 0xfffffffeu) 237 V(Any, 0xfffffffeu)
233 238
239
234 /* 240 /*
235 * The following diagrams show how integers (in the mathematical sense) are 241 * The following diagrams show how integers (in the mathematical sense) are
236 * divided among the different atomic numerical types. 242 * divided among the different atomic numerical types.
237 * 243 *
238 * If SmiValuesAre31Bits(): 244 * If SmiValuesAre31Bits():
239 * 245 *
240 * ON OS32 OSS US OU31 OU32 ON 246 * ON OS32 OSS US OU31 OU32 ON
241 * ______[_______[_______[_______[_______[_______[_______ 247 * ______[_______[_______[_______[_______[_______[_______
242 * -2^31 -2^30 0 2^30 2^31 2^32 248 * -2^31 -2^30 0 2^30 2^31 2^32
243 * 249 *
244 * Otherwise: 250 * Otherwise:
245 * 251 *
246 * ON OSS US OU32 ON 252 * ON OSS US OU32 ON
247 * ______[_______________[_______________[_______[_______ 253 * ______[_______________[_______________[_______[_______
248 * -2^31 0 2^31 2^32 254 * -2^31 0 2^31 2^32
249 * 255 *
250 * 256 *
251 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. 257 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1.
252 * 258 *
253 * NOTE: OtherSigned32 (OS32) and OU31 (OtherUnsigned31) are empty if Smis are 259 * NOTE: OtherSigned32 (OS32) and OU31 (OtherUnsigned31) are empty if Smis are
254 * 32-bit wide. They should thus never be used directly, only indirectly 260 * 32-bit wide. They should thus never be used directly, only indirectly
255 * via e.g. Number. 261 * via e.g. Number.
256 */ 262 */
257 263
258 #define PROPER_BITSET_TYPE_LIST(V) \ 264 #define PROPER_BITSET_TYPE_LIST(V) \
259 REPRESENTATION_BITSET_TYPE_LIST(V) \ 265 REPRESENTATION_BITSET_TYPE_LIST(V) \
260 SEMANTIC_BITSET_TYPE_LIST(V) 266 SEMANTIC_BITSET_TYPE_LIST(V)
261 267
262 #define BITSET_TYPE_LIST(V) \ 268 #define BITSET_TYPE_LIST(V) \
263 MASK_BITSET_TYPE_LIST(V) \ 269 MASK_BITSET_TYPE_LIST(V) \
264 PROPER_BITSET_TYPE_LIST(V) 270 REPRESENTATION_BITSET_TYPE_LIST(V) \
271 INTERNAL_BITSET_TYPE_LIST(V) \
272 SEMANTIC_BITSET_TYPE_LIST(V)
265 273
266 274
267 // ----------------------------------------------------------------------------- 275 // -----------------------------------------------------------------------------
268 // The abstract Type class, parameterized over the low-level representation. 276 // The abstract Type class, parameterized over the low-level representation.
269 277
270 // struct Config { 278 // struct Config {
271 // typedef TypeImpl<Config> Type; 279 // typedef TypeImpl<Config> Type;
272 // typedef Base; 280 // typedef Base;
273 // typedef Struct; 281 // typedef Struct;
274 // typedef Region; 282 // typedef Region;
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 #define DECLARE_TYPE(type, value) k##type = (value), 599 #define DECLARE_TYPE(type, value) k##type = (value),
592 BITSET_TYPE_LIST(DECLARE_TYPE) 600 BITSET_TYPE_LIST(DECLARE_TYPE)
593 #undef DECLARE_TYPE 601 #undef DECLARE_TYPE
594 kUnusedEOL = 0 602 kUnusedEOL = 0
595 }; 603 };
596 604
597 bitset Bitset() { return Config::as_bitset(this); } 605 bitset Bitset() { return Config::as_bitset(this); }
598 606
599 static TypeImpl* New(bitset bits) { 607 static TypeImpl* New(bitset bits) {
600 DCHECK(bits == kNone || IsInhabited(bits)); 608 DCHECK(bits == kNone || IsInhabited(bits));
609
610 if (FLAG_enable_slow_asserts) {
611 // Check that the bitset does not contain any holes in number ranges.
612 bitset mask = kSemantic;
613 if (!i::SmiValuesAre31Bits()) {
614 mask &= ~(kOtherUnsigned31 | kOtherSigned32);
615 }
616 bitset number_bits = bits & kPlainNumber & mask;
617 if (number_bits != 0) {
618 bitset lub = Lub(Min(number_bits), Max(number_bits)) & mask;
619 CHECK(lub == number_bits);
620 }
621 }
622
601 return Config::from_bitset(bits); 623 return Config::from_bitset(bits);
602 } 624 }
603 static TypeHandle New(bitset bits, Region* region) { 625 static TypeHandle New(bitset bits, Region* region) {
604 DCHECK(bits == kNone || IsInhabited(bits)); 626 DCHECK(bits == kNone || IsInhabited(bits));
605 return Config::from_bitset(bits, region); 627 return Config::from_bitset(bits, region);
606 } 628 }
607 // TODO(neis): Eventually allow again for types with empty semantics 629 // TODO(neis): Eventually allow again for types with empty semantics
608 // part and modify intersection and possibly subtyping accordingly. 630 // part and modify intersection and possibly subtyping accordingly.
609 631
610 static bool IsInhabited(bitset bits) { 632 static bool IsInhabited(bitset bits) {
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 bool Narrows(BoundsImpl that) { 1092 bool Narrows(BoundsImpl that) {
1071 return that.lower->Is(this->lower) && this->upper->Is(that.upper); 1093 return that.lower->Is(this->lower) && this->upper->Is(that.upper);
1072 } 1094 }
1073 }; 1095 };
1074 1096
1075 typedef BoundsImpl<ZoneTypeConfig> Bounds; 1097 typedef BoundsImpl<ZoneTypeConfig> Bounds;
1076 1098
1077 } } // namespace v8::internal 1099 } } // namespace v8::internal
1078 1100
1079 #endif // V8_TYPES_H_ 1101 #endif // V8_TYPES_H_
OLDNEW
« no previous file with comments | « src/compiler/typer.cc ('k') | src/types.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698