blob: 282cb0c7509ce5252860a23f000a538ed0e92432 [file] [log] [blame]
// 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"
#include "src/objects.h"
namespace v8 {
namespace internal {
// Forward declarations.
class Isolate;
class RangeType;
class Zone;
namespace compiler {
// Forward declarations.
class Operator;
class Type;
class TypeCache;
class V8_EXPORT_PRIVATE OperationTyper {
public:
OperationTyper(Isolate* isolate, Zone* zone);
// Typing Phi.
Type* Merge(Type* left, Type* right);
Type* ToPrimitive(Type* type);
Type* ToNumber(Type* type);
Type* ToNumeric(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)
SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_METHOD)
DECLARE_METHOD(ConvertReceiver)
#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
// Comparison operators.
Type* SameValue(Type* lhs, Type* rhs);
Type* StrictEqual(Type* lhs, Type* rhs);
// Check operators.
Type* CheckFloat64Hole(Type* type);
Type* CheckNumber(Type* type);
Type* ConvertTaggedHoleToUndefined(Type* type);
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;
Type* ToNumberOrNumeric(Object::Conversion mode, Type* type);
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_NaN_string_;
Type* singleton_zero_string_;
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_