i386.h (TARGET_USE_FANCY_MATH_387): New macro.
authorRoger Sayle <roger@eyesopen.com>
Tue, 23 Nov 2004 01:22:58 +0000 (01:22 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 23 Nov 2004 01:22:58 +0000 (01:22 +0000)
* config/i386/i386.h (TARGET_USE_FANCY_MATH_387): New macro.
* config/i386/i386.c (override_options):  Set MASK_NO_FANCY_MATH_387
automatically for targets without TARGET_80387.
* config/i386/i386.md (sqrtsf2, sqrtsf2_1, sqrtsf2_i387, sqrtdf2,
sqrtdf2_1, sqrtdf2_i387, *sqrtextendsfdf2, sqrtxf2,
*sqrtextenddfxf2, *sqrtextendsfxf2, fpremxf4, fmodsf3, fmoddf3,
fmodxf3, fprem1xf4, dremsf3, dremdf3, dremxf3, *sindf2, *sinsf2,
*sinextendsfdf2, *sinxf2, *cosdf2, *cossf2, *cosextendsfdf2,
*cosxf2, sincosdf3, sincossf3, *sincosextendsfdf3, sincosxf3,
*tandf3_1, tandf2, *tansf3_1, tansf2, *tanxf3_1, tanxf2,
atan2df3_1, atan2df3, atandf2, atan2sf3_1, atan2sf3, atansf2,
atan2xf3_1, atan2xf3, atanxf2, asindf2, asinsf2, asinxf2,
acosdf2, acossf2, acosxf2, fyl2x_xf3, logsf2, logdf2, logxf2,
log10sf2, log10df2, log10xf2, log2sf2, log2df2, log2xf2,
fyl2xp1_xf3, log1psf2, log1pdf2, log1pxf2, *fxtractxf3, logbsf2,
logbdf2, logbxf2, ilogbsi2, *f2xm1xf2, *fscalexf4, expsf2,
expdf2, expxf2, exp10sf2, exp10df2, exp10xf2, exp2sf2, exp2df2,
exp2xf2, expm1df2, expm1sf2, expm1xf2, frndintxf2, rintdf2,
rintsf2, rintxf2, frndintxf2_floor, floordf2, floorsf2,
floorxf2, frndintxf2_ceil, ceildf2, ceilsf2, ceilxf2,
frndintxf2_trunc, btruncdf2, btruncsf2, btruncxf2,
frndintxf2_mask_pm, nearbyintdf2, nearbyintsf2, nearbyintxf2):
Simplify conditionals using TARGET_USE_FANCY_MATH_387.

From-SVN: r91061

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md

index 742feea1e6ced6bacec18da7c02141a1e79657e0..8a0ec6276cbfaa44e57aa55484842ff3bac5bfe7 100644 (file)
@@ -1,3 +1,29 @@
+2004-11-22  Roger Sayle  <roger@eyesopen.com>
+
+       * config/i386/i386.h (TARGET_USE_FANCY_MATH_387): New macro.
+       * config/i386/i386.c (override_options):  Set MASK_NO_FANCY_MATH_387
+       automatically for targets without TARGET_80387.
+       * config/i386/i386.md (sqrtsf2, sqrtsf2_1, sqrtsf2_i387, sqrtdf2,
+       sqrtdf2_1, sqrtdf2_i387, *sqrtextendsfdf2, sqrtxf2,
+       *sqrtextenddfxf2, *sqrtextendsfxf2, fpremxf4, fmodsf3, fmoddf3,
+       fmodxf3, fprem1xf4, dremsf3, dremdf3, dremxf3, *sindf2, *sinsf2,
+       *sinextendsfdf2, *sinxf2, *cosdf2, *cossf2, *cosextendsfdf2,
+       *cosxf2, sincosdf3, sincossf3, *sincosextendsfdf3, sincosxf3,
+       *tandf3_1, tandf2, *tansf3_1, tansf2, *tanxf3_1, tanxf2,
+       atan2df3_1, atan2df3, atandf2, atan2sf3_1, atan2sf3, atansf2,
+       atan2xf3_1, atan2xf3, atanxf2, asindf2, asinsf2, asinxf2,
+       acosdf2, acossf2, acosxf2, fyl2x_xf3, logsf2, logdf2, logxf2,
+       log10sf2, log10df2, log10xf2, log2sf2, log2df2, log2xf2,
+       fyl2xp1_xf3, log1psf2, log1pdf2, log1pxf2, *fxtractxf3, logbsf2,
+       logbdf2, logbxf2, ilogbsi2, *f2xm1xf2, *fscalexf4, expsf2,
+       expdf2, expxf2, exp10sf2, exp10df2, exp10xf2, exp2sf2, exp2df2,
+       exp2xf2, expm1df2, expm1sf2, expm1xf2, frndintxf2, rintdf2,
+       rintsf2, rintxf2, frndintxf2_floor, floordf2, floorsf2, 
+       floorxf2, frndintxf2_ceil, ceildf2, ceilsf2, ceilxf2,
+       frndintxf2_trunc, btruncdf2, btruncsf2, btruncxf2,
+       frndintxf2_mask_pm, nearbyintdf2, nearbyintsf2, nearbyintxf2):
+       Simplify conditionals using TARGET_USE_FANCY_MATH_387.
+
 2004-11-22  Dale Johannesen  <dalej@apple.com>
 
        * config/darwin.h (JUMP_TABLES_IN_TEXT_SECTION):  Conditionalize
index a60558448cabf771909a26acb3157a1f6c59caf7..adb4e5ba32ec628595143d0e4cab36df98b7d367 100644 (file)
@@ -1482,6 +1482,11 @@ override_options (void)
   if (x86_arch_always_fancy_math_387 & (1 << ix86_arch))
     target_flags &= ~MASK_NO_FANCY_MATH_387;
 
+  /* Likewise, if the target doesn't have a 387, or we've specified
+     software floating point, don't use 387 inline instrinsics.  */
+  if (!TARGET_80387)
+    target_flags |= MASK_NO_FANCY_MATH_387;
+
   /* Turn on SSE2 builtins for -msse3.  */
   if (TARGET_SSE3)
     target_flags |= MASK_SSE2;
index 7da8f511884d2f2f685006cd277929b996f6e1c1..e4761f971952343e769a92ed2d6bbbd2df4bae62 100644 (file)
@@ -177,6 +177,9 @@ extern int target_flags;
    This is because FreeBSD lacks these in the math-emulator-code */
 #define TARGET_NO_FANCY_MATH_387 (target_flags & MASK_NO_FANCY_MATH_387)
 
+/* Generate 387 floating point intrinsics for the current target.  */
+#define TARGET_USE_FANCY_MATH_387 (! TARGET_NO_FANCY_MATH_387)
+
 /* Don't create frame pointers for leaf functions */
 #define TARGET_OMIT_LEAF_FRAME_POINTER \
   (target_flags & MASK_OMIT_LEAF_FRAME_POINTER)
index abc1cb8917fb3b7a3c4f844f571dec458862562f..dd5cf13ae7fa2915012f6dabf0220bdee666655f 100644 (file)
 (define_expand "sqrtsf2"
   [(set (match_operand:SF 0 "register_operand" "")
        (sqrt:SF (match_operand:SF 1 "nonimmediate_operand" "")))]
-  "(! TARGET_NO_FANCY_MATH_387 && TARGET_80387) || TARGET_SSE_MATH"
+  "TARGET_USE_FANCY_MATH_387 || TARGET_SSE_MATH"
 {
   if (!TARGET_SSE_MATH)
     operands[1] = force_reg (SFmode, operands[1]);
 (define_insn "sqrtsf2_1"
   [(set (match_operand:SF 0 "register_operand" "=f#x,x#f")
        (sqrt:SF (match_operand:SF 1 "nonimmediate_operand" "0#x,xm#f")))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && (TARGET_SSE_MATH && TARGET_MIX_SSE_I387)"
   "@
    fsqrt
 (define_insn "sqrtsf2_i387"
   [(set (match_operand:SF 0 "register_operand" "=f")
        (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && !TARGET_SSE_MATH"
   "fsqrt"
   [(set_attr "type" "fpspc")
 (define_expand "sqrtdf2"
   [(set (match_operand:DF 0 "register_operand" "")
        (sqrt:DF (match_operand:DF 1 "nonimmediate_operand" "")))]
-  "(! TARGET_NO_FANCY_MATH_387 && TARGET_80387)
+  "TARGET_USE_FANCY_MATH_387
    || (TARGET_SSE2 && TARGET_SSE_MATH)"
 {
   if (!TARGET_SSE2 || !TARGET_SSE_MATH)
 (define_insn "sqrtdf2_1"
   [(set (match_operand:DF 0 "register_operand" "=f#Y,Y#f")
        (sqrt:DF (match_operand:DF 1 "nonimmediate_operand" "0#Y,Ym#f")))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && (TARGET_SSE2 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387)"
   "@
    fsqrt
 (define_insn "sqrtdf2_i387"
   [(set (match_operand:DF 0 "register_operand" "=f")
        (sqrt:DF (match_operand:DF 1 "register_operand" "0")))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && (!TARGET_SSE2 || !TARGET_SSE_MATH)"
   "fsqrt"
   [(set_attr "type" "fpspc")
   [(set (match_operand:DF 0 "register_operand" "=f")
        (sqrt:DF (float_extend:DF
                  (match_operand:SF 1 "register_operand" "0"))))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && !(TARGET_SSE2 && TARGET_SSE_MATH)"
   "fsqrt"
   [(set_attr "type" "fpspc")
 (define_insn "sqrtxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (match_operand:XF 1 "register_operand" "0")))]
-  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387 
+  "TARGET_USE_FANCY_MATH_387 
    && (TARGET_IEEE_FP || flag_unsafe_math_optimizations) "
   "fsqrt"
   [(set_attr "type" "fpspc")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (float_extend:XF
                  (match_operand:DF 1 "register_operand" "0"))))]
-  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
+  "TARGET_USE_FANCY_MATH_387"
   "fsqrt"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (float_extend:XF
                  (match_operand:SF 1 "register_operand" "0"))))]
-  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
+  "TARGET_USE_FANCY_MATH_387"
   "fsqrt"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")
                   UNSPEC_FPREM_U))
    (set (reg:CCFP FPSR_REG)
        (unspec:CCFP [(const_int 0)] UNSPEC_NOP))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fprem"
   [(set_attr "type" "fpspc")
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))
    (use (match_operand:SF 2 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx label = gen_label_rtx ();
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))
    (use (match_operand:DF 2 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx label = gen_label_rtx ();
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))
    (use (match_operand:XF 2 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx label = gen_label_rtx ();
                   UNSPEC_FPREM1_U))
    (set (reg:CCFP FPSR_REG)
        (unspec:CCFP [(const_int 0)] UNSPEC_NOP))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fprem1"
   [(set_attr "type" "fpspc")
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))
    (use (match_operand:SF 2 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx label = gen_label_rtx ();
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))
    (use (match_operand:DF 2 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx label = gen_label_rtx ();
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))
    (use (match_operand:XF 2 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx label = gen_label_rtx ();
 (define_insn "*sindf2"
   [(set (match_operand:DF 0 "register_operand" "=f")
        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] UNSPEC_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsin"
   [(set_attr "type" "fpspc")
 (define_insn "*sinsf2"
   [(set (match_operand:SF 0 "register_operand" "=f")
        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] UNSPEC_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsin"
   [(set_attr "type" "fpspc")
        (unspec:DF [(float_extend:DF
                     (match_operand:SF 1 "register_operand" "0"))]
                   UNSPEC_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsin"
   [(set_attr "type" "fpspc")
 (define_insn "*sinxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_SIN))]
-  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsin"
   [(set_attr "type" "fpspc")
 (define_insn "*cosdf2"
   [(set (match_operand:DF 0 "register_operand" "=f")
        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] UNSPEC_COS))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fcos"
   [(set_attr "type" "fpspc")
 (define_insn "*cossf2"
   [(set (match_operand:SF 0 "register_operand" "=f")
        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] UNSPEC_COS))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fcos"
   [(set_attr "type" "fpspc")
        (unspec:DF [(float_extend:DF
                     (match_operand:SF 1 "register_operand" "0"))]
                   UNSPEC_COS))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fcos"
   [(set_attr "type" "fpspc")
 (define_insn "*cosxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_COS))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fcos"
   [(set_attr "type" "fpspc")
                   UNSPEC_SINCOS_COS))
    (set (match_operand:DF 1 "register_operand" "=u")
         (unspec:DF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsincos"
   [(set_attr "type" "fpspc")
                   UNSPEC_SINCOS_COS))
    (set (match_operand:SF 1 "register_operand" "=u")
         (unspec:SF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsincos"
   [(set_attr "type" "fpspc")
    (set (match_operand:DF 1 "register_operand" "=u")
         (unspec:DF [(float_extend:DF
                     (match_dup 2))] UNSPEC_SINCOS_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsincos"
   [(set_attr "type" "fpspc")
                   UNSPEC_SINCOS_COS))
    (set (match_operand:XF 1 "register_operand" "=u")
         (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsincos"
   [(set_attr "type" "fpspc")
                   UNSPEC_TAN_ONE))
    (set (match_operand:DF 1 "register_operand" "=u")
         (unspec:DF [(match_dup 2)] UNSPEC_TAN_TAN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fptan"
   [(set_attr "type" "fpspc")
                              UNSPEC_TAN_ONE))
              (set (match_operand:DF 0 "register_operand" "")
                   (unspec:DF [(match_dup 1)] UNSPEC_TAN_TAN))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (DFmode);
                   UNSPEC_TAN_ONE))
    (set (match_operand:SF 1 "register_operand" "=u")
         (unspec:SF [(match_dup 2)] UNSPEC_TAN_TAN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fptan"
   [(set_attr "type" "fpspc")
                              UNSPEC_TAN_ONE))
              (set (match_operand:SF 0 "register_operand" "")
                   (unspec:SF [(match_dup 1)] UNSPEC_TAN_TAN))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (SFmode);
                   UNSPEC_TAN_ONE))
    (set (match_operand:XF 1 "register_operand" "=u")
         (unspec:XF [(match_dup 2)] UNSPEC_TAN_TAN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fptan"
   [(set_attr "type" "fpspc")
                              UNSPEC_TAN_ONE))
              (set (match_operand:XF 0 "register_operand" "")
                   (unspec:XF [(match_dup 1)] UNSPEC_TAN_TAN))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
                    (match_operand:DF 1 "register_operand" "u")]
                   UNSPEC_FPATAN))
    (clobber (match_scratch:DF 3 "=1"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
   [(use (match_operand:DF 0 "register_operand" "=f"))
    (use (match_operand:DF 2 "register_operand" "0"))
    (use (match_operand:DF 1 "register_operand" "u"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx copy = gen_reg_rtx (DFmode);
                               (match_operand:DF 1 "register_operand" "")]
                    UNSPEC_FPATAN))
              (clobber (match_scratch:DF 3 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (DFmode);
                    (match_operand:SF 1 "register_operand" "u")]
                   UNSPEC_FPATAN))
    (clobber (match_scratch:SF 3 "=1"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
   [(use (match_operand:SF 0 "register_operand" "=f"))
    (use (match_operand:SF 2 "register_operand" "0"))
    (use (match_operand:SF 1 "register_operand" "u"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx copy = gen_reg_rtx (SFmode);
                               (match_operand:SF 1 "register_operand" "")]
                    UNSPEC_FPATAN))
              (clobber (match_scratch:SF 3 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (SFmode);
                    (match_operand:XF 1 "register_operand" "u")]
                   UNSPEC_FPATAN))
    (clobber (match_scratch:XF 3 "=1"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
   [(use (match_operand:XF 0 "register_operand" "=f"))
    (use (match_operand:XF 2 "register_operand" "0"))
    (use (match_operand:XF 1 "register_operand" "u"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx copy = gen_reg_rtx (XFmode);
                               (match_operand:XF 1 "register_operand" "")]
                    UNSPEC_FPATAN))
              (clobber (match_scratch:XF 3 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
              (clobber (match_scratch:XF 8 ""))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 7)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
              (clobber (match_scratch:XF 8 ""))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 7)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
                   (unspec:XF [(match_dup 5) (match_dup 1)]
                              UNSPEC_FPATAN))
              (clobber (match_scratch:XF 6 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
              (clobber (match_scratch:XF 8 ""))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 7)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
              (clobber (match_scratch:XF 8 ""))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 7)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
                   (unspec:XF [(match_dup 1) (match_dup 5)]
                              UNSPEC_FPATAN))
              (clobber (match_scratch:XF 6 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
                    (match_operand:XF 1 "register_operand" "u")]
                   UNSPEC_FYL2X))
    (clobber (match_scratch:XF 3 "=1"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fyl2x"
   [(set_attr "type" "fpspc")
              (clobber (match_scratch:XF 5 ""))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
              (clobber (match_scratch:XF 5 ""))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
                   (unspec:XF [(match_operand:XF 1 "register_operand" "")
                               (match_dup 2)] UNSPEC_FYL2X))
              (clobber (match_scratch:XF 3 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
              (clobber (match_scratch:XF 5 ""))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
              (clobber (match_scratch:XF 5 ""))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
                   (unspec:XF [(match_operand:XF 1 "register_operand" "")
                               (match_dup 2)] UNSPEC_FYL2X))
              (clobber (match_scratch:XF 3 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
              (clobber (match_scratch:XF 5 ""))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
              (clobber (match_scratch:XF 5 ""))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
                   (unspec:XF [(match_operand:XF 1 "register_operand" "")
                               (match_dup 2)] UNSPEC_FYL2X))
              (clobber (match_scratch:XF 3 ""))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
                    (match_operand:XF 1 "register_operand" "u")]
                   UNSPEC_FYL2XP1))
    (clobber (match_scratch:XF 3 "=1"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fyl2xp1"
   [(set_attr "type" "fpspc")
 (define_expand "log1psf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "log1pdf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "log1pxf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   ix86_emit_i387_log1p (operands[0], operands[1]);
                   UNSPEC_XTRACT_FRACT))
    (set (match_operand:XF 1 "register_operand" "=u")
         (unspec:XF [(match_dup 2)] UNSPEC_XTRACT_EXP))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fxtract"
   [(set_attr "type" "fpspc")
                   (unspec:XF [(match_dup 2)] UNSPEC_XTRACT_EXP))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
                   (unspec:XF [(match_dup 2)] UNSPEC_XTRACT_EXP))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 4)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
                              UNSPEC_XTRACT_FRACT))
              (set (match_operand:XF 0 "register_operand" "")
                   (unspec:XF [(match_dup 1)] UNSPEC_XTRACT_EXP))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
    (parallel [(set (match_operand:SI 0 "register_operand" "")
                   (fix:SI (match_dup 3)))
              (clobber (reg:CC FLAGS_REG))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
         UNSPEC_F2XM1))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "f2xm1"
   [(set_attr "type" "fpspc")
    (set (match_operand:XF 1 "register_operand" "=u")
        (unspec:XF [(match_dup 2) (match_dup 3)]
                   UNSPEC_FSCALE_EXP))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fscale"
   [(set_attr "type" "fpspc")
                              UNSPEC_FSCALE_EXP))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 10)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
                              UNSPEC_FSCALE_EXP))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 10)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
              (set (match_dup 9)
                   (unspec:XF [(match_dup 8) (match_dup 4)]
                              UNSPEC_FSCALE_EXP))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
                              UNSPEC_FSCALE_EXP))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 10)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
                              UNSPEC_FSCALE_EXP))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 10)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
              (set (match_dup 9)
                   (unspec:XF [(match_dup 8) (match_dup 4)]
                              UNSPEC_FSCALE_EXP))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
                              UNSPEC_FSCALE_EXP))])
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 8)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
                              UNSPEC_FSCALE_EXP))])
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 8)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
              (set (match_dup 8)
                   (unspec:XF [(match_dup 7) (match_dup 3)]
                              UNSPEC_FSCALE_EXP))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   int i;
    (set (match_dup 14) (plus:XF (match_dup 13) (match_dup 8)))
    (set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF (match_dup 14)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
    (set (match_dup 14) (plus:XF (match_dup 13) (match_dup 8)))
    (set (match_operand:SF 0 "register_operand" "")
        (float_truncate:SF (match_dup 14)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
    (set (match_dup 12) (minus:XF (match_dup 10) (match_dup 9)))
    (set (match_operand:XF 0 "register_operand" "")
        (plus:XF (match_dup 12) (match_dup 7)))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
         UNSPEC_FRNDINT))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "frndint"
   [(set_attr "type" "fpspc")
 (define_expand "rintdf2"
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "rintsf2"
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "rintxf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   emit_insn (gen_frndintxf2 (operands[0], operands[1]));
         UNSPEC_FRNDINT_FLOOR))
    (use (match_operand:HI 2 "memory_operand" "m"))
    (use (match_operand:HI 3 "memory_operand" "m"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fldcw\t%3\n\tfrndint\n\tfldcw\t%2"
   [(set_attr "type" "frndint")
 (define_expand "floordf2"
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "floorsf2"
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "floorxf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op2 = assign_386_stack_local (HImode, 1);
         UNSPEC_FRNDINT_CEIL))
    (use (match_operand:HI 2 "memory_operand" "m"))
    (use (match_operand:HI 3 "memory_operand" "m"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fldcw\t%3\n\tfrndint\n\tfldcw\t%2"
   [(set_attr "type" "frndint")
 (define_expand "ceildf2"
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "ceilsf2"
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "ceilxf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op2 = assign_386_stack_local (HImode, 1);
         UNSPEC_FRNDINT_TRUNC))
    (use (match_operand:HI 2 "memory_operand" "m"))
    (use (match_operand:HI 3 "memory_operand" "m"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fldcw\t%3\n\tfrndint\n\tfldcw\t%2"
   [(set_attr "type" "frndint")
 (define_expand "btruncdf2"
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "btruncsf2"
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "btruncxf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op2 = assign_386_stack_local (HImode, 1);
         UNSPEC_FRNDINT_MASK_PM))
    (use (match_operand:HI 2 "memory_operand" "m"))
    (use (match_operand:HI 3 "memory_operand" "m"))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fldcw\t%3\n\tfrndint\n\tfclex\n\tfldcw\t%2"
   [(set_attr "type" "frndint")
 (define_expand "nearbyintdf2"
   [(use (match_operand:DF 0 "register_operand" ""))
    (use (match_operand:DF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "nearbyintsf2"
   [(use (match_operand:SF 0 "register_operand" ""))
    (use (match_operand:SF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op0 = gen_reg_rtx (XFmode);
 (define_expand "nearbyintxf2"
   [(use (match_operand:XF 0 "register_operand" ""))
    (use (match_operand:XF 1 "register_operand" ""))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
 {
   rtx op2 = assign_386_stack_local (HImode, 1);