diff options
Diffstat (limited to 'gcc/ada/gcc-interface/misc.c')
-rw-r--r-- | gcc/ada/gcc-interface/misc.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 3d1ea17..9a07de0 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -717,6 +717,9 @@ enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int)) = { "float", "double", "long double" }; int iloop; + /* We are going to compute it below. */ + fp_arith_may_widen = false; + for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++) { enum machine_mode i = (enum machine_mode) iloop; @@ -766,6 +769,15 @@ enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int)) if (!fmt) continue; + /* Be conservative and consider that floating-point arithmetics may + use wider intermediate results as soon as there is an extended + Motorola or Intel mode supported by the machine. */ + if (fmt == &ieee_extended_motorola_format + || fmt == &ieee_extended_intel_96_format + || fmt == &ieee_extended_intel_96_round_53_format + || fmt == &ieee_extended_intel_128_format) + fp_arith_may_widen = true; + if (fmt->b == 2) digs = (fmt->p - 1) * 1233 / 4096; /* scale by log (2) */ |