[Bug libstdc++/122981] pr109261_constexpr_simd.cc and pr115454_find_last_set.cc fail on arm-none-eabi

"azoff at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122981

--- Comment #6 from Torbjorn SVENSSON <azoff at gcc dot gnu.org> ---
I think I have an answer to the "why would arm-linux-gnueabihf support this
type" question.

I used AI to compare a build of arm-none-eabi with a build of
arm-none-linux-gnueabihf and it came up with this:

> The failure is a libstdc++ <experimental/simd> NEON bug caused by differing
> canonical 32-bit types:
> 
> arm-none-linux-gnueabihf defines int32_t as int.  arm-none-eabi defines int32_t
> as long int.  simd_neon.h creates a __vector(2) int, then passes it to
> vpadd_s32, which expects int32x2_t. On Linux those are the same vector type; on
> arm-none-eabi, int32x2_t is based on long int, so they are distinct and the
> call is rejected.
> 
> The actual fix belongs in simd_neon.h:332: convert or bit-cast the intermediate
> vector to the ACLE-required int32x2_t type before calling vpadd_s32. The
> implementation must not assume that a four-byte integer selected via
> sizeof(int) is the same type as int32_t.

So, based on that response, I'd say that the fix that I've suggested in comment
2 is wrong and the proper fix is, as was mentioned in comment 4, to add a cast
somewhere.


The two binary distributions of GCC that I used to compare can be found here:
https://gitlab.arm.com/tooling/gnu-toolchains-for-arm/-/tree/releases/15.3.rel1
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.