type-hints.h 3.94 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2015 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_TYPE_HINTS_H_
#define V8_COMPILER_TYPE_HINTS_H_

8
#include "src/base/flags.h"
9 10 11 12 13 14 15 16 17
#include "src/utils.h"

namespace v8 {
namespace internal {
namespace compiler {

// Type hints for an binary operation.
class BinaryOperationHints final {
 public:
18
  enum Hint { kNone, kSignedSmall, kSigned32, kNumberOrOddball, kString, kAny };
19 20 21 22 23 24 25 26 27 28 29 30 31

  BinaryOperationHints() : BinaryOperationHints(kNone, kNone, kNone) {}
  BinaryOperationHints(Hint left, Hint right, Hint result)
      : bit_field_(LeftField::encode(left) | RightField::encode(right) |
                   ResultField::encode(result)) {}

  static BinaryOperationHints Any() {
    return BinaryOperationHints(kAny, kAny, kAny);
  }

  Hint left() const { return LeftField::decode(bit_field_); }
  Hint right() const { return RightField::decode(bit_field_); }
  Hint result() const { return ResultField::decode(bit_field_); }
32 33 34 35 36
  Hint combined() const { return Combine(Combine(left(), right()), result()); }

  // Hint 'subtyping' and generalization.
  static bool Is(Hint h1, Hint h2);
  static Hint Combine(Hint h1, Hint h2);
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

  bool operator==(BinaryOperationHints const& that) const {
    return this->bit_field_ == that.bit_field_;
  }
  bool operator!=(BinaryOperationHints const& that) const {
    return !(*this == that);
  }

  friend size_t hash_value(BinaryOperationHints const& hints) {
    return hints.bit_field_;
  }

 private:
  typedef BitField<Hint, 0, 3> LeftField;
  typedef BitField<Hint, 3, 3> RightField;
  typedef BitField<Hint, 6, 3> ResultField;

  uint32_t bit_field_;
};

std::ostream& operator<<(std::ostream&, BinaryOperationHints::Hint);
std::ostream& operator<<(std::ostream&, BinaryOperationHints);

60 61 62 63 64 65 66
// Type hints for an binary operation.
class CompareOperationHints final {
 public:
  enum Hint {
    kNone,
    kBoolean,
    kSignedSmall,
67
    kNumberOrOddball,
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    kString,
    kInternalizedString,
    kUniqueName,
    kReceiver,
    kAny
  };

  CompareOperationHints() : CompareOperationHints(kNone, kNone, kNone) {}
  CompareOperationHints(Hint left, Hint right, Hint combined)
      : bit_field_(LeftField::encode(left) | RightField::encode(right) |
                   CombinedField::encode(combined)) {}

  static CompareOperationHints Any() {
    return CompareOperationHints(kAny, kAny, kAny);
  }

  Hint left() const { return LeftField::decode(bit_field_); }
  Hint right() const { return RightField::decode(bit_field_); }
  Hint combined() const { return CombinedField::decode(bit_field_); }

  bool operator==(CompareOperationHints const& that) const {
    return this->bit_field_ == that.bit_field_;
  }
  bool operator!=(CompareOperationHints const& that) const {
    return !(*this == that);
  }

  friend size_t hash_value(CompareOperationHints const& hints) {
    return hints.bit_field_;
  }

 private:
  typedef BitField<Hint, 0, 4> LeftField;
  typedef BitField<Hint, 4, 4> RightField;
  typedef BitField<Hint, 8, 4> CombinedField;

  uint32_t bit_field_;
};

std::ostream& operator<<(std::ostream&, CompareOperationHints::Hint);
std::ostream& operator<<(std::ostream&, CompareOperationHints);
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

// Type hints for the ToBoolean type conversion.
enum class ToBooleanHint : uint16_t {
  kNone = 0u,
  kUndefined = 1u << 0,
  kBoolean = 1u << 1,
  kNull = 1u << 2,
  kSmallInteger = 1u << 3,
  kReceiver = 1u << 4,
  kString = 1u << 5,
  kSymbol = 1u << 6,
  kHeapNumber = 1u << 7,
  kSimdValue = 1u << 8,
  kAny = kUndefined | kBoolean | kNull | kSmallInteger | kReceiver | kString |
         kSymbol | kHeapNumber | kSimdValue
};

std::ostream& operator<<(std::ostream&, ToBooleanHint);

typedef base::Flags<ToBooleanHint, uint16_t> ToBooleanHints;

std::ostream& operator<<(std::ostream&, ToBooleanHints);

DEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints)

134 135 136 137 138
}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_TYPE_HINTS_H_