在 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) .. Obviously, there may have been legacy issues with the implementation when "_Float128 __builtin_nansf128()" was first supported. Architectures including LoongArch, x86_64, arm, etc. are no longer supported, and some of the remaining architectures are unproven. I will continue to follow up the implementation of the builtin function and complete the function.