在 2023-08-18五的 15:19 +0800,Xi Ruoyao写道: > On Fri, 2023-08-18 at 15:05 +0800, Xi Ruoyao via Gcc-patches wrote: > > On Fri, 2023-08-18 at 14:58 +0800, Xi Ruoyao via Gcc-patches wrote: > > > On Fri, 2023-08-18 at 14:39 +0800, chenxiaolong wrote: > > > > 在 2023-08-17四的 15:08 +0000,Joseph Myers写道: > > > > > On Thu, 17 Aug 2023, Xi Ruoyao via Gcc-patches wrote: > > > > > > > > > > > So I guess we just need > > > > > > > > > > > > builtin_define ("__builtin_fabsq=__builtin_fabsf128"); > > > > > > builtin_define ("__builtin_nanq=__builtin_nanf128"); > > > > > > > > > > > > etc. to map the "q" builtins to "f128" builtins if we > > > > > > really need > > > > > > the > > > > > > "q" builtins. > > > > > > > > > > > > Joseph: the problem here is many customers of LoongArch > > > > > > CPUs wish > > > > > > to > > > > > > compile their old code with minimal change. Is it > > > > > > acceptable to > > > > > > add > > > > > > these builtin_define's like rs6000-c.cc? Note "a new > > > > > > architecture" > > > > > > does > > > > > > not mean we'll only compile post-C2x-era programs onto it. > > > > > > > > > > The powerpc support for __float128 started in GCC 6, > > > > > predating the > > > > > support > > > > > for _FloatN type names, built-in functions etc. in GCC 7 - > > > > > that's > > > > > why > > > > > there's such backwards compatibility support there. That > > > > > name only > > > > > exists > > > > > on a few architectures. > > > > > > > > > > If people really want to compile code using the old > > > > > __float128 names > > > > > for > > > > > LoongArch I suppose you could have such #defines, but it > > > > > would be > > > > > better > > > > > for people to make their code use the standard names (as > > > > > supported > > > > > from > > > > > GCC 7 onwards, though only from GCC 13 in C++) and then put > > > > > backwards > > > > > compatibility in their code for using the __float128 names if > > > > > they > > > > > want to > > > > > support the type with older GCC (GCC 6 or before for C; GCC > > > > > 12 or > > > > > before > > > > > for C++) on x86_64 / i386 / powerpc / ia64. Such backwards > > > > > compatibility > > > > > in user code is more likely to be relevant for C++ than for > > > > > C, given > > > > > how > > > > > the C++ support was added to GCC much more recently. (Note: > > > > > I > > > > > haven't > > > > > checked when other compilers added support for the _Float128 > > > > > name or > > > > > associated built-in functions, whether for C or for C++, > > > > > which might > > > > > also > > > > > affect when user code wants such compatibility.) > > > > > > > > > Thank you for your valuable comments. On the LoongArch > > > > architecture, > > > > the "__float128" type is associated with float128_type_node and > > > > the "q" > > > > suffix function is mapped to the "f128" function. This allows > > > > compatibility with both "__float128" and "_Float128" types in > > > > the GCC > > > > compiler. The new code is modified as follows: > > > > Add the following to the loongarch-builtins.c file: > > > > +lang_hooks.types.register_builtin_type (float128_type_node, > > > > "__float128"); > > > > Add the following to the loongarch-c.c file: > > > > +builtin_define ("__builtin_fabsq=__builtin_fabsf128"); > > > > +builtin_define ("__builtin_copysignq=__builtin_copysignf128"); > > > > +builtin_define ("__builtin_nanq=__builtin_nanf128"); > > > > +builtin_define ("__builtin_nansq=__builtin_nansf128"); > > > > +builtin_define ("__builtin_infq=__builtin_inff128"); > > > > +builtin_define ("__builtin_huge_valq=__builtin_huge_valf128"); > > > > > > > > The regression tests of the six functions were added without > > > > problems. > > > > However, the implementation of the __builtin_nansq() function > > > > does not > > > > get the result we want. The questions are as follows: > > > > x86_64: > > > > _Float128 ret=__builtin_nansf128("NAN"); > > > > > > > > compiled to (with gcc test.c -O2 ): > > > > .cfi_offset 1, -8 > > > > bl %plt(__builtin_nansf128) > > > > .. > > > > LoongArch: > > > > _Float128 ret=__builtin_nansf128("NAN"); > > > > compiled to (with gcc test.c -O2 ): > > > > .cfi_offset 1, -8 > > > > bl %plt(__builtin_nansf128) > > > > > > It seems wrong. It should be "bl %plt(nansf128)" instead, > > > without the > > > __builtin_ prefix so the implementation in libm (from Glibc) will > > > be > > > used instead. AFAIK __builtin_nan and __builtin_nans are rarely > > > called > > > with a non-empty tagp so it's not worthy to inline the > > > implementation > > > for non-empty tagp here. > > > > > > The same issue happens on x86_64: > > > > > > call __builtin_nansf128@PLT > > > > > > __builtin_nanf128 compiles correct: > > > > > > call nanf128@PLT > > > > > > I'll see if there is a ticket in https://gcc.gnu.org/bugzilla. > > > If not > > > I'll create one. > > https://gcc.gnu.org/PR111058 > > > Alright, Glibc does not have a "nansf128" function yet. Actually > > there > > is even no "nans" function for the plain double type. So even a > > plain > > __builtin_nans("114") won't work too. > > > > If we'll fix this, we need to do it in a generic, target- > > independent way > > (i. e. fix it all at once for all targets). > > > > So for now, and for LoongArch specific code, the proper thing to do > > is > > aliasing float128_type_node as __float128 and the six > > __builtin_define's. > > > > Please commit them to trunk if regression test passes. You need to > > also > > add LoongArch as a target supporting __float128 in extend.texi.
Ok, I will properly analyze the implementation of the buildin relatedfunctions and fix this issue as soon as possible.