| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #pragma once
- class IntConstantBounds
- {
- private:
- int32 lowerBound;
- int32 upperBound;
- public:
- IntConstantBounds() : lowerBound(0), upperBound(0)
- {
- }
- IntConstantBounds(const int32 lowerBound, const int32 upperBound)
- : lowerBound(lowerBound), upperBound(upperBound)
- {
- Assert(lowerBound <= upperBound);
- }
- public:
- int32 LowerBound() const
- {
- return lowerBound;
- }
- int32 UpperBound() const
- {
- return upperBound;
- }
- bool IsConstant() const
- {
- return lowerBound == upperBound;
- }
- bool IsTaggable() const
- {
- #if INT32VAR
- // All 32-bit ints are taggable on 64-bit architectures
- return true;
- #else
- return lowerBound >= Js::Constants::Int31MinValue && upperBound <= Js::Constants::Int31MaxValue;
- #endif
- }
- bool IsLikelyTaggable() const
- {
- #if INT32VAR
- // All 32-bit ints are taggable on 64-bit architectures
- return true;
- #else
- return lowerBound <= Js::Constants::Int31MaxValue && upperBound >= Js::Constants::Int31MinValue;
- #endif
- }
- ValueType GetValueType() const
- {
- return ValueType::GetInt(IsLikelyTaggable());
- }
- IntConstantBounds And_0x1f() const
- {
- const int32 mask = 0x1f;
- if(static_cast<UIntConstType>(upperBound) - static_cast<UIntConstType>(lowerBound) >= static_cast<UIntConstType>(mask) ||
- (lowerBound & mask) > (upperBound & mask))
- {
- // The range contains all items in the set {0-mask}, or the range crosses a boundary of {0-mask}. Since we cannot
- // represent ranges like {0-5,8-mask}, just use {0-mask}.
- return IntConstantBounds(0, mask);
- }
- return IntConstantBounds(lowerBound & mask, upperBound & mask);
- }
- bool Contains(const int32 value) const
- {
- return lowerBound <= value && value <= upperBound;
- }
- bool operator ==(const IntConstantBounds &other) const
- {
- return lowerBound == other.lowerBound && upperBound == other.upperBound;
- }
- };
|