Re: round() on arm vs aarch64

Joel Sherrill <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAF9ehCUUaMeizgi-95dK9Erk3E3LhAqxwcFjyvGoZN_ps_pkUg@mail.gmail.com>
Digging a bit, I noticed a huge block of <cmath> is ifdef'ed out for
aarch64.
I found the file c++config.h which is different between the two.

Based on the diff of the arm and aarch64 versions, arm has
 _GLIBCXX_USE_C99_MATH_TR1 defined but aarch64 does not.

I have no idea where the settings in this file come from but this
appears to be the key difference.

More insight appreciated.

=====================================================
round]$ diff
 /home/joel/rtems-work/tools/6/lib/gcc/arm-rtems6/12.2.1/include/c++/arm-rtems6/bits/c++config.h
/home/joel/rtems-work/tools/6/lib/gcc/aarch64-rtems6/12.2.1/include/c++/aarch64-rtems6/bits/c++config.h
886c886
< /* #undef _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY */
---
> #define _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY 1
1702c1702
< #define _GLIBCXX_MANGLE_SIZE_T j
---
> #define _GLIBCXX_MANGLE_SIZE_T m
1711c1711
< #define _GLIBCXX_PTRDIFF_T_IS_INT 1
---
> /* #undef _GLIBCXX_PTRDIFF_T_IS_INT */
1717c1717
< #define _GLIBCXX_SIZE_T_IS_UINT 1
---
> /* #undef _GLIBCXX_SIZE_T_IS_UINT */
1774c1774
< #define _GLIBCXX_USE_C99_MATH_TR1 1
---
> /* #undef _GLIBCXX_USE_C99_MATH_TR1 */
=====================================================


On Mon, Nov 7, 2022 at 11:28 AM Richard Earnshaw <
[email protected]> wrote:

>
>
> On 03/11/2022 14:13, Joel Sherrill wrote:
> > Hi
> >
> > This is likely not a newlib bug but I thought I would start here because
> > I'm not sure what is going on and I thought someone on this list would
> have
> > an idea: This is a simple C++ function that calls std::round. It compiles
> > on arm but aarch64 says round isn't in the std namespace.
> >
> > If you change the program to just use round() and not std::round() it
> > compiles on both architectures.
> >
> > The compiler versions are the same and report:
> >
> > arm-rtems6-gcc (GCC) 12.2.1 20221014 (RTEMS 6, RSB
> > cb8821e93378118e78a9cb25859789b126bd5761, Newlib 0b6342c)
> >
> > =====================
> > $ cat r.cc
> > #include <cmath>
> >
> >
> >
> > int wrap(double v)
> >
> > {
> >
> >    double r = std::round((float)v);
> >
> >    return (r > 0);
> >
> > }
> >
> > [joel@devel round]$ arm-rtems6-gcc -Wall -c r.cc
> > [joel@devel round]$ aarch64-rtems6-gcc -Wall -c r.cc
> > r.cc: In function 'int wrap(double)':
> > r.cc:5:19: error: 'round' is not a member of 'std'; did you mean 'round'?
> >      5 |   double r = std::round((float)v);
> >        |                   ^~~~~
> > In file included from
> >
> /home/joel/rtems-work/tools/6/lib/gcc/aarch64-rtems6/12.2.1/include/c++/cmath:45,
> >                   from r.cc:1:
> > /home/joel/rtems-work/tools/6/aarch64-rtems6/include/math.h:337:15: note:
> > 'round' declared here
> >    337 | extern double round (double);
> > =====================
> >
> > Any ideas what would cause this?
> >
> > Thanks
> >
> > --joel
>
> Have you tried comparing the pre-processed output from the two versions?
>   It might give a clue as to what's going on.
>
> R.
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.