summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/pa/pa.md95
2 files changed, 55 insertions, 48 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2ad248b45ca..d4ee580c6c3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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".
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 0d51c62db7e..1ac18ec0d35 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -5982,7 +5982,7 @@
(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]));
@@ -6026,7 +6026,7 @@
(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]));
@@ -6148,14 +6148,51 @@
[(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")])
@@ -6164,7 +6201,7 @@
[(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")])
@@ -6175,7 +6212,7 @@
(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])))"
"#"
@@ -6188,7 +6225,7 @@
(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))))]
"")
@@ -6199,7 +6236,7 @@
(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])))"
"#"
@@ -6212,48 +6249,10 @@
(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))))]
- "")
;;- Shift instructions