public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Roger Sayle <sayle@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r14-175] [xstormy16] Improved SImode shifts by two bits.
Date: Sun, 23 Apr 2023 09:26:17 +0000 (GMT)	[thread overview]
Message-ID: <20230423092617.87D033858C66@sourceware.org> (raw)

https://gcc.gnu.org/g:987caaae343ec8277391c875549859f8a288fd81

commit r14-175-g987caaae343ec8277391c875549859f8a288fd81
Author: Roger Sayle <roger@nextmovesoftware.com>
Date:   Sun Apr 23 10:25:04 2023 +0100

    [xstormy16] Improved SImode shifts by two bits.
    
    Currently on xstormy16 SImode shifts by a single bit require two
    instructions, and shifts by other non-zero integer immediate constants
    require five instructions.  This patch implements the obvious optimization
    that shifts by two bits can be done in four instructions, by using two
    single-bit sequences.
    
    Hence, ashift_2 was previously generated as:
            mov r7,r2 | shl r2,#2 | shl r3,#2 | shr r7,#14 | or r3,r7
            ret
    and with this patch we now generate:
            shl r2,#1 | rlc r3,#1 | shl r2,#1 | rlc r3,#1
            ret
    
    2023-04-23  Roger Sayle  <roger@nextmovesoftware.com>
    
    gcc/ChangeLog
            * config/stormy16/stormy16.cc (xstormy16_output_shift): Implement
            SImode shifts by two by performing a single bit SImode shift twice.
    
    gcc/testsuite/ChangeLog
            * gcc.target/xstormy16/shiftsi.c: New test case.

Diff:
---
 gcc/config/stormy16/stormy16.cc              | 23 +++++++++++++++++++++++
 gcc/testsuite/gcc.target/xstormy16/shiftsi.c | 12 ++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/gcc/config/stormy16/stormy16.cc b/gcc/config/stormy16/stormy16.cc
index 1ed619a2896..cf2f807def2 100644
--- a/gcc/config/stormy16/stormy16.cc
+++ b/gcc/config/stormy16/stormy16.cc
@@ -2105,6 +2105,29 @@ xstormy16_output_shift (machine_mode mode, enum rtx_code code,
       return r;
     }
 
+  /* For shifts of size 2, we can use two shifts of size 1.  */
+  if (size == 2)
+    {
+      switch (code)
+	{
+	case ASHIFT:
+	  sprintf (r, "shl %s,#1 | rlc %s,#1 | shl %s,#1 | rlc %s,#1",
+		   r0, r1, r0, r1);
+	  break;
+	case ASHIFTRT:
+	  sprintf (r, "asr %s,#1 | rrc %s,#1 | asr %s,#1 | rrc %s,#1",
+		   r1, r0, r1, r0);
+	  break;
+	case LSHIFTRT:
+	  sprintf (r, "shr %s,#1 | rrc %s,#1 | shr %s,#1 | rrc %s,#1",
+		   r1, r0, r1, r0);
+	  break;
+	default:
+	  gcc_unreachable ();
+	}
+      return r;
+    }
+
   /* For large shifts, there are easy special cases.  */
   if (size == 16)
     {
diff --git a/gcc/testsuite/gcc.target/xstormy16/shiftsi.c b/gcc/testsuite/gcc.target/xstormy16/shiftsi.c
new file mode 100644
index 00000000000..42bbca795fe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/xstormy16/shiftsi.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned long ashift_1(unsigned long x) { return x << 1; }
+unsigned long ashift_2(unsigned long x) { return x << 2; }
+unsigned long lshiftrt_1(unsigned long x) { return x >> 1; }
+unsigned long lshiftrt_2(unsigned long x) { return x >> 2; }
+long ashiftrt_1(long x) { return x >> 1; }
+long ashiftrt_2(long x) { return x >> 2; }
+
+/* { dg-final { scan-assembler-not "mov " } } */
+/* { dg-final { scan-assembler-not "or " } } */

                 reply	other threads:[~2023-04-23  9:26 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230423092617.87D033858C66@sourceware.org \
    --to=sayle@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).