diff options
author | Alan Modra <amodra@bigpond.net.au> | 2004-03-04 09:26:45 +0000 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2004-03-04 19:56:45 +1030 |
commit | 1a402dc10d239645f97496dd28d7d470c5edbc65 (patch) | |
tree | 45b8f293d30af0bc7b21f80fddcaea4b30b7638c /gcc | |
parent | 6a2d136bfdd1ffe83a1feb0aae0c741a7166604b (diff) | |
download | gcc-1a402dc10d239645f97496dd28d7d470c5edbc65.zip gcc-1a402dc10d239645f97496dd28d7d470c5edbc65.tar.gz gcc-1a402dc10d239645f97496dd28d7d470c5edbc65.tar.bz2 |
re PR target/14406 (rs6000 abstf2 is broken)
PR target/14406
* config/rs6000/rs6000.md (abstf2, abstf2+1): Delete define_insn.
(abstf2, abstf2_internal): New define_expand.
From-SVN: r78896
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 43 |
2 files changed, 30 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c6aae3..337c4c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-03-04 Alan Modra <amodra@bigpond.net.au> + + PR target/14406 + * config/rs6000/rs6000.md (abstf2, abstf2+1): Delete define_insn. + (abstf2, abstf2_internal): New define_expand. + 2004-03-04 Eric Botcazou <ebotcazou@libertysurf.fr> PR optimization/14235 diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index af0d781..29b36d6 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -8375,35 +8375,40 @@ [(set_attr "type" "fp") (set_attr "length" "8")]) -(define_insn "abstf2" +(define_expand "abstf2" [(set (match_operand:TF 0 "gpc_reg_operand" "=f") (abs:TF (match_operand:TF 1 "gpc_reg_operand" "f")))] "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" - "* + " { - if (REGNO (operands[0]) == REGNO (operands[1]) + 1) - return \"fabs %L0,%L1\;fabs %0,%1\"; - else - return \"fabs %0,%1\;fabs %L0,%L1\"; -}" - [(set_attr "type" "fp") - (set_attr "length" "8")]) + rtx label = gen_label_rtx (); + emit_insn (gen_abstf2_internal (operands[0], operands[1], label)); + emit_label (label); + DONE; +}") -(define_insn "" +(define_expand "abstf2_internal" [(set (match_operand:TF 0 "gpc_reg_operand" "=f") - (neg:TF (abs:TF (match_operand:TF 1 "gpc_reg_operand" "f"))))] + (match_operand:TF 1 "gpc_reg_operand" "f")) + (set (match_dup 3) (match_dup 5)) + (set (match_dup 5) (abs:DF (match_dup 5))) + (set (match_dup 4) (compare:CCFP (match_dup 3) (match_dup 5))) + (set (pc) (if_then_else (eq (match_dup 4) (const_int 0)) + (label_ref (match_operand 2 "" "")) + (pc))) + (set (match_dup 6) (neg:DF (match_dup 6)))] "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" - "* + " { - if (REGNO (operands[0]) == REGNO (operands[1]) + 1) - return \"fnabs %L0,%L1\;fnabs %0,%1\"; - else - return \"fnabs %0,%1\;fnabs %L0,%L1\"; -}" - [(set_attr "type" "fp") - (set_attr "length" "8")]) + const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode); + const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0; + operands[3] = gen_reg_rtx (DFmode); + operands[4] = gen_reg_rtx (CCFPmode); + operands[5] = simplify_gen_subreg (DFmode, operands[0], TFmode, hi_word); + operands[6] = simplify_gen_subreg (DFmode, operands[0], TFmode, lo_word); +}") ;; Next come the multi-word integer load and store and the load and store ;; multiple insns. |