blob: 7c9baddd1394dd9355f31459c8cd7e0509f03fc4 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
11namespace v8 {
12namespace internal {
13namespace compiler {
14
15// Type hints for an binary operation.
16class BinaryOperationHints final {
17 public:
Ben Murdoch61f157c2016-09-16 13:49:30 +010018 enum Hint {
19 kNone,
20 kSignedSmall,
21 kSigned32,
22 kNumberOrUndefined,
23 kString,
24 kAny
25 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026
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_); }
Ben Murdoch61f157c2016-09-16 13:49:30 +010039 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);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044
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
64std::ostream& operator<<(std::ostream&, BinaryOperationHints::Hint);
65std::ostream& operator<<(std::ostream&, BinaryOperationHints);
66
Ben Murdoch61f157c2016-09-16 13:49:30 +010067// Type hints for an binary operation.
68class 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
114std::ostream& operator<<(std::ostream&, CompareOperationHints::Hint);
115std::ostream& operator<<(std::ostream&, CompareOperationHints);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000116
117// Type hints for the ToBoolean type conversion.
118enum 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
133std::ostream& operator<<(std::ostream&, ToBooleanHint);
134
135typedef base::Flags<ToBooleanHint, uint16_t> ToBooleanHints;
136
137std::ostream& operator<<(std::ostream&, ToBooleanHints);
138
139DEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints)
140
141} // namespace compiler
142} // namespace internal
143} // namespace v8
144
145#endif // V8_COMPILER_TYPE_HINTS_H_