5#ifndef V8_COMPILER_TURBOSHAFT_TYPER_H_
6#define V8_COMPILER_TURBOSHAFT_TYPER_H_
21template <
typename T,
size_t N>
24 T
x = +std::numeric_limits<T>::infinity();
25 for (
size_t i = 0;
i <
N; ++
i) {
26 if (!std::isnan(a[
i])) {
27 x = std::min(a[
i],
x);
31 return x == T{0} ? T{0} :
x;
37template <
typename T,
size_t N>
40 T
x = -std::numeric_limits<T>::infinity();
41 for (
size_t i = 0;
i <
N; ++
i) {
42 if (!std::isnan(a[
i])) {
43 x = std::max(a[
i],
x);
47 return x == T{0} ? T{0} :
x;
52 static_assert(Bits == 32 || Bits == 64);
56 static constexpr word_t max = std::numeric_limits<word_t>::max();
60 auto it = std::unique(elements.
begin(), elements.
end());
61 elements.
pop_back(std::distance(it, elements.
end()));
75 if (t.is_range())
return t.range();
92 if (elements[elements.
size() - 1] - elements[0] <= max / 2) {
94 return {elements[0], elements[elements.
size() - 1]};
97 size_t from_index = elements.
size() - 1;
99 while (to_index + 1 < from_index) {
100 if ((elements[to_index + 1] - elements[to_index]) <
101 (elements[from_index] - elements[from_index - 1])) {
107 return {elements[from_index], elements[to_index]};
111 return distance(range.first, range.second);
130 for (
int j = 0; j < rhs.
set_size(); ++j) {
160 for (
int j = 0; j < rhs.
set_size(); ++j) {
226 return {restrict_lhs, restrict_rhs};
268 return {restrict_lhs, restrict_rhs};
274 if (new_type.
is_any())
return new_type;
278 if (result_from < old_type.
unsigned_min()) result_from = 0;
281 result_to = std::numeric_limits<word_t>::max();
292 if (new_type.
is_any())
return new_type;
293 word_t old_from, old_to, new_from, new_to;
298 if (new_size >= 2 * old_size)
return new_type;
299 std::tie(new_from, new_to) =
MakeRange(new_type);
302 std::tie(new_from, new_to) = new_type.
range();
304 if (
distance(new_from, new_to) >= 2 * old_size) {
307 std::tie(old_from, old_to) =
MakeRange(old_type);
310 std::tie(old_from, old_to) = old_type.
range();
312 std::tie(new_from, new_to) =
MakeRange(new_type);
315 std::tie(new_from, new_to) = new_type.
range();
320 if (
distance(old_from, old_to) >= std::numeric_limits<word_t>::max() / 4) {
325 if (
distance(new_from, new_to) >= min_size) {
332 if (new_from < old_from) {
337 std::numeric_limits<word_t>::max() - (min_size - new_to);
344 DCHECK_LT(std::numeric_limits<word_t>::max() - new_from, min_size);
346 min_size - (std::numeric_limits<word_t>::max() - new_from);
355 if (new_to < old_to) {
358 DCHECK_LT(std::numeric_limits<word_t>::max() - new_from, min_size);
360 min_size - (std::numeric_limits<word_t>::max() - new_from);
369 std::numeric_limits<word_t>::max() - (min_size - new_to);
376 if (new_from < old_from) {
379 if (new_to >= min_size) {
381 word_t result_from = new_to - min_size;
391 if (new_from <= std::numeric_limits<word_t>::max() - min_size) {
393 word_t result_to = new_from + min_size;
398 return type_t::Range(std::numeric_limits<word_t>::max() - min_size,
399 std::numeric_limits<word_t>::max(), zone);
405template <
size_t Bits>
407 static_assert(Bits == 32 || Bits == 64);
408 using float_t = std::conditional_t<Bits == 32, float, double>;
410 static constexpr float_t inf = std::numeric_limits<float_t>::infinity();
420 if (min == max)
return Set({min +
float_t{0}}, special_values, zone);
424 static type_t Set(std::vector<float_t> elements, uint32_t special_values,
427 elements.erase(std::unique(elements.begin(), elements.end()),
436 if (elements.empty()) {
440 return type_t::Set(elements, special_values, zone);
446 if (!t.is_set())
return false;
447 int size = t.set_size();
451 float_t min = t.set_element(0);
452 if (std::modf(min, &unused_ipart) != 0.0)
return false;
453 if (min == -
inf)
return false;
454 float_t max = t.set_element(size - 1);
455 if (std::modf(max, &unused_ipart) != 0.0)
return false;
456 if (max ==
inf)
return false;
458 for (
int i = 1;
i < size - 1; ++
i) {
459 if (std::modf(t.set_element(
i), &unused_ipart) != 0.0)
return false;
465 return l.has_nan() || l.has_minus_zero() || l.Contains(0);
472 uint32_t special_values,
Zone* zone,
477 std::vector<float_t> results;
478 auto CombineWithLeft = [&](
float_t left) {
479 for (
int j = 0; j <
r.set_size(); ++j) {
480 results.push_back(combine(left,
r.set_element(j)));
482 if (
r.has_minus_zero()) results.push_back(combine(left, -0.0));
483 if (
r.has_nan()) results.push_back(combine(left,
nan_v<Bits>));
486 for (
int i = 0;
i < l.set_size(); ++
i) {
487 CombineWithLeft(l.set_element(
i));
489 if (l.has_minus_zero()) CombineWithLeft(-0.0);
499 auto it = std::unique(results.begin(), results.end());
502 results.erase(it, results.end());
504 return Set(std::move(results), special_values, zone);
510 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
511 bool maybe_nan = l.has_nan() ||
r.has_nan();
514 bool maybe_minuszero =
true;
515 if (l.has_minus_zero()) {
518 maybe_minuszero =
false;
520 if (
r.has_minus_zero()) {
523 maybe_minuszero =
false;
526 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
530 if (l.is_set() &&
r.is_set()) {
536 auto [l_min, l_max] = l.minmax();
537 auto [r_min, r_max] =
r.minmax();
539 std::array<float_t, 4> results;
540 results[0] = l_min + r_min;
541 results[1] = l_min + r_max;
542 results[2] = l_max + r_min;
543 results[3] = l_max + r_max;
546 for (
int i = 0;
i < 4; ++
i) {
547 if (std::isnan(results[
i])) ++nans;
558 return Range(result_min, result_max, special_values, zone);
564 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
565 bool maybe_nan = l.has_nan() ||
r.has_nan();
569 bool maybe_minuszero =
false;
570 if (l.has_minus_zero()) {
572 maybe_minuszero =
r.Contains(0);
574 if (
r.has_minus_zero()) {
578 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
582 if (l.is_set() &&
r.is_set()) {
588 auto [l_min, l_max] = l.minmax();
589 auto [r_min, r_max] =
r.minmax();
591 std::array<float_t, 4> results;
592 results[0] = l_min - r_min;
593 results[1] = l_min - r_max;
594 results[2] = l_max - r_min;
595 results[3] = l_max - r_max;
598 for (
int i = 0;
i < 4; ++
i) {
599 if (std::isnan(results[
i])) ++nans;
610 return Range(result_min, result_max, special_values, zone);
617 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
618 bool maybe_nan = l.has_nan() ||
r.has_nan() ||
623 bool maybe_minuszero = l.has_minus_zero() ||
r.has_minus_zero() ||
626 if (l.has_minus_zero()) {
629 if (
r.has_minus_zero()) {
633 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
637 if (l.is_set() &&
r.is_set()) {
643 auto [l_min, l_max] = l.minmax();
644 auto [r_min, r_max] =
r.minmax();
646 std::array<float_t, 4> results;
647 results[0] = l_min * r_min;
648 results[1] = l_min * r_max;
649 results[2] = l_max * r_min;
650 results[3] = l_max * r_max;
652 for (
int i = 0;
i < 4; ++
i) {
653 if (std::isnan(results[
i])) {
660 if (result_min <= 0.0 && 0.0 <= result_max &&
661 (l_min < 0.0 || r_min < 0.0)) {
668 if (((l_min == -
inf || l_max ==
inf) && (r_min <= 0.0 && 0.0 <= r_max)) ||
669 ((r_min == -
inf || r_max ==
inf) && (l_min <= 0.0 && 0.0 <= l_max))) {
673 type_t type =
Range(result_min, result_max, special_values, zone);
679 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
683 if V8_UNLIKELY (!std::isfinite(a) && !std::isfinite(b)) {
689 return a > 0 ? -
inf :
inf;
694 return a > 0 ?
inf : -
inf;
698 if (l.is_set() &&
r.is_set()) {
703 auto [l_min, l_max] = l.minmax();
704 auto [r_min, r_max] =
r.minmax();
708 ((l_min == -
inf || l_max ==
inf) && (r_min == -
inf || r_max ==
inf));
711 bool maybe_minuszero =
713 (l.has_minus_zero() && r_max > 0)
715 || (l.Contains(0) && r_min < 0)
717 || (l.Contains(0) && l_min < 0 && r_max > 1)
719 || (l.Contains(0) && l_max >= 0 && r_min < -1)
725 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
728 const bool r_all_positive = r_min >= 0 && !
r.has_minus_zero();
729 const bool r_all_negative = r_max < 0;
732 if (r_all_positive || r_all_negative) {
734 if (r_min > 0 && !
r.has_minus_zero()) {
735 std::array<float_t, 4> results;
736 results[0] = l_min / r_min;
737 results[1] = l_min / r_max;
738 results[2] = l_max / r_min;
739 results[3] = l_max / r_max;
747 return Range(result_min, result_max, special_values, zone);
752 if (r_all_positive) {
758 return Range(0,
inf, special_values, zone);
760 }
else if (l_min >= 0 && !l.has_minus_zero()) {
761 if (r_all_positive) {
764 return Range(0,
inf, special_values, zone);
780 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
785 bool maybe_minuszero = l.min() < 0;
786 if (l.has_minus_zero()) {
787 maybe_minuszero =
true;
790 if (
r.has_minus_zero()) {
794 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
798 auto [l_min, l_max] = l.minmax();
799 auto [r_min, r_max] =
r.minmax();
803 auto l_abs = std::max(std::abs(l_min), std::abs(l_max));
804 auto r_abs = std::max(std::abs(r_min), std::abs(r_max));
808 auto abs = std::min(l_abs, r_abs);
813 }
else if (l_max <= 0.0) {
821 if (min == max)
return Set({min}, special_values, zone);
822 return Range(min, max, special_values, zone);
830 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
831 bool maybe_nan = l.has_nan() ||
r.has_nan();
835 bool maybe_minuszero =
false;
836 if (l.has_minus_zero() && !(
r.max() < 0.0)) {
837 maybe_minuszero =
true;
840 if (
r.has_minus_zero() && !(l.max() < 0.0)) {
841 maybe_minuszero =
true;
845 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
849 if (l.is_set() &&
r.is_set()) {
856 auto [l_min, l_max] = l.minmax();
857 auto [r_min, r_max] =
r.minmax();
859 auto min = std::min(l_min, r_min);
860 auto max = std::min(l_max, r_max);
861 return Range(min, max, special_values, zone);
865 if (l.is_only_nan() ||
r.is_only_nan())
return type_t::NaN();
866 bool maybe_nan = l.has_nan() ||
r.has_nan();
870 bool maybe_minuszero =
false;
871 if (l.has_minus_zero() && !(
r.min() > 0.0)) {
872 maybe_minuszero =
true;
875 if (
r.has_minus_zero() && !(l.min() > 0.0)) {
876 maybe_minuszero =
true;
880 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
884 if (l.is_set() &&
r.is_set()) {
891 auto [l_min, l_max] = l.minmax();
892 auto [r_min, r_max] =
r.minmax();
894 auto min = std::max(l_min, r_min);
895 auto max = std::max(l_max, r_max);
896 return Range(min, max, special_values, zone);
904 if (l.is_only_nan()) {
906 if (
r.Contains(0) ||
r.has_minus_zero()) {
912 bool maybe_nan = l.has_nan() ||
r.has_nan();
914 if (
r.Contains(-
inf) ||
r.Contains(
inf)) {
915 if (l.Contains(1) || l.Contains(-1)) maybe_nan =
true;
924 bool maybe_minus_zero = l.min() < 0.0 || l.has_minus_zero();
925 uint32_t special_values = (maybe_nan ?
type_t::kNaN : 0) |
931 if (l.is_set() &&
r.is_set()) {
946 bool can_be_true =
false;
947 bool can_be_false =
false;
951 can_be_false = rhs.
min() <= 0.0;
957 can_be_true = lhs.
min() < 0.0;
958 can_be_false = lhs.
max() >= 0.0;
966 can_be_true = lhs.
min() < rhs.
max();
967 can_be_false = lhs.
max() >= rhs.
min();
980 bool can_be_true =
false;
981 bool can_be_false =
false;
986 can_be_false = rhs.
min() < 0.0;
994 can_be_false = lhs.
max() > 0.0;
1002 can_be_true = can_be_true || lhs.
min() <= rhs.
max();
1003 can_be_false = can_be_false || lhs.
max() > rhs.
min();
1016 bool can_be_true = lhs.unsigned_min() <= rhs.unsigned_max();
1017 bool can_be_false = lhs.unsigned_max() > rhs.unsigned_min();
1056 return {restrict_lhs, restrict_rhs};
1085 return {restrict_lhs, restrict_rhs};
1115 }
else if (rhs.
min() ==
inf) {
1128 }
else if (lhs.
max() == -
inf) {
1138 return {restrict_lhs, restrict_rhs};
1145 switch (rep.
value()) {
1197 if (!input.IsTuple())
return Type::Any();
1278#define FLOAT_BINOP(op, bits) \
1279 case FloatBinopOp::Kind::k##op: \
1280 return TypeFloat##bits##op(left_type, right_type, zone);
1312#define FLOAT_BINOP(op, bits, float_typer_handler) \
1313 static Type TypeFloat##bits##op(const Type& lhs, const Type& rhs, \
1315 if (lhs.IsNone() || rhs.IsNone()) return Type::None(); \
1316 if (!InputIs(lhs, Type::Kind::kFloat##bits) || \
1317 !InputIs(rhs, Type::Kind::kFloat##bits)) { \
1318 return Float##bits##Type::Any(); \
1320 const auto& l = lhs.AsFloat##bits(); \
1321 const auto& r = rhs.AsFloat##bits(); \
1322 return FloatOperationTyper<bits>::float_typer_handler(l, r, zone); \
1348 const Type& right_type,
1386 if ((0xC0000000 & l.unsigned_max()) == 0 &&
1387 (0xC0000000 &
r.unsigned_max()) == 0) {
1392 if (l.is_constant() &&
r.is_constant()) {
1393 constexpr uint32_t msb_mask = 0x80000000;
1394 DCHECK(value.is_constant());
1395 uint32_t l_msb = (*l.try_get_constant()) & msb_mask;
1396 uint32_t r_msb = (*
r.try_get_constant()) & msb_mask;
1397 if (l_msb != r_msb) {
1401 uint32_t value_msb = (*value.try_get_constant()) & msb_mask;
1402 const uint32_t overflow = value_msb == l_msb ? 0 : 1;
1412 switch (rep.
value()) {
1512 std::numeric_limits<uint64_t>::max(), zone);
1516 bool implicit_word64_narrowing,
1518 DCHECK(!input.IsInvalid());
1521 if (input.IsAny()) {
1523 }
else if (input.IsWord32()) {
1524 return input.AsWord32();
1525 }
else if (input.IsWord64() && implicit_word64_narrowing) {
1527 const auto& w64 = input.AsWord64();
1530 for (uint64_t e : w64.set_elements()) {
1531 elements.
push_back(
static_cast<uint32_t
>(e));
1538 if (w64.range_to() <= std::numeric_limits<uint32_t>::max()) {
1539 DCHECK_LE(w64.range_from(), std::numeric_limits<uint32_t>::max());
1541 static_cast<uint32_t
>(w64.range_to()), zone);
1548 FATAL(
"Missing proper type for TruncateWord32Input. Type is: %s",
1549 input.ToString().c_str());
1571 template <
bool allow_implicit_word64_truncation>
1577 if constexpr (allow_implicit_word64_truncation) {
1585 if (type.IsWord64()) {
1603 if (input.IsInvalid()) {
1605 }
else if (input.kind() == expected) {
1607 }
else if (input.IsAny()) {
1611 std::stringstream
s;
1613 FATAL(
"Missing proper type (%s). Type is: %s", s.str().c_str(),
1614 input.ToString().c_str());
void pop_back(size_t count=1)
constexpr bool empty() const
constexpr size_t size() const
static constexpr FloatRepresentation Float32()
static constexpr FloatRepresentation Float64()
bool has_minus_zero() const
static FloatType OnlySpecialValues(uint32_t special_values)
static FloatType Range(float_t min, float_t max, Zone *zone)
static FloatType Constant(float_t constant)
static FloatType Set(const base::SmallVector< const float_t, N > &elements, Zone *zone)
bool is_only_special_values() const
static FloatType LeastUpperBound(const FloatType &lhs, const FloatType &rhs, Zone *zone)
static FloatType MinusZero()
static constexpr int kMaxSetSize
constexpr Enum value() const
static constexpr RegisterRepresentation Compressed()
static constexpr RegisterRepresentation Simd128()
static constexpr RegisterRepresentation Word32()
static constexpr RegisterRepresentation Float64()
static constexpr RegisterRepresentation Float32()
static constexpr RegisterRepresentation Simd256()
static constexpr RegisterRepresentation Word64()
static constexpr RegisterRepresentation Tagged()
static TupleType Tuple(const Type &element0, const Type &element1, Zone *zone)
const Type & element(int index) const
const TupleType & AsTuple() const
const Word32Type & AsWord32() const
const Float32Type & AsFloat32() const
const Word64Type & AsWord64() const
const Float64Type & AsFloat64() const
type_refiner_t type_refiner_
void RefineTypes(const Operation &condition, bool then_branch, Zone *zone)
std::function< void(OpIndex, const Type &)> type_refiner_t
Type RefineWord32Type(const Type &type, const Type &refinement, Zone *zone)
type_getter_t type_getter_
std::function< Type(OpIndex)> type_getter_t
BranchRefinements(type_getter_t type_getter, type_refiner_t type_refiner)
static Type TypeConstant(ConstantOp::Kind kind, ConstantOp::Storage value)
static Type TypeWordBinop(Type left_type, Type right_type, WordBinopOp::Kind kind, WordRepresentation rep, Zone *zone)
static Type TypeWord64Add(const Type &lhs, const Type &rhs, Zone *zone)
static Type TypeOverflowCheckedBinop(const Type &left_type, const Type &right_type, OverflowCheckedBinopOp::Kind kind, WordRepresentation rep, Zone *zone)
static Type TypeFloat64Comparison(const Type &lhs, const Type &rhs, ComparisonOp::Kind kind, Zone *zone)
static Type TypeWord32Comparison(const Type &lhs, const Type &rhs, ComparisonOp::Kind kind, Zone *zone)
static Type TypeProjection(const Type &input, uint16_t idx)
static Type TypeWord32Add(const Type &lhs, const Type &rhs, Zone *zone)
static Type TypeWord32OverflowCheckedAdd(const Type &lhs, const Type &rhs, Zone *zone)
static Type TypeComparison(const Type &lhs, const Type &rhs, RegisterRepresentation rep, ComparisonOp::Kind kind, Zone *zone)
static Type TypeFloat32Comparison(const Type &lhs, const Type &rhs, ComparisonOp::Kind kind, Zone *zone)
static Type TypeWord64Sub(const Type &lhs, const Type &rhs, Zone *zone)
static Type TypeForRepresentation(base::Vector< const RegisterRepresentation > reps, Zone *zone)
static Type TypeForRepresentation(RegisterRepresentation rep)
static Type TypeWord64Comparison(const Type &lhs, const Type &rhs, ComparisonOp::Kind kind, Zone *zone)
static bool InputIs(const Type &input, Type::Kind expected)
static Type TypeFloatBinop(Type left_type, Type right_type, FloatBinopOp::Kind kind, FloatRepresentation rep, Zone *zone)
static Word64Type ExtendWord32ToWord64(const Word32Type &t, Zone *zone)
static Type TypeWord32Sub(const Type &lhs, const Type &rhs, Zone *zone)
static bool allow_invalid_inputs()
static Word32Type TruncateWord32Input(const Type &input, bool implicit_word64_narrowing, Zone *zone)
static constexpr WordRepresentation Word32()
static constexpr WordRepresentation Word64()
word_t unsigned_min() const
word_t set_element(int index) const
static constexpr int kMaxSetSize
static Type Intersect(const WordType &lhs, const WordType &rhs, ResolutionMode resolution_mode, Zone *zone)
static WordType Constant(word_t constant)
std::pair< word_t, word_t > range() const
static WordType Range(word_t from, word_t to, Zone *zone)
static WordType Set(const base::SmallVector< word_t, N > &elements, Zone *zone)
word_t unsigned_max() const
std::optional< TNode< JSArray > > a
ZoneVector< RpoNumber > & result
constexpr Vector< T > VectorOf(T *start, size_t size)
size_t erase_if(C &container, const P &predicate)
bool all_of(const C &container, const P &predicate)
bool is_minus_zero(T value)
bool is_unique_and_sorted(const T &container)
T array_min(const std::array< T, N > &a)
typename detail::TypeForBits< Bits >::uint_type uint_type
constexpr float_type< Bits > nan_v
T array_max(const std::array< T, N > &a)
static bool IsMinusZero(double value)
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
@ kUnsignedLessThanOrEqual
std::conditional_t< Bits==32, float, double > float_t
static Type Modulus(type_t l, type_t r, Zone *zone)
static std::pair< Type, Type > RestrictionForLessThan_True(const type_t &lhs, const type_t &rhs, Zone *zone)
static Type Min(type_t l, type_t r, Zone *zone)
static type_t Range(float_t min, float_t max, uint32_t special_values, Zone *zone)
static type_t Set(std::vector< float_t > elements, uint32_t special_values, Zone *zone)
static Type Power(const type_t &l, const type_t &r, Zone *zone)
static Type Add(type_t l, type_t r, Zone *zone)
static Type Subtract(type_t l, type_t r, Zone *zone)
static Type Divide(const type_t &l, const type_t &r, Zone *zone)
static std::pair< Type, Type > RestrictionForLessThanOrEqual_True(const type_t &lhs, const type_t &rhs, Zone *zone)
static Type Atan2(const type_t &l, const type_t &r, Zone *zone)
static std::pair< Type, Type > RestrictionForLessThanOrEqual_False(const type_t &lhs, const type_t &rhs, Zone *zone)
static Word32Type UnsignedLessThanOrEqual(const type_t &lhs, const type_t &rhs, Zone *zone)
static Type ProductSet(const type_t &l, const type_t &r, uint32_t special_values, Zone *zone, std::function< float_t(float_t, float_t)> combine)
static Type LessThanOrEqual(const type_t &lhs, const type_t &rhs, Zone *zone)
static bool IsZeroish(const type_t &l)
static Type Max(type_t l, type_t r, Zone *zone)
static Type LessThan(const type_t &lhs, const type_t &rhs, Zone *zone)
static std::pair< Type, Type > RestrictionForLessThan_False(const type_t &lhs, const type_t &rhs, Zone *zone)
static bool IsIntegerSet(const type_t &t)
static constexpr float_t inf
static Type Multiply(type_t l, type_t r, Zone *zone)
static constexpr int kSetThreshold
static type_t Subtract(const type_t &lhs, const type_t &rhs, Zone *zone)
static type_t FromElements(ElementsVector elements, Zone *zone)
static std::pair< Type, Type > RestrictionForUnsignedLessThan_True(const type_t &lhs, const type_t &rhs, Zone *zone)
static bool is_wrapping(const std::pair< word_t, word_t > &range)
static Word32Type UnsignedLessThan(const type_t &lhs, const type_t &rhs, Zone *zone)
static Word32Type UnsignedLessThanOrEqual(const type_t &lhs, const type_t &rhs, Zone *zone)
static std::pair< Type, Type > RestrictionForUnsignedLessThanOrEqual_False(const type_t &lhs, const type_t &rhs, Zone *zone)
static std::pair< word_t, word_t > MakeRange(base::Vector< const word_t > elements)
static std::pair< Type, Type > RestrictionForUnsignedLessThanOrEqual_True(const type_t &lhs, const type_t &rhs, Zone *zone)
static type_t WidenMaximal(const type_t &old_type, const type_t &new_type, Zone *zone)
static word_t distance(word_t from, word_t to)
static bool is_wrapping(word_t from, word_t to)
static word_t distance(const std::pair< word_t, word_t > &range)
static type_t Add(const type_t &lhs, const type_t &rhs, Zone *zone)
static std::pair< Type, Type > RestrictionForUnsignedLessThan_False(const type_t &lhs, const type_t &rhs, Zone *zone)
static type_t WidenExponential(const type_t &old_type, type_t new_type, Zone *zone)
static std::pair< word_t, word_t > MakeRange(const type_t &t)
#define FLOAT_BINOP(op, bits)
#define V8_UNLIKELY(condition)