OSDN Git Service

2003-12-20 Andrew Pinski <pinskia@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.md
index 9d0ea24..0eff393 100644 (file)
@@ -5,20 +5,20 @@
 ;; Mostly by William Schelter.
 ;; x86_64 support added by Jan Hubicka
 ;;
-;; This file is part of GNU CC.
+;; This file is part of GCC.
 ;;
-;; GNU CC is free software; you can redistribute it and/or modify
+;; GCC is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation; either version 2, or (at your option)
 ;; any later version.
 ;;
-;; GNU CC is distributed in the hope that it will be useful,
+;; GCC is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
 ;;
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU CC; see the file COPYING.  If not, write to
+;; along with GCC; see the file COPYING.  If not, write to
 ;; the Free Software Foundation, 59 Temple Place - Suite 330,
 ;; Boston, MA 02111-1307, USA.  */
 ;;
@@ -27,9 +27,6 @@
 ;;
 ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
 ;;
-;; Macro #define NOTICE_UPDATE_CC in file i386.h handles condition code
-;; updates for most instructions.
-;;
 ;; Macro REG_CLASS_FROM_LETTER in file i386.h defines the register
 ;; constraint letters.
 ;;
           (if_then_else (match_operand 1 "constant_call_address_operand" "")
             (const_string "none")
             (const_string "load"))
