diff options
Diffstat (limited to 'deps/v8/src/compiler/operation-typer.h')
-rw-r--r-- | deps/v8/src/compiler/operation-typer.h | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/operation-typer.h b/deps/v8/src/compiler/operation-typer.h new file mode 100644 index 0000000000..dcfe0c45ea --- /dev/null +++ b/deps/v8/src/compiler/operation-typer.h @@ -0,0 +1,92 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_COMPILER_OPERATION_TYPER_H_ +#define V8_COMPILER_OPERATION_TYPER_H_ + +#include "src/base/flags.h" +#include "src/compiler/opcodes.h" + +namespace v8 { +namespace internal { + +class Isolate; +class RangeType; +class Type; +class TypeCache; +class Zone; + +namespace compiler { + +class Operator; + +class OperationTyper { + public: + OperationTyper(Isolate* isolate, Zone* zone); + + // Typing Phi. + Type* Merge(Type* left, Type* right); + + Type* ToPrimitive(Type* type); + + // Helpers for number operation typing. + Type* ToNumber(Type* type); + Type* WeakenRange(Type* current_range, Type* previous_range); + +// Number unary operators. +#define DECLARE_METHOD(Name) Type* Name(Type* type); + SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_METHOD) +#undef DECLARE_METHOD + +// Number binary operators. +#define DECLARE_METHOD(Name) Type* Name(Type* lhs, Type* rhs); + SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_METHOD) + SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD) +#undef DECLARE_METHOD + + Type* TypeTypeGuard(const Operator* sigma_op, Type* input); + + enum ComparisonOutcomeFlags { + kComparisonTrue = 1, + kComparisonFalse = 2, + kComparisonUndefined = 4 + }; + + Type* singleton_false() const { return singleton_false_; } + Type* singleton_true() const { return singleton_true_; } + Type* singleton_the_hole() const { return singleton_the_hole_; } + + private: + typedef base::Flags<ComparisonOutcomeFlags> ComparisonOutcome; + + ComparisonOutcome Invert(ComparisonOutcome); + Type* Invert(Type*); + Type* FalsifyUndefined(ComparisonOutcome); + + Type* Rangify(Type*); + Type* AddRanger(double lhs_min, double lhs_max, double rhs_min, + double rhs_max); + Type* SubtractRanger(double lhs_min, double lhs_max, double rhs_min, + double rhs_max); + Type* MultiplyRanger(Type* lhs, Type* rhs); + + Zone* zone() const { return zone_; } + + Zone* const zone_; + TypeCache const& cache_; + + Type* infinity_; + Type* minus_infinity_; + Type* singleton_false_; + Type* singleton_true_; + Type* singleton_the_hole_; + Type* signed32ish_; + Type* unsigned32ish_; +}; + +} // namespace compiler +} // namespace internal +} // namespace v8 + +#endif // V8_COMPILER_OPERATION_TYPER_H_ |