Lines Matching refs:rhs
141 RangeInfo Union(const RangeInfo &rhs) const
143 return RangeInfo(std::min(min_, rhs.min_), std::max(max_, rhs.max_));
146 RangeInfo intersection(const RangeInfo &rhs) const
148 return RangeInfo(std::max(min_, rhs.min_), std::min(max_, rhs.max_));
151 bool MaybeAddOverflow(const RangeInfo &rhs) const
153 return (rhs.max_ > 0) && (max_ > INT32_MAX - rhs.max_);
156 bool MaybeAddUnderflow(const RangeInfo &rhs) const
158 return (rhs.min_ < 0) && (min_ < INT32_MIN - rhs.min_);
161 bool MaybeAddOverflowOrUnderflow(const RangeInfo &rhs) const
163 return MaybeAddOverflow(rhs) || MaybeAddUnderflow(rhs);
166 RangeInfo operator+ (const RangeInfo &rhs) const
168 ASSERT(min_ <= max_ && rhs.min_ <= rhs.max_);
169 int32_t nmax = MaybeAddOverflow(rhs) ? INT32_MAX : max_ + rhs.max_;
170 int32_t nmin = MaybeAddUnderflow(rhs) ? INT32_MIN : min_ + rhs.min_;
174 RangeInfo operator% (const RangeInfo &rhs) const
176 ASSERT(min_ <= max_ && rhs.min_ <= rhs.max_);
178 int32_t nmax = std::max(std::abs(rhs.min_), std::abs(rhs.max_));
197 RangeInfo operator* (const RangeInfo &rhs) const
199 ASSERT(min_ <= max_ && rhs.min_ <= rhs.max_);
200 int32_t nmax = GetMaxMulResult(rhs);
201 int32_t nmin = GetMinMulResult(rhs);
205 int32_t GetMaxMulResult(const RangeInfo &rhs) const
207 return std::max({ TryMul(min_, rhs.min_), TryMul(min_, rhs.max_),
208 TryMul(max_, rhs.min_), TryMul(max_, rhs.max_) });
211 int32_t GetMinMulResult(const RangeInfo &rhs) const
213 return std::min({ TryMul(min_, rhs.min_), TryMul(min_, rhs.max_),
214 TryMul(max_, rhs.min_), TryMul(max_, rhs.max_) });
217 int32_t TryMul(int32_t lhs, int32_t rhs) const
219 if (MaybeMulOverflow(lhs, rhs)) {
222 if (MaybeMulUnderflow(lhs, rhs)) {
225 return lhs * rhs;
228 bool MaybeMulOverflowOrUnderflow(const RangeInfo &rhs) const
230 return MaybeMulOverflow(rhs) || MaybeMulUnderflow(rhs);
233 bool MaybeMulUnderflow(const RangeInfo &rhs) const
235 return MaybeMulUnderflow(min_, rhs.max_) || MaybeMulUnderflow(max_, rhs.min_);
238 bool MaybeMulOverflow(const RangeInfo &rhs) const
240 return MaybeMulOverflow(max_, rhs.max_) || MaybeMulOverflow(min_, rhs.min_);
243 bool MaybeMulUnderflow(int32_t lhs, int32_t rhs) const
245 return (lhs > 0 && rhs < 0 && rhs < INT32_MIN / lhs) || (lhs < 0 && rhs > 0 && lhs < INT32_MIN / rhs);
248 bool MaybeMulOverflow(int32_t lhs, int32_t rhs) const
250 return (lhs > 0 && rhs > 0 && lhs > INT32_MAX / rhs) || (lhs < 0 && rhs < 0 && lhs < INT32_MAX / rhs);
253 bool MaybeSubOverflow(const RangeInfo &rhs) const
255 return (rhs.min_ < 0) && (max_ > INT32_MAX + rhs.min_);
258 bool MaybeSubUnderflow(const RangeInfo &rhs) const
260 return (rhs.max_ > 0) && (min_ < INT32_MIN + rhs.max_);
263 bool MaybeSubOverflowOrUnderflow(const RangeInfo &rhs) const
265 return MaybeSubOverflow(rhs) || MaybeSubUnderflow(rhs);
268 RangeInfo operator- (const RangeInfo &rhs) const
270 ASSERT(min_ <= max_ && rhs.min_ <= rhs.max_);
271 int32_t nmax = MaybeSubOverflow(rhs) ? INT32_MAX : max_ - rhs.min_;
272 int32_t nmin = MaybeSubUnderflow(rhs) ? INT32_MIN : min_ - rhs.max_;
276 bool MaybeShrOverflow(const RangeInfo &rhs) const
278 if (rhs.max_ != rhs.min_) {
281 return ((static_cast<uint32_t>(rhs.max_) & 0x1f) == 0) && (min_< 0); // 0x1f : shift bits
284 RangeInfo SHR(const RangeInfo &rhs) const
287 ASSERT(rhs.max_ == rhs.min_);
288 if (MaybeShrOverflow(rhs)) {
292 int32_t shift = rhs.max_ & 0x1f; // 0x1f : shift bits
300 RangeInfo ASHR(const RangeInfo &rhs) const
303 ASSERT(rhs.max_ == rhs.min_);
304 int32_t shift = rhs.max_ & 0x1f; // 0x1f : shift bits
310 bool operator== (const RangeInfo &rhs) const
312 return (min_ == rhs.min_) && (max_ == rhs.max_);
315 bool operator!= (const RangeInfo &rhs) const
317 return (min_ != rhs.min_) || (max_ != rhs.max_);