-        (and (eq_attr "type" "alu1,negnot")
+        (and (eq_attr "type" "alu1,negnot,ishift1")
              (match_operand 1 "memory_operand" ""))
           (const_string "both")
         (and (match_operand 0 "memory_operand" "")
         (match_operand 1 "memory_operand" "")
           (const_string "load")
         (and (eq_attr "type"
-                "!alu1,negnot,
+                "!alu1,negnot,ishift1,
                   imov,imovx,icmp,test,
                   fmov,fcmp,fsgn,
                   sse,ssemov,ssecmp,ssecomi,ssecvt,sseicvt,
   [(set (reg:CC 17)
        (compare:CC (match_operand:XF 0 "cmp_fp_expander_operand" "")
                    (match_operand:XF 1 "cmp_fp_expander_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-{
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
-  DONE;
-})
-
-(define_expand "cmptf"
-  [(set (reg:CC 17)
-       (compare:CC (match_operand:TF 0 "cmp_fp_expander_operand" "")
-                   (match_operand:TF 1 "cmp_fp_expander_operand" "")))]
   "TARGET_80387"
 {
   ix86_compare_op0 = operands[0];
        (compare:CCFP
          (match_operand:XF 0 "register_operand" "f")
          (match_operand:XF 1 "register_operand" "f")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "* return output_fp_compare (insn, operands, 0, 0);"
-  [(set_attr "type" "fcmp")
-   (set_attr "mode" "XF")])
-
-(define_insn "*cmpfp_2_tf"
-  [(set (reg:CCFP 18)
-       (compare:CCFP
-         (match_operand:TF 0 "register_operand" "f")
-         (match_operand:TF 1 "register_operand" "f")))]
   "TARGET_80387"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "fcmp")
             (match_operand:XF 1 "register_operand" "f")
             (match_operand:XF 2 "register_operand" "f"))]
          UNSPEC_FNSTSW))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "* return output_fp_compare (insn, operands, 2, 0);"
-  [(set_attr "type" "multi")
-   (set_attr "mode" "XF")])
-
-(define_insn "*cmpfp_2_tf_1"
-  [(set (match_operand:HI 0 "register_operand" "=a")
-       (unspec:HI
-         [(compare:CCFP
-            (match_operand:TF 1 "register_operand" "f")
-            (match_operand:TF 2 "register_operand" "f"))]
-         UNSPEC_FNSTSW))]
   "TARGET_80387"
   "* return output_fp_compare (insn, operands, 2, 0);"
   [(set_attr "type" "multi")
   [(set_attr "type" "alu1")
    (set_attr "mode" "SI")
    (set_attr "length_immediate" "0")])
-
 (define_insn "*movsi_or"
   [(set (match_operand:SI 0 "register_operand" "=r")
        (match_operand:SI 1 "immediate_operand" "i"))
    (clobber (reg:CC 17))]
-  "reload_completed && GET_CODE (operands[1]) == CONST_INT
-   && INTVAL (operands[1]) == -1
+  "reload_completed
+   && operands[1] == constm1_rtx
    && (TARGET_PENTIUM || optimize_size)"
 {
   operands[1] = constm1_rtx;
 ;; We fake an second form of instruction to force reload to load address
 ;; into register when rax is not available
 (define_insn "*movabssi_1_rex64"
-  [(set (mem:SI (match_operand:DI 0 "x86_64_movabs_operand" "i,r,r"))
-       (match_operand:SI 1 "nonmemory_operand" "a,er,i"))]
-  "TARGET_64BIT"
+  [(set (mem:SI (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
+       (match_operand:SI 1 "nonmemory_operand" "a,er"))]
+  "TARGET_64BIT && ix86_check_movabs (insn, 0)"
   "@
    movabs{l}\t{%1, %P0|%P0, %1}
-   mov{l}\t{%1, %a0|%a0, %1}
-   movabs{l}\t{%1, %a0|%a0, %1}"
+   mov{l}\t{%1, %a0|%a0, %1}"
   [(set_attr "type" "imov")
-   (set_attr "modrm" "0,*,*")
-   (set_attr "length_address" "8,0,0")
-   (set_attr "length_immediate" "0,*,*")
+   (set_attr "modrm" "0,*")
+   (set_attr "length_address" "8,0")
+   (set_attr "length_immediate" "0,*")
    (set_attr "memory" "store")
    (set_attr "mode" "SI")])
 
 (define_insn "*movabssi_2_rex64"
   [(set (match_operand:SI 0 "register_operand" "=a,r")
         (mem:SI (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
-  "TARGET_64BIT"
+  "TARGET_64BIT && ix86_check_movabs (insn, 1)"
   "@
    movabs{l}\t{%P1, %0|%0, %P1}
    mov{l}\t{%a1, %0|%0, %a1}"
 ;; We fake an second form of instruction to force reload to load address
 ;; into register when rax is not available
 (define_insn "*movabshi_1_rex64"
-  [(set (mem:HI (match_operand:DI 0 "x86_64_movabs_operand" "i,r,r"))
-       (match_operand:HI 1 "nonmemory_operand" "a,er,i"))]
-  "TARGET_64BIT"
+  [(set (mem:HI (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
+       (match_operand:HI 1 "nonmemory_operand" "a,er"))]
+  "TARGET_64BIT && ix86_check_movabs (insn, 0)"
   "@
    movabs{w}\t{%1, %P0|%P0, %1}
-   mov{w}\t{%1, %a0|%a0, %1}
-   movabs{w}\t{%1, %a0|%a0, %1}"
+   mov{w}\t{%1, %a0|%a0, %1}"
   [(set_attr "type" "imov")
-   (set_attr "modrm" "0,*,*")
-   (set_attr "length_address" "8,0,0")
-   (set_attr "length_immediate" "0,*,*")
+   (set_attr "modrm" "0,*")
+   (set_attr "length_address" "8,0")
+   (set_attr "length_immediate" "0,*")
    (set_attr "memory" "store")
    (set_attr "mode" "HI")])
 
 (define_insn "*movabshi_2_rex64"
   [(set (match_operand:HI 0 "register_operand" "=a,r")
         (mem:HI (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
-  "TARGET_64BIT"
+  "TARGET_64BIT && ix86_check_movabs (insn, 1)"
   "@
    movabs{w}\t{%P1, %0|%0, %P1}
    mov{w}\t{%a1, %0|%0, %a1}"
 ;; We fake an second form of instruction to force reload to load address
 ;; into register when rax is not available
 (define_insn "*movabsqi_1_rex64"
-  [(set (mem:QI (match_operand:DI 0 "x86_64_movabs_operand" "i,r,r"))
-       (match_operand:QI 1 "nonmemory_operand" "a,er,i"))]
-  "TARGET_64BIT"
+  [(set (mem:QI (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
+       (match_operand:QI 1 "nonmemory_operand" "a,er"))]
+  "TARGET_64BIT && ix86_check_movabs (insn, 0)"
   "@
    movabs{b}\t{%1, %P0|%P0, %1}
-   mov{b}\t{%1, %a0|%a0, %1}
-   movabs{b}\t{%1, %a0|%a0, %1}"
+   mov{b}\t{%1, %a0|%a0, %1}"
   [(set_attr "type" "imov")
-   (set_attr "modrm" "0,*,*")
-   (set_attr "length_address" "8,0,0")
-   (set_attr "length_immediate" "0,*,*")
+   (set_attr "modrm" "0,*")
+   (set_attr "length_address" "8,0")
+   (set_attr "length_immediate" "0,*")
    (set_attr "memory" "store")
    (set_attr "mode" "QI")])
 
 (define_insn "*movabsqi_2_rex64"
   [(set (match_operand:QI 0 "register_operand" "=a,r")
         (mem:QI (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
-  "TARGET_64BIT"
+  "TARGET_64BIT && ix86_check_movabs (insn, 1)"
   "@
    movabs{b}\t{%P1, %0|%0, %P1}
    mov{b}\t{%a1, %0|%0, %a1}"
    (clobber (reg:CC 17))]
   "TARGET_64BIT && (TARGET_PENTIUM || optimize_size)
    && reload_completed
-   && GET_CODE (operands[1]) == CONST_INT
-   && INTVAL (operands[1]) == -1"
+   && operands[1] == constm1_rtx"
 {
   operands[1] = constm1_rtx;
   return "or{q}\t{%1, %0|%0, %1}";
 ;; We fake an second form of instruction to force reload to load address
 ;; into register when rax is not available
 (define_insn "*movabsdi_1_rex64"
-  [(set (mem:DI (match_operand:DI 0 "x86_64_movabs_operand" "i,r,r"))
-       (match_operand:DI 1 "nonmemory_operand" "a,er,i"))]
-  "TARGET_64BIT"
+  [(set (mem:DI (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
+       (match_operand:DI 1 "nonmemory_operand" "a,er"))]
+  "TARGET_64BIT && ix86_check_movabs (insn, 0)"
   "@
    movabs{q}\t{%1, %P0|%P0, %1}
-   mov{q}\t{%1, %a0|%a0, %1}
-   movabs{q}\t{%1, %a0|%a0, %1}"
+   mov{q}\t{%1, %a0|%a0, %1}"
   [(set_attr "type" "imov")
-   (set_attr "modrm" "0,*,*")
-   (set_attr "length_address" "8,0,0")
-   (set_attr "length_immediate" "0,*,*")
+   (set_attr "modrm" "0,*")
+   (set_attr "length_address" "8,0")
+   (set_attr "length_immediate" "0,*")
    (set_attr "memory" "store")
    (set_attr "mode" "DI")])
 
 (define_insn "*movabsdi_2_rex64"
   [(set (match_operand:DI 0 "register_operand" "=a,r")
         (mem:DI (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
-  "TARGET_64BIT"
+  "TARGET_64BIT && ix86_check_movabs (insn, 1)"
   "@
    movabs{q}\t{%P1, %0|%0, %P1}
    mov{q}\t{%a1, %0|%0, %a1}"
       return "push{l}\t%1";
 
     default:
-      /* This insn should be already splitted before reg-stack.  */
+      /* This insn should be already split before reg-stack.  */
       abort ();
     }
 }
       return "push{q}\t%q1";
 
     default:
-      /* This insn should be already splitted before reg-stack.  */
+      /* This insn should be already split before reg-stack.  */
       abort ();
     }
 }
        (match_operand:DF 1 "general_no_elim_operand" "f#Y,Fo#fY,*r#fY,Y#f"))]
   "!TARGET_64BIT && !TARGET_INTEGER_DFMODE_MOVES"
 {
-  /* This insn should be already splitted before reg-stack.  */
+  /* This insn should be already split before reg-stack.  */
   abort ();
 }
   [(set_attr "type" "multi")
        (match_operand:DF 1 "general_no_elim_operand" "f#rY,rFo#fY,Y#rf"))]
   "TARGET_64BIT || TARGET_INTEGER_DFMODE_MOVES"
 {
-  /* This insn should be already splitted before reg-stack.  */
+  /* This insn should be already split before reg-stack.  */
   abort ();
 }
   [(set_attr "type" "multi")
 (define_expand "movxf"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
        (match_operand:XF 1 "general_operand" ""))]
-  "!TARGET_128BIT_LONG_DOUBLE"
-  "ix86_expand_move (XFmode, operands); DONE;")
-
-(define_expand "movtf"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "")
-       (match_operand:TF 1 "general_operand" ""))]
   ""
-  "ix86_expand_move (TFmode, operands); DONE;")
+  "ix86_expand_move (XFmode, operands); DONE;")
 
 ;; Size of pushdf is 3 (for sub) + 2 (for fstp) + memory operand size.
 ;; Size of pushdf using integer instructions is 3+3*memory operand size
 (define_insn "*pushxf_nointeger"
   [(set (match_operand:XF 0 "push_operand" "=X,X,X")
        (match_operand:XF 1 "general_no_elim_operand" "f,Fo,*r"))]
-  "!TARGET_128BIT_LONG_DOUBLE && optimize_size"
-{
-  /* This insn should be already splitted before reg-stack.  */
-  abort ();
-}
-  [(set_attr "type" "multi")
-   (set_attr "mode" "XF,SI,SI")])
-
-(define_insn "*pushtf_nointeger"
-  [(set (match_operand:TF 0 "push_operand" "=<,<,<")
-       (match_operand:TF 1 "general_no_elim_operand" "f,Fo,*r"))]
   "optimize_size"
 {
-  /* This insn should be already splitted before reg-stack.  */
+  /* This insn should be already split before reg-stack.  */
   abort ();
 }
   [(set_attr "type" "multi")
 (define_insn "*pushxf_integer"
   [(set (match_operand:XF 0 "push_operand" "=<,<")
        (match_operand:XF 1 "general_no_elim_operand" "f#r,ro#f"))]
-  "!TARGET_128BIT_LONG_DOUBLE && !optimize_size"
-{
-  /* This insn should be already splitted before reg-stack.  */
-  abort ();
-}
-  [(set_attr "type" "multi")
-   (set_attr "mode" "XF,SI")])
-
-(define_insn "*pushtf_integer"
-  [(set (match_operand:TF 0 "push_operand" "=<,<")
-       (match_operand:TF 1 "general_no_elim_operand" "f#r,rFo#f"))]
   "!optimize_size"
 {
-  /* This insn should be already splitted before reg-stack.  */
+  /* This insn should be already split before reg-stack.  */
   abort ();
 }
   [(set_attr "type" "multi")
        (match_operand 1 "general_operand" ""))]
   "reload_completed
    && (GET_MODE (operands[0]) == XFmode
-       || GET_MODE (operands[0]) == TFmode
        || GET_MODE (operands[0]) == DFmode)
    && !ANY_FP_REG_P (operands[1])"
   [(const_int 0)]
 (define_split
   [(set (match_operand:XF 0 "push_operand" "")
        (match_operand:XF 1 "any_fp_register_operand" ""))]
-  "!TARGET_128BIT_LONG_DOUBLE"
-  [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12)))
-   (set (mem:XF (reg:SI 7)) (match_dup 1))])
-
-(define_split
-  [(set (match_operand:TF 0 "push_operand" "")
-       (match_operand:TF 1 "any_fp_register_operand" ""))]
   "!TARGET_64BIT"
-  [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -16)))
-   (set (mem:TF (reg:SI 7)) (match_dup 1))])
+  [(set (reg:SI 7) (plus:SI (reg:SI 7) (match_dup 2)))
+   (set (mem:XF (reg:SI 7)) (match_dup 1))]
+  "operands[2] = GEN_INT (TARGET_128BIT_LONG_DOUBLE ? -16 : -12);")
 
 (define_split
-  [(set (match_operand:TF 0 "push_operand" "")
-       (match_operand:TF 1 "any_fp_register_operand" ""))]
+  [(set (match_operand:XF 0 "push_operand" "")
+       (match_operand:XF 1 "any_fp_register_operand" ""))]
   "TARGET_64BIT"
-  [(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -16)))
-   (set (mem:TF (reg:DI 7)) (match_dup 1))])
+  [(set (reg:DI 7) (plus:DI (reg:DI 7) (match_dup 2)))
+   (set (mem:XF (reg:DI 7)) (match_dup 1))]
+  "operands[2] = GEN_INT (TARGET_128BIT_LONG_DOUBLE ? -16 : -12);")
 
 ;; Do not use integer registers when optimizing for size
 (define_insn "*movxf_nointeger"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,*r,o")
        (match_operand:XF 1 "general_operand" "fm,f,G,*roF,F*r"))]
-  "!TARGET_128BIT_LONG_DOUBLE
-   && optimize_size
+  "optimize_size
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
    && (reload_in_progress || reload_completed
        || GET_CODE (operands[1]) != CONST_DOUBLE
   [(set_attr "type" "fmov,fmov,fmov,multi,multi")
    (set_attr "mode" "XF,XF,XF,SI,SI")])
 
-(define_insn "*movtf_nointeger"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "=f,m,f,*r,o")
-       (match_operand:TF 1 "general_operand" "fm,f,G,*roF,F*r"))]
-  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
-   && optimize_size
-   && (reload_in_progress || reload_completed
-       || GET_CODE (operands[1]) != CONST_DOUBLE
-       || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
-       || memory_operand (operands[0], TFmode))" 
-{
-  switch (which_alternative)
-    {
-    case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
-
-    case 1:
-      /* There is no non-popping store to memory for XFmode.  So if
-        we need one, follow the store with a load.  */
-      if (! find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp%z0\t%y0\;fld%z0\t%y0";
-      else
-        return "fstp%z0\t%y0";
-
-    case 2:
-      return standard_80387_constant_opcode (operands[1]);
-
-    case 3: case 4:
-      return "#";
-    }
-  abort();
-}
-  [(set_attr "type" "fmov,fmov,fmov,multi,multi")
-   (set_attr "mode" "XF,XF,XF,SI,SI")])
-
 (define_insn "*movxf_integer"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,m,f#r,r#f,o")
        (match_operand:XF 1 "general_operand" "fm#r,f#r,G,roF#f,Fr#f"))]
-  "!TARGET_128BIT_LONG_DOUBLE
-   && !optimize_size
+  "!optimize_size
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
    && (reload_in_progress || reload_completed
        || GET_CODE (operands[1]) != CONST_DOUBLE
   [(set_attr "type" "fmov,fmov,fmov,multi,multi")
    (set_attr "mode" "XF,XF,XF,SI,SI")])
 
-(define_insn "*movtf_integer"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "=f#r,m,f#r,r#f,o")
-       (match_operand:TF 1 "general_operand" "fm#r,f#r,G,roF#f,Fr#f"))]
-  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
-   && !optimize_size
-   && (reload_in_progress || reload_completed
-       || GET_CODE (operands[1]) != CONST_DOUBLE
-       || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
-       || memory_operand (operands[0], TFmode))" 
-{
-  switch (which_alternative)
-    {
-    case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
-
-    case 1:
-      /* There is no non-popping store to memory for XFmode.  So if
-        we need one, follow the store with a load.  */
-      if (! find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp%z0\t%y0\;fld%z0\t%y0";
-      else
-        return "fstp%z0\t%y0";
-
-    case 2:
-      return standard_80387_constant_opcode (operands[1]);
-
-    case 3: case 4:
-      return "#";
-    }
-  abort();
-}
-  [(set_attr "type" "fmov,fmov,fmov,multi,multi")
-   (set_attr "mode" "XF,XF,XF,SI,SI")])
-
 (define_split
   [(set (match_operand 0 "nonimmediate_operand" "")
        (match_operand 1 "general_operand" ""))]
   "reload_completed
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
-   && (GET_MODE (operands[0]) == XFmode || GET_MODE (operands[0]) == TFmode)
+   && GET_MODE (operands[0]) == XFmode
    && ! (ANY_FP_REG_P (operands[0]) || 
         (GET_CODE (operands[0]) == SUBREG
          && ANY_FP_REG_P (SUBREG_REG (operands[0]))))
        (match_operand 1 "memory_operand" ""))]
   "reload_completed
    && GET_CODE (operands[1]) == MEM
-   && (GET_MODE (operands[0]) == XFmode || GET_MODE (operands[0]) == TFmode
+   && (GET_MODE (operands[0]) == XFmode
        || GET_MODE (operands[0]) == SFmode || GET_MODE (operands[0]) == DFmode)
    && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
    && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0))
 }
   [(set_attr "type" "fxch")
    (set_attr "mode" "XF")])
-
-(define_insn "swaptf"
-  [(set (match_operand:TF 0 "register_operand" "+f")
-       (match_operand:TF 1 "register_operand" "+f"))
-   (set (match_dup 1)
-       (match_dup 0))]
-  ""
-{
-  if (STACK_TOP_P (operands[0]))
-    return "fxch\t%1";
-  else
-    return "fxch\t%0";
-}
-  [(set_attr "type" "fxch")
-   (set_attr "mode" "XF")])
 \f
 ;; Zero extension instructions
 
   ")
 
 (define_insn "zero_extendsidi2_32"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?*o")
-       (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "0,rm,r")))
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?*o,!?y,!?Y")
+       (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "0,rm,r,m,m")))
    (clobber (reg:CC 17))]
-  "!TARGET_64BIT"
-  "#"
-  [(set_attr "mode" "SI")])
+  "!TARGET_64BIT && !TARGET_INTER_UNIT_MOVES"
+  "@
+   #
+   #
+   #
+   movd\t{%1, %0|%0, %1}
+   movd\t{%1, %0|%0, %1}"
+  [(set_attr "mode" "SI,SI,SI,DI,TI")
+   (set_attr "type" "multi,multi,multi,mmxmov,ssemov")])
+
+(define_insn "*zero_extendsidi2_32_1"
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?*o,!?y,!?Y")
+       (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "0,rm,r,rm,rm")))
+   (clobber (reg:CC 17))]
+  "!TARGET_64BIT && TARGET_INTER_UNIT_MOVES"
+  "@
+   #
+   #
+   #
+   movd\t{%1, %0|%0, %1}
+   movd\t{%1, %0|%0, %1}"
+  [(set_attr "mode" "SI,SI,SI,DI,TI")
+   (set_attr "type" "multi,multi,multi,mmxmov,ssemov")])
 
 (define_insn "zero_extendsidi2_rex64"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o")
-     (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "rm,0")))]
-  "TARGET_64BIT"
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,!?y,!?Y")
+     (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "rm,0,m,m")))]
+  "TARGET_64BIT && !TARGET_INTER_UNIT_MOVES"
   "@
    mov\t{%k1, %k0|%k0, %k1}
