diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2022-11-09 01:00:57 +0100 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2022-11-09 10:03:12 +0100 |
commit | 4287e8168f89e90b3dff3a50f3ada40be53e0e01 (patch) | |
tree | bac1b41ab840e2f75ed1917e0eca56a3dd5b310b /gcc | |
parent | 6373b1fdf75ea0908dfaebdbfc54d8b55b08d409 (diff) | |
download | gcc-4287e8168f89e90b3dff3a50f3ada40be53e0e01.zip gcc-4287e8168f89e90b3dff3a50f3ada40be53e0e01.tar.gz gcc-4287e8168f89e90b3dff3a50f3ada40be53e0e01.tar.bz2 |
Implement op[12]_range operators for PLUS_EXPR and MINUS_EXPR.
We can implement the op[12]_range entries for plus and minus in terms
of each other. These are adapted from the integer versions.
gcc/ChangeLog:
* range-op-float.cc (foperator_plus::op1_range): New.
(foperator_plus::op2_range): New.
(foperator_minus::op1_range): New.
(foperator_minus::op2_range): New.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/range-op-float.cc | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc index d52e971..44db81c 100644 --- a/gcc/range-op-float.cc +++ b/gcc/range-op-float.cc @@ -1862,6 +1862,29 @@ foperator_unordered_equal::op1_range (frange &r, tree type, class foperator_plus : public range_operator_float { + using range_operator_float::op1_range; + using range_operator_float::op2_range; +public: + virtual bool op1_range (frange &r, tree type, + const frange &lhs, + const frange &op2, + relation_trio = TRIO_VARYING) const final override + { + if (lhs.undefined_p ()) + return false; + range_op_handler minus (MINUS_EXPR, type); + if (!minus) + return false; + return minus.fold_range (r, type, lhs, op2); + } + virtual bool op2_range (frange &r, tree type, + const frange &lhs, + const frange &op1, + relation_trio = TRIO_VARYING) const final override + { + return op1_range (r, type, lhs, op1); + } +private: void rv_fold (REAL_VALUE_TYPE &lb, REAL_VALUE_TYPE &ub, bool &maybe_nan, tree type, const REAL_VALUE_TYPE &lh_lb, @@ -1886,6 +1909,28 @@ class foperator_plus : public range_operator_float class foperator_minus : public range_operator_float { + using range_operator_float::op1_range; + using range_operator_float::op2_range; +public: + virtual bool op1_range (frange &r, tree type, + const frange &lhs, + const frange &op2, + relation_trio = TRIO_VARYING) const final override + { + if (lhs.undefined_p ()) + return false; + return fop_plus.fold_range (r, type, lhs, op2); + } + virtual bool op2_range (frange &r, tree type, + const frange &lhs, + const frange &op1, + relation_trio = TRIO_VARYING) const final override + { + if (lhs.undefined_p ()) + return false; + return fold_range (r, type, op1, lhs); + } +private: void rv_fold (REAL_VALUE_TYPE &lb, REAL_VALUE_TYPE &ub, bool &maybe_nan, tree type, const REAL_VALUE_TYPE &lh_lb, |