Commit 30c99a84 by Richard Henderson Committed by Richard Henderson

i386.c (x86_arch_always_fancy_math_387): New.

        * config/i386/i386.c (x86_arch_always_fancy_math_387): New.
        (override_options): Disable NO_FANCY_MATH_387 if the arch allows.
        * config/i386/i386.h (x86_arch_always_fancy_math_387): New.
        * config/i386/i386.md (sqrtxf2, sqrtextendsfxf2, sinxf2): Fix
        conditional.
        * docs/invoke.texi: Update -mno-fancy-math-387 docs.

From-SVN: r51584
parent 4d6ac542
2002-03-29 Richard Henderson <rth@redhat.com>
* config/i386/i386.c (x86_arch_always_fancy_math_387): New.
(override_options): Disable NO_FANCY_MATH_387 if the arch allows.
* config/i386/i386.h (x86_arch_always_fancy_math_387): New.
* config/i386/i386.md (sqrtxf2, sqrtextendsfxf2, sinxf2): Fix
conditional.
* docs/invoke.texi: Update -mno-fancy-math-387 docs.
2002-03-29 Dale Johannesen <dalej@apple.com> 2002-03-29 Dale Johannesen <dalej@apple.com>
* loop.c (combine_movables): Do allow combination of pseudos. * loop.c (combine_movables): Do allow combination of pseudos.
......
...@@ -393,6 +393,7 @@ const int x86_accumulate_outgoing_args = m_ATHLON | m_PENT4 | m_PPRO; ...@@ -393,6 +393,7 @@ const int x86_accumulate_outgoing_args = m_ATHLON | m_PENT4 | m_PPRO;
const int x86_prologue_using_move = m_ATHLON | m_PENT4 | m_PPRO; const int x86_prologue_using_move = m_ATHLON | m_PENT4 | m_PPRO;
const int x86_epilogue_using_move = m_ATHLON | m_PENT4 | m_PPRO; const int x86_epilogue_using_move = m_ATHLON | m_PENT4 | m_PPRO;
const int x86_decompose_lea = m_PENT4; const int x86_decompose_lea = m_PENT4;
const int x86_arch_always_fancy_math_387 = m_PENT|m_PPRO|m_ATHLON|m_PENT4;
/* In case the avreage insn count for single function invocation is /* In case the avreage insn count for single function invocation is
lower than this constant, emit fast (but longer) prologue and lower than this constant, emit fast (but longer) prologue and
...@@ -1118,6 +1119,11 @@ override_options () ...@@ -1118,6 +1119,11 @@ override_options ()
if (flag_unsafe_math_optimizations) if (flag_unsafe_math_optimizations)
target_flags &= ~MASK_IEEE_FP; target_flags &= ~MASK_IEEE_FP;
/* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
since the insns won't need emulation. */
if (x86_arch_always_fancy_math_387 & (1 << ix86_arch))
target_flags &= ~MASK_NO_FANCY_MATH_387;
if (TARGET_64BIT) if (TARGET_64BIT)
{ {
if (TARGET_ALIGN_DOUBLE) if (TARGET_ALIGN_DOUBLE)
......
...@@ -222,6 +222,7 @@ extern const int x86_add_esp_4, x86_add_esp_8, x86_sub_esp_4, x86_sub_esp_8; ...@@ -222,6 +222,7 @@ extern const int x86_add_esp_4, x86_add_esp_8, x86_sub_esp_4, x86_sub_esp_8;
extern const int x86_partial_reg_dependency, x86_memory_mismatch_stall; extern const int x86_partial_reg_dependency, x86_memory_mismatch_stall;
extern const int x86_accumulate_outgoing_args, x86_prologue_using_move; extern const int x86_accumulate_outgoing_args, x86_prologue_using_move;
extern const int x86_epilogue_using_move, x86_decompose_lea; extern const int x86_epilogue_using_move, x86_decompose_lea;
extern const int x86_arch_always_fancy_math_387;
extern int x86_prefetch_sse; extern int x86_prefetch_sse;
#define TARGET_USE_LEAVE (x86_use_leave & CPUMASK) #define TARGET_USE_LEAVE (x86_use_leave & CPUMASK)
......
...@@ -14701,7 +14701,7 @@ ...@@ -14701,7 +14701,7 @@
[(set (match_operand:XF 0 "register_operand" "=f") [(set (match_operand:XF 0 "register_operand" "=f")
(sqrt:XF (float_extend:XF (sqrt:XF (float_extend:XF
(match_operand:DF 1 "register_operand" "0"))))] (match_operand:DF 1 "register_operand" "0"))))]
"!TARGET_64BIT && TARGET_80387 && TARGET_NO_FANCY_MATH_387" "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
"fsqrt" "fsqrt"
[(set_attr "type" "fpspc") [(set_attr "type" "fpspc")
(set_attr "mode" "XF") (set_attr "mode" "XF")
...@@ -14721,7 +14721,7 @@ ...@@ -14721,7 +14721,7 @@
[(set (match_operand:XF 0 "register_operand" "=f") [(set (match_operand:XF 0 "register_operand" "=f")
(sqrt:XF (float_extend:XF (sqrt:XF (float_extend:XF
(match_operand:SF 1 "register_operand" "0"))))] (match_operand:SF 1 "register_operand" "0"))))]
"!TARGET_64BIT && TARGET_80387 && TARGET_NO_FANCY_MATH_387" "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
"fsqrt" "fsqrt"
[(set_attr "type" "fpspc") [(set_attr "type" "fpspc")
(set_attr "mode" "XF") (set_attr "mode" "XF")
...@@ -14768,7 +14768,7 @@ ...@@ -14768,7 +14768,7 @@
(define_insn "sinxf2" (define_insn "sinxf2"
[(set (match_operand:XF 0 "register_operand" "=f") [(set (match_operand:XF 0 "register_operand" "=f")
(unspec:XF [(match_operand:XF 1 "register_operand" "0")] 1))] (unspec:XF [(match_operand:XF 1 "register_operand" "0")] 1))]
"!TARGET_64BIT && TARGET_80387 && TARGET_NO_FANCY_MATH_387 "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387
&& flag_unsafe_math_optimizations" && flag_unsafe_math_optimizations"
"fsin" "fsin"
[(set_attr "type" "fpspc") [(set_attr "type" "fpspc")
......
...@@ -7366,9 +7366,12 @@ in ordinary CPU registers instead. ...@@ -7366,9 +7366,12 @@ in ordinary CPU registers instead.
@opindex mno-fancy-math-387 @opindex mno-fancy-math-387
Some 387 emulators do not support the @code{sin}, @code{cos} and Some 387 emulators do not support the @code{sin}, @code{cos} and
@code{sqrt} instructions for the 387. Specify this option to avoid @code{sqrt} instructions for the 387. Specify this option to avoid
generating those instructions. This option is the default on FreeBSD@. generating those instructions. This option is the default on FreeBSD,
As of revision 2.6.1, these instructions are not generated unless you OpenBSD and NetBSD@. This option is overridden when @option{-march}
also use the @option{-funsafe-math-optimizations} switch. indicates that the target cpu will always have an FPU and so the
instruction will not need emulation. As of revision 2.6.1, these
instructions are not generated unless you also use the
@option{-funsafe-math-optimizations} switch.
@item -malign-double @item -malign-double
@itemx -mno-align-double @itemx -mno-align-double
......
/* Verify that -mno-fancy-math-387 works. */
/* { dg-do compile { target "i?86-*-*" } } */
/* { dg-options "-O -ffast-math -mfpmath=387 -mno-fancy-math-387" } */
/* { dg-final { scan-assembler "call\tsin" } } */
/* { dg-final { scan-assembler "call\tcos" } } */
/* { dg-final { scan-assembler "call\tsqrt" } } */
double f1(double x) { return __builtin_sin(x); }
double f2(double x) { return __builtin_cos(x); }
double f3(double x) { return __builtin_sqrt(x); }
/* Verify that -march overrides -mno-fancy-math-387. */
/* { dg-do compile { target "i?86-*-*" } } */
/* { dg-options "-O -ffast-math -mfpmath=387 -march=i686 -mno-fancy-math-387" } */
/* { dg-final { scan-assembler "fsin" } } */
/* { dg-final { scan-assembler "fcos" } } */
/* { dg-final { scan-assembler "fsqrt" } } */
double f1(double x) { return __builtin_sin(x); }
double f2(double x) { return __builtin_cos(x); }
double f3(double x) { return __builtin_sqrt(x); }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment