OSDN Git Service

* config/h8300/h8300.c (compute_mov_length): Adjust for the
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Jun 2003 11:54:44 +0000 (11:54 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Jun 2003 11:54:44 +0000 (11:54 +0000)
new optimization.
* config/h8300/h8300.md (*movsi_h8300): Optimize the load of
an SImode constant whose upper and lower are the same.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68475 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 6199994..493e045 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 3a5334b..edb7820 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 ec9f1c6..341e167 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\";
        }