1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_COMPILER_TYPE_HINTS_H_ 6 #define V8_COMPILER_TYPE_HINTS_H_ 7 8 #include "src/base/flags.h" 9 #include "src/utils.h" 10 11 namespace v8 { 12 namespace internal { 13 namespace compiler { 14 15 // Type hints for an binary operation. 16 class BinaryOperationHints final { 17 public: 18 enum Hint { 19 kNone, 20 kSignedSmall, 21 kSigned32, 22 kNumberOrUndefined, 23 kString, 24 kAny 25 }; 26 27 BinaryOperationHints() : BinaryOperationHints(kNone, kNone, kNone) {} 28 BinaryOperationHints(Hint left, Hint right, Hint result) 29 : bit_field_(LeftField::encode(left) | RightField::encode(right) | 30 ResultField::encode(result)) {} 31 32 static BinaryOperationHints Any() { 33 return BinaryOperationHints(kAny, kAny, kAny); 34 } 35 36 Hint left() const { return LeftField::decode(bit_field_); } 37 Hint right() const { return RightField::decode(bit_field_); } 38 Hint result() const { return ResultField::decode(bit_field_); } 39 Hint combined() const { return Combine(Combine(left(), right()), result()); } 40 41 // Hint 'subtyping' and generalization. 42 static bool Is(Hint h1, Hint h2); 43 static Hint Combine(Hint h1, Hint h2); 44 45 bool operator==(BinaryOperationHints const& that) const { 46 return this->bit_field_ == that.bit_field_; 47 } 48 bool operator!=(BinaryOperationHints const& that) const { 49 return !(*this == that); 50 } 51 52 friend size_t hash_value(BinaryOperationHints const& hints) { 53 return hints.bit_field_; 54 } 55 56 private: 57 typedef BitField<Hint, 0, 3> LeftField; 58 typedef BitField<Hint, 3, 3> RightField; 59 typedef BitField<Hint, 6, 3> ResultField; 60 61 uint32_t bit_field_; 62 }; 63 64 std::ostream& operator<<(std::ostream&, BinaryOperationHints::Hint); 65 std::ostream& operator<<(std::ostream&, BinaryOperationHints); 66 67 // Type hints for an binary operation. 68 class CompareOperationHints final { 69 public: 70 enum Hint { 71 kNone, 72 kBoolean, 73 kSignedSmall, 74 kNumber, 75 kString, 76 kInternalizedString, 77 kUniqueName, 78 kReceiver, 79 kAny 80 }; 81 82 CompareOperationHints() : CompareOperationHints(kNone, kNone, kNone) {} 83 CompareOperationHints(Hint left, Hint right, Hint combined) 84 : bit_field_(LeftField::encode(left) | RightField::encode(right) | 85 CombinedField::encode(combined)) {} 86 87 static CompareOperationHints Any() { 88 return CompareOperationHints(kAny, kAny, kAny); 89 } 90 91 Hint left() const { return LeftField::decode(bit_field_); } 92 Hint right() const { return RightField::decode(bit_field_); } 93 Hint combined() const { return CombinedField::decode(bit_field_); } 94 95 bool operator==(CompareOperationHints const& that) const { 96 return this->bit_field_ == that.bit_field_; 97 } 98 bool operator!=(CompareOperationHints const& that) const { 99 return !(*this == that); 100 } 101 102 friend size_t hash_value(CompareOperationHints const& hints) { 103 return hints.bit_field_; 104 } 105 106 private: 107 typedef BitField<Hint, 0, 4> LeftField; 108 typedef BitField<Hint, 4, 4> RightField; 109 typedef BitField<Hint, 8, 4> CombinedField; 110 111 uint32_t bit_field_; 112 }; 113 114 std::ostream& operator<<(std::ostream&, CompareOperationHints::Hint); 115 std::ostream& operator<<(std::ostream&, CompareOperationHints); 116 117 // Type hints for the ToBoolean type conversion. 118 enum class ToBooleanHint : uint16_t { 119 kNone = 0u, 120 kUndefined = 1u << 0, 121 kBoolean = 1u << 1, 122 kNull = 1u << 2, 123 kSmallInteger = 1u << 3, 124 kReceiver = 1u << 4, 125 kString = 1u << 5, 126 kSymbol = 1u << 6, 127 kHeapNumber = 1u << 7, 128 kSimdValue = 1u << 8, 129 kAny = kUndefined | kBoolean | kNull | kSmallInteger | kReceiver | kString | 130 kSymbol | kHeapNumber | kSimdValue 131 }; 132 133 std::ostream& operator<<(std::ostream&, ToBooleanHint); 134 135 typedef base::Flags<ToBooleanHint, uint16_t> ToBooleanHints; 136 137 std::ostream& operator<<(std::ostream&, ToBooleanHints); 138 139 DEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints) 140 141 } // namespace compiler 142 } // namespace internal 143 } // namespace v8 144 145 #endif // V8_COMPILER_TYPE_HINTS_H_ 146