[PATCH], PowerPC long double transistion, patch #4

Michael Meissner meissner@linux.ibm.com
Fri Jun 15 19:57:00 GMT 2018


On Fri, Jun 15, 2018 at 01:39:49PM -0500, Segher Boessenkool wrote:
> On Wed, Jun 13, 2018 at 05:25:33PM -0400, Michael Meissner wrote:
> > This patch fixes the power8 implementation of copysign for IEEE 128-bit
> > floating point.  In particular, the way the temporary register was allocated
> > did not use the normal GCC conventions of using a clobber with match_scratch.
> > Because the constraint did not include a '&', the temporary register could have
> > used one of the input registers.
> 
> > --- gcc/config/rs6000/rs6000.md	(revision 261512)
> > +++ gcc/config/rs6000/rs6000.md	(working copy)
> > @@ -14102,11 +14102,8 @@ (define_expand "copysign<mode>3"
> >      emit_insn (gen_copysign<mode>3_hard (operands[0], operands[1],
> >  					 operands[2]));
> >    else
> > -    {
> > -      rtx tmp = gen_reg_rtx (<MODE>mode);
> > -      emit_insn (gen_copysign<mode>3_soft (operands[0], operands[1],
> > -					   operands[2], tmp));
> > -    }
> > +    emit_insn (gen_copysign<mode>3_soft (operands[0], operands[1],
> > +					 operands[2]));
> >    DONE;
> >  })
> >  
> > @@ -14125,9 +14122,9 @@ (define_insn "copysign<mode>3_soft"
> >    [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
> >  	(unspec:IEEE128
> >  	 [(match_operand:IEEE128 1 "altivec_register_operand" "v")
> > -	  (match_operand:IEEE128 2 "altivec_register_operand" "v")
> > -	  (match_operand:IEEE128 3 "altivec_register_operand" "+v")]
> > -	 UNSPEC_COPYSIGN))]
> > +	  (match_operand:IEEE128 2 "altivec_register_operand" "v")]
> > +	 UNSPEC_COPYSIGN))
> > +   (clobber (match_scratch:IEEE128 3 "=&v"))]
> >    "!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
> >     "xscpsgndp %x3,%x2,%x1\;xxpermdi %x0,%x3,%x1,1"
> >    [(set_attr "type" "veccomplex")
> 
> Does this have to be two machine insns for one RTL insns?  If you split it
> in the expander you don't need the clobber or the earlyclobber or anything
> like that.
> 
> Okay if splitting it leads to problems elsewhere.

I suspect it cannot be split before register allocation, just because that has
been a source of problems in the past.

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.ibm.com, phone: +1 (978) 899-4797



More information about the Gcc-patches mailing list