[range-op-float] Implement MINUS_EXPR.
Now that the generic parts of the binary operators have been abstracted, implementing MINUS_EXPR is a cinch. The op[12]_range entries will be submitted as a follow-up. gcc/ChangeLog: * range-op-float.cc (class foperator_minus): New. (floating_op_table::floating_op_table): Add MINUS_EXPR entry.
This commit is contained in:
parent
0ef5649e9b
commit
38ec5e4bc8
1 changed files with 24 additions and 0 deletions
|
@ -1884,6 +1884,29 @@ class foperator_plus : public range_operator_float
|
|||
} fop_plus;
|
||||
|
||||
|
||||
class foperator_minus : public range_operator_float
|
||||
{
|
||||
void rv_fold (REAL_VALUE_TYPE &lb, REAL_VALUE_TYPE &ub, bool &maybe_nan,
|
||||
tree type,
|
||||
const REAL_VALUE_TYPE &lh_lb,
|
||||
const REAL_VALUE_TYPE &lh_ub,
|
||||
const REAL_VALUE_TYPE &rh_lb,
|
||||
const REAL_VALUE_TYPE &rh_ub) const final override
|
||||
{
|
||||
frange_arithmetic (MINUS_EXPR, type, lb, lh_lb, rh_ub, dconstninf);
|
||||
frange_arithmetic (MINUS_EXPR, type, ub, lh_ub, rh_lb, dconstinf);
|
||||
|
||||
// [+INF] - [+INF] = NAN
|
||||
if (real_isinf (&lh_ub, false) && real_isinf (&rh_ub, false))
|
||||
maybe_nan = true;
|
||||
// [-INF] - [-INF] = NAN
|
||||
else if (real_isinf (&lh_lb, true) && real_isinf (&rh_lb, true))
|
||||
maybe_nan = true;
|
||||
else
|
||||
maybe_nan = false;
|
||||
}
|
||||
} fop_minus;
|
||||
|
||||
// Instantiate a range_op_table for floating point operations.
|
||||
static floating_op_table global_floating_table;
|
||||
|
||||
|
@ -1917,6 +1940,7 @@ floating_op_table::floating_op_table ()
|
|||
set (ABS_EXPR, fop_abs);
|
||||
set (NEGATE_EXPR, fop_negate);
|
||||
set (PLUS_EXPR, fop_plus);
|
||||
set (MINUS_EXPR, fop_minus);
|
||||
}
|
||||
|
||||
// Return a pointer to the range_operator_float instance, if there is
|
||||
|
|
Loading…
Add table
Reference in a new issue