On Fri, Aug 16, 2013 at 12:06:56PM -0500, Peter Bergner wrote: > --- gcc/config/rs6000/dfp.md (revision 201779) > +++ gcc/config/rs6000/dfp.md (working copy) > @@ -135,8 +135,15 @@ (define_insn "*negtd2_fpr" > [(set (match_operand:TD 0 "gpc_reg_operand" "=d") > (neg:TD (match_operand:TD 1 "gpc_reg_operand" "d")))] > "TARGET_HARD_FLOAT && TARGET_FPRS" > - "fneg %0,%1" > - [(set_attr "type" "fp")]) > + "* > +{ > + if (REGNO (operands[0]) == REGNO (operands[1])) > + return \"fneg %0,%1\"; > + else > + return \"fneg %0,%1\;fmr %L0,%L1\"; > +}" > + [(set_attr "type" "fp") > + (set_attr "length" "8")])
Is the length right for the firt case though? I mean, shouldn't the insn have two alternatives: =d,d 0,d and length 4,8 ? > @@ -148,15 +155,29 @@ (define_insn "*abstd2_fpr" > [(set (match_operand:TD 0 "gpc_reg_operand" "=d") > (abs:TD (match_operand:TD 1 "gpc_reg_operand" "d")))] > "TARGET_HARD_FLOAT && TARGET_FPRS" > - "fabs %0,%1" > - [(set_attr "type" "fp")]) > + "* > +{ > + if (REGNO (operands[0]) == REGNO (operands[1])) > + return \"fabs %0,%1\"; > + else > + return \"fabs %0,%1\;fmr %L0,%L1\"; > +}" > + [(set_attr "type" "fp") > + (set_attr "length" "8")]) Ditto here. Jakub