i386.md (movsf, movdf): Use movaps for reg-reg moves if TARGET_PARTIAL_REG_DEPENDENCY.
authorJan Hubicka <jh@suse.cz>
Tue, 27 Feb 2001 14:54:15 +0000 (15:54 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 27 Feb 2001 14:54:15 +0000 (14:54 +0000)
* i386.md (movsf, movdf): Use movaps for reg-reg moves if
TARGET_PARTIAL_REG_DEPENDENCY.
(truncdfsf2_1_sse, truncdfsf2_2): Penalize the fpreg->mem case.

From-SVN: r40093

gcc/ChangeLog
gcc/config/i386/i386.md

index c8eeca62760c849d96d885ae62a8d17904fb07ac..1546b8072cb4248f5f951472973e74c209d59cdf 100644 (file)
@@ -1,3 +1,9 @@
+Tue Feb 27 15:51:35 CET 2001  Jan Hubicka  <jh@suse.cz>
+
+       * i386.md (movsf, movdf): Use movaps for reg-reg moves if
+       TARGET_PARTIAL_REG_DEPENDENCY.
+       (truncdfsf2_1_sse, truncdfsf2_2): Penalize the fpreg->mem case.
+
 Tue Feb 27 15:36:48 CET 2001  Jan Hubicka  <jh@suse.cz>
 
        * i386.md (mins*, maxs*): New patterns, expanders and splitters.
index de369128d777832349b8cf07ff8613e9d1c37296..25a283f4e96b5edf32313d700415efa93af1cefb 100644 (file)
       return \"mov{l}\\t{%1, %0|%0, %1}\";
     case 5:
     case 6:
+      if (TARGET_PARTIAL_REG_DEPENDENCY
+         && register_operand (operands[0], VOIDmode)
+         && register_operand (operands[1], VOIDmode))
+       return \"movaps\\t{%1, %0|%0, %1}\";
       return \"movss\\t{%1, %0|%0, %1}\";
 
     default:
       return \"#\";
     case 5:
     case 6:
+      if (TARGET_PARTIAL_REG_DEPENDENCY
+         && register_operand (operands[0], VOIDmode)
+         && register_operand (operands[1], VOIDmode))
+       return \"movapd\\t{%1, %0|%0, %1}\";
       return \"movsd\\t{%1, %0|%0, %1}\";
 
     default:
    (set_attr "mode" "SF,SF")])
 
 (define_insn "*truncdfsf2_1_sse"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,Y")
+  [(set (match_operand:SF 0 "nonimmediate_operand" "=*!m,?f,Y")
        (float_truncate:SF
         (match_operand:DF 1 "nonimmediate_operand" "f,0,mY")))
    (clobber (match_operand:SF 2 "memory_operand" "=X,m,X"))]
    (set_attr "mode" "SF,SF,DF")])
 
 (define_insn "*truncdfsf2_2"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,Y")
+  [(set (match_operand:SF 0 "nonimmediate_operand" "=Y,!m")
        (float_truncate:SF
-        (match_operand:DF 1 "nonimmediate_operand" "f,mY")))]
-  "TARGET_80387 && TARGET_SSE2"
+        (match_operand:DF 1 "nonimmediate_operand" "mY,f")))]
+  "TARGET_80387 && TARGET_SSE2
+   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
   "*
 {
   switch (which_alternative)
     {
     case 0:
+      return \"cvtsd2ss\\t{%1, %0|%0, %1}\";
+    case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
        return \"fstp%z0\\t%y0\";
       else
        return \"fst%z0\\t%y0\";
-    case 1:
-    case 2:
-      return \"cvtsd2ss\\t{%1, %0|%0, %1}\";
     }
 }"
-  [(set_attr "type" "fmov,sse")
-   (set_attr "mode" "SF,DF")])
+  [(set_attr "type" "sse,fmov")
+   (set_attr "mode" "DF,SF")])
 
 (define_insn "truncdfsf2_3"
   [(set (match_operand:SF 0 "nonimmediate_operand" "=m")