• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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_OPERATION_TYPER_H_
6 #define V8_COMPILER_OPERATION_TYPER_H_
7 
8 #include "src/base/flags.h"
9 #include "src/compiler/opcodes.h"
10 #include "src/compiler/types.h"
11 #include "src/objects/objects.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 // Forward declarations.
17 class Isolate;
18 class RangeType;
19 class Zone;
20 
21 namespace compiler {
22 
23 // Forward declarations.
24 class Operator;
25 class Type;
26 class TypeCache;
27 
28 class V8_EXPORT_PRIVATE OperationTyper {
29  public:
30   OperationTyper(JSHeapBroker* broker, Zone* zone);
31 
32   // Typing Phi.
33   Type Merge(Type left, Type right);
34 
35   Type ToPrimitive(Type type);
36   Type ToNumber(Type type);
37   Type ToNumberConvertBigInt(Type type);
38   Type ToNumeric(Type type);
39   Type ToBoolean(Type type);
40 
41   Type WeakenRange(Type current_range, Type previous_range);
42 
43 // Unary operators.
44 #define DECLARE_METHOD(Name) Type Name(Type type);
45   SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_METHOD)
46   SIMPLIFIED_BIGINT_UNOP_LIST(DECLARE_METHOD)
47   SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_METHOD)
48   SIMPLIFIED_SPECULATIVE_BIGINT_UNOP_LIST(DECLARE_METHOD)
49   DECLARE_METHOD(ConvertReceiver)
50 #undef DECLARE_METHOD
51 
52 // Numeric binary operators.
53 #define DECLARE_METHOD(Name) Type Name(Type lhs, Type rhs);
54   SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_METHOD)
55   SIMPLIFIED_BIGINT_BINOP_LIST(DECLARE_METHOD)
56   SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD)
57   SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_METHOD)
58 #undef DECLARE_METHOD
59 
60   // Comparison operators.
61   Type SameValue(Type lhs, Type rhs);
62   Type SameValueNumbersOnly(Type lhs, Type rhs);
63   Type StrictEqual(Type lhs, Type rhs);
64 
65   // Check operators.
66   Type CheckBounds(Type index, Type length);
67   Type CheckFloat64Hole(Type type);
68   Type CheckNumber(Type type);
69   Type ConvertTaggedHoleToUndefined(Type type);
70 
71   Type TypeTypeGuard(const Operator* sigma_op, Type input);
72 
73   enum ComparisonOutcomeFlags {
74     kComparisonTrue = 1,
75     kComparisonFalse = 2,
76     kComparisonUndefined = 4
77   };
78 
singleton_false()79   Type singleton_false() const { return singleton_false_; }
singleton_true()80   Type singleton_true() const { return singleton_true_; }
singleton_the_hole()81   Type singleton_the_hole() const { return singleton_the_hole_; }
82 
83  private:
84   using ComparisonOutcome = base::Flags<ComparisonOutcomeFlags>;
85 
86   ComparisonOutcome Invert(ComparisonOutcome);
87   Type Invert(Type);
88   Type FalsifyUndefined(ComparisonOutcome);
89 
90   Type Rangify(Type);
91   Type AddRanger(double lhs_min, double lhs_max, double rhs_min,
92                  double rhs_max);
93   Type SubtractRanger(double lhs_min, double lhs_max, double rhs_min,
94                       double rhs_max);
95   Type MultiplyRanger(double lhs_min, double lhs_max, double rhs_min,
96                       double rhs_max);
97 
zone()98   Zone* zone() const { return zone_; }
99 
100   Zone* const zone_;
101   TypeCache const* cache_;
102 
103   Type infinity_;
104   Type minus_infinity_;
105   Type singleton_NaN_string_;
106   Type singleton_zero_string_;
107   Type singleton_false_;
108   Type singleton_true_;
109   Type singleton_the_hole_;
110   Type signed32ish_;
111   Type unsigned32ish_;
112   Type singleton_empty_string_;
113   Type truish_;
114   Type falsish_;
115 };
116 
117 }  // namespace compiler
118 }  // namespace internal
119 }  // namespace v8
120 
121 #endif  // V8_COMPILER_OPERATION_TYPER_H_
122