From ac1a7e5a687b39f2a0c483fb83004b834893ef61 Mon Sep 17 00:00:00 2001 From: amodra Date: Thu, 4 Mar 2004 09:26:45 +0000 Subject: [PATCH] PR target/14406 * config/rs6000/rs6000.md (abstf2, abstf2+1): Delete define_insn. (abstf2, abstf2_internal): New define_expand. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78896 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ 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 + + PR target/14406 + * config/rs6000/rs6000.md (abstf2, abstf2+1): Delete define_insn. + (abstf2, abstf2_internal): New define_expand. + 2004-03-04 Eric Botcazou 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. -- 2.7.4