On Fri, Aug 26, 2022 at 6:08 PM Jeff Law via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > > > On 8/23/2022 4:33 AM, Aldy Hernandez via Gcc-patches wrote: > > For the frange implementation with endpoints I'm about to contribute, > > we need to set REAL_VALUE_TYPEs with negative infinity. The support > > is already there in real.cc, but it is awkward to get at. One could > > call real_inf() and then negate the value, but I've added the ability > > to pass the sign argument like many of the existing real.* functions. > > > > I've declared the functions in such a way to avoid changes to the > > existing code base: > > > > // Unchanged function returning true for either +-INF. > > bool real_isinf (const REAL_VALUE_TYPE *r); > > // New overload to be able to specify the sign. > > bool real_isinf (const REAL_VALUE_TYPE *r, int sign); > > // Replacement function for setting INF, defaults to +INF. > > void real_inf (REAL_VALUE_TYPE *, int sign = 0); > > > > Tested on x86-64 Linux. > > > > OK? > > > > gcc/ChangeLog: > > > > * real.cc (real_isinf): New overload. > > (real_inf): Add sign argument. > > * real.h (real_isinf): New overload. > > (real_inf): Add sign argument. > > Funny in that I've fairly recently had the desire to do something a bit > similar. Let's consider 0.5, which we have a dconsthalf, but we don't > have dconstmhalf for -0.5. To get that value I create a dconsthalf > object and flip its sign. Similarly for a variety of other special > constants (particularly powers of two, but a few others as well).
Ugh, yeah. I've been doing a lot of gymnastics in this space because frange's will have REAL_VALUE_TYPE endpoints. > > Consider making the "sign" argument a boolean. It's defined as a single > bit bitfield in the real_value structure. We don't want folks to pass > in values outside [0..1] for the sign if we can easily avoid it:-) I was trying to follow all the other functions in real.cc which have "int sign", though I suppose none of them are exported in the header file. OK pending tests? Aldy
From 86664496f62f5d4d33da0347f5d5c017bd204513 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez <al...@redhat.com> Date: Sat, 20 Aug 2022 12:41:53 +0200 Subject: [PATCH] Add set/get functions for negative infinity in real.* For the frange implementation with endpoints I'm about to contribute, we need to set REAL_VALUE_TYPEs with negative infinity. The support is already there in real.cc, but it is awkward to get at. One could call real_inf() and then negate the value, but I've added the ability to pass the sign argument like many of the existing real.* functions. I've declared the functions in such a way to avoid changes to the existing code base: // Unchanged function returning true for either +-INF. bool real_isinf (const REAL_VALUE_TYPE *r); // New overload to be able to specify the sign. bool real_isinf (const REAL_VALUE_TYPE *r, int sign); // Replacement function for setting INF, defaults to +INF. void real_inf (REAL_VALUE_TYPE *, int sign = 0); gcc/ChangeLog: * real.cc (real_isinf): New overload. (real_inf): Add sign argument. * real.h (real_isinf): New overload. (real_inf): Add sign argument. --- gcc/real.cc | 14 +++++++++++--- gcc/real.h | 5 ++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/real.cc b/gcc/real.cc index 4e63b1449c5..dcf41b79f60 100644 --- a/gcc/real.cc +++ b/gcc/real.cc @@ -1234,6 +1234,14 @@ real_isinf (const REAL_VALUE_TYPE *r) return (r->cl == rvc_inf); } +/* Determine whether a floating-point value X is infinite with SIGN. */ + +bool +real_isinf (const REAL_VALUE_TYPE *r, bool sign) +{ + return real_isinf (r) && r->sign == sign; +} + /* Determine whether a floating-point value X is a NaN. */ bool @@ -2484,12 +2492,12 @@ dconst_sqrt2_ptr (void) return &value; } -/* Fills R with +Inf. */ +/* Fills R with Inf with SIGN. */ void -real_inf (REAL_VALUE_TYPE *r) +real_inf (REAL_VALUE_TYPE *r, bool sign) { - get_inf (r, 0); + get_inf (r, sign); } /* Fills R with a NaN whose significand is described by STR. If QUIET, diff --git a/gcc/real.h b/gcc/real.h index 845ef29e3a4..e01f9ed7282 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -277,6 +277,9 @@ extern bool real_compare (int, const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *) /* Determine whether a floating-point value X is infinite. */ extern bool real_isinf (const REAL_VALUE_TYPE *); +/* Determine whether a floating-point value X is infinite with SIGN. */ +extern bool real_isinf (const REAL_VALUE_TYPE *, bool sign); + /* Determine whether a floating-point value X is a NaN. */ extern bool real_isnan (const REAL_VALUE_TYPE *); @@ -331,7 +334,7 @@ extern long real_to_target (long *, const REAL_VALUE_TYPE *, format_helper); extern void real_from_target (REAL_VALUE_TYPE *, const long *, format_helper); -extern void real_inf (REAL_VALUE_TYPE *); +extern void real_inf (REAL_VALUE_TYPE *, bool sign = false); extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, format_helper); -- 2.37.1