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