• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 { kNone, kSignedSmall, kSigned32, kNumber, kString, kAny };
19 
BinaryOperationHints()20   BinaryOperationHints() : BinaryOperationHints(kNone, kNone, kNone) {}
BinaryOperationHints(Hint left,Hint right,Hint result)21   BinaryOperationHints(Hint left, Hint right, Hint result)
22       : bit_field_(LeftField::encode(left) | RightField::encode(right) |
23                    ResultField::encode(result)) {}
24 
Any()25   static BinaryOperationHints Any() {
26     return BinaryOperationHints(kAny, kAny, kAny);
27   }
28 
left()29   Hint left() const { return LeftField::decode(bit_field_); }
right()30   Hint right() const { return RightField::decode(bit_field_); }
result()31   Hint result() const { return ResultField::decode(bit_field_); }
32 
33   bool operator==(BinaryOperationHints const& that) const {
34     return this->bit_field_ == that.bit_field_;
35   }
36   bool operator!=(BinaryOperationHints const& that) const {
37     return !(*this == that);
38   }
39 
hash_value(BinaryOperationHints const & hints)40   friend size_t hash_value(BinaryOperationHints const& hints) {
41     return hints.bit_field_;
42   }
43 
44  private:
45   typedef BitField<Hint, 0, 3> LeftField;
46   typedef BitField<Hint, 3, 3> RightField;
47   typedef BitField<Hint, 6, 3> ResultField;
48 
49   uint32_t bit_field_;
50 };
51 
52 std::ostream& operator<<(std::ostream&, BinaryOperationHints::Hint);
53 std::ostream& operator<<(std::ostream&, BinaryOperationHints);
54 
55 
56 // Type hints for the ToBoolean type conversion.
57 enum class ToBooleanHint : uint16_t {
58   kNone = 0u,
59   kUndefined = 1u << 0,
60   kBoolean = 1u << 1,
61   kNull = 1u << 2,
62   kSmallInteger = 1u << 3,
63   kReceiver = 1u << 4,
64   kString = 1u << 5,
65   kSymbol = 1u << 6,
66   kHeapNumber = 1u << 7,
67   kSimdValue = 1u << 8,
68   kAny = kUndefined | kBoolean | kNull | kSmallInteger | kReceiver | kString |
69          kSymbol | kHeapNumber | kSimdValue
70 };
71 
72 std::ostream& operator<<(std::ostream&, ToBooleanHint);
73 
74 typedef base::Flags<ToBooleanHint, uint16_t> ToBooleanHints;
75 
76 std::ostream& operator<<(std::ostream&, ToBooleanHints);
77 
78 DEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints)
79 
80 }  // namespace compiler
81 }  // namespace internal
82 }  // namespace v8
83 
84 #endif  // V8_COMPILER_TYPE_HINTS_H_
85