-   #"
-  [(set_attr "type" "imovx,imov")
-   (set_attr "mode" "SI,DI")])
+   #
+   movd\t{%1, %0|%0, %1}
+   movd\t{%1, %0|%0, %1}"
+  [(set_attr "type" "imovx,imov,mmxmov,ssemov")
+   (set_attr "mode" "SI,DI,DI,TI")])
+
+(define_insn "*zero_extendsidi2_rex64_1"
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,!?y,!*?")
+     (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "rm,0,rm,rm")))]
+  "TARGET_64BIT && TARGET_INTER_UNIT_MOVES"
+  "@
+   mov\t{%k1, %k0|%k0, %k1}
+   #
+   movd\t{%1, %0|%0, %1}
+   movd\t{%1, %0|%0, %1}"
+  [(set_attr "type" "imovx,imov,mmxmov,ssemov")
+   (set_attr "mode" "SI,DI,SI,SI")])
 
 (define_split
   [(set (match_operand:DI 0 "memory_operand" "")
   [(set (match_operand:DI 0 "nonimmediate_operand" "")
        (zero_extend:DI (match_operand:SI 1 "general_operand" "")))
    (clobber (reg:CC 17))]
-  "!TARGET_64BIT && reload_completed"
+  "!TARGET_64BIT && reload_completed
+   && !SSE_REG_P (operands[0]) && !MMX_REG_P (operands[0])"
   [(set (match_dup 3) (match_dup 1))
    (set (match_dup 4) (const_int 0))]
   "split_di (&operands[0], 1, &operands[3], &operands[4]);")
 (define_split
   [(set (match_operand:XF 0 "push_operand" "")
        (float_extend:XF (match_operand:SF 1 "fp_register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE"
-  [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12)))
-   (set (mem:XF (reg:SI 7)) (float_extend:XF (match_dup 1)))])
-
-(define_insn "*dummy_extendsftf2"
-  [(set (match_operand:TF 0 "push_operand" "=<")
-       (float_extend:TF (match_operand:SF 1 "nonimmediate_operand" "f")))]
-  "0"
-  "#")
-
-(define_split
-  [(set (match_operand:TF 0 "push_operand" "")
-       (float_extend:TF (match_operand:SF 1 "fp_register_operand" "")))]
-  "!TARGET_64BIT"
-  [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -16)))
-   (set (mem:TF (reg:SI 7)) (float_extend:TF (match_dup 1)))])
+  ""
+  [(set (reg:SI 7) (plus:SI (reg:SI 7) (match_dup 2)))
+   (set (mem:XF (reg:SI 7)) (float_extend:XF (match_dup 1)))]
+  "operands[2] = GEN_INT (TARGET_128BIT_LONG_DOUBLE ? -16 : -12);")
 
 (define_split
-  [(set (match_operand:TF 0 "push_operand" "")
-       (float_extend:TF (match_operand:SF 1 "fp_register_operand" "")))]
+  [(set (match_operand:XF 0 "push_operand" "")
+       (float_extend:XF (match_operand:SF 1 "fp_register_operand" "")))]
   "TARGET_64BIT"
-  [(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -16)))
-   (set (mem:DF (reg:DI 7)) (float_extend:TF (match_dup 1)))])
-
-(define_insn "*dummy_extenddfxf2"
-  [(set (match_operand:XF 0 "push_operand" "=<")
-       (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "f")))]
-  "0"
-  "#")
+  [(set (reg:DI 7) (plus:DI (reg:DI 7) (match_dup 2)))
+   (set (mem:DF (reg:DI 7)) (float_extend:XF (match_dup 1)))]
+  "operands[2] = GEN_INT (TARGET_128BIT_LONG_DOUBLE ? -16 : -12);")
 
 (define_split
   [(set (match_operand:XF 0 "push_operand" "")
        (float_extend:XF (match_operand:DF 1 "fp_register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE"
-  [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12)))
-   (set (mem:DF (reg:SI 7)) (float_extend:XF (match_dup 1)))])
-
-(define_insn "*dummy_extenddftf2"
-  [(set (match_operand:TF 0 "push_operand" "=<")
-       (float_extend:TF (match_operand:DF 1 "nonimmediate_operand" "f")))]
-  "0"
-  "#")
-
-(define_split
-  [(set (match_operand:TF 0 "push_operand" "")
-       (float_extend:TF (match_operand:DF 1 "fp_register_operand" "")))]
-  "!TARGET_64BIT"
-  [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -16)))
-   (set (mem:TF (reg:SI 7)) (float_extend:XF (match_dup 1)))])
+  ""
+  [(set (reg:SI 7) (plus:SI (reg:SI 7) (match_dup 2)))
+   (set (mem:DF (reg:SI 7)) (float_extend:XF (match_dup 1)))]
+  "operands[2] = GEN_INT (TARGET_128BIT_LONG_DOUBLE ? -16 : -12);")
 
 (define_split
-  [(set (match_operand:TF 0 "push_operand" "")
-       (float_extend:TF (match_operand:DF 1 "fp_register_operand" "")))]
+  [(set (match_operand:XF 0 "push_operand" "")
+       (float_extend:XF (match_operand:DF 1 "fp_register_operand" "")))]
   "TARGET_64BIT"
-  [(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -16)))
-   (set (mem:TF (reg:DI 7)) (float_extend:TF (match_dup 1)))])
+  [(set (reg:DI 7) (plus:DI (reg:DI 7) (match_dup 2)))
+   (set (mem:XF (reg:DI 7)) (float_extend:XF (match_dup 1)))]
+  "operands[2] = GEN_INT (TARGET_128BIT_LONG_DOUBLE ? -16 : -12);")
 
 (define_expand "extendsfdf2"
   [(set (match_operand:DF 0 "nonimmediate_operand" "")
 (define_expand "extendsfxf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
         (float_extend:XF (match_operand:SF 1 "general_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
 {
   /* ??? Needed for compress_float_constant since all fp constants
      are LEGITIMATE_CONSTANT_P.  */
 (define_insn "*extendsfxf2_1"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
         (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387
-   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
-{
-  switch (which_alternative)
-    {
-    case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp\t%y0";
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
-
-    case 1:
-      /* There is no non-popping store to memory for XFmode.  So if
-        we need one, follow the store with a load.  */
-      if (! find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp%z0\t%y0\n\tfld%z0\t%y0";
-      else
-        return "fstp%z0\t%y0";
-
-    default:
-      abort ();
-    }
-}
-  [(set_attr "type" "fmov")
-   (set_attr "mode" "SF,XF")])
-
-(define_expand "extendsftf2"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "")
-        (float_extend:TF (match_operand:SF 1 "general_operand" "")))]
-  "TARGET_80387"
-{
-  /* ??? Needed for compress_float_constant since all fp constants
-     are LEGITIMATE_CONSTANT_P.  */
-  if (GET_CODE (operands[1]) == CONST_DOUBLE)
-    operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
-  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
-    operands[1] = force_reg (SFmode, operands[1]);
-})
-
-(define_insn "*extendsftf2_1"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "=f,m")
-        (float_extend:TF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
   "TARGET_80387
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
 {
 (define_expand "extenddfxf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
         (float_extend:XF (match_operand:DF 1 "general_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
 {
   /* ??? Needed for compress_float_constant since all fp constants
      are LEGITIMATE_CONSTANT_P.  */
 (define_insn "*extenddfxf2_1"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
         (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387
-   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
-{
-  switch (which_alternative)
-    {
-    case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp\t%y0";
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
-
-    case 1:
-      /* There is no non-popping store to memory for XFmode.  So if
-        we need one, follow the store with a load.  */
-      if (! find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp%z0\t%y0\n\tfld%z0\t%y0";
-      else
-        return "fstp%z0\t%y0";
-
-    default:
-      abort ();
-    }
-}
-  [(set_attr "type" "fmov")
-   (set_attr "mode" "DF,XF")])
-
-(define_expand "extenddftf2"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "")
-        (float_extend:TF (match_operand:DF 1 "general_operand" "")))]
-  "TARGET_80387"
-{
-  /* ??? Needed for compress_float_constant since all fp constants
-     are LEGITIMATE_CONSTANT_P.  */
-  if (GET_CODE (operands[1]) == CONST_DOUBLE)
-    operands[1] = validize_mem (force_const_mem (DFmode, operands[1]));
-  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
-    operands[1] = force_reg (DFmode, operands[1]);
-})
-
-(define_insn "*extenddftf2_1"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "=f,m")
-        (float_extend:TF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
   "TARGET_80387
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
 {
                   (float_truncate:SF
                    (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
   "operands[2] = assign_386_stack_local (SFmode, 0);")
 
 (define_insn "*truncxfsf2_1"
        (float_truncate:SF
         (match_operand:XF 1 "register_operand" "f,f,f,f")))
    (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
 {
   switch (which_alternative)
     {
   [(set (match_operand:SF 0 "memory_operand" "=m")
        (float_truncate:SF
         (match_operand:XF 1 "register_operand" "f")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
-}
-  [(set_attr "type" "fmov")
-   (set_attr "mode" "SF")])
-
-(define_split
-  [(set (match_operand:SF 0 "memory_operand" "")
-       (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:SF 2 "memory_operand" ""))]
-  "TARGET_80387"
-  [(set (match_dup 0) (float_truncate:SF (match_dup 1)))]
-  "")
-
-(define_split
-  [(set (match_operand:SF 0 "register_operand" "")
-       (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:SF 2 "memory_operand" ""))]
-  "TARGET_80387 && reload_completed"
-  [(set (match_dup 2) (float_truncate:SF (match_dup 1)))
-   (set (match_dup 0) (match_dup 2))]
-  "")
-
-(define_expand "trunctfsf2"
-  [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
-                  (float_truncate:SF
-                   (match_operand:TF 1 "register_operand" "")))
-             (clobber (match_dup 2))])]
-  "TARGET_80387"
-  "operands[2] = assign_386_stack_local (SFmode, 0);")
-
-(define_insn "*trunctfsf2_1"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
-       (float_truncate:SF
-        (match_operand:TF 1 "register_operand" "f,f,f,f")))
-   (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))]
-  "TARGET_80387"
-{
-  switch (which_alternative)
-    {
-    case 0:
-      if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       return "fstp%z0\t%y0";
-      else
-       return "fst%z0\t%y0";
-    default:
-      abort();
-    }
-}
-  [(set_attr "type" "fmov,multi,multi,multi")
-   (set_attr "mode" "SF")])
-
-(define_insn "*trunctfsf2_2"
-  [(set (match_operand:SF 0 "memory_operand" "=m")
-       (float_truncate:SF
-        (match_operand:TF 1 "register_operand" "f")))]
-  "TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
-}
-  [(set_attr "type" "fmov")
-   (set_attr "mode" "SF")])
-
-(define_split
-  [(set (match_operand:SF 0 "memory_operand" "")
-       (float_truncate:SF
-        (match_operand:TF 1 "register_operand" "")))
-   (clobber (match_operand:SF 2 "memory_operand" ""))]
-  "TARGET_80387"
-  [(set (match_dup 0) (float_truncate:SF (match_dup 1)))]
-  "")
-
-(define_split
-  [(set (match_operand:SF 0 "register_operand" "")
-       (float_truncate:SF
-        (match_operand:TF 1 "register_operand" "")))
-   (clobber (match_operand:SF 2 "memory_operand" ""))]
-  "TARGET_80387 && reload_completed"
-  [(set (match_dup 2) (float_truncate:SF (match_dup 1)))
-   (set (match_dup 0) (match_dup 2))]
-  "")
-
-
-(define_expand "truncxfdf2"
-  [(parallel [(set (match_operand:DF 0 "nonimmediate_operand" "")
-                  (float_truncate:DF
-                   (match_operand:XF 1 "register_operand" "")))
-             (clobber (match_dup 2))])]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "operands[2] = assign_386_stack_local (DFmode, 0);")
-
-(define_insn "*truncxfdf2_1"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#rY,?r#fY,?Y#rf")
-       (float_truncate:DF
-        (match_operand:XF 1 "register_operand" "f,f,f,f")))
-   (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-{
-  switch (which_alternative)
-    {
-    case 0:
-      if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       return "fstp%z0\t%y0";
-      else
-       return "fst%z0\t%y0";
-    default:
-      abort();
-    }
-  abort ();
-}
-  [(set_attr "type" "fmov,multi,multi,multi")
-   (set_attr "mode" "DF")])
-
-(define_insn "*truncxfdf2_2"
-  [(set (match_operand:DF 0 "memory_operand" "=m")
-       (float_truncate:DF
-         (match_operand:XF 1 "register_operand" "f")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
 {
   if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
     return "fstp%z0\t%y0";
     return "fst%z0\t%y0";
 }
   [(set_attr "type" "fmov")
-   (set_attr "mode" "DF")])
+   (set_attr "mode" "SF")])
 
 (define_split
-  [(set (match_operand:DF 0 "memory_operand" "")
-       (float_truncate:DF
+  [(set (match_operand:SF 0 "memory_operand" "")
+       (float_truncate:SF
         (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:DF 2 "memory_operand" ""))]
+   (clobber (match_operand:SF 2 "memory_operand" ""))]
   "TARGET_80387"
-  [(set (match_dup 0) (float_truncate:DF (match_dup 1)))]
+  [(set (match_dup 0) (float_truncate:SF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "")
-       (float_truncate:DF
+  [(set (match_operand:SF 0 "register_operand" "")
+       (float_truncate:SF
         (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:DF 2 "memory_operand" ""))]
+   (clobber (match_operand:SF 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
-  [(set (match_dup 2) (float_truncate:DF (match_dup 1)))
+  [(set (match_dup 2) (float_truncate:SF (match_dup 1)))
    (set (match_dup 0) (match_dup 2))]
   "")
 
-(define_expand "trunctfdf2"
+(define_expand "truncxfdf2"
   [(parallel [(set (match_operand:DF 0 "nonimmediate_operand" "")
                   (float_truncate:DF
-                   (match_operand:TF 1 "register_operand" "")))
+                   (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
   "TARGET_80387"
   "operands[2] = assign_386_stack_local (DFmode, 0);")
 
-(define_insn "*trunctfdf2_1"
+(define_insn "*truncxfdf2_1"
   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#rY,?r#fY,?Y#rf")
        (float_truncate:DF
-        (match_operand:TF 1 "register_operand" "f,f,f,f")))
+        (match_operand:XF 1 "register_operand" "f,f,f,f")))
    (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))]
   "TARGET_80387"
 {
   [(set_attr "type" "fmov,multi,multi,multi")
    (set_attr "mode" "DF")])
 
-       (define_insn "*trunctfdf2_2"
+(define_insn "*truncxfdf2_2"
   [(set (match_operand:DF 0 "memory_operand" "=m")
        (float_truncate:DF
-         (match_operand:TF 1 "register_operand" "f")))]
+         (match_operand:XF 1 "register_operand" "f")))]
   "TARGET_80387"
 {
   if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
 (define_split
   [(set (match_operand:DF 0 "memory_operand" "")
        (float_truncate:DF
-        (match_operand:TF 1 "register_operand" "")))
+        (match_operand:XF 1 "register_operand" "")))
    (clobber (match_operand:DF 2 "memory_operand" ""))]
   "TARGET_80387"
   [(set (match_dup 0) (float_truncate:DF (match_dup 1)))]
 (define_split
   [(set (match_operand:DF 0 "register_operand" "")
        (float_truncate:DF
-        (match_operand:TF 1 "register_operand" "")))
+        (match_operand:XF 1 "register_operand" "")))
    (clobber (match_operand:DF 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2) (float_truncate:DF (match_dup 1)))
 (define_expand "fix_truncxfdi2"
   [(set (match_operand:DI 0 "nonimmediate_operand" "")
         (fix:DI (match_operand:XF 1 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "fix_trunctfdi2"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "")
-       (fix:DI (match_operand:TF 1 "register_operand" "")))]
   "TARGET_80387"
   "")
 
 (define_expand "fix_truncxfsi2"
   [(set (match_operand:SI 0 "nonimmediate_operand" "")
        (fix:SI (match_operand:XF 1 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "fix_trunctfsi2"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "")
-       (fix:SI (match_operand:TF 1 "register_operand" "")))]
   "TARGET_80387"
   "")
 
 (define_expand "fix_truncxfhi2"
   [(set (match_operand:HI 0 "nonimmediate_operand" "")
         (fix:HI (match_operand:XF 1 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "fix_trunctfhi2"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "")
-       (fix:HI (match_operand:TF 1 "register_operand" "")))]
   "TARGET_80387"
   "")
 
 (define_insn "floathixf2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (float:XF (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "@
-   fild%z1\t%1
-   #"
-  [(set_attr "type" "fmov,multi")
-   (set_attr "mode" "XF")
-   (set_attr "fp_int_src" "true")])
-
-(define_insn "floathitf2"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (float:TF (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
   "TARGET_80387"
   "@
    fild%z1\t%1
 (define_insn "floatsixf2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (float:XF (match_operand:SI 1 "nonimmediate_operand" "m,r")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "@
-   fild%z1\t%1
-   #"
-  [(set_attr "type" "fmov,multi")
-   (set_attr "mode" "XF")
-   (set_attr "fp_int_src" "true")])
-
-(define_insn "floatsitf2"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (float:TF (match_operand:SI 1 "nonimmediate_operand" "m,r")))]
   "TARGET_80387"
   "@
    fild%z1\t%1
 (define_insn "floatdixf2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (float:XF (match_operand:DI 1 "nonimmediate_operand" "m,r")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "@
-   fild%z1\t%1
-   #"
-  [(set_attr "type" "fmov,multi")
-   (set_attr "mode" "XF")
-   (set_attr "fp_int_src" "true")])
-
-(define_insn "floatditf2"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (float:TF (match_operand:DI 1 "nonimmediate_operand" "m,r")))]
   "TARGET_80387"
   "@
    fild%z1\t%1
    (set_attr "mode" "DI")])
 
 (define_insn "addqi3_carry"
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,r")
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
          (plus:QI (plus:QI (match_operand:QI 3 "ix86_carry_flag_operator" "")
                            (match_operand:QI 1 "nonimmediate_operand" "%0,0"))
-                  (match_operand:QI 2 "general_operand" "ri,rm")))
+                  (match_operand:QI 2 "general_operand" "qi,qm")))
    (clobber (reg:CC 17))]
   "ix86_binary_operator_ok (PLUS, QImode, operands)"
   "adc{b}\t{%2, %0|%0, %2}"
   [(set (match_operand:XF 0 "register_operand" "")
        (plus:XF (match_operand:XF 1 "register_operand" "")
                 (match_operand:XF 2 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "addtf3"
-  [(set (match_operand:TF 0 "register_operand" "")
-       (plus:TF (match_operand:TF 1 "register_operand" "")
-                (match_operand:TF 2 "register_operand" "")))]
   "TARGET_80387"
   "")
 
    (set_attr "mode" "DI")])
 
 (define_insn "subqi3_carry"
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,r")
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
          (minus:QI (match_operand:QI 1 "nonimmediate_operand" "0,0")
            (plus:QI (match_operand:QI 3 "ix86_carry_flag_operator" "")
-              (match_operand:QI 2 "general_operand" "ri,rm"))))
+              (match_operand:QI 2 "general_operand" "qi,qm"))))
    (clobber (reg:CC 17))]
   "ix86_binary_operator_ok (MINUS, QImode, operands)"
   "sbb{b}\t{%2, %0|%0, %2}"
   [(set (match_operand:XF 0 "register_operand" "")
        (minus:XF (match_operand:XF 1 "register_operand" "")
                  (match_operand:XF 2 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "subtf3"
-  [(set (match_operand:TF 0 "register_operand" "")
-       (minus:TF (match_operand:TF 1 "register_operand" "")
-                 (match_operand:TF 2 "register_operand" "")))]
   "TARGET_80387"
   "")
 
   [(set (match_operand:XF 0 "register_operand" "")
        (mult:XF (match_operand:XF 1 "register_operand" "")
                 (match_operand:XF 2 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "multf3"
-  [(set (match_operand:TF 0 "register_operand" "")
-       (mult:TF (match_operand:TF 1 "register_operand" "")
-                (match_operand:TF 2 "register_operand" "")))]
   "TARGET_80387"
   "")
 
   [(set (match_operand:XF 0 "register_operand" "")
        (div:XF (match_operand:XF 1 "register_operand" "")
                (match_operand:XF 2 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "")
-
-(define_expand "divtf3"
-  [(set (match_operand:TF 0 "register_operand" "")
-       (div:TF (match_operand:TF 1 "register_operand" "")
-               (match_operand:TF 2 "register_operand" "")))]
   "TARGET_80387"
   "")
 
 {
   int size = GET_MODE_SIZE (GET_MODE (operands[1]));
 
-  /* XFmode's size is 12, TFmode 16, but only 10 bytes are used.  */
-  if (size >= 12)
+  if (GET_MODE (operands[1]) == XFmode)
     size = 10;
   operands[0] = adjust_address (operands[0], QImode, size - 1);
   operands[1] = gen_int_mode (0x80, QImode);
   [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "")
                   (neg:XF (match_operand:XF 1 "nonimmediate_operand" "")))
              (clobber (reg:CC 17))])]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "ix86_expand_unary_operator (NEG, XFmode, operands); DONE;")
-
-(define_expand "negtf2"
-  [(parallel [(set (match_operand:TF 0 "nonimmediate_operand" "")
-                  (neg:TF (match_operand:TF 1 "nonimmediate_operand" "")))
-             (clobber (reg:CC 17))])]
   "TARGET_80387"
-  "ix86_expand_unary_operator (NEG, TFmode, operands); DONE;")
+  "ix86_expand_unary_operator (NEG, XFmode, operands); DONE;")
 
 ;; Keep 'f' and 'r' in separate alternatives to avoid reload problems
 ;; because of secondary memory needed to reload from class FLOAT_INT_REGS
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,rm#f")
        (neg:XF (match_operand:XF 1 "nonimmediate_operand" "0,0")))
    (clobber (reg:CC 17))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387
+  "TARGET_80387
    && ix86_unary_operator_ok (NEG, XFmode, operands)"
   "#")
 
    operands[0] = gen_rtx_REG (SImode,
                              true_regnum (operands[0]) + (TARGET_64BIT ? 1 : 2));")
 
-;; Keep 'f' and 'r' in separate alternatives to avoid reload problems
-;; because of secondary memory needed to reload from class FLOAT_INT_REGS
-;; to itself.
-(define_insn "*negtf2_if"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "=f#r,rm#f")
-       (neg:TF (match_operand:TF 1 "nonimmediate_operand" "0,0")))
-   (clobber (reg:CC 17))]
-  "TARGET_80387 && ix86_unary_operator_ok (NEG, TFmode, operands)"
-  "#")
-
-(define_split
-  [(set (match_operand:TF 0 "fp_register_operand" "")
-       (neg:TF (match_operand:TF 1 "register_operand" "")))
-   (clobber (reg:CC 17))]
-  "TARGET_80387 && reload_completed"
-  [(set (match_dup 0)
-       (neg:TF (match_dup 1)))]
-  "")
-
-(define_split
-  [(set (match_operand:TF 0 "register_and_not_fp_reg_operand" "")
-       (neg:TF (match_operand:TF 1 "register_operand" "")))
-   (clobber (reg:CC 17))]
-  "TARGET_80387 && reload_completed"
-  [(parallel [(set (match_dup 0) (xor:SI (match_dup 0) (match_dup 1)))
-             (clobber (reg:CC 17))])]
-  "operands[1] = GEN_INT (0x8000);
-   operands[0] = gen_rtx_REG (SImode,
-                             true_regnum (operands[0]) + (TARGET_64BIT ? 1 : 2));")
-
 ;; Conditionalize these after reload. If they matches before reload, we 
 ;; lose the clobber and ability to use integer instructions.
 
 (define_insn "*negxf2_1"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (neg:XF (match_operand:XF 1 "register_operand" "0")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && reload_completed"
+  "TARGET_80387 && reload_completed"
   "fchs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (neg:XF (float_extend:XF
                  (match_operand:DF 1 "register_operand" "0"))))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
   "fchs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (neg:XF (float_extend:XF
                  (match_operand:SF 1 "register_operand" "0"))))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "fchs"
-  [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")
-   (set_attr "ppro_uops" "few")])
-
-(define_insn "*negtf2_1"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (neg:TF (match_operand:TF 1 "register_operand" "0")))]
-  "TARGET_80387 && reload_completed"
-  "fchs"
-  [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")
-   (set_attr "ppro_uops" "few")])
-
-(define_insn "*negextenddftf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (neg:TF (float_extend:TF
-                 (match_operand:DF 1 "register_operand" "0"))))]
-  "TARGET_80387"
-  "fchs"
-  [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")
-   (set_attr "ppro_uops" "few")])
-
-(define_insn "*negextendsftf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (neg:TF (float_extend:TF
-                 (match_operand:SF 1 "register_operand" "0"))))]
   "TARGET_80387"
   "fchs"
   [(set_attr "type" "fsgn")
 {
   int size = GET_MODE_SIZE (GET_MODE (operands[1]));
 
-  /* XFmode's size is 12, TFmode 16, but only 10 bytes are used.  */
-  if (size >= 12)
+  if (GET_MODE (operands[1]) == XFmode)
     size = 10;
   operands[0] = adjust_address (operands[0], QImode, size - 1);
   operands[1] = gen_int_mode (~0x80, QImode);
   [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "")
                   (neg:XF (match_operand:XF 1 "nonimmediate_operand" "")))
              (clobber (reg:CC 17))])]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "ix86_expand_unary_operator (ABS, XFmode, operands); DONE;")
-
-(define_expand "abstf2"
-  [(parallel [(set (match_operand:TF 0 "nonimmediate_operand" "")
-                  (neg:TF (match_operand:TF 1 "nonimmediate_operand" "")))
-             (clobber (reg:CC 17))])]
   "TARGET_80387"
-  "ix86_expand_unary_operator (ABS, TFmode, operands); DONE;")
+  "ix86_expand_unary_operator (ABS, XFmode, operands); DONE;")
 
 ;; Keep 'f' and 'r' in separate alternatives to avoid reload problems
 ;; because of secondary memory needed to reload from class FLOAT_INT_REGS
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,rm#f")
        (abs:XF (match_operand:XF 1 "nonimmediate_operand" "0,0")))
    (clobber (reg:CC 17))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387
