On Thu, Apr 07, 2022 at 06:09:52AM -0500, Segher Boessenkool wrote: > Hi! > > On Thu, Mar 03, 2022 at 10:11:32AM +0800, Kewen.Lin wrote: > > As PR103623 shows, it's a regression failure due to new built-in > > function framework, previously we guard __builtin_{un,}pack_{longdouble, > > ibm128} built-in functions under hard float, so they are unavailable > > with the given configuration. While with new bif infrastructure, it > > becomes available and gets ICE due to incomplete supports. > > > > Segher and Peter pointed out that we should make them available with > > soft float, I agree we can extend them to cover both soft and hard > > float. But considering it's stage 4 now and this regression is > > classified as P1, also the previous behavior requiring hard float > > aligns with what document [1] says, I guess it may be a good idea to > > fix it with the attached small patch to be consistent with the previous > > behavior. Then we can extend the functionality in upcoming stage 1. > > Or you could just not take away the existing functionality.
Have those builtins ever worked with 64-bit soft-float? When I try e.g. gcc 11 on the #c0 testcase from the PR, I get: ./cc1.r11-1 -quiet -nostdinc pr103623.c -m64 -mlong-double-128 -msoft-float pr103623.c: In function ‘main’: pr103623.c:2:16: error: ‘__builtin_unpack_longdouble’ requires the ‘-mhard-float’ option 2 | #define UNPACK __builtin_unpack_longdouble | ^ pr103623.c:11:15: note: in expansion of macro ‘UNPACK’ 11 | double x0 = UNPACK (a, 0); | ^~~~~~ >From what I can see, those builtins were using: /* 128-bit long double floating point builtins. */ #define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE) \ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ "__builtin_" NAME, /* NAME */ \ (RS6000_BTM_HARD_FLOAT /* MASK */ \ | RS6000_BTM_LDBL128), \ (RS6000_BTC_ ## ATTR /* ATTR */ \ | RS6000_BTC_BINARY), \ CODE_FOR_ ## ICODE) /* ICODE */ /* 128-bit __ibm128 floating point builtins (use -mfloat128 to indicate that __ibm128 is available). */ #define BU_IBM128_2(ENUM, NAME, ATTR, ICODE) \ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ "__builtin_" NAME, /* NAME */ \ (RS6000_BTM_HARD_FLOAT /* MASK */ \ | RS6000_BTM_FLOAT128), \ (RS6000_BTC_ ## ATTR /* ATTR */ \ | RS6000_BTC_BINARY), \ CODE_FOR_ ## ICODE) /* ICODE */ macros and rs6000_builtin_is_supported_p was checking whether all the bits in the mask are set: HOST_WIDE_INT fnmask = rs6000_builtin_info[fncode].mask; if ((fnmask & rs6000_builtin_mask) != fnmask) return false; else return true; (so logical and of all of them). Jakub