* config/rs6000/rs6000.md (movti_string): Use string instructions.
authorDavid Edelsohn <edelsohn@gnu.org>
Mon, 4 Nov 2002 03:04:10 +0000 (03:04 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Mon, 4 Nov 2002 03:04:10 +0000 (22:04 -0500)
From-SVN: r58781

gcc/ChangeLog
gcc/config/rs6000/rs6000.md

index 1d44953be654942bdc5ddeb381e02c0b0691b704..76d0d4407ebbc4571fafc6968755482dd7617a30 100644 (file)
@@ -1,3 +1,7 @@
+2002-11-03  David Edelsohn  <edelsohn@gnu.org>
+
+       * config/rs6000/rs6000.md (movti_string): Use string instructions.
+
 2002-11-03  Roger Sayle  <roger@eyesopen.com>
 
        PR c/7128
index 5af83b81cd2848dcc492642e42a06f80484a486b..53c6f8a9f4eb20356c34ff0243e4537b9b5daebd 100644 (file)
    (set_attr "length" "4,16,16,4,16")])
 
 (define_insn "*movti_string"
-  [(set (match_operand:TI 0 "reg_or_mem_operand" "=m,????r,????r")
-       (match_operand:TI 1 "reg_or_mem_operand" "r,r,m"))
-   (clobber (match_scratch:SI 2 "=X,X,X"))]
+  [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,????r,????r,????r")
+       (match_operand:TI 1 "reg_or_mem_operand" "r,r,r,Q,m"))
+   (clobber (match_scratch:SI 2 "=X,X,X,X,X"))]
   "TARGET_STRING && ! TARGET_POWER && ! TARGET_POWERPC64
    && (gpc_reg_operand (operands[0], TImode) || gpc_reg_operand (operands[1], TImode))"
   "*
       abort ();
 
     case 0:
-      return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\;{st|stw} %Y1,%Y0\;{st|stw} %Z1,%Z0\";
-
+      return \"{stsi|stswi} %1,%P0,16\";
     case 1:
+      return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\;{st|stw} %Y1,%Y0\;{st|stw} %Z1,%Z0\";
+    case 2:
       /* Normally copy registers with lowest numbered register copied first.
         But copy in the other order if the first register of the output
         is the second, third, or fourth register in the input.  */
        return \"mr %Z0,%Z1\;mr %Y0,%Y1\;mr %L0,%L1\;mr %0,%1\";
       else
        return \"mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1\";
-    case 2:
+    case 3:
+      /* If the address is not used in the output, we can use lsi.  Otherwise,
+        fall through to generating four loads.  */
+      if (! reg_overlap_mentioned_p (operands[0], operands[1]))
+       return \"{lsi|lswi} %0,%P1,16\";
+      /* ... fall through ...  */
+    case 4:
       /* If the address register is the same as the register for the lowest-
         addressed word, load it last.  Similarly for the next two words.
         Otherwise load lowest address to highest.  */
        return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\";
     }
 }"
-  [(set_attr "type" "store,*,load")
-   (set_attr "length" "16,16,16")])
+  [(set_attr "type" "store,store,*,load,load")
+   (set_attr "length" "4,16,16,4,16")])
 
 (define_insn "*movti_ppc64"
   [(set (match_operand:TI 0 "nonimmediate_operand" "=r,r,m")