+  "TARGET_80387
    && ix86_unary_operator_ok (ABS, XFmode, operands)"
   "#")
 
    operands[0] = gen_rtx_REG (SImode,
                              true_regnum (operands[0]) + (TARGET_64BIT ? 1 : 2));")
 
-(define_insn "*abstf2_if"
-  [(set (match_operand:TF 0 "nonimmediate_operand" "=f#r,rm#f")
-       (abs:TF (match_operand:TF 1 "nonimmediate_operand" "0,0")))
-   (clobber (reg:CC 17))]
-  "TARGET_80387 && ix86_unary_operator_ok (ABS, TFmode, operands)"
-  "#")
-
-(define_split
-  [(set (match_operand:TF 0 "fp_register_operand" "")
-       (abs:TF (match_operand:TF 1 "register_operand" "")))
-   (clobber (reg:CC 17))]
-  "TARGET_80387 && reload_completed"
-  [(set (match_dup 0)
-       (abs:TF (match_dup 1)))]
-  "")
-
-(define_split
-  [(set (match_operand:TF 0 "register_and_not_any_fp_reg_operand" "")
-       (abs:TF (match_operand:TF 1 "register_operand" "")))
-   (clobber (reg:CC 17))]
-  "TARGET_80387 && reload_completed"
-  [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (match_dup 1)))
-             (clobber (reg:CC 17))])]
-  "operands[1] = GEN_INT (~0x8000);
-   operands[0] = gen_rtx_REG (SImode,
-                             true_regnum (operands[0]) + (TARGET_64BIT ? 1 : 2));")
-
 (define_insn "*abssf2_1"
   [(set (match_operand:SF 0 "register_operand" "=f")
        (abs:SF (match_operand:SF 1 "register_operand" "0")))]
 (define_insn "*absxf2_1"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (abs:XF (match_operand:XF 1 "register_operand" "0")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && reload_completed"
+  "TARGET_80387 && reload_completed"
   "fabs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "DF")])
   [(set (match_operand:XF 0 "register_operand" "=f")
        (abs:XF (float_extend:XF
          (match_operand:DF 1 "register_operand" "0"))))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
   "fabs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")])
   [(set (match_operand:XF 0 "register_operand" "=f")
        (abs:XF (float_extend:XF
          (match_operand:SF 1 "register_operand" "0"))))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
-  "fabs"
-  [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")])
-
-(define_insn "*abstf2_1"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (abs:TF (match_operand:TF 1 "register_operand" "0")))]
-  "TARGET_80387 && reload_completed"
-  "fabs"
-  [(set_attr "type" "fsgn")
-   (set_attr "mode" "DF")])
-
-(define_insn "*absextenddftf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (abs:TF (float_extend:TF
-         (match_operand:DF 1 "register_operand" "0"))))]
-  "TARGET_80387"
-  "fabs"
-  [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")])
-
-(define_insn "*absextendsftf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (abs:TF (float_extend:TF
-         (match_operand:SF 1 "register_operand" "0"))))]
   "TARGET_80387"
   "fabs"
   [(set_attr "type" "fsgn")
 (define_insn_and_split "*ffs_no_cmove"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=r") 
        (ffs:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))
-   (clobber (match_scratch:SI 2 "=&r"))
+   (clobber (match_scratch:SI 2 "=&q"))
    (clobber (reg:CC 17))]
   ""
   "#"
   "reload_completed"
