* config/pa/pa.md (negdf2): Condition on !flag_signed_zeros instead of
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Nov 2010 04:09:25 +0000 (04:09 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Nov 2010 04:09:25 +0000 (04:09 +0000)
flag_unsafe_math_optimizations.
(negsf2): Likewise.
Move fnegabs related patterns together.  Only use fmpynfadd instruction
to negate a multiply if !flag_signed_zeros is true.

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

gcc/ChangeLog
gcc/config/pa/pa.md

index 2ad248b..d4ee580 100644 (file)
@@ -1,3 +1,11 @@
+2010-11-25  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       * config/pa/pa.md (negdf2): Condition on !flag_signed_zeros instead of
+       flag_unsafe_math_optimizations.
+       (negsf2): Likewise.
+       Move fnegabs related patterns together.  Only use fmpynfadd instruction
+       to negate a multiply if !flag_signed_zeros is true.
+
 2010-11-25  Uros Bizjak  <ubizjak@gmail.com>
 
        * gengtype-state.c (read_state_structures): Initialize "previous".
index 0d51c62..1ac18ec 100644 (file)
        (neg:DF (match_operand:DF 1 "register_operand" "")))]
   "!TARGET_SOFT_FLOAT"
 {
-  if (TARGET_PA_20 || flag_unsafe_math_optimizations)
+  if (TARGET_PA_20 || !flag_signed_zeros)
     emit_insn (gen_negdf2_fast (operands[0], operands[1]));
   else
     emit_insn (gen_negdf2_slow (operands[0], operands[1]));
        (neg:SF (match_operand:SF 1 "register_operand" "")))]
   "!TARGET_SOFT_FLOAT"
 {
-  if (TARGET_PA_20 || flag_unsafe_math_optimizations)
+  if (TARGET_PA_20 || !flag_signed_zeros)
     emit_insn (gen_negsf2_fast (operands[0], operands[1]));
   else
     emit_insn (gen_negsf2_slow (operands[0], operands[1]));
   [(set_attr "type" "fpalu")
    (set_attr "length" "4")])
 
+(define_insn ""
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f"))))
+   (set (match_operand:DF 2 "register_operand" "=&f") (abs:DF (match_dup 1)))]
+  "(! TARGET_SOFT_FLOAT && TARGET_PA_20
+    && ! reg_overlap_mentioned_p (operands[2], operands[1]))"
+  "#"
+  [(set_attr "type" "fpalu")
+   (set_attr "length" "8")])
+
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (neg:DF (abs:DF (match_operand:DF 1 "register_operand" ""))))
+   (set (match_operand:DF 2 "register_operand" "") (abs:DF (match_dup 1)))]
+  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
+  [(set (match_dup 2) (abs:DF (match_dup 1)))
+   (set (match_dup 0) (neg:DF (abs:DF (match_dup 1))))]
+  "")
+
+(define_insn ""
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f"))))
+   (set (match_operand:SF 2 "register_operand" "=&f") (abs:SF (match_dup 1)))]
+  "(! TARGET_SOFT_FLOAT && TARGET_PA_20
+    && ! reg_overlap_mentioned_p (operands[2], operands[1]))"
+  "#"
+  [(set_attr "type" "fpalu")
+   (set_attr "length" "8")])
+
+(define_split
+  [(set (match_operand:SF 0 "register_operand" "")
+       (neg:SF (abs:SF (match_operand:SF 1 "register_operand" ""))))
+   (set (match_operand:SF 2 "register_operand" "") (abs:SF (match_dup 1)))]
+  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
+  [(set (match_dup 2) (abs:SF (match_dup 1)))
+   (set (match_dup 0) (neg:SF (abs:SF (match_dup 1))))]
+  "")
+
 ;; Negating a multiply can be faked by adding zero in a fused multiply-add
-;; instruction.
-;; ??? Only if we add -0.0 or can ignore the sign of zero.
+;; instruction if we can ignore the sign of zero.
 (define_insn ""
   [(set (match_operand:DF 0 "register_operand" "=f")
        (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
                         (match_operand:DF 2 "register_operand" "f"))))]
-  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
+  "!TARGET_SOFT_FLOAT && TARGET_PA_20 && !flag_signed_zeros"
   "fmpynfadd,dbl %1,%2,%%fr0,%0"
   [(set_attr "type" "fpmuldbl")
    (set_attr "length" "4")])
   [(set (match_operand:SF 0 "register_operand" "=f")
        (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
                         (match_operand:SF 2 "register_operand" "f"))))]
