From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by sourceware.org (Postfix) with ESMTPS id 0E7433858D20 for ; Tue, 11 Jul 2023 11:51:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0E7433858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-314319c0d3eso6057883f8f.0 for ; Tue, 11 Jul 2023 04:51:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689076308; x=1691668308; h=content-transfer-encoding:subject:from:to:content-language:cc :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=wumYAlJX7hMHnkpuwhMpxxHlIS2h+5UTRlzv6dIoqRA=; b=hITAX4NA7Cv6P6ZOjoa2aFncJNEvNalLgQDspmTuDxiqy9uCr36Pk9pORHrqxIDE8F EI3vM4gl+w4bSphDnD5q6JTUcHzKb4ItHwxj2x0Bb+LKNnwSAuLFCKDLQDHcuoiInlyV VPrn9Nq9d+wUUWtytUoA+ReMfsfmP9+b6VMDeUEkndrUsyh3yK2atdixo3p7XhRA5b6J zKPtF+6RFvYont8/rXtHqnZ/NGQLoUgDYB0AZd9bV7ri/XKdWcQ/QVwHzzFZR15EfB0g VIGVHYqAi9YwzysXE5YQ1dJFlcpOGiapm6s0T97Wqz7diTgoJLtdSIIK2nENp7LT3JZ5 Ufhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689076308; x=1691668308; h=content-transfer-encoding:subject:from:to:content-language:cc :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=wumYAlJX7hMHnkpuwhMpxxHlIS2h+5UTRlzv6dIoqRA=; b=U04b5VyvfGih5LpkyV9EmLEHdlhq91u+pXfSOIKROSvGIno7woyx3jRShJC7ive9gY lb7whvq3syjDbEeWqrljYcjeUbSivYRWLO4rRL2aoF73Xr/4rkf11A1KFBZPEzONipIs DfUhjR09P5WHWkqsXOxEh/w3YQx6siFVNG4aFdTdhdmo3wCThC+GtXtZMMVa+TwaW38S TZj/Yy6VDGFhP/80JhimFFcBCaLELFlsykT43V9m7Nhfy54TZWOUChwvL+Dc8bQDM7Pc Dxmx/oFJB1MVmw8SV+ahMeB/qcSmGj8tCQwOBxyDZ4u4+cqpJCAzT78wpTUyzDEh/70U JsLQ== X-Gm-Message-State: ABy/qLYwTFci9B5KIb2f7NWR726aswbGXMnqToQ2MHxXZ5PFzyMTg3ws k8tRiQ4puKvUqAUUHnZNFgmLViMwzcwzkQ== X-Google-Smtp-Source: APBJJlFZWB0nrg7RgueNJV8DGU3zty6SkW33Bd2Q5YfqWBNrM47cjYyqaGbusVN53GU4SftpumENFw== X-Received: by 2002:a5d:420f:0:b0:314:15b7:1fb5 with SMTP id n15-20020a5d420f000000b0031415b71fb5mr15711453wrq.34.1689076308052; Tue, 11 Jul 2023 04:51:48 -0700 (PDT) Received: from [192.168.1.23] (ip-046-005-130-086.um12.pools.vodafone-ip.de. [46.5.130.86]) by smtp.gmail.com with ESMTPSA id j11-20020a056000124b00b0031417fd473csm2074014wrx.78.2023.07.11.04.51.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 11 Jul 2023 04:51:47 -0700 (PDT) Message-ID: <8fd3db77-035d-6874-6c71-47c944c465b5@gmail.com> Date: Tue, 11 Jul 2023 13:51:46 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Cc: rdapp.gcc@gmail.com, jeffreyalaw , "juzhe.zhong@rivai.ai" Content-Language: en-US To: gcc-patches From: Robin Dapp Subject: [PATCH] genopinit: Allow more than 256 modes. Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hi, upcoming changes for RISC-V will have us exceed 256 modes or 8 bits. The helper functions in gen* rely on the opcode as well as two modes fitting into an unsigned int (a signed int even if we consider the qsort default comparison function). This patch changes the type of the index/hash from unsigned int to unsigned long long and allows up to 16 bits for a mode as well as 32 bits for an optab. Despite fearing worse, bootstrap, build and test suite run times on x86, aarch64, rv64 and power10 are actually unchanged (I didn't check 32-bit architectures but would expect similar results). Regards Robin gcc/ChangeLog: * genopinit.cc (pattern_cmp): Use if/else for comparison instead of subtraction. (main): Change to unsigned long long. * gensupport.cc (find_optab): Ditto. * gensupport.h (struct optab_pattern): Ditto. * optabs-query.h (optab_handler): Ditto. (convert_optab_handler): Ditto. --- gcc/genopinit.cc | 19 ++++++++++++------- gcc/gensupport.cc | 3 ++- gcc/gensupport.h | 2 +- gcc/optabs-query.h | 5 +++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/gcc/genopinit.cc b/gcc/genopinit.cc index 6bd8858a1d9..58c1bf7cba8 100644 --- a/gcc/genopinit.cc +++ b/gcc/genopinit.cc @@ -51,7 +51,12 @@ pattern_cmp (const void *va, const void *vb) { const optab_pattern *a = (const optab_pattern *)va; const optab_pattern *b = (const optab_pattern *)vb; - return a->sort_num - b->sort_num; + if (a->sort_num > b->sort_num) + return 1; + else if (a->sort_num < b->sort_num) + return -1; + else + return 0; } static int @@ -306,7 +311,7 @@ main (int argc, const char **argv) "extern const struct optab_libcall_d normlib_def[NUM_NORMLIB_OPTABS];\n" "\n" "/* Returns the active icode for the given (encoded) optab. */\n" - "extern enum insn_code raw_optab_handler (unsigned);\n" + "extern enum insn_code raw_optab_handler (unsigned long long);\n" "extern bool swap_optab_enable (optab, machine_mode, bool);\n" "\n" "/* Target-dependent globals. */\n" @@ -358,14 +363,14 @@ main (int argc, const char **argv) "#include \"optabs.h\"\n" "\n" "struct optab_pat {\n" - " unsigned scode;\n" + " unsigned long long scode;\n" " enum insn_code icode;\n" "};\n\n"); fprintf (s_file, "static const struct optab_pat pats[NUM_OPTAB_PATTERNS] = {\n"); for (i = 0; patterns.iterate (i, &p); ++i) - fprintf (s_file, " { %#08x, CODE_FOR_%s },\n", p->sort_num, p->name); + fprintf (s_file, " { %#08llx, CODE_FOR_%s },\n", p->sort_num, p->name); fprintf (s_file, "};\n\n"); fprintf (s_file, "void\ninit_all_optabs (struct target_optabs *optabs)\n{\n"); @@ -410,7 +415,7 @@ main (int argc, const char **argv) the hash entries, which complicates the pat_enable array. */ fprintf (s_file, "static int\n" - "lookup_handler (unsigned scode)\n" + "lookup_handler (unsigned long long scode)\n" "{\n" " int l = 0, h = ARRAY_SIZE (pats), m;\n" " while (h > l)\n" @@ -428,7 +433,7 @@ main (int argc, const char **argv) fprintf (s_file, "enum insn_code\n" - "raw_optab_handler (unsigned scode)\n" + "raw_optab_handler (unsigned long long scode)\n" "{\n" " int i = lookup_handler (scode);\n" " return (i >= 0 && this_fn_optabs->pat_enable[i]\n" @@ -439,7 +444,7 @@ main (int argc, const char **argv) "bool\n" "swap_optab_enable (optab op, machine_mode m, bool set)\n" "{\n" - " unsigned scode = (op << 16) | m;\n" + " unsigned long long scode = ((unsigned long long)op << 32) | m;\n" " int i = lookup_handler (scode);\n" " if (i >= 0)\n" " {\n" diff --git a/gcc/gensupport.cc b/gcc/gensupport.cc index e39e6dacce2..3fe7428372d 100644 --- a/gcc/gensupport.cc +++ b/gcc/gensupport.cc @@ -3806,7 +3806,8 @@ find_optab (optab_pattern *p, const char *name) { p->name = name; p->op = optabs[pindex].op; - p->sort_num = (p->op << 16) | (p->m2 << 8) | p->m1; + p->sort_num + = ((unsigned long long) p->op << 32) | (p->m2 << 16) | p->m1; return true; } } diff --git a/gcc/gensupport.h b/gcc/gensupport.h index 7925e22ed41..9f70e2310e2 100644 --- a/gcc/gensupport.h +++ b/gcc/gensupport.h @@ -123,7 +123,7 @@ struct optab_pattern /* An index that provides a lexicographical sort of (OP, M2, M1). Used by genopinit.cc. */ - unsigned int sort_num; + unsigned long long sort_num; }; extern rtx add_implicit_parallel (rtvec); diff --git a/gcc/optabs-query.h b/gcc/optabs-query.h index 043e9791bc1..5a1d2f75470 100644 --- a/gcc/optabs-query.h +++ b/gcc/optabs-query.h @@ -37,7 +37,7 @@ convert_optab_p (optab op) inline enum insn_code optab_handler (optab op, machine_mode mode) { - unsigned scode = (op << 16) | mode; + unsigned long long scode = ((unsigned long long)op << 32) | mode; gcc_assert (op > LAST_CONV_OPTAB); return raw_optab_handler (scode); } @@ -50,7 +50,8 @@ inline enum insn_code convert_optab_handler (convert_optab op, machine_mode to_mode, machine_mode from_mode) { - unsigned scode = (op << 16) | (from_mode << 8) | to_mode; + unsigned long long scode + = ((unsigned long long) op << 32) | (from_mode << 16) | to_mode; gcc_assert (convert_optab_p (op)); return raw_optab_handler (scode); } -- 2.41.0