PR target/14406
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Mar 2004 09:26:45 +0000 (09:26 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Mar 2004 09:26:45 +0000 (09:26 +0000)
* 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
gcc/config/rs6000/rs6000.md

index 3c6aae3..337c4c2 100644 (file)
@@ -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
index af0d781..29b36d6 100644 (file)
   [(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);
+}")
 \f
 ;; Next come the multi-word integer load and store and the load and store
 ;; multiple insns.