Hi, This patch ports the logic from s390's TARGET_FLT_EVAL_METHOD to the new target hook TARGET_C_EXCESS_PRECISION.
Patch tested by building an s390-none-linux toolchain and running s390.exp (without the ability to execute) with no regressions, and manually inspecting the output assembly code when compiling testsuite/gcc.target/i386/excess-precision* to show no difference in code-generation. OK? Thanks, James --- gcc/ 2016-09-30 James Greenhalgh <james.greenha...@arm.com> * config/s390/s390.c (s390_excess_precision): New. (TARGET_C_EXCESS_PRECISION): Define.
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 3bdb648..b704d46 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -15106,6 +15106,34 @@ s390_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1, const_tree ty return NULL; } +/* Implement TARGET_EXCESS_PRECISION. + + This is used by float.h to define the float_t and double_t data + types. For historical reasons both are double on s390 what cannot + be changed anymore. */ + +static enum flt_eval_method +s390_excess_precision (enum excess_precision_type type) +{ + switch (type) + { + case EXCESS_PRECISION_TYPE_FAST: + /* The fastest type to promote to will always be the native type, + whether that occurs with implicit excess precision or + otherwise. */ + return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT; + case EXCESS_PRECISION_TYPE_STANDARD: + case EXCESS_PRECISION_TYPE_IMPLICIT: + /* Otherwise, the excess precision we want when we are + in a standards compliant mode, and the implicit precision we + provide can be identical. */ + return FLT_EVAL_METHOD_PROMOTE_TO_DOUBLE; + default: + gcc_unreachable (); + } + return FLT_EVAL_METHOD_UNPREDICTABLE; +} + /* Initialize GCC target structure. */ #undef TARGET_ASM_ALIGNED_HI_OP @@ -15161,6 +15189,9 @@ s390_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1, const_tree ty #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true +#undef TARGET_C_EXCESS_PRECISION +#define TARGET_C_EXCESS_PRECISION s390_excess_precision + #undef TARGET_SCHED_ADJUST_PRIORITY #define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority #undef TARGET_SCHED_ISSUE_RATE