From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 78074396AC17 for ; Thu, 17 Jun 2021 15:21:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 78074396AC17 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 15HF4hHU001753; Thu, 17 Jun 2021 11:21:37 -0400 Received: from ppma04wdc.us.ibm.com (1a.90.2fa9.ip4.static.sl-reverse.com [169.47.144.26]) by mx0b-001b2d01.pphosted.com with ESMTP id 3984hxj04v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 17 Jun 2021 11:21:37 -0400 Received: from pps.filterd (ppma04wdc.us.ibm.com [127.0.0.1]) by ppma04wdc.us.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 15HFAnAA004021; Thu, 17 Jun 2021 15:21:36 GMT Received: from b03cxnp07027.gho.boulder.ibm.com (b03cxnp07027.gho.boulder.ibm.com [9.17.130.14]) by ppma04wdc.us.ibm.com with ESMTP id 394mja20va-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 17 Jun 2021 15:21:36 +0000 Received: from b03ledav001.gho.boulder.ibm.com (b03ledav001.gho.boulder.ibm.com [9.17.130.232]) by b03cxnp07027.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 15HFLZiF30409060 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 17 Jun 2021 15:21:35 GMT Received: from b03ledav001.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 93C626E059; Thu, 17 Jun 2021 15:21:35 +0000 (GMT) Received: from b03ledav001.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 738586E058; Thu, 17 Jun 2021 15:21:35 +0000 (GMT) Received: from localhost (unknown [9.40.194.84]) by b03ledav001.gho.boulder.ibm.com (Postfix) with ESMTP; Thu, 17 Jun 2021 15:21:35 +0000 (GMT) From: Bill Schmidt To: gcc-patches@gcc.gnu.org Cc: segher@kernel.crashing.org Subject: [PATCH 17/55] rs6000: Write output to the builtins header file Date: Thu, 17 Jun 2021 10:19:01 -0500 Message-Id: <07dd852cc22dabe081dfa55d16343664be440ace.1623941441.git.wschmidt@linux.ibm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: _exJJQNxEILTn-KyVXXOxHKb1MM28sgu X-Proofpoint-GUID: _exJJQNxEILTn-KyVXXOxHKb1MM28sgu X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391, 18.0.790 definitions=2021-06-17_13:2021-06-15, 2021-06-17 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 mlxlogscore=999 bulkscore=0 adultscore=0 impostorscore=0 clxscore=1015 mlxscore=0 lowpriorityscore=0 spamscore=0 malwarescore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2106170096 X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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, 17 Jun 2021 15:21:39 -0000 2021-06-07 Bill Schmidt gcc/ * config/rs6000/rs6000-gen-builtins.c (write_autogenerated_header): New function. (write_decls): Likewise. (write_extern_fntype): New callback function. (write_header_file): Implement. --- gcc/config/rs6000/rs6000-gen-builtins.c | 227 ++++++++++++++++++++++++ 1 file changed, 227 insertions(+) diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c index 18922d829ff..6f393ee46d3 100644 --- a/gcc/config/rs6000/rs6000-gen-builtins.c +++ b/gcc/config/rs6000/rs6000-gen-builtins.c @@ -1988,10 +1988,237 @@ parse_ovld (void) return result; } +/* Write a comment at the top of FILE about how the code was generated. */ +static void +write_autogenerated_header (FILE *file) +{ + fprintf (file, "/* Automatically generated by the program '%s'\n", + pgm_path); + fprintf (file, " from the files '%s' and '%s'. */\n\n", + bif_path, ovld_path); +} + +/* Write declarations into the header file. */ +static void +write_decls (void) +{ + fprintf (header_file, "enum rs6000_gen_builtins\n{\n RS6000_BIF_NONE,\n"); + for (int i = 0; i <= curr_bif; i++) + fprintf (header_file, " RS6000_BIF_%s,\n", bifs[bif_order[i]].idname); + fprintf (header_file, " RS6000_BIF_MAX,\n"); + fprintf (header_file, " RS6000_OVLD_NONE,\n"); + for (int i = 0; i < num_ovld_stanzas; i++) + fprintf (header_file, " RS6000_OVLD_%s,\n", ovld_stanzas[i].stanza_id); + fprintf (header_file, " RS6000_OVLD_MAX\n};\n\n"); + + fprintf (header_file, + "extern GTY(()) tree rs6000_builtin_decls_x[RS6000_OVLD_MAX];\n\n"); + + fprintf (header_file, + "enum rs6000_ovld_instances\n{\n RS6000_INST_NONE,\n"); + for (int i = 0; i <= curr_ovld; i++) + fprintf (header_file, " RS6000_INST_%s,\n", ovlds[i].ovld_id_name); + fprintf (header_file, " RS6000_INST_MAX\n};\n\n"); + + fprintf (header_file, "#define MAX_OVLD_ARGS %d\n", max_ovld_args); + + fprintf (header_file, "enum restriction {\n"); + fprintf (header_file, " RES_NONE,\n"); + fprintf (header_file, " RES_BITS,\n"); + fprintf (header_file, " RES_RANGE,\n"); + fprintf (header_file, " RES_VAR_RANGE,\n"); + fprintf (header_file, " RES_VALUES\n"); + fprintf (header_file, "};\n\n"); + + fprintf (header_file, "enum bif_enable {\n"); + fprintf (header_file, " ENB_ALWAYS,\n"); + fprintf (header_file, " ENB_P5,\n"); + fprintf (header_file, " ENB_P6,\n"); + fprintf (header_file, " ENB_ALTIVEC,\n"); + fprintf (header_file, " ENB_CELL,\n"); + fprintf (header_file, " ENB_VSX,\n"); + fprintf (header_file, " ENB_P7,\n"); + fprintf (header_file, " ENB_P7_64,\n"); + fprintf (header_file, " ENB_P8,\n"); + fprintf (header_file, " ENB_P8V,\n"); + fprintf (header_file, " ENB_P9,\n"); + fprintf (header_file, " ENB_P9_64,\n"); + fprintf (header_file, " ENB_P9V,\n"); + fprintf (header_file, " ENB_IEEE128_HW,\n"); + fprintf (header_file, " ENB_DFP,\n"); + fprintf (header_file, " ENB_CRYPTO,\n"); + fprintf (header_file, " ENB_HTM,\n"); + fprintf (header_file, " ENB_P10,\n"); + fprintf (header_file, " ENB_P10_64,\n"); + fprintf (header_file, " ENB_MMA\n"); + fprintf (header_file, "};\n\n"); + + fprintf (header_file, "#define PPC_MAXRESTROPNDS 3\n"); + fprintf (header_file, "struct GTY((user)) bifdata\n"); + fprintf (header_file, "{\n"); + fprintf (header_file, " const char *bifname;\n"); + fprintf (header_file, " bif_enable enable;\n"); + fprintf (header_file, " tree fntype;\n"); + fprintf (header_file, " insn_code icode;\n"); + fprintf (header_file, " int nargs;\n"); + fprintf (header_file, " int bifattrs;\n"); + fprintf (header_file, " int restr_opnd[PPC_MAXRESTROPNDS];\n"); + fprintf (header_file, " restriction restr[PPC_MAXRESTROPNDS];\n"); + fprintf (header_file, " int restr_val1[PPC_MAXRESTROPNDS];\n"); + fprintf (header_file, " int restr_val2[PPC_MAXRESTROPNDS];\n"); + fprintf (header_file, " const char *attr_string;\n"); + fprintf (header_file, " rs6000_gen_builtins assoc_bif;\n"); + fprintf (header_file, "};\n\n"); + + fprintf (header_file, "#define bif_init_bit\t\t(0x00000001)\n"); + fprintf (header_file, "#define bif_set_bit\t\t(0x00000002)\n"); + fprintf (header_file, "#define bif_extract_bit\t\t(0x00000004)\n"); + fprintf (header_file, "#define bif_nosoft_bit\t\t(0x00000008)\n"); + fprintf (header_file, "#define bif_ldvec_bit\t\t(0x00000010)\n"); + fprintf (header_file, "#define bif_stvec_bit\t\t(0x00000020)\n"); + fprintf (header_file, "#define bif_reve_bit\t\t(0x00000040)\n"); + fprintf (header_file, "#define bif_pred_bit\t\t(0x00000080)\n"); + fprintf (header_file, "#define bif_htm_bit\t\t(0x00000100)\n"); + fprintf (header_file, "#define bif_htmspr_bit\t\t(0x00000200)\n"); + fprintf (header_file, "#define bif_htmcr_bit\t\t(0x00000400)\n"); + fprintf (header_file, "#define bif_mma_bit\t\t(0x00000800)\n"); + fprintf (header_file, "#define bif_quad_bit\t\t(0x00001000)\n"); + fprintf (header_file, "#define bif_pair_bit\t\t(0x00002000)\n"); + fprintf (header_file, "#define bif_no32bit_bit\t\t(0x00004000)\n"); + fprintf (header_file, "#define bif_32bit_bit\t\t(0x00008000)\n"); + fprintf (header_file, "#define bif_cpu_bit\t\t(0x00010000)\n"); + fprintf (header_file, "#define bif_ldstmask_bit\t(0x00020000)\n"); + fprintf (header_file, "#define bif_lxvrse_bit\t\t(0x00040000)\n"); + fprintf (header_file, "#define bif_lxvrze_bit\t\t(0x00080000)\n"); + fprintf (header_file, "#define bif_endian_bit\t\t(0x00100000)\n"); + fprintf (header_file, "\n"); + fprintf (header_file, + "#define bif_is_init(x)\t\t((x).bifattrs & bif_init_bit)\n"); + fprintf (header_file, + "#define bif_is_set(x)\t\t((x).bifattrs & bif_set_bit)\n"); + fprintf (header_file, + "#define bif_is_extract(x)\t((x).bifattrs & bif_extract_bit)\n"); + fprintf (header_file, + "#define bif_is_nosoft(x)\t((x).bifattrs & bif_nosoft_bit)\n"); + fprintf (header_file, + "#define bif_is_ldvec(x)\t\t((x).bifattrs & bif_ldvec_bit)\n"); + fprintf (header_file, + "#define bif_is_stvec(x)\t\t((x).bifattrs & bif_stvec_bit)\n"); + fprintf (header_file, + "#define bif_is_reve(x)\t\t((x).bifattrs & bif_reve_bit)\n"); + fprintf (header_file, + "#define bif_is_predicate(x)\t((x).bifattrs & bif_pred_bit)\n"); + fprintf (header_file, + "#define bif_is_htm(x)\t\t((x).bifattrs & bif_htm_bit)\n"); + fprintf (header_file, + "#define bif_is_htmspr(x)\t((x).bifattrs & bif_htmspr_bit)\n"); + fprintf (header_file, + "#define bif_is_htmcr(x)\t\t((x).bifattrs & bif_htmcr_bit)\n"); + fprintf (header_file, + "#define bif_is_mma(x)\t\t((x).bifattrs & bif_mma_bit)\n"); + fprintf (header_file, + "#define bif_is_quad(x)\t\t((x).bifattrs & bif_quad_bit)\n"); + fprintf (header_file, + "#define bif_is_pair(x)\t\t((x).bifattrs & bif_pair_bit)\n"); + fprintf (header_file, + "#define bif_is_no32bit(x)\t((x).bifattrs & bif_no32bit_bit)\n"); + fprintf (header_file, + "#define bif_is_32bit(x)\t((x).bifattrs & bif_32bit_bit)\n"); + fprintf (header_file, + "#define bif_is_cpu(x)\t\t((x).bifattrs & bif_cpu_bit)\n"); + fprintf (header_file, + "#define bif_is_ldstmask(x)\t((x).bifattrs & bif_ldstmask_bit)\n"); + fprintf (header_file, + "#define bif_is_lxvrse(x)\t((x).bifattrs & bif_lxvrse_bit)\n"); + fprintf (header_file, + "#define bif_is_lxvrze(x)\t((x).bifattrs & bif_lxvrze_bit)\n"); + fprintf (header_file, + "#define bif_is_endian(x)\t((x).bifattrs & bif_endian_bit)\n"); + fprintf (header_file, "\n"); + + /* #### Note that the _x is added for now to avoid conflict with + the existing rs6000_builtin_info[] file while testing. It will + be removed as we progress. */ + /* #### Cannot mark this as a GC root because only pointer types can + be marked as GTY((user)) and be GC roots. All trees in here are + kept alive by other globals, so not a big deal. Alternatively, + we could change the enum fields to ints and cast them in and out + to avoid requiring a GTY((user)) designation, but that seems + unnecessarily gross. */ + fprintf (header_file, + "extern bifdata rs6000_builtin_info_x[RS6000_BIF_MAX];\n\n"); + + fprintf (header_file, "struct GTY((user)) ovlddata\n"); + fprintf (header_file, "{\n"); + fprintf (header_file, " const char *bifname;\n"); + fprintf (header_file, " rs6000_gen_builtins bifid;\n"); + fprintf (header_file, " tree fntype;\n"); + fprintf (header_file, " ovlddata *next;\n"); + fprintf (header_file, "};\n\n"); + + fprintf (header_file, "struct ovldrecord\n"); + fprintf (header_file, "{\n"); + fprintf (header_file, " const char *ovld_name;\n"); + fprintf (header_file, " ovlddata *first_instance;\n"); + fprintf (header_file, "};\n\n"); + + /* #### Cannot mark this as a GC root because only pointer types can + be marked as GTY((user)) and be GC roots. All trees in here are + kept alive by other globals, so not a big deal. Alternatively, + we could change the enum fields to ints and cast them in and out + to avoid requiring a GTY((user)) designation, but that seems + unnecessarily gross. */ + fprintf (header_file, + "extern ovlddata rs6000_instance_info[RS6000_INST_MAX];\n"); + fprintf (header_file, "extern ovldrecord rs6000_overload_info[];\n\n"); + + fprintf (header_file, "extern void rs6000_autoinit_builtins ();\n\n"); + fprintf (header_file, + "extern bool rs6000_new_builtin_is_supported_p " + "(rs6000_gen_builtins);\n"); + fprintf (header_file, + "extern tree rs6000_builtin_decl (unsigned, " + "bool ATTRIBUTE_UNUSED);\n\n"); + fprintf (header_file, + "extern void gt_ggc_mx (bifdata *bd);\n"); + fprintf (header_file, + "extern void gt_pch_nx (bifdata *bd);\n"); + fprintf (header_file, + "extern void gt_pch_nx (bifdata *bd, gt_pointer_operator op, " + "void *cookie);\n"); + fprintf (header_file, + "extern void gt_ggc_mx (ovlddata *od);\n"); + fprintf (header_file, + "extern void gt_pch_nx (ovlddata *od);\n"); + fprintf (header_file, + "extern void gt_pch_nx (ovlddata *od, gt_pointer_operator op, " + "void *cookie);\n"); +} + +/* Callback functions used for generating trees for function types. */ +void +write_extern_fntype (char *str) +{ + fprintf (header_file, "extern GTY(()) tree %s;\n", str); +} + /* Write everything to the header file (rs6000-builtins.h). */ static int write_header_file (void) { + write_autogenerated_header (header_file); + + fprintf (header_file, "#ifndef _RS6000_BUILTINS_H\n"); + fprintf (header_file, "#define _RS6000_BUILTINS_H 1\n\n"); + fprintf (header_file, "extern int new_builtins_are_live;\n\n"); + + write_decls (); + + /* Write function type list declarators to the header file. */ + rbt_inorder_callback (&fntype_rbt, fntype_rbt.rbt_root, write_extern_fntype); + fprintf (header_file, "\n"); + fprintf (header_file, "\n#endif\n"); + return 1; } -- 2.27.0