Skip to content
Snippets Groups Projects
  • Joseph Myers's avatar
    8cc4b7a2
    Remove LIBGCC2_HAS_?F_MODE target macros. · 8cc4b7a2
    Joseph Myers authored
    This patch removes the LIBGCC2_HAS_{SF,DF,XF,TF}_MODE target macros,
    replacing them by predefines with -fbuilding-libgcc, together with a
    target hook that can influence those predefines when needed.
    
    The new default is that a floating-point mode is supported in libgcc
    if (a) it passes the scalar_mode_supported_p hook (otherwise it's not
    plausible for it to be supported in libgcc) and (b) it's one of those
    four modes (since those are the modes for which libgcc hardcodes the
    possibility of support).  The target hook can override the default
    choice (in either direction) for modes that pass
    scalar_mode_supported_p (although overriding in the direction of
    returning true when the default would return false only makes sense if
    all relevant functions are specially defined in libgcc for that
    particular target).
    
    The previous default settings depended on various settings such as
    LIBGCC2_LONG_DOUBLE_TYPE_SIZE, as well as targets defining the above
    target macros if the default wasn't correct.
    
    The default scalar_mode_supported_p only declares a floating-point
    mode to be supported if it matches one of float / double / long
    double.  This means that in most cases where a mode is only supported
    conditionally in libgcc (TFmode only supported if it's the mode of
    long double, most commonly), the default gets things right.  Overrides
    were needed in the following cases:
    
    * SFmode would always have been supported in libgcc (the condition was
      BITS_PER_UNIT == 8, true for all current targets), but pdp11
      defaults to 64-bit float, and in that case SFmode would fail
      scalar_mode_supported_p.  I don't know if libgcc actually built for
      pdp11 (and the port may well no longer be being used), but this
      patch adds a scalar_mode_supported_p hook to it to ensure SFmode is
      treated as supported.
    
    * Certain i386 and ia64 targets need the new hook to match the
      existing cases for when XFmode or TFmode support is present in
      libgcc.  For i386, the hook can always declare XFmode to be
      supported - the cases where it's not are the cases where long double
      is TFmode, in which case XFmode fails scalar_mode_supported_p[*] -
      but TFmode support needs to be conditional.  (And of the targets not
      defining LIBGCC2_HAS_TF_MODE before this patch, some defined
      LONG_DOUBLE_TYPE_SIZE to 64, so ensuring LIBGCC2_HAS_TF_MODE would
      always be false, while others did not define it, so allowing it to
      be true in the -mlong-double-128 case.  This patch matches that
      logic, although I suspect all the latter targets would have been
      broken if you tried to enable -mlong-double-128 by default, for lack
      of the soft-fp TFmode support in libgcc, which is separately
      configured.)
    
      [*] I don't know if it's deliberate not to support __float80 at all
      with -mlong-double-128.
    
    In order to implement the default version of the new hook,
    insn-modes.h was made to contain macros such as HAVE_TFmode for each
    machine mode, so the default hook can contain conditionals on whether
    XFmode and TFmode exist (to match the hardcoding of a list of modes in
    libgcc).  This is also used in fortran/trans-types.c; previously it
    had a conditional on defined(LIBGCC2_HAS_TF_MODE) (a bit dubious,
    since it ignored the value of the macro), which is replaced by testing
    defined(HAVE_TFmode), in conjunction with requiring
    targetm.libgcc_floating_mode_supported_p.
    
    (Fortran is testing something stronger than that hook: not only is
    libgcc support required, but also libm or equivalent.  Thus, it has a
    test for ENABLE_LIBQUADMATH_SUPPORT in the case that the mode is
    TFmode and that's not the same as any of the three standard types.
    The old and new tests are intended to accept exactly the same set of
    modes for all targets.)
    
    Apart from the four target macros eliminated by this patch, it gets us
    closer to eliminating LIBGCC2_LONG_DOUBLE_TYPE_SIZE as well, though a
    few more places using that macro need changing first.
    
    Bootstrapped with no regressions on x86_64-unknown-linux-gnu; also
    built cc1 for crosses to ia64-elf and pdp11-none as a minimal test of
    changes for those targets.
    
    gcc:
    	* target.def (libgcc_floating_mode_supported_p): New hook.
    	* targhooks.c (default_libgcc_floating_mode_supported_p): New
    	function.
    	* targhooks.h (default_libgcc_floating_mode_supported_p): Declare.
    	* doc/tm.texi.in (LIBGCC2_HAS_DF_MODE, LIBGCC2_HAS_XF_MODE)
    	(LIBGCC2_HAS_TF_MODE): Remove.
    	(TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): New @hook.
    	* doc/tm.texi: Regenerate.
    	* genmodes.c (emit_insn_modes_h): Define HAVE_%smode for each
    	machine mode.
    	* system.h (LIBGCC2_HAS_SF_MODE, LIBGCC2_HAS_DF_MODE)
    	(LIBGCC2_HAS_XF_MODE, LIBGCC2_HAS_TF_MODE): Poison.
    	* config/i386/cygming.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/darwin.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/djgpp.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/dragonfly.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/freebsd.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/gnu-user-common.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/i386-interix.h (IX86_NO_LIBGCC_TFMODE): Define.
    	* config/i386/i386.c (ix86_libgcc_floating_mode_supported_p): New
    	function.
    	(TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): Define.
    	* config/i386/i386elf.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/lynx.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/netbsd-elf.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/netbsd64.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/nto.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/openbsd.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/openbsdelf.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/rtemself.h (IX86_NO_LIBGCC_TFMODE): Define.
    	* config/i386/sol2.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/vx-common.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/ia64/elf.h (IA64_NO_LIBGCC_TFMODE): Define.
    	* config/ia64/freebsd.h (IA64_NO_LIBGCC_TFMODE): Define.
    	* config/ia64/hpux.h (LIBGCC2_HAS_XF_MODE, LIBGCC2_HAS_TF_MODE):
    	Remove.
    	* config/ia64/ia64.c (TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P):
    	New macro.
    	(ia64_libgcc_floating_mode_supported_p): New function.
    	* config/ia64/linux.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/ia64/vms.h (IA64_NO_LIBGCC_XFMODE)
    	(IA64_NO_LIBGCC_TFMODE): Define.
    	* config/msp430/msp430.h (LIBGCC2_HAS_DF_MODE): Remove.
    	* config/pdp11/pdp11.c (TARGET_SCALAR_MODE_SUPPORTED_P): New
    	macro.
    	(pdp11_scalar_mode_supported_p): New function.
    	* config/rl78/rl78.h (LIBGCC2_HAS_DF_MODE): Remove.
    	* config/rx/rx.h (LIBGCC2_HAS_DF_MODE): Remove.
    
    gcc/c-family:
    	* c-cppbuiltin.c (c_cpp_builtins): Define __LIBGCC_HAS_%s_MODE__
    	macros for floating-point modes.
    
    gcc/fortran:
    	* trans-types.c (gfc_init_kinds): Check
    	targetm.libgcc_floating_mode_supported_p for floating-point
    	modes.  Check HAVE_TFmode instead of LIBGCC2_HAS_TF_MODE.
    
    libgcc:
    	* libgcc2.h (LIBGCC2_HAS_SF_MODE): Define using
    	__LIBGCC_HAS_SF_MODE__.
    	(LIBGCC2_HAS_DF_MODE): Define using __LIBGCC_HAS_DF_MODE__.
    	(LIBGCC2_HAS_XF_MODE): Define using __LIBGCC_HAS_XF_MODE__.
    	(LIBGCC2_HAS_TF_MODE): Define using __LIBGCC_HAS_TF_MODE__.
    	* config/libbid/bid_gcc_intrinsics.h
    	(LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Do not define.
    	(LIBGCC2_HAS_XF_MODE): Define using __LIBGCC_HAS_XF_MODE__.
    	(LIBGCC2_HAS_TF_MODE): Define using __LIBGCC_HAS_TF_MODE__.
    	* fixed-bit.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Do not define.
    	(LIBGCC2_HAS_SF_MODE): Define using __LIBGCC_HAS_SF_MODE__.
    	(LIBGCC2_HAS_DF_MODE): Define using __LIBGCC_HAS_DF_MODE__.
    
    From-SVN: r215215
    8cc4b7a2
    History
    Remove LIBGCC2_HAS_?F_MODE target macros.
    Joseph Myers authored
    This patch removes the LIBGCC2_HAS_{SF,DF,XF,TF}_MODE target macros,
    replacing them by predefines with -fbuilding-libgcc, together with a
    target hook that can influence those predefines when needed.
    
    The new default is that a floating-point mode is supported in libgcc
    if (a) it passes the scalar_mode_supported_p hook (otherwise it's not
    plausible for it to be supported in libgcc) and (b) it's one of those
    four modes (since those are the modes for which libgcc hardcodes the
    possibility of support).  The target hook can override the default
    choice (in either direction) for modes that pass
    scalar_mode_supported_p (although overriding in the direction of
    returning true when the default would return false only makes sense if
    all relevant functions are specially defined in libgcc for that
    particular target).
    
    The previous default settings depended on various settings such as
    LIBGCC2_LONG_DOUBLE_TYPE_SIZE, as well as targets defining the above
    target macros if the default wasn't correct.
    
    The default scalar_mode_supported_p only declares a floating-point
    mode to be supported if it matches one of float / double / long
    double.  This means that in most cases where a mode is only supported
    conditionally in libgcc (TFmode only supported if it's the mode of
    long double, most commonly), the default gets things right.  Overrides
    were needed in the following cases:
    
    * SFmode would always have been supported in libgcc (the condition was
      BITS_PER_UNIT == 8, true for all current targets), but pdp11
      defaults to 64-bit float, and in that case SFmode would fail
      scalar_mode_supported_p.  I don't know if libgcc actually built for
      pdp11 (and the port may well no longer be being used), but this
      patch adds a scalar_mode_supported_p hook to it to ensure SFmode is
      treated as supported.
    
    * Certain i386 and ia64 targets need the new hook to match the
      existing cases for when XFmode or TFmode support is present in
      libgcc.  For i386, the hook can always declare XFmode to be
      supported - the cases where it's not are the cases where long double
      is TFmode, in which case XFmode fails scalar_mode_supported_p[*] -
      but TFmode support needs to be conditional.  (And of the targets not
      defining LIBGCC2_HAS_TF_MODE before this patch, some defined
      LONG_DOUBLE_TYPE_SIZE to 64, so ensuring LIBGCC2_HAS_TF_MODE would
      always be false, while others did not define it, so allowing it to
      be true in the -mlong-double-128 case.  This patch matches that
      logic, although I suspect all the latter targets would have been
      broken if you tried to enable -mlong-double-128 by default, for lack
      of the soft-fp TFmode support in libgcc, which is separately
      configured.)
    
      [*] I don't know if it's deliberate not to support __float80 at all
      with -mlong-double-128.
    
    In order to implement the default version of the new hook,
    insn-modes.h was made to contain macros such as HAVE_TFmode for each
    machine mode, so the default hook can contain conditionals on whether
    XFmode and TFmode exist (to match the hardcoding of a list of modes in
    libgcc).  This is also used in fortran/trans-types.c; previously it
    had a conditional on defined(LIBGCC2_HAS_TF_MODE) (a bit dubious,
    since it ignored the value of the macro), which is replaced by testing
    defined(HAVE_TFmode), in conjunction with requiring
    targetm.libgcc_floating_mode_supported_p.
    
    (Fortran is testing something stronger than that hook: not only is
    libgcc support required, but also libm or equivalent.  Thus, it has a
    test for ENABLE_LIBQUADMATH_SUPPORT in the case that the mode is
    TFmode and that's not the same as any of the three standard types.
    The old and new tests are intended to accept exactly the same set of
    modes for all targets.)
    
    Apart from the four target macros eliminated by this patch, it gets us
    closer to eliminating LIBGCC2_LONG_DOUBLE_TYPE_SIZE as well, though a
    few more places using that macro need changing first.
    
    Bootstrapped with no regressions on x86_64-unknown-linux-gnu; also
    built cc1 for crosses to ia64-elf and pdp11-none as a minimal test of
    changes for those targets.
    
    gcc:
    	* target.def (libgcc_floating_mode_supported_p): New hook.
    	* targhooks.c (default_libgcc_floating_mode_supported_p): New
    	function.
    	* targhooks.h (default_libgcc_floating_mode_supported_p): Declare.
    	* doc/tm.texi.in (LIBGCC2_HAS_DF_MODE, LIBGCC2_HAS_XF_MODE)
    	(LIBGCC2_HAS_TF_MODE): Remove.
    	(TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): New @hook.
    	* doc/tm.texi: Regenerate.
    	* genmodes.c (emit_insn_modes_h): Define HAVE_%smode for each
    	machine mode.
    	* system.h (LIBGCC2_HAS_SF_MODE, LIBGCC2_HAS_DF_MODE)
    	(LIBGCC2_HAS_XF_MODE, LIBGCC2_HAS_TF_MODE): Poison.
    	* config/i386/cygming.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/darwin.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/djgpp.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/dragonfly.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/freebsd.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/gnu-user-common.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/i386-interix.h (IX86_NO_LIBGCC_TFMODE): Define.
    	* config/i386/i386.c (ix86_libgcc_floating_mode_supported_p): New
    	function.
    	(TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): Define.
    	* config/i386/i386elf.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/lynx.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/netbsd-elf.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/netbsd64.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/nto.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/openbsd.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/i386/openbsdelf.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/rtemself.h (IX86_NO_LIBGCC_TFMODE): Define.
    	* config/i386/sol2.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/i386/vx-common.h (IX86_MAYBE_NO_LIBGCC_TFMODE): Define.
    	* config/ia64/elf.h (IA64_NO_LIBGCC_TFMODE): Define.
    	* config/ia64/freebsd.h (IA64_NO_LIBGCC_TFMODE): Define.
    	* config/ia64/hpux.h (LIBGCC2_HAS_XF_MODE, LIBGCC2_HAS_TF_MODE):
    	Remove.
    	* config/ia64/ia64.c (TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P):
    	New macro.
    	(ia64_libgcc_floating_mode_supported_p): New function.
    	* config/ia64/linux.h (LIBGCC2_HAS_TF_MODE): Remove.
    	* config/ia64/vms.h (IA64_NO_LIBGCC_XFMODE)
    	(IA64_NO_LIBGCC_TFMODE): Define.
    	* config/msp430/msp430.h (LIBGCC2_HAS_DF_MODE): Remove.
    	* config/pdp11/pdp11.c (TARGET_SCALAR_MODE_SUPPORTED_P): New
    	macro.
    	(pdp11_scalar_mode_supported_p): New function.
    	* config/rl78/rl78.h (LIBGCC2_HAS_DF_MODE): Remove.
    	* config/rx/rx.h (LIBGCC2_HAS_DF_MODE): Remove.
    
    gcc/c-family:
    	* c-cppbuiltin.c (c_cpp_builtins): Define __LIBGCC_HAS_%s_MODE__
    	macros for floating-point modes.
    
    gcc/fortran:
    	* trans-types.c (gfc_init_kinds): Check
    	targetm.libgcc_floating_mode_supported_p for floating-point
    	modes.  Check HAVE_TFmode instead of LIBGCC2_HAS_TF_MODE.
    
    libgcc:
    	* libgcc2.h (LIBGCC2_HAS_SF_MODE): Define using
    	__LIBGCC_HAS_SF_MODE__.
    	(LIBGCC2_HAS_DF_MODE): Define using __LIBGCC_HAS_DF_MODE__.
    	(LIBGCC2_HAS_XF_MODE): Define using __LIBGCC_HAS_XF_MODE__.
    	(LIBGCC2_HAS_TF_MODE): Define using __LIBGCC_HAS_TF_MODE__.
    	* config/libbid/bid_gcc_intrinsics.h
    	(LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Do not define.
    	(LIBGCC2_HAS_XF_MODE): Define using __LIBGCC_HAS_XF_MODE__.
    	(LIBGCC2_HAS_TF_MODE): Define using __LIBGCC_HAS_TF_MODE__.
    	* fixed-bit.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Do not define.
    	(LIBGCC2_HAS_SF_MODE): Define using __LIBGCC_HAS_SF_MODE__.
    	(LIBGCC2_HAS_DF_MODE): Define using __LIBGCC_HAS_DF_MODE__.
    
    From-SVN: r215215