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 #include "src/compiler/type-hints.h" 6 7 namespace v8 { 8 namespace internal { 9 namespace compiler { 10 11 std::ostream& operator<<(std::ostream& os, BinaryOperationHints::Hint hint) { 12 switch (hint) { 13 case BinaryOperationHints::kNone: 14 return os << "None"; 15 case BinaryOperationHints::kSignedSmall: 16 return os << "SignedSmall"; 17 case BinaryOperationHints::kSigned32: 18 return os << "Signed32"; 19 case BinaryOperationHints::kNumberOrUndefined: 20 return os << "NumberOrUndefined"; 21 case BinaryOperationHints::kString: 22 return os << "String"; 23 case BinaryOperationHints::kAny: 24 return os << "Any"; 25 } 26 UNREACHABLE(); 27 return os; 28 } 29 30 std::ostream& operator<<(std::ostream& os, BinaryOperationHints hints) { 31 return os << hints.left() << "*" << hints.right() << "->" << hints.result(); 32 } 33 34 std::ostream& operator<<(std::ostream& os, CompareOperationHints::Hint hint) { 35 switch (hint) { 36 case CompareOperationHints::kNone: 37 return os << "None"; 38 case CompareOperationHints::kBoolean: 39 return os << "Boolean"; 40 case CompareOperationHints::kSignedSmall: 41 return os << "SignedSmall"; 42 case CompareOperationHints::kNumber: 43 return os << "Number"; 44 case CompareOperationHints::kString: 45 return os << "String"; 46 case CompareOperationHints::kInternalizedString: 47 return os << "InternalizedString"; 48 case CompareOperationHints::kUniqueName: 49 return os << "UniqueName"; 50 case CompareOperationHints::kReceiver: 51 return os << "Receiver"; 52 case CompareOperationHints::kAny: 53 return os << "Any"; 54 } 55 UNREACHABLE(); 56 return os; 57 } 58 59 std::ostream& operator<<(std::ostream& os, CompareOperationHints hints) { 60 return os << hints.left() << "*" << hints.right() << " (" << hints.combined() 61 << ")"; 62 } 63 64 std::ostream& operator<<(std::ostream& os, ToBooleanHint hint) { 65 switch (hint) { 66 case ToBooleanHint::kNone: 67 return os << "None"; 68 case ToBooleanHint::kUndefined: 69 return os << "Undefined"; 70 case ToBooleanHint::kBoolean: 71 return os << "Boolean"; 72 case ToBooleanHint::kNull: 73 return os << "Null"; 74 case ToBooleanHint::kSmallInteger: 75 return os << "SmallInteger"; 76 case ToBooleanHint::kReceiver: 77 return os << "Receiver"; 78 case ToBooleanHint::kString: 79 return os << "String"; 80 case ToBooleanHint::kSymbol: 81 return os << "Symbol"; 82 case ToBooleanHint::kHeapNumber: 83 return os << "HeapNumber"; 84 case ToBooleanHint::kSimdValue: 85 return os << "SimdValue"; 86 case ToBooleanHint::kAny: 87 return os << "Any"; 88 } 89 UNREACHABLE(); 90 return os; 91 } 92 93 std::ostream& operator<<(std::ostream& os, ToBooleanHints hints) { 94 if (hints == ToBooleanHint::kAny) return os << "Any"; 95 if (hints == ToBooleanHint::kNone) return os << "None"; 96 bool first = true; 97 for (ToBooleanHints::mask_type i = 0; i < sizeof(i) * CHAR_BIT; ++i) { 98 ToBooleanHint const hint = static_cast<ToBooleanHint>(1u << i); 99 if (hints & hint) { 100 if (!first) os << "|"; 101 first = false; 102 os << hint; 103 } 104 } 105 return os; 106 } 107 108 // static 109 bool BinaryOperationHints::Is(Hint h1, Hint h2) { 110 if (h1 == h2) return true; 111 switch (h1) { 112 case kNone: 113 return true; 114 case kSignedSmall: 115 return h2 == kSigned32 || h2 == kNumberOrUndefined || h2 == kAny; 116 case kSigned32: 117 return h2 == kNumberOrUndefined || h2 == kAny; 118 case kNumberOrUndefined: 119 return h2 == kAny; 120 case kString: 121 return h2 == kAny; 122 case kAny: 123 return false; 124 } 125 UNREACHABLE(); 126 return false; 127 } 128 129 // static 130 BinaryOperationHints::Hint BinaryOperationHints::Combine(Hint h1, Hint h2) { 131 if (Is(h1, h2)) return h2; 132 if (Is(h2, h1)) return h1; 133 return kAny; 134 } 135 136 } // namespace compiler 137 } // namespace internal 138 } // namespace v8 139