-  [(parallel [(set (match_dup 2) (const_int 0))
-             (clobber (reg:CC 17))])
-   (parallel [(set (reg:CCZ 17) (compare:CCZ (match_dup 1) (const_int 0)))
+  [(parallel [(set (reg:CCZ 17) (compare:CCZ (match_dup 1) (const_int 0)))
              (set (match_dup 0) (ctz:SI (match_dup 1)))])
    (set (strict_low_part (match_dup 3))
        (eq:QI (reg:CCZ 17) (const_int 0)))
              (clobber (reg:CC 17))])]
 {
   operands[3] = gen_lowpart (QImode, operands[2]);
+  ix86_expand_clear (operands[2]);
 })
 
 (define_insn "*ffssi_1"
        (match_operator:XF 3 "binary_fp_operator"
                        [(match_operand:XF 1 "register_operand" "%0")
                         (match_operand:XF 2 "register_operand" "f")]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387
+  "TARGET_80387
    && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
            (const_string "fop")))
    (set_attr "mode" "XF")])
 
-(define_insn "*fop_tf_comm"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (match_operator:TF 3 "binary_fp_operator"
-                       [(match_operand:TF 1 "register_operand" "%0")
-                        (match_operand:TF 2 "register_operand" "f")]))]
-  "TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
-  "* return output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (if_then_else (match_operand:TF 3 "mult_operator" "") 
-           (const_string "fmul")
-           (const_string "fop")))
-   (set_attr "mode" "XF")])
-
 (define_insn "*fop_sf_1_nosse"
   [(set (match_operand:SF 0 "register_operand" "=f,f")
        (match_operator:SF 3 "binary_fp_operator"
        (match_operator:XF 3 "binary_fp_operator"
                        [(match_operand:XF 1 "register_operand" "0,f")
                         (match_operand:XF 2 "register_operand" "f,0")]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387
+  "TARGET_80387
    && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
               (const_string "fop")))
    (set_attr "mode" "XF")])
 
-(define_insn "*fop_tf_1"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (match_operator:TF 3 "binary_fp_operator"
-                       [(match_operand:TF 1 "register_operand" "0,f")
-                        (match_operand:TF 2 "register_operand" "f,0")]))]
-  "TARGET_80387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
-  "* return output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (cond [(match_operand:TF 3 "mult_operator" "") 
-                 (const_string "fmul")
-               (match_operand:TF 3 "div_operator" "") 
-                 (const_string "fdiv")
-              ]
-              (const_string "fop")))
-   (set_attr "mode" "XF")])
-
 (define_insn "*fop_xf_2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
           [(float:XF (match_operand:SI 1 "nonimmediate_operand" "m,?r"))
            (match_operand:XF 2 "register_operand" "0,0")]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && TARGET_USE_FIOP"
+  "TARGET_80387 && TARGET_USE_FIOP"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
    (set_attr "mode" "SI")
    (set_attr "ppro_uops" "many")])
 
