From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by sourceware.org (Postfix) with ESMTPS id BBE4A384AB44 for ; Wed, 8 May 2024 07:36:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BBE4A384AB44 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=vrull.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=vrull.eu ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BBE4A384AB44 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::134 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715153809; cv=none; b=hhRjMnJ6cAL2RmsLLQmvg7yvl3XE7tZkT+Gh8jRoXoBDu6Pfp9tR0K4klKf+xcasASWmBxZ9zF7BL6sNscwNl7yU2PQYozIoRlYuu8rP/CAloAP/HEk5YFCh7Jq2auW9vbr6K3gfYE9Mc8O4S7/C4PGR+lrCVY1hvKn1twIKYFI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715153809; c=relaxed/simple; bh=0686pnkXSPI2c0hx7kIitvGkvZHr9sx3c5Cx9tOe/EY=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=bX3GQsu7M9cRyB4Z4jQzZut85K/2Ha5rxMDrnoa8TX+O1y8p/iCmc7K13AHUShXMA+++LXKOQREXc4Lswr21BOVvNS7hMNHXGaWZ4AQvCFOrY9qnCC5Tmt8KPNJZdEN3otkIjhB4wy9SEe9TAd1SMPJq4c5tz9YibNuA0hLZdwU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lf1-x134.google.com with SMTP id 2adb3069b0e04-5210684cee6so2487114e87.0 for ; Wed, 08 May 2024 00:36:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; t=1715153803; x=1715758603; darn=gcc.gnu.org; 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=QJe/VnDa9Xx0RwVGomC0pbaBUDuUNdkGa9Tofcktf80=; b=bV/hnLkF+c5Cty2VEwL2nKBVZoQpwnlG5fXuqea2j2UHl78tF/HNKHpTnuEHMXV+Pv B7+xtRTMTxxg3jj4udPT8Je3mT+pWwPhcZh5f73QNmcr6UPVODOxdtyh9B5o5nmL2FBG 2YCVA81Et863bwVX1ZxJt9W15etDgsvykUrvRof1kq85dpGYKFpblwNmWTsYYArspUxd azdbA116jg+ftDKuKpF4Lwe17TTo9IDN/QzjKm3msn8UMykfQTeX6cFtRNhet6tW5mn7 bmAWBOeg+UnE3R1w3So3meeVvFJx3X/TnicOOO1teyTZgRte0ghJaMgAhDSnFKnuit0u Cstg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715153803; x=1715758603; 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=QJe/VnDa9Xx0RwVGomC0pbaBUDuUNdkGa9Tofcktf80=; b=Ccx3qUJ7I/FOJlqCJPv6x+XmZ0cMJn8ByLGxNPKgpeCCCP+qflqY215baXMiLHwiRp i/GQ8ebSvw0PQo9iBj2Irx2jxCCz9TFd2yGvxrKimvZvBIrnWCkalbj82XRnH7i+iCAo 6yERPsYxLzV27BvcP9LMrbZtMpMe7aWdGWMU3cKwf6kam2kEihr0kUfbhGFw3EGFKuH6 vPDSl9t9iCBwoUnd+MssC7YIq97nQXGGabPIgU3wbnSy6qbGVShZhTgGF1Q6GSWJqGG6 Yof3RRjx2HbymFrT0M9F8wA+8dZE09N0co8IVwqeUW7cOSNxAM9MK3XU798sTaduvgwg xYBw== X-Gm-Message-State: AOJu0YxXoTzZ1NkIUzzKxlOvB6B7sZaSY6Wtv+Eh9opYklEjDeezYr5l 9D61mgBtVnxpBW5hofdUACf0AqMTMamr8vcjTCYRXQBBa+G35JLbXxAw4tjV2eEmqUBtyb7PrQm Asv4= X-Google-Smtp-Source: AGHT+IEKegFvoFeQKGLSi6l8ndSlAIdWZdN5OZS+KqZcEDCMQ3Q6pZ5x8L+VHyJtHXl+c/IU5tWIlg== X-Received: by 2002:a19:5f5e:0:b0:51d:abb3:d701 with SMTP id 2adb3069b0e04-5217c276f12mr1029430e87.5.1715153803462; Wed, 08 May 2024 00:36:43 -0700 (PDT) Received: from antares.fritz.box (62-178-148-172.cable.dynamic.surfer.at. [62.178.148.172]) by smtp.gmail.com with ESMTPSA id ef14-20020a05640228ce00b00572678527e6sm7275295edb.59.2024.05.08.00.36.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 May 2024 00:36:42 -0700 (PDT) From: =?UTF-8?q?Christoph=20M=C3=BCllner?= To: gcc-patches@gcc.gnu.org, Kito Cheng , Jim Wilson , Palmer Dabbelt , Andrew Waterman , Philipp Tomsich , Jeff Law , Vineet Gupta Cc: =?UTF-8?q?Christoph=20M=C3=BCllner?= Subject: [PATCH v2 3/4] RISC-V: Add zero_extract support for rv64gc Date: Wed, 8 May 2024 09:36:35 +0200 Message-ID: <20240508073636.1896951-3-christoph.muellner@vrull.eu> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240508073636.1896951-1-christoph.muellner@vrull.eu> References: <20240508073636.1896951-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=-11.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_MANYTO,KAM_SHORT,LIKELY_SPAM_BODY,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 List-Id: The combiner attempts to optimize a zero-extension of a logical right shift using zero_extract. We already utilize this optimization for those cases that result in a single instructions. Let's add a insn_and_split pattern that also matches the generic case, where we can emit an optimized sequence of a slli/srli. Tested with SPEC CPU 2017 (rv64gc). PR 111501 gcc/ChangeLog: * config/riscv/riscv.md (*lshr3_zero_extend_4): New pattern for zero-extraction. gcc/testsuite/ChangeLog: * gcc.target/riscv/extend-shift-helpers.h: New test. * gcc.target/riscv/pr111501.c: New test. * gcc.target/riscv/zero-extend-rshift-32.c: New test. * gcc.target/riscv/zero-extend-rshift-64.c: New test. * gcc.target/riscv/zero-extend-rshift.c: New test. Signed-off-by: Christoph Müllner --- gcc/config/riscv/riscv.md | 30 +++++ .../gcc.target/riscv/extend-shift-helpers.h | 26 ++++ gcc/testsuite/gcc.target/riscv/pr111501.c | 21 ++++ .../gcc.target/riscv/zero-extend-rshift-32.c | 13 ++ .../gcc.target/riscv/zero-extend-rshift-64.c | 17 +++ .../gcc.target/riscv/zero-extend-rshift.c | 115 ++++++++++++++++++ 6 files changed, 222 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/extend-shift-helpers.h create mode 100644 gcc/testsuite/gcc.target/riscv/pr111501.c create mode 100644 gcc/testsuite/gcc.target/riscv/zero-extend-rshift-32.c create mode 100644 gcc/testsuite/gcc.target/riscv/zero-extend-rshift-64.c create mode 100644 gcc/testsuite/gcc.target/riscv/zero-extend-rshift.c diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index b7fc13e4e61..58bf7712277 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -2793,6 +2793,36 @@ (define_insn "*lshrsi3_zero_extend_3" [(set_attr "type" "shift") (set_attr "mode" "SI")]) +;; Canonical form for a zero-extend of a logical right shift. +;; Special cases are handled above. +;; Skip for single-bit extraction (Zbs/XTheadBs) and th.extu (XTheadBb) +(define_insn_and_split "*lshr3_zero_extend_4" + [(set (match_operand:GPR 0 "register_operand" "=r") + (zero_extract:GPR + (match_operand:GPR 1 "register_operand" " r") + (match_operand 2 "const_int_operand") + (match_operand 3 "const_int_operand"))) + (clobber (match_scratch:GPR 4 "=&r"))] + "!((TARGET_ZBS || TARGET_XTHEADBS) && (INTVAL (operands[2]) == 1)) + && !TARGET_XTHEADBB" + "#" + "&& reload_completed" + [(set (match_dup 4) + (ashift:GPR (match_dup 1) (match_dup 2))) + (set (match_dup 0) + (lshiftrt:GPR (match_dup 4) (match_dup 3)))] +{ + int regbits = GET_MODE_BITSIZE (GET_MODE (operands[0])).to_constant (); + int sizebits = INTVAL (operands[2]); + int startbits = INTVAL (operands[3]); + int lshamt = regbits - sizebits - startbits; + int rshamt = lshamt + startbits; + operands[2] = GEN_INT (lshamt); + operands[3] = GEN_INT (rshamt); +} + [(set_attr "type" "shift") + (set_attr "mode" "")]) + ;; Handle AND with 2^N-1 for N from 12 to XLEN. This can be split into ;; two logical shifts. Otherwise it requires 3 instructions: lui, ;; xor/addi/srli, and. diff --git a/gcc/testsuite/gcc.target/riscv/extend-shift-helpers.h b/gcc/testsuite/gcc.target/riscv/extend-shift-helpers.h new file mode 100644 index 00000000000..4853fe490d8 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/extend-shift-helpers.h @@ -0,0 +1,26 @@ +#ifndef EXTEND_SHIFT_HELPERS_H +#define EXTEND_SHIFT_HELPERS_H + +#define RT_EXT_CT_RSHIFT_N_AT(RTS,RT,CTS,CT,N,ATS,AT) \ +RTS RT \ +RTS##_##RT##_ext_##CTS##_##CT##_rshift_##N##_##ATS##_##AT(ATS AT v) \ +{ \ + return (CTS CT)(v >> N); \ +} + +#define ULONG_EXT_USHORT_RSHIFT_N_ULONG(N) \ + RT_EXT_CT_RSHIFT_N_AT(unsigned,long,unsigned,short,N,unsigned,long) + +#define ULONG_EXT_UINT_RSHIFT_N_ULONG(N) \ + RT_EXT_CT_RSHIFT_N_AT(unsigned,long,unsigned,int,N,unsigned,long) + +#define UINT_EXT_USHORT_RSHIFT_N_UINT(N) \ + RT_EXT_CT_RSHIFT_N_AT(unsigned,int,unsigned,short,N,unsigned,int) + +#define UINT_EXT_USHORT_RSHIFT_N_ULONG(N) \ + RT_EXT_CT_RSHIFT_N_AT(unsigned,int,unsigned,short,N,unsigned,long) + +#define ULONG_EXT_USHORT_RSHIFT_N_UINT(N) \ + RT_EXT_CT_RSHIFT_N_AT(unsigned,long,unsigned,short,N,unsigned,int) + +#endif /* EXTEND_SHIFT_HELPERS_H */ diff --git a/gcc/testsuite/gcc.target/riscv/pr111501.c b/gcc/testsuite/gcc.target/riscv/pr111501.c new file mode 100644 index 00000000000..db48c34ce9a --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr111501.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv64 } */ +/* { dg-options "-march=rv64gc" { target { rv64 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ + +unsigned int +do_shift(unsigned long csum) +{ + return (unsigned short)(csum >> 32); +} + +unsigned int +do_shift2(unsigned long csum) +{ + return (csum << 16) >> 48; +} + +/* { dg-final { scan-assembler-times "slli\t" 2 } } */ +/* { dg-final { scan-assembler-times "srli\t" 2 } } */ +/* { dg-final { scan-assembler-times "slli\ta\[0-9\],a\[0-9\],16" 2 } } */ +/* { dg-final { scan-assembler-times "srli\ta\[0-9\],a\[0-9\],48" 2 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zero-extend-rshift-32.c b/gcc/testsuite/gcc.target/riscv/zero-extend-rshift-32.c new file mode 100644 index 00000000000..c995a6e0dfa --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zero-extend-rshift-32.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv32 } */ +/* { dg-options "-march=rv32gc" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ + +#include "extend-shift-helpers.h" + +/* { dg-final { scan-assembler "slli\ta\[0-9\],a\[0-9\],2" } } */ +/* { dg-final { scan-assembler "srli\ta\[0-9\],a\[0-9\],16" } } */ +ULONG_EXT_USHORT_RSHIFT_N_ULONG(14) + +/* { dg-final { scan-assembler "srli\ta\[0-9\],a\[0-9\],23" } } */ +ULONG_EXT_UINT_RSHIFT_N_ULONG(23) diff --git a/gcc/testsuite/gcc.target/riscv/zero-extend-rshift-64.c b/gcc/testsuite/gcc.target/riscv/zero-extend-rshift-64.c new file mode 100644 index 00000000000..847fadf660f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zero-extend-rshift-64.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv64 } */ +/* { dg-options "-march=rv64gc" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ + +#include "extend-shift-helpers.h" + +/* { dg-final { scan-assembler "slli\ta\[0-9\],a\[0-9\],34" } } */ +/* { dg-final { scan-assembler "srli\ta\[0-9\],a\[0-9\],48" } } */ +ULONG_EXT_USHORT_RSHIFT_N_ULONG(14) + +/* { dg-final { scan-assembler "srli\ta\[0-9\],a\[0-9\],51" } } */ +ULONG_EXT_USHORT_RSHIFT_N_ULONG(51) + +/* { dg-final { scan-assembler "slli\ta\[0-9\],a\[0-9\],9" } } */ +/* { dg-final { scan-assembler "srli\ta\[0-9\],a\[0-9\],32" } } */ +ULONG_EXT_UINT_RSHIFT_N_ULONG(23) diff --git a/gcc/testsuite/gcc.target/riscv/zero-extend-rshift.c b/gcc/testsuite/gcc.target/riscv/zero-extend-rshift.c new file mode 100644 index 00000000000..8b27b0eb9ba --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zero-extend-rshift.c @@ -0,0 +1,115 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32gc" { target { rv32 } } } */ +/* { dg-options "-march=rv64gc" { target { rv64 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ + +// Tests for merging rshifts into zero-extensions. +// u8-casts are skipped as they can be done with one instruction (andi 0xff). + +#include "extend-shift-helpers.h" + +// Below "slli (16-N); srli 16" for rv32 +// Below "slli ((32+16)-N); srli (32+16)" for rv64 +ULONG_EXT_USHORT_RSHIFT_N_ULONG(1) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(7) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(8) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(9) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(15) +// Below "srli 16" for rv32 +// Below "srliw 16" for rv64 +ULONG_EXT_USHORT_RSHIFT_N_ULONG(16) +// Below "srli N" for rv32 +// Below "slli ((32+16)-N); srli (32+16)" for rv64 +ULONG_EXT_USHORT_RSHIFT_N_ULONG(17) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(23) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(24) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(25) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(31) +// Below compiler warning for rv32 +#if __riscv_xlen == 64 +// Below "slli ((32+16)-N); srli (32+16)" for rv64 +ULONG_EXT_USHORT_RSHIFT_N_ULONG(32) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(33) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(39) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(40) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(41) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(47) +// Below "srli N" for rv64 +ULONG_EXT_USHORT_RSHIFT_N_ULONG(48) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(49) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(55) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(56) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(57) +ULONG_EXT_USHORT_RSHIFT_N_ULONG(63) +#endif /* __riscv_xlen == 64 */ + + + +// Below "srli N" for rv32 +// Below "slli (32-N); srli 32" for rv64 +ULONG_EXT_UINT_RSHIFT_N_ULONG(1) +ULONG_EXT_UINT_RSHIFT_N_ULONG(7) +ULONG_EXT_UINT_RSHIFT_N_ULONG(8) +ULONG_EXT_UINT_RSHIFT_N_ULONG(9) +ULONG_EXT_UINT_RSHIFT_N_ULONG(15) +ULONG_EXT_UINT_RSHIFT_N_ULONG(16) +ULONG_EXT_UINT_RSHIFT_N_ULONG(17) +ULONG_EXT_UINT_RSHIFT_N_ULONG(23) +ULONG_EXT_UINT_RSHIFT_N_ULONG(24) +ULONG_EXT_UINT_RSHIFT_N_ULONG(25) +ULONG_EXT_UINT_RSHIFT_N_ULONG(31) +// Below compiler warning for rv32 +#if __riscv_xlen == 64 +// Below "srli N" for rv64 +ULONG_EXT_UINT_RSHIFT_N_ULONG(32) +ULONG_EXT_UINT_RSHIFT_N_ULONG(33) +ULONG_EXT_UINT_RSHIFT_N_ULONG(39) +ULONG_EXT_UINT_RSHIFT_N_ULONG(40) +ULONG_EXT_UINT_RSHIFT_N_ULONG(41) +ULONG_EXT_UINT_RSHIFT_N_ULONG(47) +ULONG_EXT_UINT_RSHIFT_N_ULONG(48) +ULONG_EXT_UINT_RSHIFT_N_ULONG(49) +ULONG_EXT_UINT_RSHIFT_N_ULONG(55) +ULONG_EXT_UINT_RSHIFT_N_ULONG(56) +ULONG_EXT_UINT_RSHIFT_N_ULONG(57) +ULONG_EXT_UINT_RSHIFT_N_ULONG(63) +#endif /* __riscv_xlen == 64 */ + + + +#if __riscv_xlen == 64 +// Below "slli ((32+16)-N); srli (32+16)" for rv64 +UINT_EXT_USHORT_RSHIFT_N_UINT(1) +UINT_EXT_USHORT_RSHIFT_N_UINT(7) +UINT_EXT_USHORT_RSHIFT_N_UINT(8) +UINT_EXT_USHORT_RSHIFT_N_UINT(9) +UINT_EXT_USHORT_RSHIFT_N_UINT(15) +// Below "srliw N" for rv64 +UINT_EXT_USHORT_RSHIFT_N_UINT(16) +UINT_EXT_USHORT_RSHIFT_N_UINT(17) +UINT_EXT_USHORT_RSHIFT_N_UINT(23) +UINT_EXT_USHORT_RSHIFT_N_UINT(24) +UINT_EXT_USHORT_RSHIFT_N_UINT(25) +UINT_EXT_USHORT_RSHIFT_N_UINT(31) +#endif /* __riscv_xlen == 64 */ + + + +// Below "slli (16-N); srli 16" for rv32 +// Below "slli ((32+16)-N); srli (32+16)" for rv64 +UINT_EXT_USHORT_RSHIFT_N_ULONG(9) +UINT_EXT_USHORT_RSHIFT_N_ULONG(15) + + + +// Below "slli (16-N); srli 16" for rv32 +// Below "slli ((32+16)-N); srli (32+16)" for rv64 +ULONG_EXT_USHORT_RSHIFT_N_UINT(9) +ULONG_EXT_USHORT_RSHIFT_N_UINT(15) + +/* { dg-final { scan-assembler-times "slli\t" 9 { target { rv32 } } } } */ +/* { dg-final { scan-assembler-times "srli\t" 26 { target { rv32 } } } } */ + +/* { dg-final { scan-assembler-times "slli\t" 36 { target { rv64 } } } } */ +/* { dg-final { scan-assembler-times "srli\t" 54 { target { rv64 } } } } */ +/* { dg-final { scan-assembler-times "srliw\t" 7 { target { rv64 } } } } */ -- 2.44.0