[avr,applied] ad PR117726: Also split logic shifts of bitsize - 1

Message ID 7cd45b51-1a01-48f5-aa66-b3128aab47f1@gjlay.de
State New
Headers
Series [avr,applied] ad PR117726: Also split logic shifts of bitsize - 1 |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Georg-Johann Lay Dec. 3, 2024, 3:05 p.m. UTC
  Applied the patch below which also splits logic shifts
with an offset of bitsize - 1 into byte operations.

Johann

--

AVR: ad target/117726 - Also split logic shifts of bitsize - 1.

When -msplit-bit-shift is on, also split logic shifts of bitsize(mode) - 1.

gcc/
	PR target/117726
	* config/avr/avr-passes.cc (avr_split_shift_p)
	[ASHIFT, LSHIFTRT]: Allow offsets of bitsize - 1.
	(avr_split_shift4) [ASHIFT, LSHIFTRT]: Also split offset 31.
	(avr_split_shift3) [ASHIFT, LSHIFTRT]: Also split offset 23.
	(avr_split_shift2) [ASHIFT, LSHIFTRT]: Also split offset 15.
  

Patch

    AVR: ad target/117726 - Also split logic shifts of bitsize - 1.
    
    When -msplit-bit-shift is on, also split logic shifts of bitsize(mode) - 1.
    
    gcc/
            PR target/117726
            * config/avr/avr-passes.cc (avr_split_shift_p)
            [ASHIFT, LSHIFTRT]: Allow offsets of bitsize - 1.
            (avr_split_shift4) [ASHIFT, LSHIFTRT]: Also split offset 31.
            (avr_split_shift3) [ASHIFT, LSHIFTRT]: Also split offset 23.
            (avr_split_shift2) [ASHIFT, LSHIFTRT]: Also split offset 15.

diff --git a/gcc/config/avr/avr-passes.cc b/gcc/config/avr/avr-passes.cc
index dc98780ef27..076d8cbe365 100644
--- a/gcc/config/avr/avr-passes.cc
+++ b/gcc/config/avr/avr-passes.cc
@@ -4860,23 +4860,23 @@  avr_split_shift_p (int n_bytes, int offset, rtx_code code)
 
   if (n_bytes == 4)
     return select<bool>()
-      : code == ASHIFT ? IN_RANGE (offset, 9, 30) && offset != 15
+      : code == ASHIFT ? IN_RANGE (offset, 9, 31) && offset != 15
       : code == ASHIFTRT ? IN_RANGE (offset, 9, 29) && offset != 15
-      : code == LSHIFTRT ? IN_RANGE (offset, 9, 30) && offset != 15
+      : code == LSHIFTRT ? IN_RANGE (offset, 9, 31) && offset != 15
       : bad_case<bool> ();
 
   if (n_bytes == 3)
     return select<bool>()
-      : code == ASHIFT ? IN_RANGE (offset, 9, 22) && offset != 15
+      : code == ASHIFT ? IN_RANGE (offset, 9, 23) && offset != 15
       : code == ASHIFTRT ? IN_RANGE (offset, 9, 21) && offset != 15
-      : code == LSHIFTRT ? IN_RANGE (offset, 9, 22) && offset != 15
+      : code == LSHIFTRT ? IN_RANGE (offset, 9, 23) && offset != 15
       : bad_case<bool> ();
 
   if (n_bytes == 2)
     return select<bool>()
-      : code == ASHIFT ? IN_RANGE (offset, 9, 14)
+      : code == ASHIFT ? IN_RANGE (offset, 9, 15)
       : code == ASHIFTRT ? IN_RANGE (offset, 9, 13)
-      : code == LSHIFTRT ? IN_RANGE (offset, 9, 14)
+      : code == LSHIFTRT ? IN_RANGE (offset, 9, 15)
       : bad_case<bool> ();
 
   return false;
@@ -4955,7 +4955,7 @@  avr_split_shift4 (rtx dest, rtx src, int ioff, rtx scratch, rtx_code code)
 
   if (code == ASHIFT)
     {
-      if (IN_RANGE (ioff, 25, 30))
+      if (IN_RANGE (ioff, 25, 31))
 	{
 	  rtx dst8 = avr_byte (dest, 3);
 	  rtx src8 = avr_byte (src, 0);
@@ -4978,7 +4978,7 @@  avr_split_shift4 (rtx dest, rtx src, int ioff, rtx scratch, rtx_code code)
   else if (code == ASHIFTRT
 	   || code == LSHIFTRT)
     {
-      if (IN_RANGE (ioff, 25, 30))
+      if (IN_RANGE (ioff, 25, 30 + (code == LSHIFTRT)))
 	{
 	  rtx dst8 = avr_byte (dest, 0);
 	  rtx src8 = avr_byte (src, 3);
@@ -5042,7 +5042,7 @@  avr_split_shift3 (rtx dest, rtx src, int ioff, rtx scratch, rtx_code code)
 
   if (code == ASHIFT)
     {
-      if (IN_RANGE (ioff, 17, 22))
+      if (IN_RANGE (ioff, 17, 23))
 	{
 	  rtx dst8 = avr_byte (dest, 2);
 	  rtx src8 = avr_byte (src, 0);
@@ -5056,7 +5056,7 @@  avr_split_shift3 (rtx dest, rtx src, int ioff, rtx scratch, rtx_code code)
   else if (code == ASHIFTRT
 	   || code == LSHIFTRT)
     {
-      if (IN_RANGE (ioff, 17, 22))
+      if (IN_RANGE (ioff, 17, 22 + (code == LSHIFTRT)))
 	{
 	  rtx dst8 = avr_byte (dest, 0);
 	  rtx src8 = avr_byte (src, 2);
@@ -5102,7 +5102,7 @@  avr_split_shift2 (rtx dest, rtx src, int ioff, rtx /*scratch*/, rtx_code code)
 
   if (code == ASHIFT)
     {
-      if (IN_RANGE (ioff, 9, 14))
+      if (IN_RANGE (ioff, 9, 15))
 	{
 	  rtx dst8 = avr_byte (dest, 1);
 	  rtx src8 = avr_byte (src, 0);
@@ -5114,7 +5114,7 @@  avr_split_shift2 (rtx dest, rtx src, int ioff, rtx /*scratch*/, rtx_code code)
   else if (code == ASHIFTRT
 	   || code == LSHIFTRT)
     {
-      if (IN_RANGE (ioff, 9, 14))
+      if (IN_RANGE (ioff, 9, 14 + (code == LSHIFTRT)))
 	{
 	  rtx dst8 = avr_byte (dest, 0);
 	  rtx src8 = avr_byte (src, 1);