-(define_insn "*fop_tf_2"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (match_operator:TF 3 "binary_fp_operator"
-          [(float:TF (match_operand:SI 1 "nonimmediate_operand" "m,?r"))
-           (match_operand:TF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && TARGET_USE_FIOP"
-  "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (cond [(match_operand:TF 3 "mult_operator" "") 
-                 (const_string "fmul")
-               (match_operand:TF 3 "div_operator" "") 
-                 (const_string "fdiv")
-              ]
-              (const_string "fop")))
-   (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "many")])
-
 (define_insn "*fop_xf_3"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
          [(match_operand:XF 1 "register_operand" "0,0")
           (float:XF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && TARGET_USE_FIOP"
+  "TARGET_80387 && TARGET_USE_FIOP"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
    (set_attr "mode" "SI")
    (set_attr "ppro_uops" "many")])
 
-(define_insn "*fop_tf_3"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (match_operator:TF 3 "binary_fp_operator"
-         [(match_operand:TF 1 "register_operand" "0,0")
-          (float:TF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && TARGET_USE_FIOP"
-  "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (cond [(match_operand:TF 3 "mult_operator" "") 
-                 (const_string "fmul")
-               (match_operand:TF 3 "div_operator" "") 
-                 (const_string "fdiv")
-              ]
-              (const_string "fop")))
-   (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "many")])
-
 (define_insn "*fop_xf_4"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
           [(float_extend:XF (match_operand 1 "nonimmediate_operand" "fm,0"))
            (match_operand:XF 2 "register_operand" "0,f")]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
               (const_string "fop")))
    (set_attr "mode" "SF")])
 
-(define_insn "*fop_tf_4"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (match_operator:TF 3 "binary_fp_operator"
-          [(float_extend:TF (match_operand 1 "nonimmediate_operand" "fm,0"))
-           (match_operand:TF 2 "register_operand" "0,f")]))]
-  "TARGET_80387"
-  "* return output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (cond [(match_operand:TF 3 "mult_operator" "") 
-                 (const_string "fmul")
-               (match_operand:TF 3 "div_operator" "") 
-                 (const_string "fdiv")
-              ]
-              (const_string "fop")))
-   (set_attr "mode" "SF")])
-
 (define_insn "*fop_xf_5"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
          [(match_operand:XF 1 "register_operand" "0,f")
           (float_extend:XF
            (match_operand 2 "nonimmediate_operand" "fm,0"))]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
               (const_string "fop")))
    (set_attr "mode" "SF")])
 
-(define_insn "*fop_tf_5"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (match_operator:TF 3 "binary_fp_operator"
-         [(match_operand:TF 1 "register_operand" "0,f")
-          (float_extend:TF
-           (match_operand 2 "nonimmediate_operand" "fm,0"))]))]
-  "TARGET_80387"
-  "* return output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (cond [(match_operand:TF 3 "mult_operator" "") 
-                 (const_string "fmul")
-               (match_operand:TF 3 "div_operator" "") 
-                 (const_string "fdiv")
-              ]
-              (const_string "fop")))
-   (set_attr "mode" "SF")])
-
 (define_insn "*fop_xf_6"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
            (match_operand 1 "register_operand" "0,f"))
           (float_extend:XF
            (match_operand 2 "nonimmediate_operand" "fm,0"))]))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387"
+  "TARGET_80387"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
               (const_string "fop")))
    (set_attr "mode" "SF")])
 
-(define_insn "*fop_tf_6"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (match_operator:TF 3 "binary_fp_operator"
-         [(float_extend:TF
-           (match_operand 1 "register_operand" "0,f"))
-          (float_extend:TF
-           (match_operand 2 "nonimmediate_operand" "fm,0"))]))]
-  "TARGET_80387"
-  "* return output_387_binary_op (insn, operands);"
-  [(set (attr "type") 
-        (cond [(match_operand:TF 3 "mult_operator" "") 
-                 (const_string "fmul")
-               (match_operand:TF 3 "div_operator" "") 
-                 (const_string "fdiv")
-              ]
-              (const_string "fop")))
-   (set_attr "mode" "SF")])
-
 (define_split
   [(set (match_operand 0 "register_operand" "")
        (match_operator 3 "binary_fp_operator"
 (define_insn "sqrtxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (match_operand:XF 1 "register_operand" "0")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387 
-   && (TARGET_IEEE_FP || flag_unsafe_math_optimizations) "
-  "fsqrt"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")
-   (set_attr "athlon_decode" "direct")])
-
-(define_insn "sqrttf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (sqrt:TF (match_operand:TF 1 "register_operand" "0")))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_80387 && !TARGET_NO_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_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
-  "fsqrt"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")
-   (set_attr "athlon_decode" "direct")])
-
-(define_insn "*sqrtextenddftf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (sqrt:TF (float_extend:TF
-                 (match_operand:DF 1 "register_operand" "0"))))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
-  "fsqrt"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")
-   (set_attr "athlon_decode" "direct")])
-
-(define_insn "*sqrtextendsfxf2"
-  [(set (match_operand:XF 0 "register_operand" "=f")
-       (sqrt:XF (float_extend:XF
-                 (match_operand:SF 1 "register_operand" "0"))))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
+  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
   "fsqrt"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")
    (set_attr "athlon_decode" "direct")])
 
