Hi, This patch set enables the _Float16 type specified in ISO/IEC TS 18661-3 for AArch64.
To do this, we first need to update the excess precision logic to support possibly computing _Float16 values in 16-bit range and precision, and to set the FLT_EVAL_METHOD macro to "16" as appropriate. That requires some more expressiveness than we currently get with TARGET_FLT_EVAL_METHOD, so we first need a new target hook - TARGET_C_EXCESS_PRECISION (patch 1/11), which we implement in the i386, s390 and m68k back-ends in patches 2-4/11. However, the meaning of the new value "16" for FLT_EVAL_METHOD is not specified under C99/C11, and conforming code may have been written assuming that the only possible values for FLT_EVAL_METHOD were negative values and { 0, 1, 2 }. In [patch 5/11] we work around that with a new option - -fpermitted-flt-eval-methods=[c11|ts-18661-3]. This option will restrict the compiler to only using the C99/C11 values for FLT_EVAL_METHOD, and is set to -fpermitted-flt-eval-methods=c11 by default when in a standards compliant mode like -std=c11. Patch 6/11 does the work of rewriting the excess precision logic along the guidelines given in https://gcc.gnu.org/ml/gcc-patches/2016-09/msg00410.html Patch 7/11 finishes the hookization of TARGET_FLT_EVAL_METHOD by poisoning the old macro. Patch 8/11 removes the restriction in targhooks.c:default_floatn_mode that currently disables HFmode support. This patch is not strictly necessary, and an alternative route to the same goal would override TARGET_FLOATN_MODE in AArch64. However, now we've cleaned up the excess precision logic, I don't believe there is any reason this patch would not be correct. Patch 9/11 imports the soft-fp changes from https://sourceware.org/ml/libc-alpha/2016-09/msg00310.html to libgcc. Patch 10/11 enables these conversion routines for AArch64. And finally patch 11/11 adds support for the various hooks that the AArch64 back-end requires to turn _Float16 support on. The patch series as a whole passes a bootstrap and test cycle on x86_64 and AArch64. I've bootstrapped and tested each patch individually on x86_64. All new tests added and enabled pass as appropriate. The AArch64 enablement requires https://gcc.gnu.org/ml/gcc-patches/2016-09/msg00268.html OK? Thanks, James ChangeLogs: [Patch 1/11] Add a new target hook for describing excess precision intentions gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * target.def (excess_precision): New hook. * target.h (flt_eval_method): New. (excess_precision_type): Likewise. * targhooks.c (default_excess_precision): New. * targhooks.h (default_excess_precision): New. * doc/tm.texi.in (TARGET_EXCESS_PRECISION): New. * doc/tm.texi: Regenerate. [Patch 2/11] Implement TARGET_C_EXCESS_PRECISION for i386 gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/i386/i386.c (ix86_excess_precision): New. (TARGET_C_EXCESS_PRECISION): Define. [Patch 3/11] Implement TARGET_C_EXCESS_PRECISION for s390 gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/s390/s390.c (s390_excess_precision): New. (TARGET_C_EXCESS_PRECISION): Define. [Patch 4/11] Implement TARGET_C_EXCESS_PRECISION for m68k gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/m68k/m68k.c (m68k_excess_precision): New. (TARGET_C_EXCESS_PRECISION): Define. [Patch 5/11] Add -fpermitted-flt-eval-methods=[c11|ts-18661-3] gcc/c-family/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * c-opts.c (c_common_post_options): Add logic to handle the default case for -fpermitted-flt-eval-methods. gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * common.opt (fpermitted-flt-eval-methods): New. * doc/invoke.texi (-fpermitted-flt-eval-methods): Document it. * flag_types.h (permitted_flt_eval_methods): New. gcc/testsuite/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * gcc.dg/fpermitted-flt-eval-methods_1.c: New. * gcc.dg/fpermitted-flt-eval-methods_2.c: New. [Patch 6/11] Migrate excess precision logic to use TARGET_EXCESS_PRECISION gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * toplev.c (init_excess_precision): Delete most logic. * tree.c (excess_precision_type): Rewrite to use TARGET_EXCESS_PRECISION. * doc/invoke.texi (-fexcess-precision): Document behaviour in a more generic fashion. gcc/c-family/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * c-common.c (excess_precision_mode_join): New. (c_ts18661_flt_eval_method): New. (c_c11_flt_eval_method): Likewise. (c_flt_eval_method): Likewise. * c-common.h (excess_precision_mode_join): New. (c_flt_eval_method): Likewise. * c-cppbuiltin.c (c_cpp_flt_eval_method_iec_559): New. (cpp_iec_559_value): Call it. (c_cpp_builtins): Modify logic for __LIBGCC_*_EXCESS_PRECISION__, call c_flt_eval_method to set __FLT_EVAL_METHOD__ and __FLT_EVAL_METHOD_C99__. [Patch 7/11] Delete TARGET_FLT_EVAL_METHOD and poison it. gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/s390/s390.h (TARGET_FLT_EVAL_METHOD): Delete. * config/m68k/m68k.h (TARGET_FLT_EVAL_METHOD): Delete. * config/i386/i386.h (TARGET_FLT_EVAL_METHOD): Delete. * defaults.h (TARGET_FLT_EVAL_METHOD): Delete. * doc/tm.texi.in (TARGET_FLT_EVAL_METHOD): Delete. * doc/tm.texi: Regenerate. * system.h (TARGET_FLT_EVAL_METHOD): Poison. [Patch 8/11] Make _Float16 available if HFmode is available gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * targhooks.c (default_floatn_mode): Enable _Float16 if a target provides HFmode. [Patch libgcc 9/11] Update soft-fp from glibc libgcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * soft-fp/extendhftf2.c: New. * soft-fp/fixhfti.c: Likewise. * soft-fp/fixunshfti.c: Likewise. * soft-fp/floattihf.c: Likewise. * soft-fp/floatuntihf.c: Likewise. * soft-fp/half.h: Likewise. * soft-fp/trunctfhf2.c: Likewise. [Patch libgcc AArch64 10/11] Enable hfmode soft-float conversions and truncations gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/aarch64/aarch64-c.c (aarch64_scalar_mode_supported_p): New. (TARGET_SCALAR_MODE_SUPPORTED_P): Define. libgcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/aarch64/sfp-machine.h (_FP_NANFRAC_H): Define. (_FP_NANSIGN_H): Likewise. * config/aarch64/t-softfp (softfp_extensions): Add hftf. (softfp_truncations): Add tfhf. (softfp_extras): Add required conversion functions. [Patch AArch64 11/11] Enable _Float16 gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/aarch64/aarch64-c.c (aarch64_update_cpp_builtins): Update __FLT_EVAL_METHOD__ and __FLT_EVAL_METHOD_C99__ when we switch architecture levels. * config/aarch64/aarch64.c (aarch64_promoted_type): Only promote the aarch64_fp16_type_node, not all HFmode types. (aarch64_libgcc_floating_mode_supported_p): Support HFmode. (aarch64_scalar_mode_supported_p): Likewise. (aarch64_excess_precision): New. (TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): Define. (TARGET_SCALAR_MODE_SUPPORTED_P): Likewise. (TARGET_C_EXCESS_PRECISION): Likewise. gcc/testsuite/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * gcc.target/aarch64/_Float16_1.c: New. * gcc.target/aarch64/_Float16_2.c: Likewise. * gcc.target/aarch64/_Float16_3.c: Likewise.