On Mon, Jan 21, 2019 at 6:03 PM Joseph Myers <jos...@codesourcery.com> wrote:
>
> On Mon, 21 Jan 2019, H.J. Lu wrote:
>
> > The testcase at
> >
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88931
> >
> > with -frounding-math.  __floattisf and __floattidf from libgcc2.c give
> > the wrong results for FE_UPWARD and FE_TOWARDZERO.
>
> I suggest writing a test that looks something like
> gcc.dg/torture/fp-int-convert-float128-timode-3.c - one that verifies the
> conversion of a single value, in a single rounding mode (four such tests
> if you want to verify conversions for each of SFmode and DFmode, in each
> of two rounding modes).  Of course that test wouldn't have any of the dg-*
> related to __float128, because this isn't a float128 issue.  Given such a
> test that uses volatile as appropriate and just does and checks one
> conversion, we can be confident we have a real issue (not something about
> code movement).
>
> If such a test shows a bug, it will be somewhere in the libgcc2.c code,
> with the appropriate fix being in that code.  Since that code has lots of
> conditionals in it, it would help to identify exactly which cases in that
> code are used; that is, which of the
>
> #if FSSIZE >= W_TYPE_SIZE
>
> #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))       \
>      || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))     \
>      || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
>
> or
>
> #else
>
> cases is being used (and, in the second case, what FSIZE and FTYPE are).
> The bug could either be in the code in the selected case, or in the logic
> that selects which case to use.
>
> Based on code inspection, it's possible the issue is with
>
>   /* No leading bits means u == minimum.  */
>   if (count == 0)
>     return -(Wtype_MAXp1_F * (Wtype_MAXp1_F / 2));
>
> in the third case (where actually count == 0 only means the high part is
> minimum).  In which case something like
>
>     return Wtype_MAXp1_F * (FSTYPE) (hi | ((UWtype) u != 0));
>
> for the (count == 0) case would address the problem.

Yes, this works.


-- 
H.J.

Reply via email to