-  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
+  "!TARGET_SOFT_FLOAT && TARGET_PA_20 && !flag_signed_zeros"
   "fmpynfadd,sgl %1,%2,%%fr0,%0"
   [(set_attr "type" "fpmuldbl")
    (set_attr "length" "4")])
                         (match_operand:DF 2 "register_operand" "f"))))
    (set (match_operand:DF 3 "register_operand" "=&f")
        (mult:DF (match_dup 1) (match_dup 2)))]
-  "(! TARGET_SOFT_FLOAT && TARGET_PA_20
+  "(!TARGET_SOFT_FLOAT && TARGET_PA_20 && !flag_signed_zeros
     && ! (reg_overlap_mentioned_p (operands[3], operands[1])
           || reg_overlap_mentioned_p (operands[3], operands[2])))"
   "#"
                         (match_operand:DF 2 "register_operand" ""))))
    (set (match_operand:DF 3 "register_operand" "")
        (mult:DF (match_dup 1) (match_dup 2)))]
-  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
+  "!TARGET_SOFT_FLOAT && TARGET_PA_20 && !flag_signed_zeros"
   [(set (match_dup 3) (mult:DF (match_dup 1) (match_dup 2)))
    (set (match_dup 0) (neg:DF (mult:DF (match_dup 1) (match_dup 2))))]
   "")
                         (match_operand:SF 2 "register_operand" "f"))))
    (set (match_operand:SF 3 "register_operand" "=&f")
        (mult:SF (match_dup 1) (match_dup 2)))]
-  "(! TARGET_SOFT_FLOAT && TARGET_PA_20
+  "(!TARGET_SOFT_FLOAT && TARGET_PA_20 && !flag_signed_zeros
     && ! (reg_overlap_mentioned_p (operands[3], operands[1])
           || reg_overlap_mentioned_p (operands[3], operands[2])))"
   "#"
                         (match_operand:SF 2 "register_operand" ""))))
    (set (match_operand:SF 3 "register_operand" "")
        (mult:SF (match_dup 1) (match_dup 2)))]
-  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
+  "!TARGET_SOFT_FLOAT && TARGET_PA_20&& !flag_signed_zeros"
   [(set (match_dup 3) (mult:SF (match_dup 1) (match_dup 2)))
    (set (match_dup 0) (neg:SF (mult:SF (match_dup 1) (match_dup 2))))]
   "")
-
-(define_insn ""
-  [(set (match_operand:DF 0 "register_operand" "=f")
-       (neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f"))))
-   (set (match_operand:DF 2 "register_operand" "=&f") (abs:DF (match_dup 1)))]
-  "(! TARGET_SOFT_FLOAT && TARGET_PA_20
-    && ! reg_overlap_mentioned_p (operands[2], operands[1]))"
-  "#"
-  [(set_attr "type" "fpalu")
-   (set_attr "length" "8")])
-
-(define_split
-  [(set (match_operand:DF 0 "register_operand" "")
-       (neg:DF (abs:DF (match_operand:DF 1 "register_operand" ""))))
-   (set (match_operand:DF 2 "register_operand" "") (abs:DF (match_dup 1)))]
-  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
-  [(set (match_dup 2) (abs:DF (match_dup 1)))
-   (set (match_dup 0) (neg:DF (abs:DF (match_dup 1))))]
-  "")
-
-(define_insn ""
-  [(set (match_operand:SF 0 "register_operand" "=f")
-       (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f"))))
-   (set (match_operand:SF 2 "register_operand" "=&f") (abs:SF (match_dup 1)))]
-  "(! TARGET_SOFT_FLOAT && TARGET_PA_20
-    && ! reg_overlap_mentioned_p (operands[2], operands[1]))"
-  "#"
-  [(set_attr "type" "fpalu")
-   (set_attr "length" "8")])
-
-(define_split
-  [(set (match_operand:SF 0 "register_operand" "")
-       (neg:SF (abs:SF (match_operand:SF 1 "register_operand" ""))))
-   (set (match_operand:SF 2 "register_operand" "") (abs:SF (match_dup 1)))]
-  "! TARGET_SOFT_FLOAT && TARGET_PA_20"
-  [(set (match_dup 2) (abs:SF (match_dup 1)))
-   (set (match_dup 0) (neg:SF (abs:SF (match_dup 1))))]
-  "")
 \f
 ;;- Shift instructions