diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-26 04:09:25 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-26 04:09:25 +0000 |
commit | a0b71069c18000351f635cabc7c881888a69ea5b (patch) | |
tree | c03024eb8d64ed17936c90bc921938d1715a1802 /gcc/config/pa | |
parent | fdc6557920ef6d6c8d774427edbc514b16d1a5d3 (diff) | |
download | gcc-a0b71069c18000351f635cabc7c881888a69ea5b.tar.gz |
* 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
Diffstat (limited to 'gcc/config/pa')
-rw-r--r-- | gcc/config/pa/pa.md | 95 |
1 files changed, 47 insertions, 48 deletions
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 |