Message ID | 20230224055127.2500953-4-christoph.muellner@vrull.eu |
---|---|
State | Committed |
Headers |
Return-Path: <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A6F073881D06 for <patchwork@sourceware.org>; Fri, 24 Feb 2023 05:52:40 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by sourceware.org (Postfix) with ESMTPS id 62D563858284 for <gcc-patches@gcc.gnu.org>; Fri, 24 Feb 2023 05:51:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 62D563858284 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=vrull.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=vrull.eu Received: by mail-wr1-x435.google.com with SMTP id j2so12598894wrh.9 for <gcc-patches@gcc.gnu.org>; Thu, 23 Feb 2023 21:51:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mLY2KBcxNirQKo1ZMJ0EbmdYwsXhqkpZtLZaeqQmVFQ=; b=FtQOgZ/fAnSliqEEHfmc5fvdiELFHPRvbBTrEP054oUsXQaA8Jm12Rm4SA57L1oA0u xv5E8m0QdkphAfPNDbbFB6vO04OMqVHU7+R0dzJscljXI/n7sJx6ZfX5tOOHUzVGxyW8 F1rCwEsECUXFV8f60zx0kdgfj7ReYbaUjG9TdCD7xtLJ6IumeL9lV7XRCjN/FYZyUSHz uGM/bAPrskfpGc/Rf+ym/Gtqq0wdmCdzawYgUmOgET3E2tnQ9kS8wHFcXV5Wr/gszzAp Hy4BiJ7jBCfCG3fhlklUmc6PTLwbNf82ihuPVFyXT/VhoZrcZr0Hq/Hgy3x6hvaU9m3B VzQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mLY2KBcxNirQKo1ZMJ0EbmdYwsXhqkpZtLZaeqQmVFQ=; b=TMvvUTX6glekuV0BobvWG5uYh97wp3hBkaB/zVogVtavaQ+G0coOVJsCtRnVbJvRA/ snUKSop0NVrUr7UlJLeIjjtwmRnRcIZMQEIC+kbUCIW3E8d7TaRJW1rGBVOxLrVwSUvV /LEAZvGbez0VkbM/mq5dUs2e6ejZvrXylj1zPPrf1BH9VbnoGKqvjuzzIcorxU5DP/mN 8iEXcXQrPp6TyMwyTvJ22Rckv1FHKEZ3Wur9ZGgITa8t0pbJsSgy+eGhcUh57FIoSFwa iuGrOOtfEUbzN32js9RdJlyPwcFZWIztLvWasjVxjXtMUKmaQiPzUsOXD7Ioej6uhckC s8fg== X-Gm-Message-State: AO0yUKXLL43zLNAxxEgEhu6tT5RHA2BCi+Ytr4LsPkNRiOCmKJEj64pq v4XfiKQ/7jHyVzemCc14kRa7/xVlv8UTx3L7 X-Google-Smtp-Source: AK7set+98D9UdN3gtwP6ehU/wo+BnKf+8xNJnyZbwBGY+LNeDgJ6ccTbRsu8JfIzGRHohiOYhNIrZw== X-Received: by 2002:a5d:51ca:0:b0:2c7:1159:ea43 with SMTP id n10-20020a5d51ca000000b002c71159ea43mr4031389wrv.51.1677217896430; Thu, 23 Feb 2023 21:51:36 -0800 (PST) Received: from beast.fritz.box (62-178-148-172.cable.dynamic.surfer.at. [62.178.148.172]) by smtp.gmail.com with ESMTPSA id f18-20020adffcd2000000b002c59e001631sm11704055wrs.77.2023.02.23.21.51.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Feb 2023 21:51:35 -0800 (PST) From: Christoph Muellner <christoph.muellner@vrull.eu> To: gcc-patches@gcc.gnu.org, Kito Cheng <kito.cheng@sifive.com>, Jim Wilson <jim.wilson.gcc@gmail.com>, Palmer Dabbelt <palmer@dabbelt.com>, Andrew Waterman <andrew@sifive.com>, Philipp Tomsich <philipp.tomsich@vrull.eu>, Jeff Law <jeffreyalaw@gmail.com>, Cooper Qu <cooper.qu@linux.alibaba.com>, Lifang Xia <lifang_xia@linux.alibaba.com>, Yunhai Shang <yunhai@linux.alibaba.com>, Zhiwei Liu <zhiwei_liu@linux.alibaba.com> Cc: =?utf-8?q?Christoph_M=C3=BCllner?= <christoph.muellner@vrull.eu> Subject: [PATCH v3 03/11] riscv: thead: Add support for the XTheadBa ISA extension Date: Fri, 24 Feb 2023 06:51:19 +0100 Message-Id: <20230224055127.2500953-4-christoph.muellner@vrull.eu> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230224055127.2500953-1-christoph.muellner@vrull.eu> References: <20230224055127.2500953-1-christoph.muellner@vrull.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_MANYTO, KAM_SHORT, RCVD_IN_DNSWL_NONE, 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.29 Precedence: list List-Id: Gcc-patches mailing list <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> |
Series |
RISC-V: Add XThead* extension support
|
|
Commit Message
Christoph Müllner
Feb. 24, 2023, 5:51 a.m. UTC
From: Christoph Müllner <christoph.muellner@vrull.eu> This patch adds support for the XTheadBa ISA extension. The new INSN pattern is defined in a new file to separate this vendor extension from the standard extensions. gcc/ChangeLog: * config/riscv/riscv.md: Include thead.md * config/riscv/thead.md: New file. gcc/testsuite/ChangeLog: * gcc.target/riscv/xtheadba-addsl.c: New test. Changes in v3: - Fix operand order for th.addsl. Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> --- gcc/config/riscv/riscv.md | 1 + gcc/config/riscv/thead.md | 31 +++++++++++ .../gcc.target/riscv/xtheadba-addsl.c | 55 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 gcc/config/riscv/thead.md create mode 100644 gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c
Comments
On Thu, Feb 23, 2023 at 9:55 PM Christoph Muellner <christoph.muellner@vrull.eu> wrote: > > From: Christoph Müllner <christoph.muellner@vrull.eu> > > This patch adds support for the XTheadBa ISA extension. > The new INSN pattern is defined in a new file to separate > this vendor extension from the standard extensions. How does this interact with doing -march=rv32gc_xtheadba_zba ? Seems like it might be better handle that case correctly. I suspect these all XThreadB* extensions have a similar problem too. Thanks, Andrew Pinski > > gcc/ChangeLog: > > * config/riscv/riscv.md: Include thead.md > * config/riscv/thead.md: New file. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/xtheadba-addsl.c: New test. > > Changes in v3: > - Fix operand order for th.addsl. > > Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> > --- > gcc/config/riscv/riscv.md | 1 + > gcc/config/riscv/thead.md | 31 +++++++++++ > .../gcc.target/riscv/xtheadba-addsl.c | 55 +++++++++++++++++++ > 3 files changed, 87 insertions(+) > create mode 100644 gcc/config/riscv/thead.md > create mode 100644 gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > index 05924e9bbf1..d6c2265e9d4 100644 > --- a/gcc/config/riscv/riscv.md > +++ b/gcc/config/riscv/riscv.md > @@ -3093,4 +3093,5 @@ (define_insn "riscv_prefetchi_<mode>" > (include "pic.md") > (include "generic.md") > (include "sifive-7.md") > +(include "thead.md") > (include "vector.md") > diff --git a/gcc/config/riscv/thead.md b/gcc/config/riscv/thead.md > new file mode 100644 > index 00000000000..158e9124c3a > --- /dev/null > +++ b/gcc/config/riscv/thead.md > @@ -0,0 +1,31 @@ > +;; Machine description for T-Head vendor extensions > +;; Copyright (C) 2021-2022 Free Software Foundation, Inc. > + > +;; This file is part of GCC. > + > +;; GCC is free software; you can redistribute it and/or modify > +;; it under the terms of the GNU General Public License as published by > +;; the Free Software Foundation; either version 3, or (at your option) > +;; any later version. > + > +;; GCC is distributed in the hope that it will be useful, > +;; but WITHOUT ANY WARRANTY; without even the implied warranty of > +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +;; GNU General Public License for more details. > + > +;; You should have received a copy of the GNU General Public License > +;; along with GCC; see the file COPYING3. If not see > +;; <http://www.gnu.org/licenses/>. > + > +;; XTheadBa > + > +(define_insn "*th_addsl" > + [(set (match_operand:X 0 "register_operand" "=r") > + (plus:X (ashift:X (match_operand:X 1 "register_operand" "r") > + (match_operand:QI 2 "immediate_operand" "I")) > + (match_operand:X 3 "register_operand" "r")))] > + "TARGET_XTHEADBA > + && (INTVAL (operands[2]) >= 0) && (INTVAL (operands[2]) <= 3)" > + "th.addsl\t%0,%3,%1,%2" > + [(set_attr "type" "bitmanip") > + (set_attr "mode" "<X:MODE>")]) > diff --git a/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > new file mode 100644 > index 00000000000..5004735a246 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > @@ -0,0 +1,55 @@ > +/* { dg-do compile } */ > +/* { dg-options "-march=rv32gc_xtheadba" { target { rv32 } } } */ > +/* { dg-options "-march=rv64gc_xtheadba" { target { rv64 } } } */ > +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ > + > +long > +test_1 (long a, long b) > +{ > + /* th.addsl aX, aX, 1 */ > + return a + (b << 1); > +} > + > +int > +foos (short *x, int n) > +{ > + /* th.addsl aX, aX, 1 */ > + return x[n]; > +} > + > +long > +test_2 (long a, long b) > +{ > + /* th.addsl aX, aX, 2 */ > + return a + (b << 2); > +} > + > +int > +fooi (int *x, int n) > +{ > + /* th.addsl aX, aX, 2 */ > + return x[n]; > +} > + > +long > +test_3 (long a, long b) > +{ > + /* th.addsl aX, aX, 3 */ > + return a + (b << 3); > +} > + > +long > +fool (long *x, int n) > +{ > + /* th.addsl aX, aX, 2 (rv32) */ > + /* th.addsl aX, aX, 3 (rv64) */ > + return x[n]; > +} > + > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,1" 2 } } */ > + > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 3 { target { rv32 } } } } */ > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 2 { target { rv64 } } } } */ > + > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 1 { target { rv32 } } } } */ > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 2 { target { rv64 } } } } */ > -- > 2.39.2 >
My impression is that md patterns will use first-match patterns? so the zba will get higher priority than xtheadba if both patterns are matched? On Fri, Feb 24, 2023 at 2:52 PM Andrew Pinski via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On Thu, Feb 23, 2023 at 9:55 PM Christoph Muellner > <christoph.muellner@vrull.eu> wrote: > > > > From: Christoph Müllner <christoph.muellner@vrull.eu> > > > > This patch adds support for the XTheadBa ISA extension. > > The new INSN pattern is defined in a new file to separate > > this vendor extension from the standard extensions. > > How does this interact with doing -march=rv32gc_xtheadba_zba ? > Seems like it might be better handle that case correctly. I suspect > these all XThreadB* extensions have a similar problem too. > > Thanks, > Andrew Pinski > > > > > gcc/ChangeLog: > > > > * config/riscv/riscv.md: Include thead.md > > * config/riscv/thead.md: New file. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.target/riscv/xtheadba-addsl.c: New test. > > > > Changes in v3: > > - Fix operand order for th.addsl. > > > > Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> > > --- > > gcc/config/riscv/riscv.md | 1 + > > gcc/config/riscv/thead.md | 31 +++++++++++ > > .../gcc.target/riscv/xtheadba-addsl.c | 55 +++++++++++++++++++ > > 3 files changed, 87 insertions(+) > > create mode 100644 gcc/config/riscv/thead.md > > create mode 100644 gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > > index 05924e9bbf1..d6c2265e9d4 100644 > > --- a/gcc/config/riscv/riscv.md > > +++ b/gcc/config/riscv/riscv.md > > @@ -3093,4 +3093,5 @@ (define_insn "riscv_prefetchi_<mode>" > > (include "pic.md") > > (include "generic.md") > > (include "sifive-7.md") > > +(include "thead.md") > > (include "vector.md") > > diff --git a/gcc/config/riscv/thead.md b/gcc/config/riscv/thead.md > > new file mode 100644 > > index 00000000000..158e9124c3a > > --- /dev/null > > +++ b/gcc/config/riscv/thead.md > > @@ -0,0 +1,31 @@ > > +;; Machine description for T-Head vendor extensions > > +;; Copyright (C) 2021-2022 Free Software Foundation, Inc. > > + > > +;; This file is part of GCC. > > + > > +;; GCC is free software; you can redistribute it and/or modify > > +;; it under the terms of the GNU General Public License as published by > > +;; the Free Software Foundation; either version 3, or (at your option) > > +;; any later version. > > + > > +;; GCC is distributed in the hope that it will be useful, > > +;; but WITHOUT ANY WARRANTY; without even the implied warranty of > > +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +;; GNU General Public License for more details. > > + > > +;; You should have received a copy of the GNU General Public License > > +;; along with GCC; see the file COPYING3. If not see > > +;; <http://www.gnu.org/licenses/>. > > + > > +;; XTheadBa > > + > > +(define_insn "*th_addsl" > > + [(set (match_operand:X 0 "register_operand" "=r") > > + (plus:X (ashift:X (match_operand:X 1 "register_operand" "r") > > + (match_operand:QI 2 "immediate_operand" "I")) > > + (match_operand:X 3 "register_operand" "r")))] > > + "TARGET_XTHEADBA > > + && (INTVAL (operands[2]) >= 0) && (INTVAL (operands[2]) <= 3)" > > + "th.addsl\t%0,%3,%1,%2" > > + [(set_attr "type" "bitmanip") > > + (set_attr "mode" "<X:MODE>")]) > > diff --git a/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > new file mode 100644 > > index 00000000000..5004735a246 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > @@ -0,0 +1,55 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-march=rv32gc_xtheadba" { target { rv32 } } } */ > > +/* { dg-options "-march=rv64gc_xtheadba" { target { rv64 } } } */ > > +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ > > + > > +long > > +test_1 (long a, long b) > > +{ > > + /* th.addsl aX, aX, 1 */ > > + return a + (b << 1); > > +} > > + > > +int > > +foos (short *x, int n) > > +{ > > + /* th.addsl aX, aX, 1 */ > > + return x[n]; > > +} > > + > > +long > > +test_2 (long a, long b) > > +{ > > + /* th.addsl aX, aX, 2 */ > > + return a + (b << 2); > > +} > > + > > +int > > +fooi (int *x, int n) > > +{ > > + /* th.addsl aX, aX, 2 */ > > + return x[n]; > > +} > > + > > +long > > +test_3 (long a, long b) > > +{ > > + /* th.addsl aX, aX, 3 */ > > + return a + (b << 3); > > +} > > + > > +long > > +fool (long *x, int n) > > +{ > > + /* th.addsl aX, aX, 2 (rv32) */ > > + /* th.addsl aX, aX, 3 (rv64) */ > > + return x[n]; > > +} > > + > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,1" 2 } } */ > > + > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 3 { target { rv32 } } } } */ > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 2 { target { rv64 } } } } */ > > + > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 1 { target { rv32 } } } } */ > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 2 { target { rv64 } } } } */ > > -- > > 2.39.2 > >
On Fri, Feb 24, 2023 at 10:54 AM Kito Cheng <kito.cheng@gmail.com> wrote: > > My impression is that md patterns will use first-match patterns? so > the zba will get higher priority than xtheadba if both patterns are > matched? Yes, I was just about to write this. /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zba_xtheadba -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c The resulting xtheadba-addsl.s file has: .attribute arch, "rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0_zba1p0_xtheadba1p0" [...] sh1add a0,a1,a0 So the standard extension will be preferred over the custom extension. > > On Fri, Feb 24, 2023 at 2:52 PM Andrew Pinski via Gcc-patches > <gcc-patches@gcc.gnu.org> wrote: > > > > On Thu, Feb 23, 2023 at 9:55 PM Christoph Muellner > > <christoph.muellner@vrull.eu> wrote: > > > > > > From: Christoph Müllner <christoph.muellner@vrull.eu> > > > > > > This patch adds support for the XTheadBa ISA extension. > > > The new INSN pattern is defined in a new file to separate > > > this vendor extension from the standard extensions. > > > > How does this interact with doing -march=rv32gc_xtheadba_zba ? > > Seems like it might be better handle that case correctly. I suspect > > these all XThreadB* extensions have a similar problem too. > > > > Thanks, > > Andrew Pinski > > > > > > > > gcc/ChangeLog: > > > > > > * config/riscv/riscv.md: Include thead.md > > > * config/riscv/thead.md: New file. > > > > > > gcc/testsuite/ChangeLog: > > > > > > * gcc.target/riscv/xtheadba-addsl.c: New test. > > > > > > Changes in v3: > > > - Fix operand order for th.addsl. > > > > > > Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> > > > --- > > > gcc/config/riscv/riscv.md | 1 + > > > gcc/config/riscv/thead.md | 31 +++++++++++ > > > .../gcc.target/riscv/xtheadba-addsl.c | 55 +++++++++++++++++++ > > > 3 files changed, 87 insertions(+) > > > create mode 100644 gcc/config/riscv/thead.md > > > create mode 100644 gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > > > > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > > > index 05924e9bbf1..d6c2265e9d4 100644 > > > --- a/gcc/config/riscv/riscv.md > > > +++ b/gcc/config/riscv/riscv.md > > > @@ -3093,4 +3093,5 @@ (define_insn "riscv_prefetchi_<mode>" > > > (include "pic.md") > > > (include "generic.md") > > > (include "sifive-7.md") > > > +(include "thead.md") > > > (include "vector.md") > > > diff --git a/gcc/config/riscv/thead.md b/gcc/config/riscv/thead.md > > > new file mode 100644 > > > index 00000000000..158e9124c3a > > > --- /dev/null > > > +++ b/gcc/config/riscv/thead.md > > > @@ -0,0 +1,31 @@ > > > +;; Machine description for T-Head vendor extensions > > > +;; Copyright (C) 2021-2022 Free Software Foundation, Inc. > > > + > > > +;; This file is part of GCC. > > > + > > > +;; GCC is free software; you can redistribute it and/or modify > > > +;; it under the terms of the GNU General Public License as published by > > > +;; the Free Software Foundation; either version 3, or (at your option) > > > +;; any later version. > > > + > > > +;; GCC is distributed in the hope that it will be useful, > > > +;; but WITHOUT ANY WARRANTY; without even the implied warranty of > > > +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > > +;; GNU General Public License for more details. > > > + > > > +;; You should have received a copy of the GNU General Public License > > > +;; along with GCC; see the file COPYING3. If not see > > > +;; <http://www.gnu.org/licenses/>. > > > + > > > +;; XTheadBa > > > + > > > +(define_insn "*th_addsl" > > > + [(set (match_operand:X 0 "register_operand" "=r") > > > + (plus:X (ashift:X (match_operand:X 1 "register_operand" "r") > > > + (match_operand:QI 2 "immediate_operand" "I")) > > > + (match_operand:X 3 "register_operand" "r")))] > > > + "TARGET_XTHEADBA > > > + && (INTVAL (operands[2]) >= 0) && (INTVAL (operands[2]) <= 3)" > > > + "th.addsl\t%0,%3,%1,%2" > > > + [(set_attr "type" "bitmanip") > > > + (set_attr "mode" "<X:MODE>")]) > > > diff --git a/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > new file mode 100644 > > > index 00000000000..5004735a246 > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > @@ -0,0 +1,55 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-march=rv32gc_xtheadba" { target { rv32 } } } */ > > > +/* { dg-options "-march=rv64gc_xtheadba" { target { rv64 } } } */ > > > +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ > > > + > > > +long > > > +test_1 (long a, long b) > > > +{ > > > + /* th.addsl aX, aX, 1 */ > > > + return a + (b << 1); > > > +} > > > + > > > +int > > > +foos (short *x, int n) > > > +{ > > > + /* th.addsl aX, aX, 1 */ > > > + return x[n]; > > > +} > > > + > > > +long > > > +test_2 (long a, long b) > > > +{ > > > + /* th.addsl aX, aX, 2 */ > > > + return a + (b << 2); > > > +} > > > + > > > +int > > > +fooi (int *x, int n) > > > +{ > > > + /* th.addsl aX, aX, 2 */ > > > + return x[n]; > > > +} > > > + > > > +long > > > +test_3 (long a, long b) > > > +{ > > > + /* th.addsl aX, aX, 3 */ > > > + return a + (b << 3); > > > +} > > > + > > > +long > > > +fool (long *x, int n) > > > +{ > > > + /* th.addsl aX, aX, 2 (rv32) */ > > > + /* th.addsl aX, aX, 3 (rv64) */ > > > + return x[n]; > > > +} > > > + > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,1" 2 } } */ > > > + > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 3 { target { rv32 } } } } */ > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 2 { target { rv64 } } } } */ > > > + > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 1 { target { rv32 } } } } */ > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 2 { target { rv64 } } } } */ > > > -- > > > 2.39.2 > > >
On Fri, Feb 24, 2023 at 11:05 AM Christoph Müllner <christoph.muellner@vrull.eu> wrote: > > On Fri, Feb 24, 2023 at 10:54 AM Kito Cheng <kito.cheng@gmail.com> wrote: > > > > My impression is that md patterns will use first-match patterns? so > > the zba will get higher priority than xtheadba if both patterns are > > matched? > > Yes, I was just about to write this. > > /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 > -march=rv64gc_zba_xtheadba -mtune=thead-c906 -S > ./gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > The resulting xtheadba-addsl.s file has: > .attribute arch, "rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0_zba1p0_xtheadba1p0" > [...] > sh1add a0,a1,a0 > > So the standard extension will be preferred over the custom extension. I tested now with all of them (RV32 and RV64): /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zba_xtheadba -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-ext.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-extu.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-extu-2.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-ff1.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-rev.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-srri.c /opt/riscv-thead/bin/riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zbb_xtheadbs -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbs-tst.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zba_xtheadba -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-ext.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-extu.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-extu-2.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-ff1.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-rev.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbb -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbb-srri.c /opt/riscv-thead32/bin/riscv32-unknown-linux-gnu-gcc -O2 -march=rv32gc_zbb_xtheadbs -mtune=thead-c906 -S ./gcc/testsuite/gcc.target/riscv/xtheadbs-tst.c All behave ok (also when dropping the xtheadb* from the -march). Is it ok to leave this as is? Thanks, Christoph > > > > > > On Fri, Feb 24, 2023 at 2:52 PM Andrew Pinski via Gcc-patches > > <gcc-patches@gcc.gnu.org> wrote: > > > > > > On Thu, Feb 23, 2023 at 9:55 PM Christoph Muellner > > > <christoph.muellner@vrull.eu> wrote: > > > > > > > > From: Christoph Müllner <christoph.muellner@vrull.eu> > > > > > > > > This patch adds support for the XTheadBa ISA extension. > > > > The new INSN pattern is defined in a new file to separate > > > > this vendor extension from the standard extensions. > > > > > > How does this interact with doing -march=rv32gc_xtheadba_zba ? > > > Seems like it might be better handle that case correctly. I suspect > > > these all XThreadB* extensions have a similar problem too. > > > > > > Thanks, > > > Andrew Pinski > > > > > > > > > > > gcc/ChangeLog: > > > > > > > > * config/riscv/riscv.md: Include thead.md > > > > * config/riscv/thead.md: New file. > > > > > > > > gcc/testsuite/ChangeLog: > > > > > > > > * gcc.target/riscv/xtheadba-addsl.c: New test. > > > > > > > > Changes in v3: > > > > - Fix operand order for th.addsl. > > > > > > > > Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> > > > > --- > > > > gcc/config/riscv/riscv.md | 1 + > > > > gcc/config/riscv/thead.md | 31 +++++++++++ > > > > .../gcc.target/riscv/xtheadba-addsl.c | 55 +++++++++++++++++++ > > > > 3 files changed, 87 insertions(+) > > > > create mode 100644 gcc/config/riscv/thead.md > > > > create mode 100644 gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > > > > > > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > > > > index 05924e9bbf1..d6c2265e9d4 100644 > > > > --- a/gcc/config/riscv/riscv.md > > > > +++ b/gcc/config/riscv/riscv.md > > > > @@ -3093,4 +3093,5 @@ (define_insn "riscv_prefetchi_<mode>" > > > > (include "pic.md") > > > > (include "generic.md") > > > > (include "sifive-7.md") > > > > +(include "thead.md") > > > > (include "vector.md") > > > > diff --git a/gcc/config/riscv/thead.md b/gcc/config/riscv/thead.md > > > > new file mode 100644 > > > > index 00000000000..158e9124c3a > > > > --- /dev/null > > > > +++ b/gcc/config/riscv/thead.md > > > > @@ -0,0 +1,31 @@ > > > > +;; Machine description for T-Head vendor extensions > > > > +;; Copyright (C) 2021-2022 Free Software Foundation, Inc. > > > > + > > > > +;; This file is part of GCC. > > > > + > > > > +;; GCC is free software; you can redistribute it and/or modify > > > > +;; it under the terms of the GNU General Public License as published by > > > > +;; the Free Software Foundation; either version 3, or (at your option) > > > > +;; any later version. > > > > + > > > > +;; GCC is distributed in the hope that it will be useful, > > > > +;; but WITHOUT ANY WARRANTY; without even the implied warranty of > > > > +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > > > +;; GNU General Public License for more details. > > > > + > > > > +;; You should have received a copy of the GNU General Public License > > > > +;; along with GCC; see the file COPYING3. If not see > > > > +;; <http://www.gnu.org/licenses/>. > > > > + > > > > +;; XTheadBa > > > > + > > > > +(define_insn "*th_addsl" > > > > + [(set (match_operand:X 0 "register_operand" "=r") > > > > + (plus:X (ashift:X (match_operand:X 1 "register_operand" "r") > > > > + (match_operand:QI 2 "immediate_operand" "I")) > > > > + (match_operand:X 3 "register_operand" "r")))] > > > > + "TARGET_XTHEADBA > > > > + && (INTVAL (operands[2]) >= 0) && (INTVAL (operands[2]) <= 3)" > > > > + "th.addsl\t%0,%3,%1,%2" > > > > + [(set_attr "type" "bitmanip") > > > > + (set_attr "mode" "<X:MODE>")]) > > > > diff --git a/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > > new file mode 100644 > > > > index 00000000000..5004735a246 > > > > --- /dev/null > > > > +++ b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c > > > > @@ -0,0 +1,55 @@ > > > > +/* { dg-do compile } */ > > > > +/* { dg-options "-march=rv32gc_xtheadba" { target { rv32 } } } */ > > > > +/* { dg-options "-march=rv64gc_xtheadba" { target { rv64 } } } */ > > > > +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ > > > > + > > > > +long > > > > +test_1 (long a, long b) > > > > +{ > > > > + /* th.addsl aX, aX, 1 */ > > > > + return a + (b << 1); > > > > +} > > > > + > > > > +int > > > > +foos (short *x, int n) > > > > +{ > > > > + /* th.addsl aX, aX, 1 */ > > > > + return x[n]; > > > > +} > > > > + > > > > +long > > > > +test_2 (long a, long b) > > > > +{ > > > > + /* th.addsl aX, aX, 2 */ > > > > + return a + (b << 2); > > > > +} > > > > + > > > > +int > > > > +fooi (int *x, int n) > > > > +{ > > > > + /* th.addsl aX, aX, 2 */ > > > > + return x[n]; > > > > +} > > > > + > > > > +long > > > > +test_3 (long a, long b) > > > > +{ > > > > + /* th.addsl aX, aX, 3 */ > > > > + return a + (b << 3); > > > > +} > > > > + > > > > +long > > > > +fool (long *x, int n) > > > > +{ > > > > + /* th.addsl aX, aX, 2 (rv32) */ > > > > + /* th.addsl aX, aX, 3 (rv64) */ > > > > + return x[n]; > > > > +} > > > > + > > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,1" 2 } } */ > > > > + > > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 3 { target { rv32 } } } } */ > > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 2 { target { rv64 } } } } */ > > > > + > > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 1 { target { rv32 } } } } */ > > > > +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 2 { target { rv64 } } } } */ > > > > -- > > > > 2.39.2 > > > >
diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index 05924e9bbf1..d6c2265e9d4 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -3093,4 +3093,5 @@ (define_insn "riscv_prefetchi_<mode>" (include "pic.md") (include "generic.md") (include "sifive-7.md") +(include "thead.md") (include "vector.md") diff --git a/gcc/config/riscv/thead.md b/gcc/config/riscv/thead.md new file mode 100644 index 00000000000..158e9124c3a --- /dev/null +++ b/gcc/config/riscv/thead.md @@ -0,0 +1,31 @@ +;; Machine description for T-Head vendor extensions +;; Copyright (C) 2021-2022 Free Software Foundation, Inc. + +;; This file is part of GCC. + +;; GCC is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; GCC is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GCC; see the file COPYING3. If not see +;; <http://www.gnu.org/licenses/>. + +;; XTheadBa + +(define_insn "*th_addsl" + [(set (match_operand:X 0 "register_operand" "=r") + (plus:X (ashift:X (match_operand:X 1 "register_operand" "r") + (match_operand:QI 2 "immediate_operand" "I")) + (match_operand:X 3 "register_operand" "r")))] + "TARGET_XTHEADBA + && (INTVAL (operands[2]) >= 0) && (INTVAL (operands[2]) <= 3)" + "th.addsl\t%0,%3,%1,%2" + [(set_attr "type" "bitmanip") + (set_attr "mode" "<X:MODE>")]) diff --git a/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c new file mode 100644 index 00000000000..5004735a246 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/xtheadba-addsl.c @@ -0,0 +1,55 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32gc_xtheadba" { target { rv32 } } } */ +/* { dg-options "-march=rv64gc_xtheadba" { target { rv64 } } } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ + +long +test_1 (long a, long b) +{ + /* th.addsl aX, aX, 1 */ + return a + (b << 1); +} + +int +foos (short *x, int n) +{ + /* th.addsl aX, aX, 1 */ + return x[n]; +} + +long +test_2 (long a, long b) +{ + /* th.addsl aX, aX, 2 */ + return a + (b << 2); +} + +int +fooi (int *x, int n) +{ + /* th.addsl aX, aX, 2 */ + return x[n]; +} + +long +test_3 (long a, long b) +{ + /* th.addsl aX, aX, 3 */ + return a + (b << 3); +} + +long +fool (long *x, int n) +{ + /* th.addsl aX, aX, 2 (rv32) */ + /* th.addsl aX, aX, 3 (rv64) */ + return x[n]; +} + +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,1" 2 } } */ + +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 3 { target { rv32 } } } } */ +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,2" 2 { target { rv64 } } } } */ + +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 1 { target { rv32 } } } } */ +/* { dg-final { scan-assembler-times "th.addsl\[ \t\]*a\[0-9\]+,a\[0-9\]+,a\[0-9\]+,3" 2 { target { rv64 } } } } */