h8300.c (compute_mov_length): Adjust for the new optimization.
authorKazu Hirata <kazu@cs.umass.edu>
Wed, 25 Jun 2003 11:54:44 +0000 (11:54 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Wed, 25 Jun 2003 11:54:44 +0000 (11:54 +0000)
* config/h8300/h8300.c (compute_mov_length): Adjust for the
new optimization.
* config/h8300/h8300.md (*movsi_h8300): Optimize the load of
an SImode constant whose upper and lower are the same.

From-SVN: r68475

gcc/ChangeLog
gcc/config/h8300/h8300.c
gcc/config/h8300/h8300.md

index 6199994c1b043fc9e347b7d0afc12addd3eec4ee..493e045def206c2936135f09ea2bdd0247cb9f38 100644 (file)
@@ -1,3 +1,10 @@
+2003-06-25  Kazu Hirata  <kazu@cs.umass.edu>
+
+       * config/h8300/h8300.c (compute_mov_length): Adjust for the
+       new optimization.
+       * config/h8300/h8300.md (*movsi_h8300): Optimize the load of
+       an SImode constant whose upper and lower are the same.
+
 Wed Jun 25 11:31:59 CEST 2003  Jan Hubicka  <jh@suse.cz>
 
        * varasm.c (assemble_name): Mark needed variables even when
index 3a5334bf42c17debaa240aa4139777bbd70d1ed1..edb7820d128fe48c9ec69bf3aa1f74f01a89ace2 100644 (file)
@@ -1876,6 +1876,10 @@ compute_mov_length (rtx *operands)
 
                  if ((INTVAL (src) & 0xffff) == 0)
                    return 6;
+
+                 if ((INTVAL (src) & 0xffff)
+                     == ((INTVAL (src) >> 16) & 0xffff))
+                   return 6;
                }
              return 8;
            }
index ec9f1c6876f5f50933651bc2d31bc2ce0c6c0d5c..341e167ce9dde6d66fb6a21eb7b33e5097aacca4 100644 (file)
        }
       else
        {
-         /* See if either half is zero.  If so, use sub.w to clear
-            that half.  */
          if (GET_CODE (operands[1]) == CONST_INT)
            {
+             /* If either half is zero, use sub.w to clear that
+                half.  */
              if ((INTVAL (operands[1]) & 0xffff) == 0)
                return \"mov.w  %e1,%e0\;sub.w  %f0,%f0\";
              if (((INTVAL (operands[1]) >> 16) & 0xffff) == 0)
                return \"sub.w  %e0,%e0\;mov.w  %f1,%f0\";
+             /* If the upper half and the lower half are the same,
+                copy one half to the other.  */
+             if ((INTVAL (operands[1]) & 0xffff)
+                 == ((INTVAL (operands[1]) >> 16) & 0xffff))
+               return \"mov.w\\t%e1,%e0\;mov.w\\t%e0,%f0\";
            }
          return \"mov.w        %e1,%e0\;mov.w  %f1,%f0\";
        }