-(define_insn "*sqrtextendsftf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (sqrt:TF (float_extend:TF
+(define_insn "*sqrtextendsfxf2"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+       (sqrt:XF (float_extend:XF
                  (match_operand:SF 1 "register_operand" "0"))))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
+  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387"
   "fsqrt"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")
 (define_insn "sinxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_SIN))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387
-   && flag_unsafe_math_optimizations"
-  "fsin"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
-
-(define_insn "sintf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (unspec:TF [(match_operand:TF 1 "register_operand" "0")] UNSPEC_SIN))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "TARGET_80387 && !TARGET_NO_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
   "fsin"
   [(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_128BIT_LONG_DOUBLE && ! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations"
-  "fcos"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
-
-(define_insn "costf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (unspec:TF [(match_operand:TF 1 "register_operand" "0")] UNSPEC_COS))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
   "fcos"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
 
-(define_insn "atan2df3"
-  [(parallel [(set (match_operand:DF 0 "register_operand" "=f")
-                  (unspec:DF [(match_operand:DF 2 "register_operand" "0")
-                              (match_operand:DF 1 "register_operand" "u")]
-                   UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+(define_insn "atan2df3_1"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (unspec:DF [(match_operand:DF 2 "register_operand" "0")
+                   (match_operand:DF 1 "register_operand" "u")]
+                  UNSPEC_FPATAN))
+   (clobber (match_scratch:DF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
-(define_insn "atan2sf3"
-  [(parallel [(set (match_operand:SF 0 "register_operand" "=f")
-                  (unspec:SF [(match_operand:SF 2 "register_operand" "0")
-                              (match_operand:SF 1 "register_operand" "u")]
-                   UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+(define_expand "atan2df3"
+  [(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
+   && flag_unsafe_math_optimizations"
+{
+  rtx copy = gen_reg_rtx (DFmode);
+  emit_move_insn (copy, operands[1]);
+  emit_insn (gen_atan2df3_1 (operands[0], copy, operands[2]));
+  DONE;
+})
+
+(define_insn "atan2sf3_1"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+        (unspec:SF [(match_operand:SF 2 "register_operand" "0")
+                   (match_operand:SF 1 "register_operand" "u")]
+                  UNSPEC_FPATAN))
+   (clobber (match_scratch:SF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "SF")])
 
-(define_insn "atan2xf3"
-  [(parallel [(set (match_operand:XF 0 "register_operand" "=f")
-                  (unspec:XF [(match_operand:XF 2 "register_operand" "0")
-                              (match_operand:XF 1 "register_operand" "u")]
-                   UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+(define_expand "atan2sf3"
+  [(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
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
-  "fpatan"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
+   && flag_unsafe_math_optimizations"
+{
+  rtx copy = gen_reg_rtx (SFmode);
+  emit_move_insn (copy, operands[1]);
+  emit_insn (gen_atan2sf3_1 (operands[0], copy, operands[2]));
+  DONE;
+})
 
-(define_insn "atan2tf3"
-  [(parallel [(set (match_operand:TF 0 "register_operand" "=f")
-                  (unspec:TF [(match_operand:TF 2 "register_operand" "0")
-                              (match_operand:TF 1 "register_operand" "u")]
-                   UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+(define_insn "atan2xf3_1"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+        (unspec:XF [(match_operand:XF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+                  UNSPEC_FPATAN))
+   (clobber (match_scratch:XF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
 
+(define_expand "atan2xf3"
+  [(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
+   && flag_unsafe_math_optimizations"
+{
+  rtx copy = gen_reg_rtx (XFmode);
+  emit_move_insn (copy, operands[1]);
+  emit_insn (gen_atan2xf3_1 (operands[0], copy, operands[2]));
+  DONE;
+})
+
 (define_insn "*fyl2x_sfxf3"
-  [(parallel [(set (match_operand:SF 0 "register_operand" "=f")
-                  (unspec:SF [(match_operand:SF 2 "register_operand" "0")
-                              (match_operand 1 "register_operand" "u")]
+  [(set (match_operand:SF 0 "register_operand" "=f")
+         (unspec:SF [(match_operand:SF 2 "register_operand" "0")
+                    (match_operand:XF 1 "register_operand" "u")]
                    UNSPEC_FYL2X))
-             (clobber (match_dup 1))])]
+   (clobber (match_scratch:SF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations
-   && GET_MODE (operands[1]) == TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode"
+   && flag_unsafe_math_optimizations"
   "fyl2x"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "SF")])
 
 (define_insn "*fyl2x_dfxf3"
-  [(parallel [(set (match_operand:DF 0 "register_operand" "=f")
-                  (unspec:DF [(match_operand:DF 2 "register_operand" "0")
-                              (match_operand 1 "register_operand" "u")]
+  [(set (match_operand:DF 0 "register_operand" "=f")
+         (unspec:DF [(match_operand:DF 2 "register_operand" "0")
+                    (match_operand:XF 1 "register_operand" "u")]
                    UNSPEC_FYL2X))
-             (clobber (match_dup 1))])]
+   (clobber (match_scratch:DF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations
-   && GET_MODE (operands[1]) == TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode"
+   && flag_unsafe_math_optimizations"
   "fyl2x"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
 (define_insn "*fyl2x_xf3"
-  [(parallel [(set (match_operand:XF 0 "register_operand" "=f")
-                  (unspec:XF [(match_operand:XF 2 "register_operand" "0")
-                              (match_operand:XF 1 "register_operand" "u")]
-                   UNSPEC_FYL2X))
-             (clobber (match_dup 1))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
-  "fyl2x"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
-
-(define_insn "*fyl2x_tfxf3"
-  [(parallel [(set (match_operand:TF 0 "register_operand" "=f")
-                  (unspec:TF [(match_operand:TF 2 "register_operand" "0")
-                              (match_operand:TF 1 "register_operand" "u")]
-                   UNSPEC_FYL2X))
-             (clobber (match_dup 1))])]
+  [(set (match_operand:XF 0 "register_operand" "=f")
+        (unspec:XF [(match_operand:XF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+                  UNSPEC_FYL2X))
+   (clobber (match_scratch:XF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
   "fyl2x"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
   [(parallel [(set (match_operand:SF 0 "register_operand" "")
                   (unspec:SF [(match_operand:SF 1 "register_operand" "")
                               (match_dup 2)] UNSPEC_FYL2X))
-             (clobber (match_dup 2))])]
+             (clobber (match_scratch:SF 3 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
 
-  operands[2] = gen_reg_rtx (TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode);
+  operands[2] = gen_reg_rtx (XFmode);
   temp = standard_80387_constant_rtx (4); /* fldln2 */
   emit_move_insn (operands[2], temp);
 })
   [(parallel [(set (match_operand:DF 0 "register_operand" "")
                   (unspec:DF [(match_operand:DF 1 "register_operand" "")
                               (match_dup 2)] UNSPEC_FYL2X))
-             (clobber (match_dup 2))])]
+             (clobber (match_scratch:DF 3 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
 
-  operands[2] = gen_reg_rtx (TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode);
+  operands[2] = gen_reg_rtx (XFmode);
   temp = standard_80387_constant_rtx (4); /* fldln2 */
   emit_move_insn (operands[2], temp);
 })
   [(parallel [(set (match_operand:XF 0 "register_operand" "")
                   (unspec:XF [(match_operand:XF 1 "register_operand" "")
                               (match_dup 2)] UNSPEC_FYL2X))
-             (clobber (match_dup 2))])]
+             (clobber (match_scratch:XF 3 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
 {
   rtx temp;
 
   emit_move_insn (operands[2], temp);
 })
 
-(define_expand "logtf2"
-  [(parallel [(set (match_operand:TF 0 "register_operand" "")
-                  (unspec:TF [(match_operand:TF 1 "register_operand" "")
-                              (match_dup 2)] UNSPEC_FYL2X))
-             (clobber (match_dup 2))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
-{
-  rtx temp;
-
-  operands[2] = gen_reg_rtx (TFmode);
-  temp = standard_80387_constant_rtx (4); /* fldln2 */
-  emit_move_insn (operands[2], temp);
-})
-
 (define_insn "*fscale_sfxf3"
-  [(parallel [(set (match_operand:SF 0 "register_operand" "=f")
-                  (unspec:SF [(match_operand 2 "register_operand" "0")
-                              (match_operand 1 "register_operand" "u")]
+  [(set (match_operand:SF 0 "register_operand" "=f")
+        (unspec:SF [(match_operand:XF 2 "register_operand" "0")
+                    (match_operand:XF 1 "register_operand" "u")]
                    UNSPEC_FSCALE))
-             (clobber (match_dup 1))])]
+   (clobber (match_scratch:SF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations
-   && GET_MODE (operands[1]) == TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode
-   && GET_MODE (operands[2]) == TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode"
+   && flag_unsafe_math_optimizations"
   "fscale\;fstp\t%y1"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "SF")])
 
 (define_insn "*fscale_dfxf3"
-  [(parallel [(set (match_operand:DF 0 "register_operand" "=f")
-                  (unspec:DF [(match_operand 2 "register_operand" "0")
-                              (match_operand 1 "register_operand" "u")]
+  [(set (match_operand:DF 0 "register_operand" "=f")
+        (unspec:DF [(match_operand:XF 2 "register_operand" "0")
+                    (match_operand:XF 1 "register_operand" "u")]
                    UNSPEC_FSCALE))
-             (clobber (match_dup 1))])]
+   (clobber (match_scratch:DF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations
-   && GET_MODE (operands[1]) == TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode
-   && GET_MODE (operands[2]) == TARGET_128BIT_LONG_DOUBLE ? TFmode : XFmode"
+   && flag_unsafe_math_optimizations"
   "fscale\;fstp\t%y1"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
 (define_insn "*fscale_xf3"
-  [(parallel [(set (match_operand:XF 0 "register_operand" "=f")
-                  (unspec:XF [(match_operand:XF 2 "register_operand" "0")
-                              (match_operand:XF 1 "register_operand" "u")]
-                   UNSPEC_FSCALE))
-             (clobber (match_dup 1))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
-  "fscale\;fstp\t%y1"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
-
-(define_insn "*fscale_tf3"
-  [(parallel [(set (match_operand:TF 0 "register_operand" "=f")
-                  (unspec:TF [(match_operand:TF 2 "register_operand" "0")
-                              (match_operand:TF 1 "register_operand" "u")]
-                   UNSPEC_FSCALE))
-             (clobber (match_dup 1))])]
+  [(set (match_operand:XF 0 "register_operand" "=f")
+       (unspec:XF [(match_operand:XF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+                  UNSPEC_FSCALE))
+   (clobber (match_scratch:XF 3 "=1"))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
   "fscale\;fstp\t%y1"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
         UNSPEC_FRNDINT))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
-  "frndint"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
-
-(define_insn "*frndinttf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (unspec:TF [(match_operand:TF 1 "register_operand" "0")]
-        UNSPEC_FRNDINT))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
   "frndint"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
         UNSPEC_F2XM1))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
-  "f2xm1"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "XF")])
-
-(define_insn "*f2xm1tf2"
-  [(set (match_operand:TF 0 "register_operand" "=f")
-       (unspec:TF [(match_operand:TF 1 "register_operand" "0")]
-        UNSPEC_F2XM1))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
   "f2xm1"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
    (set (match_dup 9) (plus:XF (match_dup 7) (match_dup 8)))
    (parallel [(set (match_operand:SF 0 "register_operand" "")
                   (unspec:SF [(match_dup 9) (match_dup 5)] UNSPEC_FSCALE))
-             (clobber (match_dup 5))])]
+             (clobber (match_scratch:SF 5 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
   int i;
 
-  if (TARGET_128BIT_LONG_DOUBLE)
-    {
-      emit_insn (gen_expsf2_tf (operands[0], operands[1]));
-      DONE;
-    }
-
   for (i=2; i<10; i++)
     operands[i] = gen_reg_rtx (XFmode);
   temp = standard_80387_constant_rtx (5); /* fldl2e */
   emit_move_insn (operands[8], CONST1_RTX (XFmode));  /* fld1 */
 })
 
-(define_expand "expsf2_tf"
-  [(set (match_dup 2)
-       (float_extend:TF (match_operand:SF 1 "register_operand" "")))
-   (set (match_dup 4) (mult:TF (match_dup 2) (match_dup 3)))
-   (set (match_dup 5) (unspec:TF [(match_dup 4)] UNSPEC_FRNDINT))
-   (set (match_dup 6) (minus:TF (match_dup 4) (match_dup 5)))
-   (set (match_dup 7) (unspec:TF [(match_dup 6)] UNSPEC_F2XM1))
-   (set (match_dup 9) (plus:TF (match_dup 7) (match_dup 8)))
-   (parallel [(set (match_operand:SF 0 "register_operand" "")
-                  (unspec:SF [(match_dup 9) (match_dup 5)] UNSPEC_FSCALE))
-             (clobber (match_dup 5))])]
-  ""
-{
-  rtx temp;
-  int i;
-
-  for (i=2; i<10; i++)
-    operands[i] = gen_reg_rtx (TFmode);
-  temp = standard_80387_constant_rtx (5); /* fldl2e */
-  emit_move_insn (operands[3], temp);
-  emit_move_insn (operands[8], CONST1_RTX (TFmode));  /* fld1 */
-})
-
 (define_expand "expdf2"
   [(set (match_dup 2)
        (float_extend:XF (match_operand:DF 1 "register_operand" "")))
    (set (match_dup 9) (plus:XF (match_dup 7) (match_dup 8)))
    (parallel [(set (match_operand:DF 0 "register_operand" "")
                   (unspec:DF [(match_dup 9) (match_dup 5)] UNSPEC_FSCALE))
-             (clobber (match_dup 5))])]
+             (clobber (match_scratch:DF 5 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
 {
   rtx temp;
   int i;
 
-  if (TARGET_128BIT_LONG_DOUBLE)
-    {
-      emit_insn (gen_expdf2_tf (operands[0], operands[1]));
-      DONE;
-    }
-
   for (i=2; i<10; i++)
     operands[i] = gen_reg_rtx (XFmode);
   temp = standard_80387_constant_rtx (5); /* fldl2e */
   emit_move_insn (operands[8], CONST1_RTX (XFmode));  /* fld1 */
 })
 
-
-(define_expand "expdf2_tf"
-  [(set (match_dup 2)
-       (float_extend:TF (match_operand:DF 1 "register_operand" "")))
-   (set (match_dup 4) (mult:TF (match_dup 2) (match_dup 3)))
-   (set (match_dup 5) (unspec:TF [(match_dup 4)] UNSPEC_FRNDINT))
-   (set (match_dup 6) (minus:TF (match_dup 4) (match_dup 5)))
-   (set (match_dup 7) (unspec:TF [(match_dup 6)] UNSPEC_F2XM1))
-   (set (match_dup 9) (plus:TF (match_dup 7) (match_dup 8)))
-   (parallel [(set (match_operand:DF 0 "register_operand" "")
-                  (unspec:DF [(match_dup 9) (match_dup 5)] UNSPEC_FSCALE))
-             (clobber (match_dup 5))])]
-   ""
-{
-  rtx temp;
-  int i;
-
-  for (i=2; i<10; i++)
-    operands[i] = gen_reg_rtx (TFmode);
-  temp = standard_80387_constant_rtx (5); /* fldl2e */
-  emit_move_insn (operands[3], temp);
-  emit_move_insn (operands[8], CONST1_RTX (TFmode));  /* fld1 */
-})
-
 (define_expand "expxf2"
   [(set (match_dup 3) (mult:XF (match_operand:XF 1 "register_operand" "")
                               (match_dup 2)))
    (set (match_dup 8) (plus:XF (match_dup 6) (match_dup 7)))
    (parallel [(set (match_operand:XF 0 "register_operand" "")
                   (unspec:XF [(match_dup 8) (match_dup 4)] UNSPEC_FSCALE))
-             (clobber (match_dup 4))])]
+             (clobber (match_scratch:XF 5 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
 {
   rtx temp;
   int i;
                   (unspec:SF [(match_dup 2)
                               (match_operand:SF 1 "register_operand" "")]
                    UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+             (clobber (match_scratch:SF 3 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
 {
   emit_move_insn (operands[2], CONST1_RTX (SFmode));  /* fld1 */
 })
 
-(define_expand "exptf2"
-  [(set (match_dup 3) (mult:TF (match_operand:TF 1 "register_operand" "")
-                              (match_dup 2)))
-   (set (match_dup 4) (unspec:TF [(match_dup 3)] UNSPEC_FRNDINT))
-   (set (match_dup 5) (minus:TF (match_dup 3) (match_dup 4)))
-   (set (match_dup 6) (unspec:TF [(match_dup 5)] UNSPEC_F2XM1))
-   (set (match_dup 8) (plus:TF (match_dup 6) (match_dup 7)))
-   (parallel [(set (match_operand:TF 0 "register_operand" "")
-                  (unspec:TF [(match_dup 8) (match_dup 4)] UNSPEC_FSCALE))
-             (clobber (match_dup 4))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
-{
-  rtx temp;
-  int i;
-
-  for (i=2; i<9; i++)
-    operands[i] = gen_reg_rtx (TFmode);
-  temp = standard_80387_constant_rtx (5); /* fldl2e */
-  emit_move_insn (operands[2], temp);
-  emit_move_insn (operands[7], CONST1_RTX (TFmode));  /* fld1 */
-})
-
 (define_expand "atandf2"
   [(parallel [(set (match_operand:DF 0 "register_operand" "")
                   (unspec:DF [(match_dup 2)
                               (match_operand:DF 1 "register_operand" "")]
                    UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+             (clobber (match_scratch:DF 3 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
 {
                   (unspec:XF [(match_dup 2)
                               (match_operand:XF 1 "register_operand" "")]
                    UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
+             (clobber (match_scratch:XF 3 ""))])]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && !TARGET_128BIT_LONG_DOUBLE"
+   && flag_unsafe_math_optimizations"
 {
   operands[2] = gen_reg_rtx (XFmode);
   emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
 })
-
-(define_expand "atantf2"
-  [(parallel [(set (match_operand:TF 0 "register_operand" "")
-                  (unspec:TF [(match_dup 2)
-                              (match_operand:TF 1 "register_operand" "")]
-                   UNSPEC_FPATAN))
-             (clobber (match_dup 1))])]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
-   && flag_unsafe_math_optimizations && TARGET_128BIT_LONG_DOUBLE"
-{
-  operands[2] = gen_reg_rtx (TFmode);
-  emit_move_insn (operands[2], CONST1_RTX (TFmode));  /* fld1 */
-})
 \f
 ;; Block operation instructions
 
    (use (match_operand:BLK 1 "memory_operand" ""))
    (use (match_operand:SI 2 "nonmemory_operand" ""))
    (use (match_operand:SI 3 "const_int_operand" ""))]
-  ""
+  "! optimize_size"
 {
  if (ix86_expand_movstr (operands[0], operands[1], operands[2], operands[3]))
    DONE;
                    (match_operand:BLK 2 "general_operand" "")))
    (use (match_operand 3 "general_operand" ""))
    (use (match_operand 4 "immediate_operand" ""))]
-  ""
+  "! optimize_size || TARGET_INLINE_ALL_STRINGOPS"
 {
   rtx addr1, addr2, out, outlow, count, countreg, align;
 
        (if_then_else:XF (match_operand 1 "comparison_operator" "")
                         (match_operand:XF 2 "register_operand" "")
                         (match_operand:XF 3 "register_operand" "")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_CMOVE"
-  "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
-
-(define_expand "movtfcc"
-  [(set (match_operand:TF 0 "register_operand" "")
-       (if_then_else:TF (match_operand 1 "comparison_operator" "")
-                        (match_operand:TF 2 "register_operand" "")
-                        (match_operand:TF 3 "register_operand" "")))]
   "TARGET_CMOVE"
   "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
 
                                [(reg 17) (const_int 0)])
                      (match_operand:XF 2 "register_operand" "f,0")
                      (match_operand:XF 3 "register_operand" "0,f")))]
-  "!TARGET_128BIT_LONG_DOUBLE && TARGET_CMOVE"
-  "@
-   fcmov%F1\t{%2, %0|%0, %2}
-   fcmov%f1\t{%3, %0|%0, %3}"
-  [(set_attr "type" "fcmov")
-   (set_attr "mode" "XF")])
-
-(define_insn "*movtfcc_1"
-  [(set (match_operand:TF 0 "register_operand" "=f,f")
-       (if_then_else:TF (match_operator 1 "fcmov_comparison_operator" 
-                               [(reg 17) (const_int 0)])
-                     (match_operand:TF 2 "register_operand" "f,0")
-                     (match_operand:TF 3 "register_operand" "0,f")))]
   "TARGET_CMOVE"
   "@
    fcmov%F1\t{%2, %0|%0, %2}
           && operands_match_p (operands[2], operands[3])))"
   [(set (reg:CCFP 17)
        (compare:CCFP (match_dup 2)
-                     (match_dup 2)))
+                     (match_dup 1)))
    (set (match_dup 0)
        (if_then_else:DF (ge (reg:CCFP 17) (const_int 0))
                         (match_dup 1)
 ;; [(set (mem (plus (reg ebp) (const_int -160000))) (const_int 0))]
 ;;
 ;; in proper program order.
-(define_expand "pro_epilogue_adjust_stack"
-  [(parallel [(set (match_operand:SI 0 "register_operand" "=r,r")
-                  (plus:SI (match_operand:SI 1 "register_operand" "0,r")
-                           (match_operand:SI 2 "immediate_operand" "i,i")))
-             (clobber (reg:CC 17))
-             (clobber (mem:BLK (scratch)))])]
- ""
-{
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_pro_epilogue_adjust_stack_rex64
-                (operands[0], operands[1], operands[2]));
-      DONE;
-    }
-})
-
-(define_insn "*pro_epilogue_adjust_stack_1"
+(define_insn "pro_epilogue_adjust_stack_1"
   [(set (match_operand:SI 0 "register_operand" "=r,r")
        (plus:SI (match_operand:SI 1 "register_operand" "0,r")
                 (match_operand:SI 2 "immediate_operand" "i,i")))
 
     case TYPE_ALU:
       if (GET_CODE (operands[2]) == CONST_INT
+         /* Avoid overflows.  */
+         && ((INTVAL (operands[2]) & ((((unsigned int) 1) << 31) - 1)))
           && (INTVAL (operands[2]) == 128
              || (INTVAL (operands[2]) < 0
                  && INTVAL (operands[2]) != -128)))
              (const_string "lea")))
    (set_attr "mode" "DI")])
 
+(define_insn "pro_epilogue_adjust_stack_rex64_2"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+       (plus:DI (match_operand:DI 1 "register_operand" "0,r")
+                (match_operand:DI 3 "immediate_operand" "i,i")))
+   (use (match_operand:DI 2 "register_operand" "r,r"))
+   (clobber (reg:CC 17))
+   (clobber (mem:BLK (scratch)))]
+  "TARGET_64BIT"
+{
+  switch (get_attr_type (insn))
+    {
+    case TYPE_ALU:
+      return "add{q}\t{%2, %0|%0, %2}";
+
+    case TYPE_LEA:
+      operands[2] = gen_rtx_PLUS (DImode, operands[1], operands[2]);
+      return "lea{q}\t{%a2, %0|%0, %a2}";
+
+    default:
+      abort ();
+    }
+}
+  [(set_attr "type" "alu,lea")
+   (set_attr "mode" "DI")])
 
 ;; Placeholder for the conditional moves.  This one is split either to SSE
 ;; based moves emulation or to usual cmove sequence.  Little bit unfortunate
   DONE;
 })
 
+(define_expand "movtf"
+  [(set (match_operand:TF 0 "nonimmediate_operand" "")
+       (match_operand:TF 1 "nonimmediate_operand" ""))]
+  "TARGET_64BIT"
+{
+  if (TARGET_64BIT)
+    ix86_expand_move (TFmode, operands);
+  else
+    ix86_expand_vector_move (TFmode, operands);
+  DONE;
+})
+
 (define_insn "movv2df_internal"
   [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,m")
        (match_operand:V2DF 1 "vector_move_operand" "C,xm,x"))]
                   (const_string "TI"))]
               (const_string "DI")))])
 
+(define_insn "*movtf_rex64"
+  [(set (match_operand:TF 0 "nonimmediate_operand" "=r,o,x,x,xm")
+       (match_operand:TF 1 "general_operand" "riFo,riF,C,xm,x"))]
+  "TARGET_64BIT
+   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
+{
+  switch (which_alternative)
+    {
+    case 0:
+    case 1:
+      return "#";
+    case 2:
+      if (get_attr_mode (insn) == MODE_V4SF)
+       return "xorps\t%0, %0";
+      else
+       return "pxor\t%0, %0";
+    case 3:
+    case 4:
+      if (get_attr_mode (insn) == MODE_V4SF)
+       return "movaps\t{%1, %0|%0, %1}";
+      else
+       return "movdqa\t{%1, %0|%0, %1}";
+    default:
+      abort ();
+    }
+}
+  [(set_attr "type" "*,*,ssemov,ssemov,ssemov")
+   (set (attr "mode")
+        (cond [(eq_attr "alternative" "2,3")
+                (if_then_else
+                  (ne (symbol_ref "optimize_size")
+                      (const_int 0))
+                  (const_string "V4SF")
+                  (const_string "TI"))
+              (eq_attr "alternative" "4")
+                (if_then_else
+                  (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
+                           (const_int 0))
+                       (ne (symbol_ref "optimize_size")
+                           (const_int 0)))
+                  (const_string "V4SF")
+                  (const_string "TI"))]
+              (const_string "DI")))])
+
 (define_split
   [(set (match_operand:TI 0 "nonimmediate_operand" "")
         (match_operand:TI 1 "general_operand" ""))]
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
+(define_split
+  [(set (match_operand:TF 0 "nonimmediate_operand" "")
+        (match_operand:TF 1 "general_operand" ""))]
+  "reload_completed && !SSE_REG_P (operands[0])
+   && !SSE_REG_P (operands[1])"
+  [(const_int 0)]
+  "ix86_split_long_move (operands); DONE;")
+
 ;; These two patterns are useful for specifying exactly whether to use
 ;; movaps or movups
 (define_expand "sse_movaps"
         (vec_merge:V4HI (match_operand:V4HI 1 "register_operand" "0")
                        (vec_duplicate:V4HI
                         (truncate:HI (match_operand:SI 2 "nonimmediate_operand" "rm")))
-                       (match_operand:SI 3 "immediate_operand" "i")))]
+                       (match_operand:SI 3 "const_0_to_15_operand" "N")))]
   "TARGET_SSE || TARGET_3DNOW_A"
   "pinsrw\t{%3, %2, %0|%0, %2, %3}"
   [(set_attr "type" "mmxcvt")
   [(set (match_operand:SI 0 "register_operand" "=r")
         (zero_extend:SI (vec_select:HI (match_operand:V4HI 1 "register_operand" "y")
                                       (parallel
-                                       [(match_operand:SI 2 "immediate_operand" "i")]))))]
+                                       [(match_operand:SI 2 "const_0_to_3_operand" "N")]))))]
   "TARGET_SSE || TARGET_3DNOW_A"
   "pextrw\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "type" "mmxcvt")
                        (vec_duplicate:V8HI
                         (truncate:HI
                           (match_operand:SI 2 "nonimmediate_operand" "rm")))
-                       (match_operand:SI 3 "immediate_operand" "i")))]
+                       (match_operand:SI 3 "const_0_to_255_operand" "N")))]
   "TARGET_SSE2"
   "pinsrw\t{%3, %2, %0|%0, %2, %3}"
   [(set_attr "type" "ssecvt")
         (zero_extend:SI
          (vec_select:HI (match_operand:V8HI 1 "register_operand" "x")
                         (parallel
-                         [(match_operand:SI 2 "immediate_operand" "i")]))))]
+                         [(match_operand:SI 2 "const_0_to_7_operand" "N")]))))]
   "TARGET_SSE2"
   "pextrw\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "type" "ssecvt")