[PATCH] Add SPECIAL_FLOAT_MODE to enable adding IEEE 128-bit floating point to PowerPC

Michael Meissner meissner@linux.vnet.ibm.com
Wed May 6 21:09:00 GMT 2015


On Wed, May 06, 2015 at 03:27:48PM +0000, Joseph Myers wrote:
> On Tue, 5 May 2015, Michael Meissner wrote:
> 
> > The problem is the PowerPC will have 2 128-bit floating point types, one using
> > the IBM double-double format (a pair of doubles to give the user more mantissa
> > bits, but no greater exponent range), and IEEE 128-bit floating point.  I don't
> > want DFmode to automatically convert to KFmode (IEEE 128-bit floating point),
> > but to TFmode (IBM double-double).
> 
> But actually it shouldn't automatically convert to either, except maybe 
> for very limited cases such as loading constants for a wider mode that can 
> be represented in a narrower mode.  It shouldn't automatically convert to 
> TFmode because that's non-IEEE and anything done with such an automatic 
> conversion is unlikely to have correct semantics for double; it shouldn't 
> automatically convert to KFmode because that's a software type and 
> converting automatically to it won't be that efficient.
> 
> (Cf libgcc2.c's AVOID_FP_TYPE_CONVERSION - where as far as I can tell, 
> removing the __powerpc__ special case would achieve the semantics I 
> expect.)
> 
> What in the compiler is actually doing such conversions automatically, and 
> what simply needs to iterate over all the types?  I think we need a better 
> understanding of each place that's affected by these changes to work out 
> what's actually correct.  If something adds conversions from DFmode to 
> non-IEEE TFmode at present, where the original program did not contain 
> such conversions, that's a bug in the existing code (except for very 
> limited cases such as constants), even in the absence of KFmode.

I was curious, and instrumented GET_MODE_WIDENING_MODE for FP (both scalar and
vector) types, and found it was called in the following spots compiling normal
code that is vectorizable (not IEEE 128-bit):

expr.c:03690 DF
expr.c:03690 SF

    compress_float_constant

optabs.c:00353 TF

    find_widening_optab_handler_and_mode

optabs.c:01658 TF

    expand_binop
    /* Look for a wider mode of the same class for which we think we
       can open-code the operation.  Check for a widening multiply at the
       wider mode as well.  */

optabs.c:02203 TF

    expand_binop
    /* Look for a wider mode of the same class for which it appears we can do
       the operation.  */

optabs.c:03156 TF

    expand_unop
    /* It can't be done in this mode.  Can we open-code it in a wider mode?  */

optabs.c:03319 TF

    expand_unop
    /* It can't be done in this mode.  Can we do it in a wider mode?  */

optabs.c:05245 TF

    expand_fix
      /* We first try to find a pair of modes, one real and one integer, at
         least as wide as FROM and TO, respectively, in which we can open-code
         this conversion.  If the integer mode is wider than the mode of TO,
         we can do the conversion either signed or unsigned.  */

optabs.c:05308 TF

    expand_fix
    /* unsigned conversion if no hardware support */

reginfo.c:00664 DF
reginfo.c:00664 SF
reginfo.c:00664 TF

    choose_hard_reg_mode
    /* We first look for the largest integer mode that can be validly
       held in REGNO.  If none, we look for the largest floating-point mode.
       If we still didn't find a valid mode, try CCmode.  */

reginfo.c:00673 V2DF
reginfo.c:00673 V2SF
reginfo.c:00673 V2TF
reginfo.c:00673 V4DF
reginfo.c:00673 V4SF
reginfo.c:00673 V8SF

    choose_hard_reg_mode
    /* look for vector float if we can't find float.  */

stor-layout.c:00347 DC
stor-layout.c:00347 DF
stor-layout.c:00347 SC
stor-layout.c:00347 SF

    mode_for_size

stor-layout.c:00541 V2SF
stor-layout.c:00541 V4SF

    mode_for_vector

> (If something is about e.g. eliminating a widening followed by a narrowing 
> - never implicitly adding a widening but possibly removing one - then that 
> would be correct for either (DFmode, TFmode) or (DFmode, KFmode).  But 
> you'd still have the issue that neither TFmode nor KFmode is a widening of 
> the other - each can represent values the other cannot.)
> 
> If "wider" means "can represent all values of the other mode", both TFmode 
> and KFmode are wider than DFmode.  If it means "is suitable to use as an 
> intermediate mode for operations involving the other mode" (the libgcc 
> case), neither is wider than DFmode.  If it means "can efficiently load 
> constants of the other mode", TFmode is wider than DFmode but KFmode may 
> not be.  In any case, neither of TFmode and KFmode is wider than the 
> other.  Unless all the code uses a single one of these meanings, you need 
> to distinguish which meaning is used in each place in the code.

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



More information about the Gcc-patches mailing list