From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 0EB973858429 for ; Thu, 10 Mar 2022 09:35:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0EB973858429 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-402-YwtuwntsOh-sYZVbUoGDZg-1; Thu, 10 Mar 2022 04:35:43 -0500 X-MC-Unique: YwtuwntsOh-sYZVbUoGDZg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 64FBB8145F6; Thu, 10 Mar 2022 09:35:42 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.81]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BDB9B72191; Thu, 10 Mar 2022 09:35:40 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 22A9ZbKc843409 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 10 Mar 2022 10:35:37 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 22A9ZalY843408; Thu, 10 Mar 2022 10:35:36 +0100 Date: Thu, 10 Mar 2022 10:35:36 +0100 From: Jakub Jelinek To: Segher Boessenkool Cc: Michael Meissner , Jonathan Wakely , gcc-patches@gcc.gnu.org, David Edelsohn Subject: Re: [PATCH] rs6000, v3: Fix up __SIZEOF_{FLOAT, IBM}128__ defines [PR99708] Message-ID: Reply-To: Jakub Jelinek References: <20220307213718.GL614@gate.crashing.org> <20220309183406.GS614@gate.crashing.org> <20220309205720.GT614@gate.crashing.org> <20220309225701.GU614@gate.crashing.org> MIME-Version: 1.0 In-Reply-To: <20220309225701.GU614@gate.crashing.org> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Mar 2022 09:35:49 -0000 On Wed, Mar 09, 2022 at 04:57:01PM -0600, Segher Boessenkool wrote: > > > If you are fed up with all this, please commit what you have now (after > > > testing of course ;-) ), and I'll pick up things myself. Either way, > > > thank you for all your work on this! > > > > Ok, here is what I'll test momentarily: > > Thanks again! Unfortunately, while regtesting on powerpc64le-linux went fine (except for l += 2.0; in the last testcase should have been h += 2.0; already fixed in my copy), on powerpc64-linux it regressed (both -m32 and -m64) following testcase: +FAIL: gcc.target/powerpc/convert-fp-128.c (test for excess errors) +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendddtd2\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendddtf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extenddfdd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extenddftd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsddd2\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsddf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsdtd2\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsdtf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsfdd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsfsd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendsftd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_extendtftd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_truncdddf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_truncddsd2\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_truncddsf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_truncdfsd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_truncsdsf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctddd2\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctddf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctdsd2\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctdsf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctdtf\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctfdd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl __dpd_trunctfsd\\\\M 1 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mbl\\\\M 24 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mfmr\\\\M 0 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mfrsp|xsrsp\\\\M 2 +UNRESOLVED: gcc.target/powerpc/convert-fp-128.c scan-assembler-times \\\\mlfd\\\\M 2 The problem is that previously on the pre-VSX -mcpu= where we support only TFmode being double double we accepted both: typedef float __attribute__((mode(IF))) mode_if; typedef float __attribute__((mode(KF))) mode_kf; in the testcase. handle_mode_attribute calls /* Allow the target a chance to translate MODE into something supported. See PR86324. */ mode = targetm.translate_mode_attribute (mode); and the rs6000 hook for it looks like: /* Target hook for translate_mode_attribute. */ static machine_mode rs6000_translate_mode_attribute (machine_mode mode) { if ((FLOAT128_IEEE_P (mode) && ieee128_float_type_node == long_double_type_node) || (FLOAT128_IBM_P (mode) && ibm128_float_type_node == long_double_type_node)) return COMPLEX_MODE_P (mode) ? E_TCmode : E_TFmode; return mode; } With the v3 patch, ibm128_float_type_node == long_double_type_node in that case and IF -> TF translation looks correct to me, under the hood it will do the same thing. But the fact that it accepted KFmode before and silently handled it like TFmode, where KFmode should be IEEE quad, while TFmode in this case is double double looks like a bug to me. So, I think we just need to adjust the testcase. As mode_kf is only used #ifdef __FLOAT128_TYPE__, I've guarded its definition with that condition too. Thus, here is what I've committed in the end. Note, really unsure about backports, this patch is quite large and changes behavior here and there. Probably easiest would be just to revert those __SIZEOF_*128__ rs6000 change on release branches? Or backport a strictly __SIZEOF_*128__ related change (such as use TARGET_FLOAT128_TYPE as the condition on whether to predefine those macros or not together with moving __SIZEOF_FLOAT128__ to the other function next to __float128)? 2022-03-10 Jakub Jelinek PR target/99708 * config/rs6000/rs6000.h (enum rs6000_builtin_type_index): Remove RS6000_BTI_ptr_ieee128_float and RS6000_BTI_ptr_ibm128_float. (ptr_ieee128_float_type_node, ptr_ibm128_float_type_node): Remove. * config/rs6000/rs6000-builtin.cc (rs6000_type_string): Return "**NULL**" if type_node is NULL first. Handle ieee128_float_type_node. (rs6000_init_builtins): Don't initialize ptr_ieee128_float_type_node and ptr_ibm128_float_type_node. Set ibm128_float_type_node and ieee128_float_type_node to NULL rather than long_double_type_node if they aren't supported. Do support __ibm128 even if !TARGET_FLOAT128_TYPE when long double is double double. (rs6000_expand_builtin): Error if bif_is_ibm128 and !ibm128_float_type_node. Remap RS6000_BIF_{,UN}PACK_IF to RS6000_BIF_{,UN}PACK_TF much earlier and only use bif_is_ibm128 check for it. * config/rs6000/rs6000-c.cc (rs6000_target_modify_macros): Define __SIZEOF_FLOAT128__ here and only iff __float128 macro is defined. (rs6000_cpu_cpp_builtins): Don't define __SIZEOF_FLOAT128__ here. Define __SIZEOF_IBM128__=16 if ieee128_float_type_node is non-NULL. Formatting fix. * config/rs6000/rs6000-gen-builtins.cc: Document ibm128 attribute. (struct attrinfo): Add isibm128 member. (TYPE_MAP_SIZE): Remove. (type_map): Use [] instead of [TYPE_MAP_SIZE]. For "if" use ibm128_float_type_node only if it is non-NULL, otherwise fall back to long_double_type_node. Remove "pif" entry. (parse_bif_attrs): Handle ibm128 attribute and print it for debugging. (write_decls): Output bif_ibm128_bit and bif_is_ibm128. (write_type_node): Use sizeof type_map / sizeof type_map[0] instead of TYPE_MAP_SIZE. (write_bif_static_init): Handle isibm128. * config/rs6000/rs6000-builtins.def: Document ibm128 attribute. (__builtin_pack_ibm128, __builtin_unpack_ibm128): Add ibm128 attribute. * gcc.dg/pr99708.c: New test. * gcc.target/powerpc/pr99708-2.c: New test. * gcc.target/powerpc/convert-fp-128.c (mode_kf): Define only if __FLOAT128_TYPE__ is defined. --- gcc/config/rs6000/rs6000.h.jj 2022-03-09 15:24:50.647017881 +0100 +++ gcc/config/rs6000/rs6000.h 2022-03-09 19:55:31.879255798 +0100 @@ -2444,8 +2444,6 @@ enum rs6000_builtin_type_index RS6000_BTI_ptr_long_double, RS6000_BTI_ptr_dfloat64, RS6000_BTI_ptr_dfloat128, - RS6000_BTI_ptr_ieee128_float, - RS6000_BTI_ptr_ibm128_float, RS6000_BTI_ptr_vector_pair, RS6000_BTI_ptr_vector_quad, RS6000_BTI_ptr_long_long, @@ -2541,8 +2539,6 @@ enum rs6000_builtin_type_index #define ptr_long_double_type_node (rs6000_builtin_types[RS6000_BTI_ptr_long_double]) #define ptr_dfloat64_type_node (rs6000_builtin_types[RS6000_BTI_ptr_dfloat64]) #define ptr_dfloat128_type_node (rs6000_builtin_types[RS6000_BTI_ptr_dfloat128]) -#define ptr_ieee128_float_type_node (rs6000_builtin_types[RS6000_BTI_ptr_ieee128_float]) -#define ptr_ibm128_float_type_node (rs6000_builtin_types[RS6000_BTI_ptr_ibm128_float]) #define ptr_vector_pair_type_node (rs6000_builtin_types[RS6000_BTI_ptr_vector_pair]) #define ptr_vector_quad_type_node (rs6000_builtin_types[RS6000_BTI_ptr_vector_quad]) #define ptr_long_long_integer_type_node (rs6000_builtin_types[RS6000_BTI_ptr_long_long]) --- gcc/config/rs6000/rs6000-builtin.cc.jj 2022-03-09 15:24:50.642017950 +0100 +++ gcc/config/rs6000/rs6000-builtin.cc 2022-03-09 20:10:53.778612345 +0100 @@ -402,7 +402,9 @@ rs6000_vector_type (const char *name, tr static const char *rs6000_type_string (tree type_node) { - if (type_node == void_type_node) + if (type_node == NULL_TREE) + return "**NULL**"; + else if (type_node == void_type_node) return "void"; else if (type_node == long_integer_type_node) return "long"; @@ -432,6 +434,8 @@ const char *rs6000_type_string (tree typ return "ss"; else if (type_node == ibm128_float_type_node) return "__ibm128"; + else if (type_node == ieee128_float_type_node) + return "__ieee128"; else if (type_node == opaque_V4SI_type_node) return "opaque"; else if (POINTER_TYPE_P (type_node)) @@ -709,9 +713,9 @@ rs6000_init_builtins (void) For IEEE 128-bit floating point, always create the type __ieee128. If the user used -mfloat128, rs6000-c.cc will create a define from __float128 to __ieee128. */ - if (TARGET_FLOAT128_TYPE) + if (TARGET_LONG_DOUBLE_128 && (!TARGET_IEEEQUAD || TARGET_FLOAT128_TYPE)) { - if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128) + if (!TARGET_IEEEQUAD) ibm128_float_type_node = long_double_type_node; else { @@ -721,22 +725,24 @@ rs6000_init_builtins (void) layout_type (ibm128_float_type_node); } t = build_qualified_type (ibm128_float_type_node, TYPE_QUAL_CONST); - ptr_ibm128_float_type_node = build_pointer_type (t); lang_hooks.types.register_builtin_type (ibm128_float_type_node, "__ibm128"); + } + else + ibm128_float_type_node = NULL_TREE; + if (TARGET_FLOAT128_TYPE) + { if (TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128) ieee128_float_type_node = long_double_type_node; else ieee128_float_type_node = float128_type_node; t = build_qualified_type (ieee128_float_type_node, TYPE_QUAL_CONST); - ptr_ieee128_float_type_node = build_pointer_type (t); lang_hooks.types.register_builtin_type (ieee128_float_type_node, "__ieee128"); } - else - ieee128_float_type_node = ibm128_float_type_node = long_double_type_node; + ieee128_float_type_node = NULL_TREE; /* Vector pair and vector quad support. */ vector_pair_type_node = make_node (OPAQUE_TYPE); @@ -3418,6 +3424,13 @@ rs6000_expand_builtin (tree exp, rtx tar return const0_rtx; } + if (bif_is_ibm128 (*bifaddr) && !ibm128_float_type_node) + { + error ("%qs requires %<__ibm128%> type support", + bifaddr->bifname); + return const0_rtx; + } + if (bif_is_cpu (*bifaddr)) return cpu_expand_builtin (fcode, exp, target); @@ -3498,6 +3511,21 @@ rs6000_expand_builtin (tree exp, rtx tar gcc_unreachable (); } + if (bif_is_ibm128 (*bifaddr) && TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD) + { + if (fcode == RS6000_BIF_PACK_IF) + { + icode = CODE_FOR_packtf; + fcode = RS6000_BIF_PACK_TF; + uns_fcode = (size_t) fcode; + } + else if (fcode == RS6000_BIF_UNPACK_IF) + { + icode = CODE_FOR_unpacktf; + fcode = RS6000_BIF_UNPACK_TF; + uns_fcode = (size_t) fcode; + } + } /* TRUE iff the built-in function returns void. */ bool void_func = TREE_TYPE (TREE_TYPE (fndecl)) == void_type_node; @@ -3642,23 +3670,6 @@ rs6000_expand_builtin (tree exp, rtx tar if (bif_is_mma (*bifaddr)) return mma_expand_builtin (exp, target, icode, fcode); - if (fcode == RS6000_BIF_PACK_IF - && TARGET_LONG_DOUBLE_128 - && !TARGET_IEEEQUAD) - { - icode = CODE_FOR_packtf; - fcode = RS6000_BIF_PACK_TF; - uns_fcode = (size_t) fcode; - } - else if (fcode == RS6000_BIF_UNPACK_IF - && TARGET_LONG_DOUBLE_128 - && !TARGET_IEEEQUAD) - { - icode = CODE_FOR_unpacktf; - fcode = RS6000_BIF_UNPACK_TF; - uns_fcode = (size_t) fcode; - } - if (TREE_TYPE (TREE_TYPE (fndecl)) == void_type_node) target = NULL_RTX; else if (target == 0 --- gcc/config/rs6000/rs6000-c.cc.jj 2022-03-09 15:24:50.643017937 +0100 +++ gcc/config/rs6000/rs6000-c.cc 2022-03-09 19:55:31.880255784 +0100 @@ -584,6 +584,10 @@ rs6000_target_modify_macros (bool define rs6000_define_or_undefine_macro (true, "__float128=__ieee128"); else rs6000_define_or_undefine_macro (false, "__float128"); + if (ieee128_float_type_node && define_p) + rs6000_define_or_undefine_macro (true, "__SIZEOF_FLOAT128__=16"); + else + rs6000_define_or_undefine_macro (false, "__SIZEOF_FLOAT128__"); } /* OPTION_MASK_FLOAT128_HARDWARE can be turned on if -mcpu=power9 is used or via the target attribute/pragma. */ @@ -623,11 +627,11 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfi if (TARGET_FRSQRTES) builtin_define ("__RSQRTEF__"); if (TARGET_FLOAT128_TYPE) - builtin_define ("__FLOAT128_TYPE__"); + builtin_define ("__FLOAT128_TYPE__"); if (ibm128_float_type_node) builtin_define ("__SIZEOF_IBM128__=16"); if (ieee128_float_type_node) - builtin_define ("__SIZEOF_FLOAT128__=16"); + builtin_define ("__SIZEOF_IEEE128__=16"); #ifdef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB builtin_define ("__BUILTIN_CPU_SUPPORTS__"); #endif --- gcc/config/rs6000/rs6000-gen-builtins.cc.jj 2022-03-09 15:24:50.644017923 +0100 +++ gcc/config/rs6000/rs6000-gen-builtins.cc 2022-03-09 19:55:31.880255784 +0100 @@ -93,6 +93,8 @@ along with GCC; see the file COPYING3. lxvrze Needs special handling for load-rightmost, zero-extended endian Needs special handling for endianness ibmld Restrict usage to the case when TFmode is IBM-128 + ibm128 Restrict usage to the case where __ibm128 is supported or + if ibmld An example stanza might look like this: @@ -392,6 +394,7 @@ struct attrinfo bool islxvrze; bool isendian; bool isibmld; + bool isibm128; }; /* Fields associated with a function prototype (bif or overload). */ @@ -492,8 +495,7 @@ struct typemap maps tokens from a fntype string to a tree type. For example, in "si_ftype_hi" we would map "si" to "intSI_type_node" and map "hi" to "intHI_type_node". */ -#define TYPE_MAP_SIZE 86 -static typemap type_map[TYPE_MAP_SIZE] = +static typemap type_map[] = { { "bi", "bool_int" }, { "bv16qi", "bool_V16QI" }, @@ -506,7 +508,9 @@ static typemap type_map[TYPE_MAP_SIZE] = { "df", "double" }, { "di", "long_long_integer" }, { "hi", "intHI" }, - { "if", "ibm128_float" }, + { "if", "ibm128_float_type_node " + "? ibm128_float_type_node " + ": long_double" }, { "ld", "long_double" }, { "lg", "long_integer" }, { "pbv16qi", "ptr_bool_V16QI" }, @@ -519,7 +523,6 @@ static typemap type_map[TYPE_MAP_SIZE] = { "pdf", "ptr_double" }, { "pdi", "ptr_long_long_integer" }, { "phi", "ptr_intHI" }, - { "pif", "ptr_ibm128_float" }, { "pld", "ptr_long_double" }, { "plg", "ptr_long_integer" }, { "pqi", "ptr_intQI" }, @@ -1439,6 +1442,8 @@ parse_bif_attrs (attrinfo *attrptr) attrptr->isendian = 1; else if (!strcmp (attrname, "ibmld")) attrptr->isibmld = 1; + else if (!strcmp (attrname, "ibm128")) + attrptr->isibm128 = 1; else { diag (oldpos, "unknown attribute.\n"); @@ -1472,14 +1477,15 @@ parse_bif_attrs (attrinfo *attrptr) "ldvec = %d, stvec = %d, reve = %d, pred = %d, htm = %d, " "htmspr = %d, htmcr = %d, mma = %d, quad = %d, pair = %d, " "mmaint = %d, no32bit = %d, 32bit = %d, cpu = %d, ldstmask = %d, " - "lxvrse = %d, lxvrze = %d, endian = %d, ibmdld= %d.\n", + "lxvrse = %d, lxvrze = %d, endian = %d, ibmdld = %d, ibm128 = %d.\n", attrptr->isinit, attrptr->isset, attrptr->isextract, attrptr->isnosoft, attrptr->isldvec, attrptr->isstvec, attrptr->isreve, attrptr->ispred, attrptr->ishtm, attrptr->ishtmspr, attrptr->ishtmcr, attrptr->ismma, attrptr->isquad, attrptr->ispair, attrptr->ismmaint, attrptr->isno32bit, attrptr->is32bit, attrptr->iscpu, attrptr->isldstmask, attrptr->islxvrse, - attrptr->islxvrze, attrptr->isendian, attrptr->isibmld); + attrptr->islxvrze, attrptr->isendian, attrptr->isibmld, + attrptr->isibm128); #endif return PC_OK; @@ -2294,6 +2300,7 @@ write_decls (void) fprintf (header_file, "#define bif_lxvrze_bit\t\t(0x00100000)\n"); fprintf (header_file, "#define bif_endian_bit\t\t(0x00200000)\n"); fprintf (header_file, "#define bif_ibmld_bit\t\t(0x00400000)\n"); + fprintf (header_file, "#define bif_ibm128_bit\t\t(0x00800000)\n"); fprintf (header_file, "\n"); fprintf (header_file, "#define bif_is_init(x)\t\t((x).bifattrs & bif_init_bit)\n"); @@ -2341,6 +2348,8 @@ write_decls (void) "#define bif_is_endian(x)\t((x).bifattrs & bif_endian_bit)\n"); fprintf (header_file, "#define bif_is_ibmld(x)\t((x).bifattrs & bif_ibmld_bit)\n"); + fprintf (header_file, + "#define bif_is_ibm128(x)\t((x).bifattrs & bif_ibm128_bit)\n"); fprintf (header_file, "\n"); fprintf (header_file, @@ -2385,8 +2394,10 @@ write_type_node (char *tok, bool indent) { if (indent) fprintf (init_file, " "); - typemap *entry = (typemap *) bsearch (tok, type_map, TYPE_MAP_SIZE, - sizeof (typemap), typemap_cmp); + typemap *entry + = (typemap *) bsearch (tok, type_map, + sizeof type_map / sizeof type_map[0], + sizeof (typemap), typemap_cmp); if (!entry) fatal ("Type map is inconsistent."); fprintf (init_file, "%s_type_node", entry->value); @@ -2535,6 +2546,8 @@ write_bif_static_init (void) fprintf (init_file, " | bif_endian_bit"); if (bifp->attrs.isibmld) fprintf (init_file, " | bif_ibmld_bit"); + if (bifp->attrs.isibm128) + fprintf (init_file, " | bif_ibm128_bit"); fprintf (init_file, ",\n"); fprintf (init_file, " /* restr_opnd */\t{%d, %d, %d},\n", bifp->proto.restr_opnd[0], bifp->proto.restr_opnd[1], --- gcc/config/rs6000/rs6000-builtins.def.jj 2022-03-09 15:24:50.643017937 +0100 +++ gcc/config/rs6000/rs6000-builtins.def 2022-03-09 19:55:31.880255784 +0100 @@ -138,6 +138,7 @@ ; lxvrze Needs special handling for load-rightmost, zero-extended ; endian Needs special handling for endianness ; ibmld Restrict usage to the case when TFmode is IBM-128 +; ibm128 Restrict usage to the case where __ibm128 is supported or if ibmld ; ; Each attribute corresponds to extra processing required when ; the built-in is expanded. All such special processing should @@ -234,13 +235,13 @@ MTFSF rs6000_mtfsf {} const __ibm128 __builtin_pack_ibm128 (double, double); - PACK_IF packif {} + PACK_IF packif {ibm128} void __builtin_set_fpscr_rn (const int[0,3]); SET_FPSCR_RN rs6000_set_fpscr_rn {} const double __builtin_unpack_ibm128 (__ibm128, const int<1>); - UNPACK_IF unpackif {} + UNPACK_IF unpackif {ibm128} ; This is redundant with __builtin_unpack_ibm128, as it requires long ; double to be __ibm128. Should probably be deprecated. --- gcc/testsuite/gcc.dg/pr99708.c.jj 2022-03-09 19:55:31.880255784 +0100 +++ gcc/testsuite/gcc.dg/pr99708.c 2022-03-09 19:55:31.880255784 +0100 @@ -0,0 +1,7 @@ +/* PR target/99708 */ +/* { dg-do compile } */ + +#ifdef __SIZEOF_FLOAT128__ +__float128 f = 1.0; +#endif +long double l = 1.0; --- gcc/testsuite/gcc.target/powerpc/pr99708-2.c.jj 2022-03-09 19:55:31.881255770 +0100 +++ gcc/testsuite/gcc.target/powerpc/pr99708-2.c 2022-03-09 19:55:31.880255784 +0100 @@ -0,0 +1,22 @@ +/* PR target/99708 */ +/* { dg-do compile } */ + +#ifdef __SIZEOF_IBM128__ +__ibm128 f = 1.0; +#endif +#ifdef __SIZEOF_IEEE128__ +__ieee128 g = 1.0; +#endif +long double h = 1.0; + +void +foo (void) +{ +#ifdef __SIZEOF_IBM128__ + f += 2.0; +#endif +#ifdef __SIZEOF_IEEE128__ + g += 2.0; +#endif + h += 2.0; +} --- gcc/testsuite/gcc.target/powerpc/convert-fp-128.c.jj 2020-07-28 15:39:10.048755678 +0200 +++ gcc/testsuite/gcc.target/powerpc/convert-fp-128.c 2022-03-10 10:14:50.681047411 +0100 @@ -7,7 +7,9 @@ #define mode_sf float #define mode_df double typedef float __attribute__((mode(IF))) mode_if; +#ifdef __FLOAT128_TYPE__ typedef float __attribute__((mode(KF))) mode_kf; +#endif #define mode_sd _Decimal32 #define mode_dd _Decimal64 #define mode_td _Decimal128 Jakub