1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// found in the LICENSE file.
4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifndef V8_COMPILER_TYPE_CACHE_H_
6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define V8_COMPILER_TYPE_CACHE_H_
7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/types.h"
9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/date.h"
10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8 {
12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace internal {
13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace compiler {
14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass TypeCache final {
16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // This has to be first for the initialization magic to work.
18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  AccountingAllocator allocator;
19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Zone zone_;
20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public:
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static TypeCache const& Get();
23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
24c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  TypeCache() : zone_(&allocator, ZONE_NAME) {}
25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kInt8 = CreateRange<int8_t>();
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kUint8 = CreateRange<uint8_t>();
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kUint8Clamped = kUint8;
29c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Type* const kUint8OrMinusZeroOrNaN =
30c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Type::Union(kUint8, Type::MinusZeroOrNaN(), zone());
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kInt16 = CreateRange<int16_t>();
32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kUint16 = CreateRange<uint16_t>();
33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kInt32 = Type::Signed32();
34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kUint32 = Type::Unsigned32();
35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kFloat32 = Type::Number();
36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kFloat64 = Type::Number();
37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
38c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Type* const kHoleySmi =
39c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Type::Union(Type::SignedSmall(), Type::Hole(), zone());
40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kSingletonZero = CreateRange(0.0, 0.0);
42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kSingletonOne = CreateRange(1.0, 1.0);
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kSingletonTen = CreateRange(10.0, 10.0);
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kSingletonMinusOne = CreateRange(-1.0, -1.0);
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kZeroOrUndefined =
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kSingletonZero, Type::Undefined(), zone());
47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kTenOrUndefined =
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kSingletonTen, Type::Undefined(), zone());
49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kMinusOneOrZero = CreateRange(-1.0, 0.0);
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kMinusOneToOneOrMinusZeroOrNaN = Type::Union(
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(CreateRange(-1.0, 1.0), Type::MinusZero(), zone()),
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::NaN(), zone());
53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kZeroOrOne = CreateRange(0.0, 1.0);
54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kZeroOrOneOrNaN = Type::Union(kZeroOrOne, Type::NaN(), zone());
55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kZeroToThirtyOne = CreateRange(0.0, 31.0);
56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kZeroToThirtyTwo = CreateRange(0.0, 32.0);
57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kZeroish =
58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kSingletonZero, Type::MinusZeroOrNaN(), zone());
59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kInteger = CreateRange(-V8_INFINITY, V8_INFINITY);
60f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kIntegerOrMinusZero =
61f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kInteger, Type::MinusZero(), zone());
62f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kIntegerOrMinusZeroOrNaN =
63f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kIntegerOrMinusZero, Type::NaN(), zone());
64f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kPositiveInteger = CreateRange(0.0, V8_INFINITY);
65f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kPositiveIntegerOrMinusZero =
66f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kPositiveInteger, Type::MinusZero(), zone());
67f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kPositiveIntegerOrMinusZeroOrNaN =
68f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kPositiveIntegerOrMinusZero, Type::NaN(), zone());
69f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
70f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kAdditiveSafeInteger =
71f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      CreateRange(-4503599627370496.0, 4503599627370496.0);
72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kSafeInteger = CreateRange(-kMaxSafeInteger, kMaxSafeInteger);
73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kAdditiveSafeIntegerOrMinusZero =
74f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kAdditiveSafeInteger, Type::MinusZero(), zone());
75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kSafeIntegerOrMinusZero =
76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(kSafeInteger, Type::MinusZero(), zone());
77f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kPositiveSafeInteger = CreateRange(0.0, kMaxSafeInteger);
78f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
79f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The FixedArray::length property always containts a smi in the range
80f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, FixedArray::kMaxLength].
81f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kFixedArrayLengthType = CreateRange(0.0, FixedArray::kMaxLength);
82f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The FixedDoubleArray::length property always containts a smi in the range
84f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, FixedDoubleArray::kMaxLength].
85f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kFixedDoubleArrayLengthType =
86f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      CreateRange(0.0, FixedDoubleArray::kMaxLength);
87f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSArray::length property always contains a tagged number in the range
89f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, kMaxUInt32].
90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSArrayLengthType = Type::Unsigned32();
91f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
92f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSTyped::length property always contains a tagged number in the range
93f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, kMaxSmiValue].
94f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSTypedArrayLengthType = Type::UnsignedSmall();
95f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
96f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The String::length property always contains a smi in the range
97f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, String::kMaxLength].
98f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kStringLengthType = CreateRange(0.0, String::kMaxLength);
99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::day property always contains a tagged number in the range
101f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [1, 31] or NaN.
102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateDayType =
103f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(CreateRange(1, 31.0), Type::NaN(), zone());
104f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
105f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::hour property always contains a tagged number in the range
106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, 23] or NaN.
107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateHourType =
108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(CreateRange(0, 23.0), Type::NaN(), zone());
109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::minute property always contains a tagged number in the range
111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, 59] or NaN.
112f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateMinuteType =
113f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(CreateRange(0, 59.0), Type::NaN(), zone());
114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
115f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::month property always contains a tagged number in the range
116f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, 11] or NaN.
117f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateMonthType =
118f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(CreateRange(0, 11.0), Type::NaN(), zone());
119f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
120f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::second property always contains a tagged number in the range
121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, 59] or NaN.
122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateSecondType = kJSDateMinuteType;
123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
124f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::value property always contains a tagged number in the range
125f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [-kMaxTimeInMs, kMaxTimeInMs] or NaN.
126f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateValueType = Type::Union(
127f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      CreateRange(-DateCache::kMaxTimeInMs, DateCache::kMaxTimeInMs),
128f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::NaN(), zone());
129f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
130f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::weekday property always contains a tagged number in the range
131f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // [0, 6] or NaN.
132f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateWeekdayType =
133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(CreateRange(0, 6.0), Type::NaN(), zone());
134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // The JSDate::year property always contains a tagged number in the signed
136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // small range or NaN.
137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* const kJSDateYearType =
138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Type::Union(Type::SignedSmall(), Type::NaN(), zone());
139f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
140f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
141f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  template <typename T>
142f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* CreateRange() {
143f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return CreateRange(std::numeric_limits<T>::min(),
144f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       std::numeric_limits<T>::max());
145f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
147f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Type* CreateRange(double min, double max) {
148f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return Type::Range(min, max, zone());
149f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
150f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
151f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Zone* zone() { return &zone_; }
152f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
153f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
154f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace compiler
155f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace internal
156f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace v8
157f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
158f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif  // V8_COMPILER_TYPE_CACHE_H_
159