From patchwork Wed Sep 6 05:47:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tsukasa OI X-Patchwork-Id: 137553 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ab0a:0:b0:3f2:4152:657d with SMTP id m10csp2107316vqo; Tue, 5 Sep 2023 22:49:00 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFV+bCiL9ql2LX0EWsbrqcaMTebNbjbafoTefQJY1mWCzsweUIge5rlhf4OdcFCTyhbaQzW X-Received: by 2002:aa7:d610:0:b0:522:2019:2020 with SMTP id c16-20020aa7d610000000b0052220192020mr1430215edr.17.1693979339985; Tue, 05 Sep 2023 22:48:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693979339; cv=none; d=google.com; s=arc-20160816; b=SgTdTIP/dVHkjeVgzLz/S90bPa19QTlpQR9SsjoWaT/LMM3n4ygyLA+BWWZ9u86DhR ijDy+jpoRRoyJp+e9S8qSBwY8vUQKnYs38e2ulxR0MHV3Kr8cqEdG2bhkH8wHeTDFEo0 NlquR2L2XQ7SUouyfSzOgVfHylbphVGs82Wg0tjZRMhE2bkH7g8OqxrPX61uXf9FjKo0 fVnSGrm/Up8eJtQy+A6HgynkiuPVtl4ruZz2EIEsIRQJaQzEL8FaH6DarDtPii8v8/Qw 9P26FGFIAlgGPtQTyYa/WgD9upgSJP/PPf9HQ8X8BxM2a2Sd4Uibkrb3i2ylxeQCLuWf tT1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=AsmJVaTzKdN6eieY6XHy7cDLL8MRZxtOLXryvhveDv8=; fh=HKgiOHUFLyfVG2npWMLYE8/3Ecp4EiEdadhQOzpm3aI=; b=j9XhQ5gvtTVho0h+O9GScl6i0xlZ3ZCG6R0njLQuP4Vk18Dxyn3zMeUi4syczy4IKx J4Dp3E7b764RzIkqsIo05FXQQoJiP8qbBly6J1/mh+SITyPx85tBpiP/joqX0MunMomc MGxfceww95HkXTLrrpfJJOGLtF/Cs0gGTTvRIGoODh+LnHZdL177eI5oAeTBwFYyUZeR WGfqEdvJjww4axL1Htxsakj7GDVeFY8K0eB/Re0aL5xuEVANUlY0iGKMTh/GM6YLwi3l 1j7/HPXnUonDdn8vsEdJuc67s1iMfaEgunQkka0v4kcjF1v4bEZ3yuvfDRe5wtTX6WAb lfYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=WZXGonu9; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id r19-20020aa7cfd3000000b005256d74f242si1657820edy.13.2023.09.05.22.48.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Sep 2023 22:48:59 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=WZXGonu9; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 866763858422 for ; Wed, 6 Sep 2023 05:48:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 866763858422 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1693979338; bh=AsmJVaTzKdN6eieY6XHy7cDLL8MRZxtOLXryvhveDv8=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=WZXGonu94nGyAlOD/q0aYZ+k0NJxaclVY+puAW8oHd5bA5LbACVdt8dqd0BNcc/AL uCp9Z0EdUSqI2zLuZKb76CYiWbQsBro1+/uWwH2NjHSJTqsSsAe/deMZYNHu6AAtRb V2CzBHHqnBCPJQN8hZlNZgcQpwcu3YK2QfAkQ9IQ= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-sender-0.a4lg.com (mail-sender.a4lg.com [153.120.152.154]) by sourceware.org (Postfix) with ESMTPS id 5E8133858D28 for ; Wed, 6 Sep 2023 05:48:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5E8133858D28 Received: from [127.0.0.1] (localhost [127.0.0.1]) by mail-sender-0.a4lg.com (Postfix) with ESMTPSA id 0CE65300089; Wed, 6 Sep 2023 05:48:10 +0000 (UTC) To: Tsukasa OI , Kito Cheng , Palmer Dabbelt , Andrew Waterman , Jim Wilson , Jeff Law Cc: gcc-patches@gcc.gnu.org Subject: [PATCH v4 1/1] RISC-V: Add support for 'XVentanaCondOps' reusing 'Zicond' support Date: Wed, 6 Sep 2023 05:47:07 +0000 Message-ID: <018e6aa00b7ef8925919df999dfaf0330aebba72.1693979213.git.research_trasio@irq.a4lg.com> In-Reply-To: References: Mime-Version: 1.0 X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, KAM_MANYTO, KAM_SHORT, LIKELY_SPAM_BODY, SPF_HELO_NONE, SPF_PASS, TXREP 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: , X-Patchwork-Original-From: Tsukasa OI via Gcc-patches From: Tsukasa OI Reply-To: Tsukasa OI Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1775635505065508451 X-GMAIL-MSGID: 1776266080332477855 From: Tsukasa OI 'XVentanaCondOps' is a vendor extension from Ventana Micro Systems containing two instructions for conditional move and will be supported on their Veyron V1 CPU. And most notably (for historical reasons), 'XVentanaCondOps' and the standard 'Zicond' extension are functionally equivalent (only encodings and instruction names are different). * czero.eqz == vt.maskc * czero.nez == vt.maskcn This commit adds support for the 'XVentanaCondOps' extension by extending 'Zicond' extension support. With this, we can now reuse the optimization using the 'Zicond' extension for the 'XVentanaCondOps' extension. The specification for the 'XVentanaCondOps' extension is based on: gcc/ChangeLog: * common/config/riscv/riscv-common.cc (riscv_ext_flag_table): Parse 'XVentanaCondOps' extension. * config/riscv/riscv-opts.h (MASK_XVENTANACONDOPS): New. (TARGET_XVENTANACONDOPS): Ditto. (TARGET_ZICOND_LIKE): New to represent targets with conditional moves like 'Zicond'. It includes RV64 + 'XVentanaCondOps'. * config/riscv/riscv.cc (riscv_rtx_costs): Replace TARGET_ZICOND with TARGET_ZICOND_LIKE. (riscv_expand_conditional_move): Ditto. * config/riscv/riscv.md (movcc): Replace TARGET_ZICOND with TARGET_ZICOND_LIKE. * config/riscv/riscv.opt: Add new riscv_xventana_subext. * config/riscv/zicond.md: Modify description. (eqz_ventana): New to match corresponding czero instructions. (nez_ventana): Ditto. (*czero..): Emit a 'XVentanaCondOps' instruction if 'Zicond' is not available but 'XVentanaCondOps' + RV64 is. (*czero..): Ditto. (*czero.eqz..opt1): Ditto. (*czero.nez..opt2): Ditto. gcc/testsuite/ChangeLog: * gcc.target/riscv/xventanacondops-primitiveSemantics.c: New test, * gcc.target/riscv/xventanacondops-primitiveSemantics-rv32.c: New test to make sure that XVentanaCondOps instructions are disabled on RV32. * gcc.target/riscv/xventanacondops-xor-01.c: New test, --- gcc/common/config/riscv/riscv-common.cc | 2 + gcc/config/riscv/riscv-opts.h | 6 +++ gcc/config/riscv/riscv.cc | 4 +- gcc/config/riscv/riscv.md | 2 +- gcc/config/riscv/riscv.opt | 3 ++ gcc/config/riscv/zicond.md | 53 +++++++++++++++---- .../xventanacondops-primitiveSemantics-rv32.c | 8 +++ .../xventanacondops-primitiveSemantics.c | 10 ++++ .../gcc.target/riscv/xventanacondops-xor-01.c | 8 +++ 9 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics-rv32.c create mode 100644 gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics.c create mode 100644 gcc/testsuite/gcc.target/riscv/xventanacondops-xor-01.c diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index f142212f2edc..9a0a68fe5db3 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -1493,6 +1493,8 @@ static const riscv_ext_flag_table_t riscv_ext_flag_table[] = {"xtheadmempair", &gcc_options::x_riscv_xthead_subext, MASK_XTHEADMEMPAIR}, {"xtheadsync", &gcc_options::x_riscv_xthead_subext, MASK_XTHEADSYNC}, + {"xventanacondops", &gcc_options::x_riscv_xventana_subext, MASK_XVENTANACONDOPS}, + {NULL, NULL, 0} }; diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h index b6b5907e111b..a525f679683c 100644 --- a/gcc/config/riscv/riscv-opts.h +++ b/gcc/config/riscv/riscv-opts.h @@ -321,6 +321,12 @@ enum riscv_entity #define TARGET_XTHEADMEMPAIR ((riscv_xthead_subext & MASK_XTHEADMEMPAIR) != 0) #define TARGET_XTHEADSYNC ((riscv_xthead_subext & MASK_XTHEADSYNC) != 0) +#define MASK_XVENTANACONDOPS (1 << 0) + +#define TARGET_XVENTANACONDOPS ((riscv_xventana_subext & MASK_XVENTANACONDOPS) != 0) + +#define TARGET_ZICOND_LIKE (TARGET_ZICOND || (TARGET_XVENTANACONDOPS && TARGET_64BIT)) + /* We only enable VLS modes for VLA vectorization since fixed length VLMAX mode is the highest priority choice and should not conflict with VLS modes. */ #define TARGET_VECTOR_VLS \ diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 475fb2841427..a6e58e4f1159 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -2744,7 +2744,7 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN *total = COSTS_N_INSNS (1); return true; } - else if (TARGET_ZICOND + else if (TARGET_ZICOND_LIKE && outer_code == SET && ((GET_CODE (XEXP (x, 1)) == REG && XEXP (x, 2) == CONST0_RTX (GET_MODE (XEXP (x, 1)))) @@ -3841,7 +3841,7 @@ riscv_expand_conditional_move (rtx dest, rtx op, rtx cons, rtx alt) cond, cons, alt))); return true; } - else if (TARGET_ZICOND + else if (TARGET_ZICOND_LIKE && GET_MODE_CLASS (mode) == MODE_INT) { /* The comparison must be comparing WORD_MODE objects. We must diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index d80b6938f84b..03833be7129b 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -2608,7 +2608,7 @@ (if_then_else:GPR (match_operand 1 "comparison_operator") (match_operand:GPR 2 "sfb_alu_operand") (match_operand:GPR 3 "sfb_alu_operand")))] - "TARGET_SFB_ALU || TARGET_XTHEADCONDMOV || TARGET_ZICOND" + "TARGET_SFB_ALU || TARGET_XTHEADCONDMOV || TARGET_ZICOND_LIKE" { if (riscv_expand_conditional_move (operands[0], operands[1], operands[2], operands[3])) diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt index eca0dda4dd5c..3615f52ff0e0 100644 --- a/gcc/config/riscv/riscv.opt +++ b/gcc/config/riscv/riscv.opt @@ -257,6 +257,9 @@ int riscv_ztso_subext TargetVariable int riscv_xthead_subext +TargetVariable +int riscv_xventana_subext + Enum Name(isa_spec_class) Type(enum riscv_isa_spec_class) Supported ISA specs (for use with the -misa-spec= option): diff --git a/gcc/config/riscv/zicond.md b/gcc/config/riscv/zicond.md index c28bee5d5709..6627be3fa585 100644 --- a/gcc/config/riscv/zicond.md +++ b/gcc/config/riscv/zicond.md @@ -1,4 +1,5 @@ -;; Machine description for the RISC-V Zicond extension +;; Machine description for the RISC-V Zicond extension and functionally- +;; equivalent XVentanaCondOps vendor extension ;; Copyright (C) 2022-23 Free Software Foundation, Inc. ;; This file is part of GCC. @@ -20,16 +21,25 @@ (define_code_iterator eq_or_ne [eq ne]) (define_code_attr eqz [(eq "nez") (ne "eqz")]) (define_code_attr nez [(eq "eqz") (ne "nez")]) +(define_code_attr eqz_ventana [(eq "n") (ne "")]) +(define_code_attr nez_ventana [(eq "") (ne "n")]) -;; Zicond +;; Zicond / XVentanaCondOps (define_insn "*czero.." [(set (match_operand:GPR 0 "register_operand" "=r") (if_then_else:GPR (eq_or_ne (match_operand:X 1 "register_operand" "r") (const_int 0)) (match_operand:GPR 2 "register_operand" "r") (const_int 0)))] - "TARGET_ZICOND" - "czero.\t%0,%2,%1" + "TARGET_ZICOND_LIKE" + { + if (TARGET_ZICOND) + return "czero.\t%0,%2,%1"; + else if (TARGET_XVENTANACONDOPS && TARGET_64BIT) + return "vt.maskc\t%0,%2,%1"; + else + gcc_unreachable (); + } ) (define_insn "*czero.." @@ -38,8 +48,15 @@ (const_int 0)) (const_int 0) (match_operand:GPR 2 "register_operand" "r")))] - "TARGET_ZICOND" - "czero.\t%0,%2,%1" + "TARGET_ZICOND_LIKE" + { + if (TARGET_ZICOND) + return "czero.\t%0,%2,%1"; + else if (TARGET_XVENTANACONDOPS && TARGET_64BIT) + return "vt.maskc\t%0,%2,%1"; + else + gcc_unreachable (); + } ) ;; Special optimization under eq/ne in primitive semantics @@ -49,8 +66,15 @@ (const_int 0)) (match_operand:GPR 2 "register_operand" "1") (match_operand:GPR 3 "register_operand" "r")))] - "TARGET_ZICOND && rtx_equal_p (operands[1], operands[2])" - "czero.eqz\t%0,%3,%1" + "TARGET_ZICOND_LIKE && rtx_equal_p (operands[1], operands[2])" + { + if (TARGET_ZICOND) + return "czero.eqz\t%0,%3,%1"; + else if (TARGET_XVENTANACONDOPS && TARGET_64BIT) + return "vt.maskc\t%0,%3,%1"; + else + gcc_unreachable (); + } ) (define_insn "*czero.nez..opt2" @@ -60,7 +84,14 @@ (match_operand:GPR 2 "register_operand" "r") (match_operand:GPR 3 "register_operand" "1")))] "TARGET_ZICOND && rtx_equal_p (operands[1], operands[3])" - "czero.eqz\t%0,%2,%1" + { + if (TARGET_ZICOND) + return "czero.eqz\t%0,%2,%1"; + else if (TARGET_XVENTANACONDOPS && TARGET_64BIT) + return "vt.maskc\t%0,%2,%1"; + else + gcc_unreachable (); + } ) ;; Combine creates this form in some cases (particularly the coremark @@ -72,7 +103,7 @@ (match_operand 2 "immediate_operand")) (match_operand:X 3 "register_operand"))) (clobber (match_operand:X 4 "register_operand"))] - "TARGET_ZICOND && TARGET_ZBS" + "TARGET_ZICOND_LIKE && TARGET_ZBS" [(set (match_dup 4) (zero_extract:X (match_dup 1) (const_int 1) (match_dup 2))) (set (match_dup 0) (if_then_else:X (eq:X (match_dup 4) (const_int 0)) (const_int 0) @@ -85,7 +116,7 @@ (match_operand 2 "immediate_operand")) (match_operand:X 3 "register_operand"))) (clobber (match_operand:X 4 "register_operand"))] - "TARGET_ZICOND && !TARGET_ZBS && (UINTVAL (operands[2]) < 11)" + "TARGET_ZICOND_LIKE && !TARGET_ZBS && (UINTVAL (operands[2]) < 11)" [(set (match_dup 4) (and:X (match_dup 1) (match_dup 2))) (set (match_dup 0) (if_then_else:X (eq:X (match_dup 4) (const_int 0)) (const_int 0) diff --git a/gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics-rv32.c b/gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics-rv32.c new file mode 100644 index 000000000000..862ad309b52c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics-rv32.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32gc_xventanacondops -mabi=ilp32d" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og"} } */ + +#include "zicond-primitiveSemantics.c" + +/* { dg-final { scan-assembler-not "vt\\.maskc\t" } } */ +/* { dg-final { scan-assembler-not "vt\\.maskcn\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics.c b/gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics.c new file mode 100644 index 000000000000..644ca12d6470 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/xventanacondops-primitiveSemantics.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_xventanacondops -mabi=lp64d" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og"} } */ + +#include "zicond-primitiveSemantics.c" + +/* { dg-final { scan-assembler-times "vt\\.maskc\t" 6 } } */ +/* { dg-final { scan-assembler-times "vt\\.maskcn\t" 6 } } */ +/* { dg-final { scan-assembler-not "beq" } } */ +/* { dg-final { scan-assembler-not "bne" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/xventanacondops-xor-01.c b/gcc/testsuite/gcc.target/riscv/xventanacondops-xor-01.c new file mode 100644 index 000000000000..634eff84f89d --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/xventanacondops-xor-01.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_xventanacondops -mabi=lp64d" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Os" "-Oz" } } */ + +#include "zicond-xor-01.c" + +/* { dg-final { scan-assembler-times "vt\\.maskc\t" 1 } } */ +/* { dg-final { scan-assembler-times "xor\t" 1 } } */