https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91970

            Bug ID: 91970
           Summary: arm: 64bit int to double conversion does not respect
                    rounding mode
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nsz at gcc dot gnu.org
  Target Milestone: ---

on arm-* with

#include <fenv.h>
#include <stdio.h>
int main()
{
        long long x = (1LL << 60) - 1;
        double y;
        fesetround(FE_DOWNWARD);
        __asm__ __volatile__ ("" : "+m" (x));
        y = x;
        __asm__ __volatile__ ("" : "+m" (y));
        fesetround(FE_TONEAREST);
        printf("%a\n", y);
}

i get

0x1p60

instead of

0x1.fffffffffffffp+59

i assume this is because the conversion is handled by __aeabi_l2d
(also known as __floatdidf in libgcc) which is not rounding mode
aware.

this affects hardfloat targets which otherwise support directed
rounding modes.

Reply via email to