From a0b71069c18000351f635cabc7c881888a69ea5b Mon Sep 17 00:00:00 2001 From: danglin Date: Fri, 26 Nov 2010 04:09:25 +0000 Subject: * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167159 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/pa/pa.md | 95 ++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 48 deletions(-) (limited to 'gcc/config/pa') 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 -- cgit v1.2.1