diff options
author | jgreenhalgh <jgreenhalgh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-11-23 17:17:35 +0000 |
---|---|---|
committer | jgreenhalgh <jgreenhalgh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-11-23 17:17:35 +0000 |
commit | 41af789c259ce9cc196bc3de1612c5f25b2dff4f (patch) | |
tree | a128fc2fda7f3ceaac3644fd20a8a3f6c6be5874 /gcc/config/m68k/m68k.c | |
parent | 1de60655248653c9148c66ae41d14eaa32ddb131 (diff) | |
download | gcc-41af789c259ce9cc196bc3de1612c5f25b2dff4f.tar.gz |
[Patch 4/17] Implement TARGET_C_EXCESS_PRECISION for m68k
gcc/
* config/m68k/m68k.c (m68k_excess_precision): New.
(TARGET_C_EXCESS_PRECISION): Define.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@242774 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/m68k/m68k.c')
-rw-r--r-- | gcc/config/m68k/m68k.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c index 346c2dc6af3..7bc26bf17e6 100644 --- a/gcc/config/m68k/m68k.c +++ b/gcc/config/m68k/m68k.c @@ -183,6 +183,8 @@ static rtx m68k_function_arg (cumulative_args_t, machine_mode, static bool m68k_cannot_force_const_mem (machine_mode mode, rtx x); static bool m68k_output_addr_const_extra (FILE *, rtx); static void m68k_init_sync_libfuncs (void) ATTRIBUTE_UNUSED; +static enum flt_eval_method +m68k_excess_precision (enum excess_precision_type); /* Initialize the GCC target structure. */ @@ -323,6 +325,9 @@ static void m68k_init_sync_libfuncs (void) ATTRIBUTE_UNUSED; #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA m68k_output_addr_const_extra +#undef TARGET_C_EXCESS_PRECISION +#define TARGET_C_EXCESS_PRECISION m68k_excess_precision + /* The value stored by TAS. */ #undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL #define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 128 @@ -6534,4 +6539,36 @@ m68k_epilogue_uses (int regno ATTRIBUTE_UNUSED) == m68k_fk_interrupt_handler)); } + +/* Implement TARGET_C_EXCESS_PRECISION. + + Set the value of FLT_EVAL_METHOD in float.h. When using 68040 fp + instructions, we get proper intermediate rounding, otherwise we + get extended precision results. */ + +static enum flt_eval_method +m68k_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. */ + if (TARGET_68040 || ! TARGET_68881) + return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT; + + return FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE; + default: + gcc_unreachable (); + } + return FLT_EVAL_METHOD_UNPREDICTABLE; +} + #include "gt-m68k.h" |