From patchwork Wed Jan 3 02:39:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: joshua X-Patchwork-Id: 1881847 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4T4YpT1qHTz1ydb for ; Wed, 3 Jan 2024 13:39:45 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E35F1385828B for ; Wed, 3 Jan 2024 02:39:41 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from out30-133.freemail.mail.aliyun.com (out30-133.freemail.mail.aliyun.com [115.124.30.133]) by sourceware.org (Postfix) with ESMTPS id BF34E3858C2A for ; Wed, 3 Jan 2024 02:39:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BF34E3858C2A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.alibaba.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BF34E3858C2A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=115.124.30.133 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704249561; cv=none; b=RxpJuNnzCjE4S0MLH1sOloCH9PnJnT9olST9Js2Jj+azz3oEJxNBXOvwW2XOvRbac+FoTcrUqvb08kRJbJmuP2xWvs/X7/9eUbgoL0oYOsgyf4dDseSAyL+YoVDuwYCtwWtOwr6QRKb2fk2y7APUdm4CIwEjgsbSufHWrYllfLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704249561; c=relaxed/simple; bh=3JH2R4/s8+vzymkYr2zVTW0KWFhkqgtvccnpz9HoBn4=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=lJxRShNnAeNoTZmQQlpbMDz9w5o84qiVQndu8xCehNb5FWHGFc0RYksQAK5Vfp/1+RoFPL6WvPI2iJKaRs1HTbI6SsyVLi4+OIxB+xfqDUDM6VL+Qa+fixxAaIJkVCFkITTWMmvhEQMT5b2HXoOo+Jtif0v8LzG6HW0bTsPzHCY= ARC-Authentication-Results: i=1; server2.sourceware.org X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R431e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=ay29a033018046049; MF=cooper.joshua@linux.alibaba.com; NM=1; PH=DS; RN=11; SR=0; TI=SMTPD_---0VzsCSl9_1704249551; Received: from localhost.localdomain(mailfrom:cooper.joshua@linux.alibaba.com fp:SMTPD_---0VzsCSl9_1704249551) by smtp.aliyun-inc.com; Wed, 03 Jan 2024 10:39:13 +0800 From: "Jun Sha (Joshua)" To: gcc-patches@gcc.gnu.org Cc: jim.wilson.gcc@gmail.com, palmer@dabbelt.com, andrew@sifive.com, philipp.tomsich@vrull.eu, jeffreyalaw@gmail.com, christoph.muellner@vrull.eu, juzhe.zhong@rivai.ai, "Jun Sha (Joshua)" , Jin Ma , Xianmiao Qu Subject: [PATCH v4] RISC-V: Rewrite some instructions using ASM targethook Date: Wed, 3 Jan 2024 10:39:01 +0800 Message-Id: <20240103023901.1631-1-cooper.joshua@linux.alibaba.com> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20231229040310.1047-1-cooper.joshua@linux.alibaba.com> References: <20231229040310.1047-1-cooper.joshua@linux.alibaba.com> MIME-Version: 1.0 X-Spam-Status: No, score=-19.9 required=5.0 tests=BAYES_00, ENV_AND_HDR_SPF_MATCH, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY, URIBL_BLACK, USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org There are some xtheadvector instructions that differ from RVV1.0 apart from simply adding "th." prefix. For example, RVV1.0 load/store instructions will have SEW while xtheadvector not; RVV1.0 will have "o" for indexed-ordered store instructions while xtheadvecotr not; xtheadvector and RVV1.0 have different vnsrl/vnsra/vfncvt suffix (vv/vx/vi vs wv/wx/wi). To address this issue without duplicating patterns, we use ASM targethook to rewrite the whole string of the instructions. We identify different instructions from the corresponding attribute. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_asm_output_opcode): Co-authored-by: Jin Ma Co-authored-by: Xianmiao Qu Co-authored-by: Christoph Müllner --- gcc/config/riscv/riscv.cc | 213 +++++++++++++++++++++++++++++++++++++- 1 file changed, 210 insertions(+), 3 deletions(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index a80bf8d1a74..13cdfc4ee27 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -5646,9 +5646,216 @@ riscv_asm_output_opcode (FILE *asm_out_file, const char *p) { /* We need to add th. prefix to all the xtheadvector insturctions here.*/ - if (TARGET_XTHEADVECTOR && current_output_insn != NULL_RTX && - p[0] == 'v') - fputs ("th.", asm_out_file); + if (TARGET_XTHEADVECTOR && current_output_insn != NULL_RTX) + { + if (get_attr_type (current_output_insn) == TYPE_VLDE || + get_attr_type (current_output_insn) == TYPE_VSTE || + get_attr_type (current_output_insn) == TYPE_VLDFF) + { + if (strstr (p, "e8") || strstr (p, "e16") || + strstr (p, "e32") || strstr (p, "e64")) + { + get_attr_type (current_output_insn) == TYPE_VSTE + ? fputs ("th.vse", asm_out_file) + : fputs ("th.vle", asm_out_file); + if (strstr (p, "e8")) + return p+4; + else + return p+5; + } + } + + if (get_attr_type (current_output_insn) == TYPE_VLDS || + get_attr_type (current_output_insn) == TYPE_VSTS) + { + if (strstr (p, "vle8") || strstr (p, "vse8") || + strstr (p, "vle16") || strstr (p, "vse16") || + strstr (p, "vle32") || strstr (p, "vse32") || + strstr (p, "vle64") || strstr (p, "vse64")) + { + get_attr_type (current_output_insn) == TYPE_VSTS + ? fputs ("th.vse", asm_out_file) + : fputs ("th.vle", asm_out_file); + if (strstr (p, "e8")) + return p+4; + else + return p+5; + } + else if (strstr (p, "vlse8") || strstr (p, "vsse8") || + strstr (p, "vlse16") || strstr (p, "vsse16") || + strstr (p, "vlse32") || strstr (p, "vsse32") || + strstr (p, "vlse64") || strstr (p, "vsse64")) + { + get_attr_type (current_output_insn) == TYPE_VSTS + ? fputs ("th.vsse", asm_out_file) + : fputs ("th.vlse", asm_out_file); + if (strstr (p, "e8")) + return p+5; + else + return p+6; + } + } + + if (get_attr_type (current_output_insn) == TYPE_VLDUX || + get_attr_type (current_output_insn) == TYPE_VLDOX) + { + if (strstr (p, "ei")) + { + fputs ("th.vlxe", asm_out_file); + if (strstr (p, "ei8")) + return p+7; + else + return p+8; + } + } + + if (get_attr_type (current_output_insn) == TYPE_VSTUX || + get_attr_type (current_output_insn) == TYPE_VSTOX) + { + if (strstr (p, "ei")) + { + get_attr_type (current_output_insn) == TYPE_VSTUX + ? fputs ("th.vsuxe", asm_out_file) + : fputs ("th.vsxe", asm_out_file); + if (strstr (p, "ei8")) + return p+7; + else + return p+8; + } + } + + if (get_attr_type (current_output_insn) == TYPE_VLSEGDE || + get_attr_type (current_output_insn) == TYPE_VSSEGTE || + get_attr_type (current_output_insn) == TYPE_VLSEGDFF) + { + get_attr_type (current_output_insn) == TYPE_VSSEGTE + ? fputs ("th.vsseg", asm_out_file) + : fputs ("th.vlseg", asm_out_file); + asm_fprintf (asm_out_file, "%c", p[5]); + fputs ("e", asm_out_file); + if (strstr (p, "e8")) + return p+8; + else + return p+9; + } + + if (get_attr_type (current_output_insn) == TYPE_VLSEGDS || + get_attr_type (current_output_insn) == TYPE_VSSEGTS) + { + get_attr_type (current_output_insn) == TYPE_VSSEGTS + ? fputs ("th.vssseg", asm_out_file) + : fputs ("th.vlsseg", asm_out_file); + asm_fprintf (asm_out_file, "%c", p[6]); + fputs ("e", asm_out_file); + if (strstr (p, "e8")) + return p+9; + else + return p+10; + } + + if (get_attr_type (current_output_insn) == TYPE_VLSEGDUX || + get_attr_type (current_output_insn) == TYPE_VLSEGDOX) + { + fputs ("th.vlxseg", asm_out_file); + asm_fprintf (asm_out_file, "%c", p[7]); + fputs ("e", asm_out_file); + if (strstr (p, "e8")) + return p+10; + else + return p+11; + } + + if (get_attr_type (current_output_insn) == TYPE_VSSEGTUX || + get_attr_type (current_output_insn) == TYPE_VSSEGTOX) + { + fputs ("th.vsxseg", asm_out_file); + asm_fprintf (asm_out_file, "%c", p[7]); + fputs ("e", asm_out_file); + if (strstr (p, "e8")) + return p+10; + else + return p+11; + } + + if (get_attr_type (current_output_insn) == TYPE_VNSHIFT) + { + if (strstr (p, "vncvt")) + { + fputs ("th.vncvt.x.x.v", asm_out_file); + return p+11; + } + + strstr (p, "vnsrl") ? fputs ("th.vnsrl.v", asm_out_file) + : fputs ("th.vnsra.v", asm_out_file); + return p+7; + } + + if (get_attr_type (current_output_insn) == TYPE_VNCLIP) + { + if (strstr (p, "vnclipu")) + { + fputs ("th.vnclipu.v", asm_out_file); + return p+9; + } + else + { + fputs ("th.vnclip.v", asm_out_file); + return p+8; + } + } + + if (get_attr_type (current_output_insn) == TYPE_VMPOP) + { + fputs ("th.vmpopc", asm_out_file); + return p+5; + } + + if (get_attr_type (current_output_insn) == TYPE_VMFFS) + { + fputs ("th.vmfirst", asm_out_file); + return p+6; + } + + if (get_attr_type (current_output_insn) == TYPE_VFNCVTFTOI || + get_attr_type (current_output_insn) == TYPE_VFNCVTITOF) + { + if (strstr (p, "xu")) + { + get_attr_type (current_output_insn) == TYPE_VFNCVTFTOI + ? fputs ("th.vfncvt.xu.f.v", asm_out_file) + : fputs ("th.vfncvt.f.xu.v", asm_out_file); + return p+13; + } + else + { + get_attr_type (current_output_insn) == TYPE_VFNCVTFTOI + ? fputs ("th.vfncvt.x.f.v", asm_out_file) + : fputs ("th.vfncvt.f.x.v", asm_out_file); + return p+12; + } + } + + if (get_attr_type (current_output_insn) == TYPE_VFNCVTFTOF) + { + fputs ("th.vfncvt.f.f.v", asm_out_file); + return p+12; + } + + if (get_attr_type (current_output_insn) == TYPE_VFREDU) + { + fputs ("th.vfredsum", asm_out_file); + return p+9; + } + + if (get_attr_type (current_output_insn) == TYPE_VFWREDU) + { + fputs ("th.vfwredsum", asm_out_file); + return p+10; + } + + if (p[0] == 'v') + fputs ("th.", asm_out_file); + } return p; }