From patchwork Fri May 27 05:03:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 1636134 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=KVx8sw+7; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4L8XmM4JcHz9s75 for ; Fri, 27 May 2022 15:04:49 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E5F9C382D471 for ; Fri, 27 May 2022 05:04:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E5F9C382D471 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1653627887; bh=BSyZIGT3UG4vIkFe35UEiFemTlgGbkgXouzTLwE3RQE=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=KVx8sw+7wA+ytG28IH5tiFs97ltZdI+h/4pg7qAW0oj3IkMEe6WBL6hELOc7iJABQ q0OgZ6tc8POxrSWDzPNzz9MX6y8gxQd4Cm9j2PtK5o7+pbD7K1lG9EzqA/ldiFF1ml VQ+yfQTmftRMLgrnt4cPp/dwBzwVWR7xm67o6Ax0= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-lj1-x229.google.com (mail-lj1-x229.google.com [IPv6:2a00:1450:4864:20::229]) by sourceware.org (Postfix) with ESMTPS id 08B85382D44A for ; Fri, 27 May 2022 05:04:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 08B85382D44A Received: by mail-lj1-x229.google.com with SMTP id r3so3793979ljd.7 for ; Thu, 26 May 2022 22:04:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=BSyZIGT3UG4vIkFe35UEiFemTlgGbkgXouzTLwE3RQE=; b=HFoTnaRxIgRBmgyMuw9UU2F2QcJWV90VIXFWZB0h4vzWS1HzGDwHBM5uEBcX691Gab PL63trQIkZGJ2h6WvQZ++haJ6T79bW9pzuvAozXSkwESBoDwfq1dX4VrPulzjtKvcXvx 1hcG9MdtHYWPxa0j2yVcfDRG9bucfHqFfyJq/sSMk9smJSiUGfyTvH/SY3WfPeW5dR8Z K9CrzI6BTbcJkLp6WN3r/KUd56QD2Qkli5EM5GFu9EBnS5190v7DKLGmLqfq2f9+Uoho 5EZhYeD2LDMS/ao95LvcRii/hzLzN5vOiMfmqsd7SmC9a28iYkWmxz+lhv3wiRG0E6ZR fwsg== X-Gm-Message-State: AOAM532ywgpo7DPgD7wrUZy0JwYask2sGqcyVvSNc+k81+nDCoLMFZUV vpuydzjXpm7M/mnezytC/TjHpiflfYw= X-Google-Smtp-Source: ABdhPJwo3eA7x28n/8KlhXCyB8zq6+OL1q3Gp/zXpRlpVs8Py/sT3ZIKJ4WzZKagmb02DrsIFnf2FQ== X-Received: by 2002:a2e:8907:0:b0:253:c8e5:1fac with SMTP id d7-20020a2e8907000000b00253c8e51facmr24885304lji.338.1653627864528; Thu, 26 May 2022 22:04:24 -0700 (PDT) Received: from octofox.metropolis ([212.58.114.186]) by smtp.gmail.com with ESMTPSA id s8-20020ac25fa8000000b0047255d21122sm699581lfe.81.2022.05.26.22.04.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 May 2022 22:04:23 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [COMMITTED] xtensa: Improve bswap[sd]i2 insn patterns Date: Thu, 26 May 2022 22:03:58 -0700 Message-Id: <20220527050358.2674540-1-jcmvbkbc@gmail.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, FROM_LOCAL_NOVOWEL, GIT_PATCH_0, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Max Filippov via Gcc-patches From: Max Filippov Reply-To: Max Filippov Cc: linux-xtensa@linux-xtensa.org Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" From: Takayuki 'January June' Suwa This patch makes bswap[sd]i2 better register allocation, and reconstructs bswapsi2 in order to take advantage of GIMPLE manual byte-swapping recognition. gcc/ChangeLog: * config/xtensa/xtensa.md (bswapsi2): New expansion pattern. (bswapsi2_internal): Revise the template and condition, and add detection code for preceding the same insn in order to omit a "SSAI 8" instruction of the latter. (bswapdi2): Suppress built-in insn expansion with the corresponding library call when optimizing for size. gcc/testsuite/ChangeLog: * gcc.target/xtensa/bswap.c: Remove test. * gcc.target/xtensa/bswap-O1.c: New. * gcc.target/xtensa/bswap-O2.c: Ditto. * gcc.target/xtensa/bswap-Os.c: Ditto. --- gcc/config/xtensa/xtensa.md | 77 +++++++++++++++++----- gcc/testsuite/gcc.target/xtensa/bswap-O1.c | 37 +++++++++++ gcc/testsuite/gcc.target/xtensa/bswap-O2.c | 37 +++++++++++ gcc/testsuite/gcc.target/xtensa/bswap-Os.c | 37 +++++++++++ gcc/testsuite/gcc.target/xtensa/bswap.c | 14 ---- 5 files changed, 172 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/gcc.target/xtensa/bswap-O1.c create mode 100644 gcc/testsuite/gcc.target/xtensa/bswap-O2.c create mode 100644 gcc/testsuite/gcc.target/xtensa/bswap-Os.c delete mode 100644 gcc/testsuite/gcc.target/xtensa/bswap.c diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index 2d146b7995c9..6f5cbc541d85 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -471,23 +471,68 @@ ;; Byte swap. -(define_insn "bswapsi2" - [(set (match_operand:SI 0 "register_operand" "=&a") - (bswap:SI (match_operand:SI 1 "register_operand" "r")))] - "!optimize_size" - "ssai\t8\;srli\t%0, %1, 16\;src\t%0, %0, %1\;src\t%0, %0, %0\;src\t%0, %1, %0" - [(set_attr "type" "arith") - (set_attr "mode" "SI") - (set_attr "length" "15")]) +(define_expand "bswapsi2" + [(set (match_operand:SI 0 "register_operand" "") + (bswap:SI (match_operand:SI 1 "register_operand" "")))] + "!optimize_debug && optimize > 1" +{ + /* GIMPLE manual byte-swapping recognition is now activated. + For both built-in and manual bswaps, emit corresponding library call + if optimizing for size, or a series of dedicated machine instructions + if otherwise. */ + if (optimize_size) + emit_library_call_value (optab_libfunc (bswap_optab, SImode), + operands[0], LCT_NORMAL, SImode, + operands[1], SImode); + else + emit_insn (gen_bswapsi2_internal (operands[0], operands[1])); + DONE; +}) -(define_insn "bswapdi2" - [(set (match_operand:DI 0 "register_operand" "=&a") - (bswap:DI (match_operand:DI 1 "register_operand" "r")))] - "!optimize_size" - "ssai\t8\;srli\t%0, %D1, 16\;src\t%0, %0, %D1\;src\t%0, %0, %0\;src\t%0, %D1, %0\;srli\t%D0, %1, 16\;src\t%D0, %D0, %1\;src\t%D0, %D0, %D0\;src\t%D0, %1, %D0" - [(set_attr "type" "arith") - (set_attr "mode" "DI") - (set_attr "length" "27")]) +(define_insn "bswapsi2_internal" + [(set (match_operand:SI 0 "register_operand" "=a,&a") + (bswap:SI (match_operand:SI 1 "register_operand" "0,r"))) + (clobber (match_scratch:SI 2 "=&a,X"))] + "!optimize_debug && optimize > 1 && !optimize_size" +{ + rtx_insn *prev_insn = prev_nonnote_nondebug_insn (insn); + const char *init = "ssai\t8\;"; + static char result[64]; + if (prev_insn && NONJUMP_INSN_P (prev_insn)) + { + rtx x = PATTERN (prev_insn); + if (GET_CODE (x) == PARALLEL && XVECLEN (x, 0) == 2 + && GET_CODE (XVECEXP (x, 0, 0)) == SET + && GET_CODE (XVECEXP (x, 0, 1)) == CLOBBER) + { + x = XEXP (XVECEXP (x, 0, 0), 1); + if (GET_CODE (x) == BSWAP && GET_MODE (x) == SImode) + init = ""; + } + } + sprintf (result, + (which_alternative == 0) + ? "%s" "srli\t%%2, %%1, 16\;src\t%%2, %%2, %%1\;src\t%%2, %%2, %%2\;src\t%%0, %%1, %%2" + : "%s" "srli\t%%0, %%1, 16\;src\t%%0, %%0, %%1\;src\t%%0, %%0, %%0\;src\t%%0, %%1, %%0", + init); + return result; +} + [(set_attr "type" "arith,arith") + (set_attr "mode" "SI") + (set_attr "length" "15,15")]) + +(define_expand "bswapdi2" + [(set (match_operand:DI 0 "register_operand" "") + (bswap:DI (match_operand:DI 1 "register_operand" "")))] + "!optimize_debug && optimize > 1 && optimize_size" +{ + /* Replace with a single DImode library call. + Without this, two SImode library calls are emitted. */ + emit_library_call_value (optab_libfunc (bswap_optab, DImode), + operands[0], LCT_NORMAL, DImode, + operands[1], DImode); + DONE; +}) ;; Negation and one's complement. diff --git a/gcc/testsuite/gcc.target/xtensa/bswap-O1.c b/gcc/testsuite/gcc.target/xtensa/bswap-O1.c new file mode 100644 index 000000000000..a0c885baaf1e --- /dev/null +++ b/gcc/testsuite/gcc.target/xtensa/bswap-O1.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +unsigned int test_0(unsigned int a) +{ + return (a & 0x000000FF) << 24 | + (a & 0x0000FF00) << 8 | + (a & 0x00FF0000) >> 8 | + (a & 0xFF000000) >> 24; +} + +unsigned int test_1(unsigned int a) +{ + union + { + unsigned int i; + unsigned char a[4]; + } u, v; + u.i = a; + v.a[0] = u.a[3]; + v.a[1] = u.a[2]; + v.a[2] = u.a[1]; + v.a[3] = u.a[0]; + return v.i; +} + +unsigned int test_2(unsigned int a) +{ + return __builtin_bswap32(a); +} + +unsigned long long test_3(unsigned long long a) +{ + return __builtin_bswap64(a); +} + +/* { dg-final { scan-assembler-times "call" 2 } } */ diff --git a/gcc/testsuite/gcc.target/xtensa/bswap-O2.c b/gcc/testsuite/gcc.target/xtensa/bswap-O2.c new file mode 100644 index 000000000000..4cf95b9255c2 --- /dev/null +++ b/gcc/testsuite/gcc.target/xtensa/bswap-O2.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +unsigned int test_0(unsigned int a) +{ + return (a & 0x000000FF) << 24 | + (a & 0x0000FF00) << 8 | + (a & 0x00FF0000) >> 8 | + (a & 0xFF000000) >> 24; +} + +unsigned int test_1(unsigned int a) +{ + union + { + unsigned int i; + unsigned char a[4]; + } u, v; + u.i = a; + v.a[0] = u.a[3]; + v.a[1] = u.a[2]; + v.a[2] = u.a[1]; + v.a[3] = u.a[0]; + return v.i; +} + +unsigned int test_2(unsigned int a) +{ + return __builtin_bswap32(a); +} + +unsigned long long test_3(unsigned long long a) +{ + return __builtin_bswap64(a); +} + +/* { dg-final { scan-assembler-times "ssai" 4 } } */ diff --git a/gcc/testsuite/gcc.target/xtensa/bswap-Os.c b/gcc/testsuite/gcc.target/xtensa/bswap-Os.c new file mode 100644 index 000000000000..1e010fd62ae9 --- /dev/null +++ b/gcc/testsuite/gcc.target/xtensa/bswap-Os.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-Os" } */ + +unsigned int test_0(unsigned int a) +{ + return (a & 0x000000FF) << 24 | + (a & 0x0000FF00) << 8 | + (a & 0x00FF0000) >> 8 | + (a & 0xFF000000) >> 24; +} + +unsigned int test_1(unsigned int a) +{ + union + { + unsigned int i; + unsigned char a[4]; + } u, v; + u.i = a; + v.a[0] = u.a[3]; + v.a[1] = u.a[2]; + v.a[2] = u.a[1]; + v.a[3] = u.a[0]; + return v.i; +} + +unsigned int test_2(unsigned int a) +{ + return __builtin_bswap32(a); +} + +unsigned long long test_3(unsigned long long a) +{ + return __builtin_bswap64(a); +} + +/* { dg-final { scan-assembler-times "call" 4 } } */ diff --git a/gcc/testsuite/gcc.target/xtensa/bswap.c b/gcc/testsuite/gcc.target/xtensa/bswap.c deleted file mode 100644 index 057a3569703f..000000000000 --- a/gcc/testsuite/gcc.target/xtensa/bswap.c +++ /dev/null @@ -1,14 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O1" } */ - -unsigned long f32(unsigned long v) -{ - return __builtin_bswap32(v); -} - -unsigned long long f64(unsigned long long v) -{ - return __builtin_bswap64(v); -} - -/* { dg-final { scan-assembler-times "ssai" 2 } } */