OSDN Git Service

2004-04-27 Wu Yongwei <adah@sh163.net>
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.md
index a004c32..c0a3ff4 100644 (file)
@@ -1,6 +1,6 @@
 ;; GCC machine description for IA-32 and x86-64.
 ;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-;; 2001, 2002, 2003
+;; 2001, 2002, 2003, 2004
 ;; Free Software Foundation, Inc.
 ;; Mostly by William Schelter.
 ;; x86_64 support added by Jan Hubicka
    (UNSPEC_FRNDINT             68)
    (UNSPEC_F2XM1               69)
 
+   ; x87 Double output FP
+   (UNSPEC_SINCOS_COS          80)
+   (UNSPEC_SINCOS_SIN          81)
+   (UNSPEC_TAN_ONE             82)
+   (UNSPEC_TAN_TAN             83)
+   (UNSPEC_XTRACT_FRACT                84)
+   (UNSPEC_XTRACT_EXP          85)
+
    ; REP instruction
    (UNSPEC_REP                 75)
   ])
 \f
 ;; Processor type.  This attribute must exactly match the processor_type
 ;; enumeration in i386.h.
-(define_attr "cpu" "i386,i486,pentium,pentiumpro,k6,athlon,pentium4,k8"
+(define_attr "cpu" "i386,i486,pentium,pentiumpro,k6,athlon,pentium4,k8,nocona"
   (const (symbol_ref "ix86_tune")))
 
 ;; A basic instruction type.  Refinements due to arguments to be
     (const_int 1)
     (const_int 0)))
 
-;; Set when 0f opcode prefix is used.
+;; Set when REX opcode prefix is used.
 (define_attr "prefix_rex" ""
   (cond [(and (eq_attr "mode" "DI")
              (eq_attr "type" "!push,pop,call,callv,leave,ibr"))
   "fnstsw\t%0"
   [(set_attr "length" "2")
    (set_attr "mode" "SI")
-   (set_attr "unit" "i387")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "unit" "i387")])
 
 ;; FP compares, step 3
 ;; Get ax into flags, general case.
   "sahf"
   [(set_attr "length" "1")
    (set_attr "athlon_decode" "vector")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "one")])
+   (set_attr "mode" "SI")])
 
 ;; Pentium Pro can do steps 1 through 3 in one go.
 
    (set_attr "pent_pair" "np")
    (set_attr "athlon_decode" "vector")
    (set_attr "mode" "SI")
-   (set_attr "modrm" "0")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "modrm" "0")])
 
 (define_expand "movhi"
   [(set (match_operand:HI 0 "nonimmediate_operand" "")
     }
 }
   [(set (attr "type")
-     (cond [(and (eq_attr "alternative" "0")
+     (cond [(ne (symbol_ref "optimize_size") (const_int 0))
+             (const_string "imov")
+           (and (eq_attr "alternative" "0")
                 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
                          (const_int 0))
                      (eq (symbol_ref "TARGET_HIMODE_MATH")
   [(set_attr "type" "imov")
    (set_attr "pent_pair" "np")
    (set_attr "mode" "HI")
-   (set_attr "modrm" "0")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "modrm" "0")])
 
 (define_insn "*swaphi_2"
   [(set (match_operand:HI 0 "register_operand" "+r")
   [(set_attr "type" "imov")
    (set_attr "pent_pair" "np")
    (set_attr "mode" "SI")
-   (set_attr "modrm" "0")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "modrm" "0")])
 
 (define_expand "movstricthi"
   [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" ""))
     }
 }
   [(set (attr "type")
-     (cond [(and (eq_attr "alternative" "3")
+     (cond [(ne (symbol_ref "optimize_size") (const_int 0))
+             (const_string "imov")
+           (and (eq_attr "alternative" "3")
                 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
                          (const_int 0))
                      (eq (symbol_ref "TARGET_QIMODE_MATH")
   [(set_attr "type" "imov")
    (set_attr "pent_pair" "np")
    (set_attr "mode" "QI")
-   (set_attr "modrm" "0")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "modrm" "0")])
 
 (define_expand "movstrictqi"
   [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))
    (set_attr "pent_pair" "np")
    (set_attr "athlon_decode" "vector")
    (set_attr "mode" "DI")
-   (set_attr "modrm" "0")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "modrm" "0")])
 
   
 (define_expand "movsf"
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
    && (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))
-   && (!(SSE_REG_P (operands[0]) || 
-        (GET_CODE (operands[0]) == SUBREG
-         && SSE_REG_P (SUBREG_REG (operands[0]))))
-       || standard_sse_constant_p (get_pool_constant (XEXP (operands[1], 0))))
-   && (!(FP_REG_P (operands[0]) || 
-        (GET_CODE (operands[0]) == SUBREG
-         && FP_REG_P (SUBREG_REG (operands[0]))))
-       || standard_80387_constant_p (get_pool_constant (XEXP (operands[1], 0))))"
-  [(set (match_dup 0)
-       (match_dup 1))]
-  "operands[1] = get_pool_constant (XEXP (operands[1], 0));")
+   && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0))"
+  [(set (match_dup 0) (match_dup 1))]
+{
+  rtx c = get_pool_constant (XEXP (operands[1], 0));
+  rtx r = operands[0];
+
+  if (GET_CODE (r) == SUBREG)
+    r = SUBREG_REG (r);
+
+  if (SSE_REG_P (r))
+    {
+      if (!standard_sse_constant_p (c))
+       FAIL;
+    }
+  else if (FP_REG_P (r))
+    {
+      if (!standard_80387_constant_p (c))
+       FAIL;
+    }
+  else if (MMX_REG_P (r))
+    FAIL;
+
+  operands[1] = c;
+})
 
 (define_insn "swapxf"
   [(set (match_operand:XF 0 "register_operand" "+f")
      (zero_extend:DI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
   "TARGET_64BIT"
   "@
-   movz{wl|x}\t{%1, %k0|%k0, %1} 
+   movz{wl|x}\t{%1, %k0|%k0, %1}
    movz{wq|x}\t{%1, %0|%0, %1}"
   [(set_attr "type" "imovx")
    (set_attr "mode" "SI,DI")])
      (zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "Q,m")))]
   "TARGET_64BIT"
   "@
-   movz{bl|x}\t{%1, %k0|%k0, %1} 
+   movz{bl|x}\t{%1, %k0|%k0, %1}
    movz{bq|x}\t{%1, %0|%0, %1}"
   [(set_attr "type" "imovx")
    (set_attr "mode" "SI,DI")])
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
         return "fstp%z0\t%y0";
-
       else
         return "fst%z0\t%y0";
+
     case 2:
       return "cvtss2sd\t{%1, %0|%0, %1}";
 
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
   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";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
              (clobber (match_dup 2))])]
   "TARGET_80387 || TARGET_SSE2"
   "
-   if (TARGET_80387)
-     operands[2] = assign_386_stack_local (SFmode, 0);
-   else
+   if (!TARGET_80387)
      {
        emit_insn (gen_truncdfsf2_sse_only (operands[0], operands[1]));
        DONE;
      }
+   else if (flag_unsafe_math_optimizations)
+     {
+       rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode);
+       emit_insn (gen_truncdfsf2_noop (reg, operands[1]));
+       if (reg != operands[0])
+         emit_move_insn (operands[0], reg);
+       DONE;
+     }
+   else
+     operands[2] = assign_386_stack_local (SFmode, 0);
 ")
 
+(define_insn "truncdfsf2_noop"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
+  "TARGET_80387 && flag_unsafe_math_optimizations"
+{
+  return output_387_reg_move (insn, operands);
+}
+  [(set_attr "type" "fmov")
+   (set_attr "mode" "SF")])
+
 (define_insn "*truncdfsf2_1"
   [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
        (float_truncate:SF
                    (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
   "TARGET_80387"
-  "operands[2] = assign_386_stack_local (SFmode, 0);")
+  "
+  if (flag_unsafe_math_optimizations)
+    {
+      rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode);
+      emit_insn (gen_truncxfsf2_noop (reg, operands[1]));
+      if (reg != operands[0])
+       emit_move_insn (operands[0], reg);
+      DONE;
+    }
+  else
+    operands[2] = assign_386_stack_local (SFmode, 0);
+  ")
+
+(define_insn "truncxfsf2_noop"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (float_truncate:SF (match_operand:XF 1 "register_operand" "f")))]
+  "TARGET_80387 && flag_unsafe_math_optimizations"
+{
+  return output_387_reg_move (insn, operands);
+}
+  [(set_attr "type" "fmov")
+   (set_attr "mode" "SF")])
 
 (define_insn "*truncxfsf2_1"
   [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
                    (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
   "TARGET_80387"
-  "operands[2] = assign_386_stack_local (DFmode, 0);")
+  "
+  if (flag_unsafe_math_optimizations)
+    {
+      rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (DFmode);
+      emit_insn (gen_truncxfdf2_noop (reg, operands[1]));
+      if (reg != operands[0])
+       emit_move_insn (operands[0], reg);
+      DONE;
+    }
+  else
+    operands[2] = assign_386_stack_local (DFmode, 0);
+  ")
+
+(define_insn "truncxfdf2_noop"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
+  "TARGET_80387 && flag_unsafe_math_optimizations"
+{
+  return output_387_reg_move (insn, operands);
+}
+  [(set_attr "type" "fmov")
+   (set_attr "mode" "DF")])
 
 (define_insn "*truncxfdf2_1"
   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#rY,?r#fY,?Y#rf")
 ;; Signed conversion to DImode.
 
 (define_expand "fix_truncxfdi2"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "")
-        (fix:DI (match_operand:XF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:DI 0 "nonimmediate_operand" "")
+                   (fix:DI (match_operand:XF 1 "register_operand" "")))
+             (clobber (reg:CC 17))])]
   "TARGET_80387"
   "")
 
 (define_expand "fix_truncdfdi2"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "")
-        (fix:DI (match_operand:DF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:DI 0 "nonimmediate_operand" "")
+                   (fix:DI (match_operand:DF 1 "register_operand" "")))
+              (clobber (reg:CC 17))])]
   "TARGET_80387 || (TARGET_SSE2 && TARGET_64BIT)"
 {
   if (TARGET_64BIT && TARGET_SSE2)
 })
 
 (define_expand "fix_truncsfdi2"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "")
-       (fix:DI (match_operand:SF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:DI 0 "nonimmediate_operand" "")
+                  (fix:DI (match_operand:SF 1 "register_operand" "")))
+              (clobber (reg:CC 17))])] 
   "TARGET_80387 || (TARGET_SSE && TARGET_64BIT)"
 {
   if (TARGET_SSE && TARGET_64BIT)
 ;; of the machinery.
 (define_insn_and_split "*fix_truncdi_1"
   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,?r")
-       (fix:DI (match_operand 1 "register_operand" "f,f")))]
+       (fix:DI (match_operand 1 "register_operand" "f,f")))
+   (clobber (reg:CC 17))]
   "TARGET_80387 && FLOAT_MODE_P (GET_MODE (operands[1]))
    && !reload_completed && !reload_in_progress
    && (!SSE_FLOAT_MODE_P (GET_MODE (operands[1])) || !TARGET_64BIT)"
 ;; Signed conversion to SImode.
 
 (define_expand "fix_truncxfsi2"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "")
-       (fix:SI (match_operand:XF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:SI 0 "nonimmediate_operand" "")
+                  (fix:SI (match_operand:XF 1 "register_operand" "")))
+             (clobber (reg:CC 17))])]
   "TARGET_80387"
   "")
 
 (define_expand "fix_truncdfsi2"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "")
-       (fix:SI (match_operand:DF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:SI 0 "nonimmediate_operand" "")
+                  (fix:SI (match_operand:DF 1 "register_operand" "")))
+             (clobber (reg:CC 17))])]
   "TARGET_80387 || TARGET_SSE2"
 {
   if (TARGET_SSE2)
 })
 
 (define_expand "fix_truncsfsi2"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "")
-       (fix:SI (match_operand:SF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:SI 0 "nonimmediate_operand" "")
+                  (fix:SI (match_operand:SF 1 "register_operand" "")))
+             (clobber (reg:CC 17))])] 
   "TARGET_80387 || TARGET_SSE"
 {
   if (TARGET_SSE)
 ;; of the machinery.
 (define_insn_and_split "*fix_truncsi_1"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=m,?r")
-       (fix:SI (match_operand 1 "register_operand" "f,f")))]
+       (fix:SI (match_operand 1 "register_operand" "f,f")))
+   (clobber (reg:CC 17))]
   "TARGET_80387 && FLOAT_MODE_P (GET_MODE (operands[1]))
    && !reload_completed && !reload_in_progress
    && !SSE_FLOAT_MODE_P (GET_MODE (operands[1]))"
 ;; Signed conversion to HImode.
 
 (define_expand "fix_truncxfhi2"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "")
-        (fix:HI (match_operand:XF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:HI 0 "nonimmediate_operand" "")
+                   (fix:HI (match_operand:XF 1 "register_operand" "")))
+              (clobber (reg:CC 17))])] 
   "TARGET_80387"
   "")
 
 (define_expand "fix_truncdfhi2"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "")
-       (fix:HI (match_operand:DF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:HI 0 "nonimmediate_operand" "")
+                  (fix:HI (match_operand:DF 1 "register_operand" "")))
+              (clobber (reg:CC 17))])]
   "TARGET_80387 && !TARGET_SSE2"
   "")
 
 (define_expand "fix_truncsfhi2"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "")
-       (fix:HI (match_operand:SF 1 "register_operand" "")))]
+  [(parallel [(set (match_operand:HI 0 "nonimmediate_operand" "")
+                  (fix:HI (match_operand:SF 1 "register_operand" "")))
+               (clobber (reg:CC 17))])]
   "TARGET_80387 && !TARGET_SSE"
   "")
 
 ;; of the machinery.
 (define_insn_and_split "*fix_trunchi_1"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=m,?r")
-       (fix:HI (match_operand 1 "register_operand" "f,f")))]
+       (fix:HI (match_operand 1 "register_operand" "f,f")))
+   (clobber (reg:CC 17))]
   "TARGET_80387 && FLOAT_MODE_P (GET_MODE (operands[1]))
    && !reload_completed && !reload_in_progress
    && !SSE_FLOAT_MODE_P (GET_MODE (operands[1]))"
   "fnstcw\t%0"
   [(set_attr "length" "2")
    (set_attr "mode" "HI")
-   (set_attr "unit" "i387")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "unit" "i387")])
 
 (define_insn "x86_fldcw_1"
   [(set (reg:HI 18)
   [(set_attr "length" "2")
    (set_attr "mode" "HI")
    (set_attr "unit" "i387")
-   (set_attr "athlon_decode" "vector")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "athlon_decode" "vector")])
 \f
 ;; Conversion between fixed point and floating point.
 
  
         emit_move_insn (tmp, operands[1]);
         emit_insn (gen_sse_shufps (op0, tmp, tmp,
-                                   GEN_INT (1)));
+                                   const1_rtx));
       }
     case 2:
       {
   "adc{q}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "mode" "DI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "DI")])
 
 (define_insn "*adddi3_cc_rex64"
   [(set (reg:CC 17)
   "adc{b}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "mode" "QI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "QI")])
 
 (define_insn "addhi3_carry"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
   "adc{w}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "mode" "HI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "HI")])
 
 (define_insn "addsi3_carry"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r")
   "adc{l}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "SI")])
 
 (define_insn "*addsi3_carry_zext"
   [(set (match_operand:DI 0 "register_operand" "=r")
   "adc{l}\t{%2, %k0|%k0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "SI")])
 
 (define_insn "*addsi3_cc"
   [(set (reg:CC 17)
       if (GET_CODE (operands[1]) == CONST_INT
          && INTVAL (operands[1]) < 0)
        {
-         operands[2] = GEN_INT (-INTVAL (operands[2]));
+         operands[1] = GEN_INT (-INTVAL (operands[1]));
          return "sub{b}\t{%1, %0|%0, %1}";
        }
       return "add{b}\t{%1, %0|%0, %1}";
   "sbb{q}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "DI")])
 
 (define_insn "*subdi_1_rex64"
   "sbb{b}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "QI")])
 
 (define_insn "subhi3_carry"
   "sbb{w}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "HI")])
 
 (define_insn "subsi3_carry"
   "sbb{l}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "SI")])
 
 (define_insn "subsi3_carry_zext"
   "sbb{l}\t{%2, %k0|%k0, %2}"
   [(set_attr "type" "alu")
    (set_attr "pent_pair" "pu")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "SI")])
 
 (define_expand "subsi3"
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "mul{q}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set_attr "length_immediate" "0")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "mul{l}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set_attr "length_immediate" "0")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "mul{q}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set_attr "length_immediate" "0")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
   "GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM"
   "mul{l}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set_attr "length_immediate" "0")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "mul{l}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set_attr "length_immediate" "0")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "imul{q}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
         (const_string "vector")
   "GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM"
   "imul{l}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
         (const_string "vector")
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "imul{l}\t%2"
   [(set_attr "type" "imul")
-   (set_attr "ppro_uops" "few")
    (set (attr "athlon_decode")
      (if_then_else (eq_attr "cpu" "athlon")
         (const_string "vector")
   "TARGET_QIMODE_MATH"
   "idiv{b}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "mode" "QI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "QI")])
 
 (define_insn "udivqi3"
   [(set (match_operand:QI 0 "register_operand" "=a")
   "TARGET_QIMODE_MATH"
   "div{b}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "mode" "QI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "QI")])
 
 ;; The patterns that match these are at the end of this file.
 
   "TARGET_64BIT"
   "idiv{q}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "mode" "DI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "DI")])
 
 (define_split
   [(set (match_operand:DI 0 "register_operand" "")
   ""
   "idiv{l}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "SI")])
 
 (define_split
   [(set (match_operand:SI 0 "register_operand" "")
   "TARGET_64BIT"
   "div{q}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "DI")])
 
 (define_split
   ""
   "div{l}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "SI")])
 
 (define_split
   ""
   "div{w}\t%2"
   [(set_attr "type" "idiv")
-   (set_attr "mode" "HI")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "HI")])
 
 ;; We can not use div/idiv for double division, because it causes
 ;; "division by zero" on the overflow and that's not what we expect
 ;   (clobber (reg:CC 17))]
 ;  ""
 ;  "div{l}\t{%2, %0|%0, %2}"
-;  [(set_attr "type" "idiv")
-;   (set_attr "ppro_uops" "few")])
+;  [(set_attr "type" "idiv")])
 \f
 ;;- Logical AND instructions
 
   "TARGET_64BIT && ix86_match_ccmode (insn, CCNOmode)
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
   "@
-   test{l}\t{%k1, %k0|%k0, %k1} 
-   test{l}\t{%k1, %k0|%k0, %k1} 
-   test{q}\t{%1, %0|%0, %1} 
-   test{q}\t{%1, %0|%0, %1} 
+   test{l}\t{%k1, %k0|%k0, %k1}
+   test{l}\t{%k1, %k0|%k0, %k1}
+   test{q}\t{%1, %0|%0, %1}
+   test{q}\t{%1, %0|%0, %1}
    test{q}\t{%1, %0|%0, %1}"
   [(set_attr "type" "test")
    (set_attr "modrm" "0,1,0,1,1")
   "TARGET_64BIT && ix86_match_ccmode (insn, CCNOmode)
    && ix86_binary_operator_ok (AND, DImode, operands)"
   "@
-   and{l}\t{%k2, %k0|%k0, %k2} 
-   and{q}\t{%2, %0|%0, %2} 
+   and{l}\t{%k2, %k0|%k0, %k2}
+   and{q}\t{%2, %0|%0, %2}
    and{q}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "mode" "SI,DI,DI")])
   "TARGET_64BIT
    && ix86_binary_operator_ok (XOR, DImode, operands)"
   "@
-   xor{q}\t{%2, %0|%0, %2} 
+   xor{q}\t{%2, %0|%0, %2}
    xor{q}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "mode" "DI,DI")])
    && ix86_match_ccmode (insn, CCNOmode)
    && ix86_binary_operator_ok (XOR, DImode, operands)"
   "@
-   xor{q}\t{%2, %0|%0, %2} 
+   xor{q}\t{%2, %0|%0, %2}
    xor{q}\t{%2, %0|%0, %2}"
   [(set_attr "type" "alu")
    (set_attr "mode" "DI,DI")])
    (use (match_operand:V4SF 2 "nonimmediate_operand" ""))
    (clobber (reg:CC 17))]
   "reload_completed && SSE_REG_P (operands[0])"
-  [(set (subreg:TI (match_dup 0) 0)
-       (xor:TI (match_dup 1)
-               (match_dup 2)))]
+  [(set (match_dup 0)
+       (xor:V4SF (match_dup 1)
+                 (match_dup 2)))]
 {
-  operands[1] = simplify_gen_subreg (TImode, operands[1], SFmode, 0);
-  operands[2] = simplify_gen_subreg (TImode, operands[2], V4SFmode, 0);
+  operands[0] = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+  operands[1] = simplify_gen_subreg (V4SFmode, operands[1], SFmode, 0);
   if (operands_match_p (operands[0], operands[2]))
     {
       rtx tmp;
    (use (match_operand:V2DF 2 "nonimmediate_operand" ""))
    (clobber (reg:CC 17))]
   "reload_completed && SSE_REG_P (operands[0])"
-  [(set (subreg:TI (match_dup 0) 0)
-       (xor:TI (match_dup 1)
-               (match_dup 2)))]
+  [(set (match_dup 0)
+       (xor:V2DF (match_dup 1)
+                 (match_dup 2)))]
 {
   operands[0] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
-  operands[1] = simplify_gen_subreg (TImode, operands[1], DFmode, 0);
-  operands[2] = simplify_gen_subreg (TImode, operands[2], V2DFmode, 0);
+  operands[1] = simplify_gen_subreg (V2DFmode, operands[1], DFmode, 0);
   /* Avoid possible reformatting on the operands.  */
   if (TARGET_SSE_PARTIAL_REGS && !optimize_size)
     emit_insn (gen_sse2_unpcklpd (operands[0], operands[0], operands[0]));
   "TARGET_80387 && reload_completed"
   "fchs"
   [(set_attr "type" "fsgn")
-   (set_attr "mode" "SF")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "SF")])
 
 (define_insn "*negdf2_1"
   [(set (match_operand:DF 0 "register_operand" "=f")
   "TARGET_80387 && reload_completed"
   "fchs"
   [(set_attr "type" "fsgn")
-   (set_attr "mode" "DF")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "DF")])
 
 (define_insn "*negextendsfdf2"
   [(set (match_operand:DF 0 "register_operand" "=f")
   "TARGET_80387"
   "fchs"
   [(set_attr "type" "fsgn")
-   (set_attr "mode" "DF")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "DF")])
 
 (define_insn "*negxf2_1"
   [(set (match_operand:XF 0 "register_operand" "=f")
   "TARGET_80387 && reload_completed"
   "fchs"
   [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "XF")])
 
 (define_insn "*negextenddfxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
   "TARGET_80387"
   "fchs"
   [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "XF")])
 
 (define_insn "*negextendsfxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
   "TARGET_80387"
   "fchs"
   [(set_attr "type" "fsgn")
-   (set_attr "mode" "XF")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "mode" "XF")])
 \f
 ;; Absolute value instructions
 
    (use (match_operand:V4SF 2 "nonimmediate_operand" ""))
    (clobber (reg:CC 17))]
   "reload_completed && SSE_REG_P (operands[0])"
-  [(set (subreg:TI (match_dup 0) 0)
-       (and:TI (match_dup 1)
-               (match_dup 2)))]
+  [(set (match_dup 0)
+       (and:V4SF (match_dup 1)
+                 (match_dup 2)))]
 {
-  operands[1] = simplify_gen_subreg (TImode, operands[1], SFmode, 0);
-  operands[2] = simplify_gen_subreg (TImode, operands[2], V4SFmode, 0);
+  operands[0] = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+  operands[1] = simplify_gen_subreg (V4SFmode, operands[1], SFmode, 0);
   if (operands_match_p (operands[0], operands[2]))
     {
       rtx tmp;
    (use (match_operand:V2DF 2 "nonimmediate_operand" ""))
    (clobber (reg:CC 17))]
   "reload_completed && SSE_REG_P (operands[0])"
-  [(set (subreg:TI (match_dup 0) 0)
-       (and:TI (match_dup 1)
-               (match_dup 2)))]
+  [(set (match_dup 0)
+       (and:V2DF (match_dup 1)
+                 (match_dup 2)))]
 {
   operands[0] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
-  operands[1] = simplify_gen_subreg (TImode, operands[1], DFmode, 0);
-  operands[2] = simplify_gen_subreg (TImode, operands[2], V2DFmode, 0);
+  operands[1] = simplify_gen_subreg (V2DFmode, operands[1], DFmode, 0);
   /* Avoid possible reformatting on the operands.  */
   if (TARGET_SSE_PARTIAL_REGS && !optimize_size)
     emit_insn (gen_sse2_unpcklpd (operands[0], operands[0], operands[0]));
     default:
       if (REG_P (operands[2]))
        return "sal{q}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{q}\t%0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{q}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{q}\t%0";
       else
    (set_attr "prefix_0f" "1")
    (set_attr "mode" "SI")
    (set_attr "pent_pair" "np")
-   (set_attr "athlon_decode" "vector")
-   (set_attr "ppro_uops" "few")])
+   (set_attr "athlon_decode" "vector")])
 
 (define_expand "x86_shift_adj_1"
   [(set (reg:CCZ 17)
     default:
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{l}\t%0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %k0|%k0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{l}\t%k0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{l}\t%0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %k0|%k0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{l}\t%k0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{w}\t%0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{w}\t%0";
       else
     default:
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{w}\t%0";
       else
          else
            return "sal{b}\t{%b2, %0|%0, %b2}";
        }
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        {
          if (get_attr_mode (insn) == MODE_SI)
          else
            return "sal{b}\t{%b2, %0|%0, %b2}";
        }
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        {
          if (get_attr_mode (insn) == MODE_SI)
     default:
       if (REG_P (operands[2]))
        return "sal{b}\t{%b2, %0|%0, %b2}";
-      else if (GET_CODE (operands[2]) == CONST_INT
-              && INTVAL (operands[2]) == 1
+      else if (operands[2] == const1_rtx
               && (TARGET_SHIFT1 || optimize_size))
        return "sal{b}\t%0";
       else
   [(set_attr "type" "ishift")
    (set_attr "prefix_0f" "1")
    (set_attr "pent_pair" "np")
-   (set_attr "ppro_uops" "few")
    (set_attr "mode" "SI")])
 
 (define_expand "x86_shift_adj_3"
   rtx new_op1 = copy_rtx (operands[1]);
   operands[1] = new_op1;
   PUT_MODE (new_op1, QImode);
-  PUT_CODE (new_op1, REVERSE_CONDITION (GET_CODE (new_op1),
-                                       GET_MODE (XEXP (new_op1, 0))));
+  PUT_CODE (new_op1, ix86_reverse_condition (GET_CODE (new_op1),
+                                            GET_MODE (XEXP (new_op1, 0))));
 
   /* Make sure that (a) the CCmode we have for the flags is strong
      enough for the reversed compare or (b) we have a valid FP compare.  */
   rtx new_op1 = copy_rtx (operands[1]);
   operands[1] = new_op1;
   PUT_MODE (new_op1, QImode);
-  PUT_CODE (new_op1, REVERSE_CONDITION (GET_CODE (new_op1),
-                                       GET_MODE (XEXP (new_op1, 0))));
+  PUT_CODE (new_op1, ix86_reverse_condition (GET_CODE (new_op1),
+                                            GET_MODE (XEXP (new_op1, 0))));
 
   /* Make sure that (a) the CCmode we have for the flags is strong
      enough for the reversed compare or (b) we have a valid FP compare.  */
   rtx new_op0 = copy_rtx (operands[0]);
   operands[0] = new_op0;
   PUT_MODE (new_op0, VOIDmode);
-  PUT_CODE (new_op0, REVERSE_CONDITION (GET_CODE (new_op0),
-                                       GET_MODE (XEXP (new_op0, 0))));
+  PUT_CODE (new_op0, ix86_reverse_condition (GET_CODE (new_op0),
+                                            GET_MODE (XEXP (new_op0, 0))));
 
   /* Make sure that (a) the CCmode we have for the flags is strong
      enough for the reversed compare or (b) we have a valid FP compare.  */
   [(const_int 0)]
 {
   ix86_split_fp_branch (GET_CODE (operands[0]), operands[1], operands[2],
-                       operands[3], operands[4], NULL_RTX);
+                       operands[3], operands[4], NULL_RTX);
   DONE;
 })
 
          (match_dup 4)))]
 {
   ix86_split_fp_branch (GET_CODE (operands[0]), operands[1], operands[2],
-                       operands[3], operands[4], operands[5]);
+                       operands[3], operands[4], operands[5]);
   DONE;
 })
 \f
                          (const_int 1))
                      (label_ref (match_operand 0 "" ""))
                      (pc)))
-   (set (match_operand:SI 2 "register_operand" "=1,1,*m*r")
+   (set (match_operand:SI 2 "nonimmediate_operand" "=1,1,*m*r")
        (plus:SI (match_dup 1)
                 (const_int -1)))
    (clobber (match_scratch:SI 3 "=X,X,r"))
    (clobber (reg:CC 17))]
-  "!TARGET_64BIT && TARGET_USE_LOOP"
+  "!TARGET_64BIT && TARGET_USE_LOOP
+   && (reload_in_progress || reload_completed
+       || register_operand (operands[2], VOIDmode))"
 {
   if (which_alternative != 0)
     return "#";
   else
     return "dec{l}\t%1\;%+jne\t%l0";
 }
-  [(set_attr "ppro_uops" "many")
-   (set (attr "length")
+  [(set (attr "length")
        (if_then_else (and (eq_attr "alternative" "0")
                           (and (ge (minus (match_dup 0) (pc))
                                    (const_int -126))
   "nop"
   [(set_attr "length" "1")
    (set_attr "length_immediate" "0")
-   (set_attr "modrm" "0")
-   (set_attr "ppro_uops" "one")])
+   (set_attr "modrm" "0")])
 
 ;; Align to 16-byte boundary, max skip in op0.  Used to avoid
 ;; branch prediction penalty for the third jump in a 16-byte
        (ctz:SI (match_dup 1)))]
   ""
   "bsf{l}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_0f" "1")
-   (set_attr "ppro_uops" "few")])
+  [(set_attr "prefix_0f" "1")])
 
 (define_insn "ctzsi2"
   [(set (match_operand:SI 0 "register_operand" "=r")
    (clobber (reg:CC 17))]
   ""
   "bsf{l}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_0f" "1")
-   (set_attr "ppro_uops" "few")])
+  [(set_attr "prefix_0f" "1")])
 
 (define_expand "clzsi2"
   [(parallel
    (clobber (reg:CC 17))]
   ""
   "bsr{l}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_0f" "1")
-   (set_attr "ppro_uops" "few")])
+  [(set_attr "prefix_0f" "1")])
 \f
 ;; Thread-local storage patterns for ELF.
 ;;
   [(set (match_operand:DI 0 "register_operand" "=r")
        (unspec:DI [(const_int 0)] UNSPEC_TP))]
   "TARGET_64BIT"
-  "mov{l}\t{%%fs:0, %0|%0, QWORD PTR %%fs:0}"
+  "mov{q}\t{%%fs:0, %0|%0, QWORD PTR %%fs:0}"
   [(set_attr "type" "imov")
    (set_attr "modrm" "0")
    (set_attr "length" "7")
                        [(match_operand:SF 1 "nonimmediate_operand" "%0")
                         (match_operand:SF 2 "nonimmediate_operand" "fm")]))]
   "TARGET_80387 && !TARGET_SSE_MATH
-   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'
+   && COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:SF 1 "nonimmediate_operand" "%0,0")
                         (match_operand:SF 2 "nonimmediate_operand" "fm#x,xm#f")]))]
   "TARGET_80387 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'
+   && COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
        (match_operator:SF 3 "binary_fp_operator"
                        [(match_operand:SF 1 "nonimmediate_operand" "%0")
                         (match_operand:SF 2 "nonimmediate_operand" "xm")]))]
-  "TARGET_SSE_MATH && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'
+  "TARGET_SSE_MATH && COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:DF 1 "nonimmediate_operand" "%0")
                         (match_operand:DF 2 "nonimmediate_operand" "fm")]))]
   "TARGET_80387 && (!TARGET_SSE2 || !TARGET_SSE_MATH)
-   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'
+   && COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:DF 1 "nonimmediate_operand" "%0,0")
                         (match_operand:DF 2 "nonimmediate_operand" "fm#Y,Ym#f")]))]
   "TARGET_80387 && TARGET_SSE_MATH && TARGET_SSE2 && TARGET_MIX_SSE_I387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'
+   && COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:DF 1 "nonimmediate_operand" "%0")
                         (match_operand:DF 2 "nonimmediate_operand" "Ym")]))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'
+   && COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:XF 1 "register_operand" "%0")
                         (match_operand:XF 2 "register_operand" "f")]))]
   "TARGET_80387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
+   && COMMUTATIVE_ARITH_P (operands[3])"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (if_then_else (match_operand:XF 3 "mult_operator" "") 
                        [(match_operand:SF 1 "nonimmediate_operand" "0,fm")
                         (match_operand:SF 2 "nonimmediate_operand" "fm,0")]))]
   "TARGET_80387 && !TARGET_SSE_MATH
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'
+   && !COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:SF 1 "nonimmediate_operand" "0,fm,0")
                         (match_operand:SF 2 "nonimmediate_operand" "fm,0,xm#f")]))]
   "TARGET_80387 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'
+   && !COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:SF 1 "register_operand" "0")
                         (match_operand:SF 2 "nonimmediate_operand" "xm")]))]
   "TARGET_SSE_MATH
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
+   && !COMMUTATIVE_ARITH_P (operands[3])"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:SF 3 "mult_operator" "")
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "ppro_uops" "many")
    (set_attr "mode" "SI")])
 
 (define_insn "*fop_sf_3"
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "ppro_uops" "many")
    (set_attr "mode" "SI")])
 
 (define_insn "*fop_df_1_nosse"
                        [(match_operand:DF 1 "nonimmediate_operand" "0,fm")
                         (match_operand:DF 2 "nonimmediate_operand" "fm,0")]))]
   "TARGET_80387 && (!TARGET_SSE2 || !TARGET_SSE_MATH)
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'
+   && !COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:DF 1 "nonimmediate_operand" "0,fm,0")
                         (match_operand:DF 2 "nonimmediate_operand" "fm,0,Ym#f")]))]
   "TARGET_80387 && TARGET_SSE2 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'
+   && !COMMUTATIVE_ARITH_P (operands[3])
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:DF 1 "register_operand" "0")
                         (match_operand:DF 2 "nonimmediate_operand" "Ym")]))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
+   && !COMMUTATIVE_ARITH_P (operands[3])"
   "* return output_387_binary_op (insn, operands);"
   [(set_attr "mode" "DF")
    (set (attr "type") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "ppro_uops" "many")
    (set_attr "mode" "SI")])
 
 (define_insn "*fop_df_3"
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "ppro_uops" "many")
    (set_attr "mode" "SI")])
 
 (define_insn "*fop_df_4"
                        [(match_operand:XF 1 "register_operand" "0,f")
                         (match_operand:XF 2 "register_operand" "f,0")]))]
   "TARGET_80387
-   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
+   && !COMMUTATIVE_ARITH_P (operands[3])"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "many")])
+   (set_attr "mode" "SI")])
 
 (define_insn "*fop_xf_3"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")
-   (set_attr "ppro_uops" "many")])
+   (set_attr "mode" "SI")])
 
 (define_insn "*fop_xf_4"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
    (set_attr "mode" "XF")
    (set_attr "athlon_decode" "direct")])
 
-(define_insn "sindf2"
+(define_insn "*sindf2"
   [(set (match_operand:DF 0 "register_operand" "=f")
        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] UNSPEC_SIN))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
-(define_insn "sinsf2"
+(define_insn "*sinsf2"
   [(set (match_operand:SF 0 "register_operand" "=f")
        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] UNSPEC_SIN))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
-(define_insn "sinxf2"
+(define_insn "*sinxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_SIN))]
   "TARGET_80387 && !TARGET_NO_FANCY_MATH_387
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
 
-(define_insn "cosdf2"
+(define_insn "*cosdf2"
   [(set (match_operand:DF 0 "register_operand" "=f")
        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] UNSPEC_COS))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
-(define_insn "cossf2"
+(define_insn "*cossf2"
   [(set (match_operand:SF 0 "register_operand" "=f")
        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] UNSPEC_COS))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
-(define_insn "cosxf2"
+(define_insn "*cosxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_COS))]
   "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
 
-(define_insn "atan2df3_1"
+;; With sincos pattern defined, sin and cos builtin function will be
+;; expanded to sincos pattern with one of its outputs left unused. 
+;; Cse pass  will detected, if two sincos patterns can be combined,
+;; otherwise sincos pattern will be splitted back to sin or cos pattern,
+;; depending on the unused output.
+
+(define_insn "sincosdf3"
   [(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
+       (unspec:DF [(match_operand:DF 2 "register_operand" "0")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:DF 1 "register_operand" "=u")
+        (unspec:DF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
    && flag_unsafe_math_optimizations"
-  "fpatan"
+  "fsincos"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "DF")])
 
-(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_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (unspec:DF [(match_operand:DF 2 "register_operand" "")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:DF 1 "register_operand" "")
+       (unspec:DF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[0]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 1) (unspec:DF [(match_dup 2)] UNSPEC_SIN))]
+  "")
 
-(define_insn "atan2sf3_1"
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (unspec:DF [(match_operand:DF 2 "register_operand" "")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:DF 1 "register_operand" "")
+       (unspec:DF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[1]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 0) (unspec:DF [(match_dup 2)] UNSPEC_COS))]
+  "")
+
+(define_insn "sincossf3"
   [(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
+       (unspec:SF [(match_operand:SF 2 "register_operand" "0")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:SF 1 "register_operand" "=u")
+        (unspec:SF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
    && flag_unsafe_math_optimizations"
-  "fpatan"
+  "fsincos"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "SF")])
 
-(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
+(define_split
+  [(set (match_operand:SF 0 "register_operand" "")
+       (unspec:SF [(match_operand:SF 2 "register_operand" "")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:SF 1 "register_operand" "")
+       (unspec:SF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[0]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 1) (unspec:SF [(match_dup 2)] UNSPEC_SIN))]
+  "")
+
+(define_split
+  [(set (match_operand:SF 0 "register_operand" "")
+       (unspec:SF [(match_operand:SF 2 "register_operand" "")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:SF 1 "register_operand" "")
+       (unspec:SF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[1]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 0) (unspec:SF [(match_dup 2)] UNSPEC_COS))]
+  "")
+
+(define_insn "*sincosextendsfdf3"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (unspec:DF [(float_extend:DF
+                    (match_operand:SF 2 "register_operand" "0"))]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:DF 1 "register_operand" "=u")
+        (unspec:DF [(float_extend:DF
+                    (match_dup 2))] UNSPEC_SINCOS_SIN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
    && 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;
-})
+  "fsincos"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "DF")])
 
-(define_insn "atan2xf3_1"
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (unspec:DF [(float_extend:DF
+                    (match_operand:SF 2 "register_operand" ""))]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:DF 1 "register_operand" "")
+        (unspec:DF [(float_extend:DF
+                    (match_dup 2))] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[0]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 1) (unspec:DF [(float_extend:DF
+                                  (match_dup 2))] UNSPEC_SIN))]
+  "")
+
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (unspec:DF [(float_extend:DF
+                    (match_operand:SF 2 "register_operand" ""))]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:DF 1 "register_operand" "")
+        (unspec:DF [(float_extend:DF
+                    (match_dup 2))] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[1]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 0) (unspec:DF [(float_extend:DF
+                                  (match_dup 2))] UNSPEC_COS))]
+  "")
+
+(define_insn "sincosxf3"
   [(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
+       (unspec:XF [(match_operand:XF 2 "register_operand" "0")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:XF 1 "register_operand" "=u")
+        (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
    && flag_unsafe_math_optimizations"
-  "fpatan"
+  "fsincos"
   [(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
+(define_split
+  [(set (match_operand:XF 0 "register_operand" "")
+       (unspec:XF [(match_operand:XF 2 "register_operand" "")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:XF 1 "register_operand" "")
+       (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[0]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 1) (unspec:XF [(match_dup 2)] UNSPEC_SIN))]
+  "")
+
+(define_split
+  [(set (match_operand:XF 0 "register_operand" "")
+       (unspec:XF [(match_operand:XF 2 "register_operand" "")]
+                  UNSPEC_SINCOS_COS))
+   (set (match_operand:XF 1 "register_operand" "")
+       (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
+  "find_regno_note (insn, REG_UNUSED, REGNO (operands[1]))
+   && !reload_completed && !reload_in_progress"
+  [(set (match_dup 0) (unspec:XF [(match_dup 2)] UNSPEC_COS))]
+  "")
+
+(define_insn "*tandf3_1"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (unspec:DF [(match_operand:DF 2 "register_operand" "0")]
+                  UNSPEC_TAN_ONE))
+   (set (match_operand:DF 1 "register_operand" "=u")
+        (unspec:DF [(match_dup 2)] UNSPEC_TAN_TAN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+  "fptan"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "DF")])
+
+;; optimize sequence: fptan
+;;                   fstp    %st(0)
+;;                   fld1
+;; into fptan insn.
+
+(define_peephole2
+  [(parallel[(set (match_operand:DF 0 "register_operand" "")
+                 (unspec:DF [(match_operand:DF 2 "register_operand" "")]
+                            UNSPEC_TAN_ONE))
+            (set (match_operand:DF 1 "register_operand" "")
+                 (unspec:DF [(match_dup 2)] UNSPEC_TAN_TAN))])
+   (set (match_dup 0)
+        (match_operand:DF 3 "immediate_operand" ""))]
+  "standard_80387_constant_p (operands[3]) == 2"
+  [(parallel[(set (match_dup 0) (unspec:DF [(match_dup 2)] UNSPEC_TAN_ONE))
+            (set (match_dup 1) (unspec:DF [(match_dup 2)] UNSPEC_TAN_TAN))])]
+  "")
+
+(define_expand "tandf2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:DF [(match_operand:DF 1 "register_operand" "")]
+                             UNSPEC_TAN_ONE))
+             (set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_dup 1)] UNSPEC_TAN_TAN))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (DFmode);
+})
+
+(define_insn "*tansf3_1"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (unspec:SF [(match_operand:SF 2 "register_operand" "0")]
+                  UNSPEC_TAN_ONE))
+   (set (match_operand:SF 1 "register_operand" "=u")
+        (unspec:SF [(match_dup 2)] UNSPEC_TAN_TAN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+  "fptan"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "SF")])
+
+;; optimize sequence: fptan
+;;                   fstp    %st(0)
+;;                   fld1
+;; into fptan insn.
+
+(define_peephole2
+  [(parallel[(set (match_operand:SF 0 "register_operand" "")
+                 (unspec:SF [(match_operand:SF 2 "register_operand" "")]
+                            UNSPEC_TAN_ONE))
+            (set (match_operand:SF 1 "register_operand" "")
+                 (unspec:SF [(match_dup 2)] UNSPEC_TAN_TAN))])
+   (set (match_dup 0)
+        (match_operand:SF 3 "immediate_operand" ""))]
+  "standard_80387_constant_p (operands[3]) == 2"
+  [(parallel[(set (match_dup 0) (unspec:SF [(match_dup 2)] UNSPEC_TAN_ONE))
+            (set (match_dup 1) (unspec:SF [(match_dup 2)] UNSPEC_TAN_TAN))])]
+  "")
+
+(define_expand "tansf2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:SF [(match_operand:SF 1 "register_operand" "")]
+                             UNSPEC_TAN_ONE))
+             (set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_dup 1)] UNSPEC_TAN_TAN))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (SFmode);
+})
+
+(define_insn "*tanxf3_1"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+       (unspec:XF [(match_operand:XF 2 "register_operand" "0")]
+                  UNSPEC_TAN_ONE))
+   (set (match_operand:XF 1 "register_operand" "=u")
+        (unspec:XF [(match_dup 2)] UNSPEC_TAN_TAN))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+  "fptan"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "XF")])
+
+;; optimize sequence: fptan
+;;                   fstp    %st(0)
+;;                   fld1
+;; into fptan insn.
+
+(define_peephole2
+  [(parallel[(set (match_operand:XF 0 "register_operand" "")
+                 (unspec:XF [(match_operand:XF 2 "register_operand" "")]
+                            UNSPEC_TAN_ONE))
+            (set (match_operand:XF 1 "register_operand" "")
+                 (unspec:XF [(match_dup 2)] UNSPEC_TAN_TAN))])
+   (set (match_dup 0)
+        (match_operand:XF 3 "immediate_operand" ""))]
+  "standard_80387_constant_p (operands[3]) == 2"
+  [(parallel[(set (match_dup 0) (unspec:XF [(match_dup 2)] UNSPEC_TAN_ONE))
+            (set (match_dup 1) (unspec:XF [(match_dup 2)] UNSPEC_TAN_TAN))])]
+  "")
+
+(define_expand "tanxf2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")]
+                             UNSPEC_TAN_ONE))
+             (set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_dup 1)] UNSPEC_TAN_TAN))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+})
+
+(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_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_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"
+{
+  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 "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"
+  "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);
   DONE;
 })
 
+(define_expand "asindf2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:DF 1 "register_operand" "")))
+   (set (match_dup 3) (mult:XF (match_dup 2) (match_dup 2)))
+   (set (match_dup 5) (minus:XF (match_dup 4) (match_dup 3)))
+   (set (match_dup 6) (sqrt:XF (match_dup 5)))
+   (parallel [(set (match_dup 7)
+                  (unspec:XF [(match_dup 6) (match_dup 2)]
+                             UNSPEC_FPATAN))
+             (clobber (match_scratch:XF 8 ""))])
+   (set (match_operand:DF 0 "register_operand" "")
+       (float_truncate:DF (match_dup 7)))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+
+  emit_move_insn (operands[4], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "asinsf2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:SF 1 "register_operand" "")))
+   (set (match_dup 3) (mult:XF (match_dup 2) (match_dup 2)))
+   (set (match_dup 5) (minus:XF (match_dup 4) (match_dup 3)))
+   (set (match_dup 6) (sqrt:XF (match_dup 5)))
+   (parallel [(set (match_dup 7)
+                  (unspec:XF [(match_dup 6) (match_dup 2)]
+                             UNSPEC_FPATAN))
+             (clobber (match_scratch:XF 8 ""))])
+   (set (match_operand:SF 0 "register_operand" "")
+       (float_truncate:SF (match_dup 7)))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+
+  emit_move_insn (operands[4], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "asinxf2"
+  [(set (match_dup 2)
+       (mult:XF (match_operand:XF 1 "register_operand" "")
+                (match_dup 1)))
+   (set (match_dup 4) (minus:XF (match_dup 3) (match_dup 2)))
+   (set (match_dup 5) (sqrt:XF (match_dup 4)))
+   (parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_dup 5) (match_dup 1)]
+                             UNSPEC_FPATAN))
+             (clobber (match_scratch:XF 6 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<6; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+
+  emit_move_insn (operands[3], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "acosdf2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:DF 1 "register_operand" "")))
+   (set (match_dup 3) (mult:XF (match_dup 2) (match_dup 2)))
+   (set (match_dup 5) (minus:XF (match_dup 4) (match_dup 3)))
+   (set (match_dup 6) (sqrt:XF (match_dup 5)))
+   (parallel [(set (match_dup 7)
+                  (unspec:XF [(match_dup 2) (match_dup 6)]
+                             UNSPEC_FPATAN))
+             (clobber (match_scratch:XF 8 ""))])
+   (set (match_operand:DF 0 "register_operand" "")
+       (float_truncate:DF (match_dup 7)))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+
+  emit_move_insn (operands[4], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "acossf2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:SF 1 "register_operand" "")))
+   (set (match_dup 3) (mult:XF (match_dup 2) (match_dup 2)))
+   (set (match_dup 5) (minus:XF (match_dup 4) (match_dup 3)))
+   (set (match_dup 6) (sqrt:XF (match_dup 5)))
+   (parallel [(set (match_dup 7)
+                  (unspec:XF [(match_dup 2) (match_dup 6)]
+                             UNSPEC_FPATAN))
+             (clobber (match_scratch:XF 8 ""))])
+   (set (match_operand:SF 0 "register_operand" "")
+       (float_truncate:SF (match_dup 7)))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+
+  emit_move_insn (operands[4], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "acosxf2"
+  [(set (match_dup 2)
+       (mult:XF (match_operand:XF 1 "register_operand" "")
+                (match_dup 1)))
+   (set (match_dup 4) (minus:XF (match_dup 3) (match_dup 2)))
+   (set (match_dup 5) (sqrt:XF (match_dup 4)))
+   (parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_dup 1) (match_dup 5)]
+                             UNSPEC_FPATAN))
+             (clobber (match_scratch:XF 6 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<6; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+
+  emit_move_insn (operands[3], CONST1_RTX (XFmode));  /* fld1 */
+})
+
 (define_insn "*fyl2x_sfxf3"
   [(set (match_operand:SF 0 "register_operand" "=f")
          (unspec:SF [(match_operand:SF 2 "register_operand" "0")
   emit_move_insn (operands[2], temp);
 })
 
+(define_expand "log10sf2"
+  [(parallel [(set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_operand:SF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:SF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (3); /* fldlg2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "log10df2"
+  [(parallel [(set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_operand:DF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:DF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (3); /* fldlg2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "log10xf2"
+  [(parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:XF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (3); /* fldlg2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "log2sf2"
+  [(parallel [(set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_operand:SF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:SF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
+
+})
+
+(define_expand "log2df2"
+  [(parallel [(set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_operand:DF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:DF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "log2xf2"
+  [(parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:XF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_insn "*fxtractdf3"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (unspec:DF [(match_operand:DF 2 "register_operand" "0")]
+                  UNSPEC_XTRACT_FRACT))
+   (set (match_operand:DF 1 "register_operand" "=u")
+        (unspec:DF [(match_dup 2)] UNSPEC_XTRACT_EXP))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+  "fxtract"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "DF")])
+
+(define_expand "logbdf2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:DF [(match_operand:DF 1 "register_operand" "")]
+                             UNSPEC_XTRACT_FRACT))
+             (set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_dup 1)] UNSPEC_XTRACT_EXP))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (DFmode);
+})
+
+(define_insn "*fxtractsf3"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (unspec:SF [(match_operand:SF 2 "register_operand" "0")]
+                  UNSPEC_XTRACT_FRACT))
+   (set (match_operand:SF 1 "register_operand" "=u")
+        (unspec:SF [(match_dup 2)] UNSPEC_XTRACT_EXP))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+  "fxtract"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "SF")])
+
+(define_expand "logbsf2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:SF [(match_operand:SF 1 "register_operand" "")]
+                             UNSPEC_XTRACT_FRACT))
+             (set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_dup 1)] UNSPEC_XTRACT_EXP))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (SFmode);
+})
+
+(define_insn "*fxtractxf3"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+       (unspec:XF [(match_operand:XF 2 "register_operand" "0")]
+                  UNSPEC_XTRACT_FRACT))
+   (set (match_operand:XF 1 "register_operand" "=u")
+        (unspec:XF [(match_dup 2)] UNSPEC_XTRACT_EXP))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+  "fxtract"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "XF")])
+
+(define_expand "logbxf2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")]
+                             UNSPEC_XTRACT_FRACT))
+             (set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_dup 1)] UNSPEC_XTRACT_EXP))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+})
+
+(define_expand "ilogbsi2"
+  [(parallel [(set (match_dup 2)
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")]
+                             UNSPEC_XTRACT_FRACT))
+             (set (match_operand:XF 3 "register_operand" "")
+                  (unspec:XF [(match_dup 1)] UNSPEC_XTRACT_EXP))])
+   (parallel [(set (match_operand:SI 0 "register_operand" "")
+                  (fix:SI (match_dup 3)))
+             (clobber (reg:CC 17))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  operands[3] = gen_reg_rtx (XFmode);
+})
+
 (define_insn "*fscale_sfxf3"
   [(set (match_operand:SF 0 "register_operand" "=f")
         (unspec:SF [(match_operand:XF 2 "register_operand" "0")
    (set (match_dup 4) (mult:XF (match_dup 2) (match_dup 3)))
    (set (match_dup 5) (unspec:XF [(match_dup 4)] UNSPEC_FRNDINT))
    (set (match_dup 6) (minus:XF (match_dup 4) (match_dup 5)))
+
    (set (match_dup 7) (unspec:XF [(match_dup 6)] UNSPEC_F2XM1))
    (set (match_dup 9) (plus:XF (match_dup 7) (match_dup 8)))
    (parallel [(set (match_operand:DF 0 "register_operand" "")
   emit_move_insn (operands[7], CONST1_RTX (XFmode));  /* fld1 */
 })
 
+(define_expand "exp10sf2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:SF 1 "register_operand" "")))
+   (set (match_dup 4) (mult:XF (match_dup 2) (match_dup 3)))
+   (set (match_dup 5) (unspec:XF [(match_dup 4)] UNSPEC_FRNDINT))
+   (set (match_dup 6) (minus:XF (match_dup 4) (match_dup 5)))
+   (set (match_dup 7) (unspec:XF [(match_dup 6)] UNSPEC_F2XM1))
+   (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_scratch:SF 5 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+  int i;
+
+  for (i=2; i<10; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (6); /* fldl2t */
+  emit_move_insn (operands[3], temp);
+  emit_move_insn (operands[8], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "exp10df2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:DF 1 "register_operand" "")))
+   (set (match_dup 4) (mult:XF (match_dup 2) (match_dup 3)))
+   (set (match_dup 5) (unspec:XF [(match_dup 4)] UNSPEC_FRNDINT))
+   (set (match_dup 6) (minus:XF (match_dup 4) (match_dup 5)))
+   (set (match_dup 7) (unspec:XF [(match_dup 6)] UNSPEC_F2XM1))
+   (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_scratch:DF 5 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+  int i;
+
+  for (i=2; i<10; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (6); /* fldl2t */
+  emit_move_insn (operands[3], temp);
+  emit_move_insn (operands[8], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "exp10xf2"
+  [(set (match_dup 3) (mult:XF (match_operand:XF 1 "register_operand" "")
+                              (match_dup 2)))
+   (set (match_dup 4) (unspec:XF [(match_dup 3)] UNSPEC_FRNDINT))
+   (set (match_dup 5) (minus:XF (match_dup 3) (match_dup 4)))
+   (set (match_dup 6) (unspec:XF [(match_dup 5)] UNSPEC_F2XM1))
+   (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_scratch:XF 5 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+  int i;
+
+  for (i=2; i<9; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (6); /* fldl2t */
+  emit_move_insn (operands[2], temp);
+  emit_move_insn (operands[7], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "exp2sf2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:SF 1 "register_operand" "")))
+   (set (match_dup 3) (unspec:XF [(match_dup 2)] UNSPEC_FRNDINT))
+   (set (match_dup 4) (minus:XF (match_dup 2) (match_dup 3)))
+   (set (match_dup 5) (unspec:XF [(match_dup 4)] UNSPEC_F2XM1))
+   (set (match_dup 7) (plus:XF (match_dup 5) (match_dup 6)))
+   (parallel [(set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_dup 7) (match_dup 3)] UNSPEC_FSCALE))
+             (clobber (match_scratch:SF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[6], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "exp2df2"
+  [(set (match_dup 2)
+       (float_extend:XF (match_operand:DF 1 "register_operand" "")))
+   (set (match_dup 3) (unspec:XF [(match_dup 2)] UNSPEC_FRNDINT))
+   (set (match_dup 4) (minus:XF (match_dup 2) (match_dup 3)))
+   (set (match_dup 5) (unspec:XF [(match_dup 4)] UNSPEC_F2XM1))
+   (set (match_dup 7) (plus:XF (match_dup 5) (match_dup 6)))
+   (parallel [(set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_dup 7) (match_dup 3)] UNSPEC_FSCALE))
+             (clobber (match_scratch:DF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[6], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "exp2xf2"
+  [(set (match_dup 2) (match_operand:XF 1 "register_operand" ""))
+   (set (match_dup 3) (unspec:XF [(match_dup 2)] UNSPEC_FRNDINT))
+   (set (match_dup 4) (minus:XF (match_dup 2) (match_dup 3)))
+   (set (match_dup 5) (unspec:XF [(match_dup 4)] UNSPEC_F2XM1))
+   (set (match_dup 7) (plus:XF (match_dup 5) (match_dup 6)))
+   (parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_dup 7) (match_dup 3)] UNSPEC_FSCALE))
+             (clobber (match_scratch:XF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  int i;
+
+  for (i=2; i<8; i++)
+    operands[i] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[6], CONST1_RTX (XFmode));  /* fld1 */
+})
+
 (define_expand "atansf2"
   [(parallel [(set (match_operand:SF 0 "register_operand" "")
                   (unspec:SF [(match_dup 2)
 })
 
 ;; Most CPUs don't like single string operations
-;; Handle this case here to simplify previous expander.
-
-(define_expand "strmovdi_rex64"
-  [(set (match_dup 2)
-       (mem:DI (match_operand:DI 1 "register_operand" "")))
-   (set (mem:DI (match_operand:DI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 8)))
-             (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:DI (match_dup 1) (const_int 8)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strmovdi_rex_1 (operands[0], operands[1], operands[0],
-                                    operands[1]));
-      DONE;
-    }
-  else 
-    operands[2] = gen_reg_rtx (DImode);
-})
-
-
-(define_expand "strmovsi"
-  [(set (match_dup 2)
-       (mem:SI (match_operand:SI 1 "register_operand" "")))
-   (set (mem:SI (match_operand:SI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 4)))
-             (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:SI (match_dup 1) (const_int 4)))
-             (clobber (reg:CC 17))])]
-  ""
-{
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_strmovsi_rex64 (operands[0], operands[1]));
-      DONE;
-    }
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strmovsi_1 (operands[0], operands[1], operands[0],
-                               operands[1]));
-      DONE;
-    }
-  else 
-    operands[2] = gen_reg_rtx (SImode);
-})
-
-(define_expand "strmovsi_rex64"
-  [(set (match_dup 2)
-       (mem:SI (match_operand:DI 1 "register_operand" "")))
-   (set (mem:SI (match_operand:DI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 4)))
-             (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:DI (match_dup 1) (const_int 4)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strmovsi_rex_1 (operands[0], operands[1], operands[0],
-                                    operands[1]));
-      DONE;
-    }
-  else 
-    operands[2] = gen_reg_rtx (SImode);
-})
-
-(define_expand "strmovhi"
-  [(set (match_dup 2)
-       (mem:HI (match_operand:SI 1 "register_operand" "")))
-   (set (mem:HI (match_operand:SI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 2)))
-             (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:SI (match_dup 1) (const_int 2)))
-             (clobber (reg:CC 17))])]
-  ""
-{
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_strmovhi_rex64 (operands[0], operands[1]));
-      DONE;
-    }
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strmovhi_1 (operands[0], operands[1], operands[0],
-                               operands[1]));
-      DONE;
-    }
-  else 
-    operands[2] = gen_reg_rtx (HImode);
-})
-
-(define_expand "strmovhi_rex64"
-  [(set (match_dup 2)
-       (mem:HI (match_operand:DI 1 "register_operand" "")))
-   (set (mem:HI (match_operand:DI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 2)))
-             (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:DI (match_dup 1) (const_int 2)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strmovhi_rex_1 (operands[0], operands[1], operands[0],
-                                    operands[1]));
-      DONE;
-    }
-  else 
-    operands[2] = gen_reg_rtx (HImode);
-})
-
-(define_expand "strmovqi"
-  [(set (match_dup 2)
-       (mem:QI (match_operand:SI 1 "register_operand" "")))
-   (set (mem:QI (match_operand:SI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 1)))
-             (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))
-             (clobber (reg:CC 17))])]
-  ""
-{
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_strmovqi_rex64 (operands[0], operands[1]));
-      DONE;
-    }
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strmovqi_1 (operands[0], operands[1], operands[0],
-                               operands[1]));
-      DONE;
-    }
-  else 
-    operands[2] = gen_reg_rtx (QImode);
-})
+;; Handle this case here to simplify previous expander.
 
-(define_expand "strmovqi_rex64"
-  [(set (match_dup 2)
-       (mem:QI (match_operand:DI 1 "register_operand" "")))
-   (set (mem:QI (match_operand:DI 0 "register_operand" ""))
-        (match_dup 2))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 1)))
+(define_expand "strmov"
+  [(set (match_dup 4) (match_operand 3 "memory_operand" ""))
+   (set (match_operand 1 "memory_operand" "") (match_dup 4))
+   (parallel [(set (match_operand 0 "register_operand" "") (match_dup 5))
              (clobber (reg:CC 17))])
-   (parallel [(set (match_dup 1) (plus:DI (match_dup 1) (const_int 1)))
+   (parallel [(set (match_operand 2 "register_operand" "") (match_dup 6))
              (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
+  ""
 {
+  rtx adjust = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[1])));
+
+  /* If .md ever supports :P for Pmode, these can be directly
+     in the pattern above.  */
+  operands[5] = gen_rtx_PLUS (Pmode, operands[0], adjust);
+  operands[6] = gen_rtx_PLUS (Pmode, operands[2], adjust);
+
   if (TARGET_SINGLE_STRINGOP || optimize_size)
     {
-      emit_insn (gen_strmovqi_rex_1 (operands[0], operands[1], operands[0],
-                                    operands[1]));
+      emit_insn (gen_strmov_singleop (operands[0], operands[1],
+                                     operands[2], operands[3],
+                                     operands[5], operands[6]));
       DONE;
     }
-  else 
-    operands[2] = gen_reg_rtx (QImode);
+
+  operands[4] = gen_reg_rtx (GET_MODE (operands[1]));
 })
 
-(define_insn "strmovdi_rex_1"
+(define_expand "strmov_singleop"
+  [(parallel [(set (match_operand 1 "memory_operand" "")
+                  (match_operand 3 "memory_operand" ""))
+             (set (match_operand 0 "register_operand" "")
+                  (match_operand 4 "" ""))
+             (set (match_operand 2 "register_operand" "")
+                  (match_operand 5 "" ""))
+             (use (reg:SI 19))])]
+  "TARGET_SINGLE_STRINGOP || optimize_size"
+  "")
+
+(define_insn "*strmovdi_rex_1"
   [(set (mem:DI (match_operand:DI 2 "register_operand" "0"))
        (mem:DI (match_operand:DI 3 "register_operand" "1")))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "mode" "DI")
    (set_attr "memory" "both")])
 
-(define_insn "strmovsi_1"
+(define_insn "*strmovsi_1"
   [(set (mem:SI (match_operand:SI 2 "register_operand" "0"))
        (mem:SI (match_operand:SI 3 "register_operand" "1")))
    (set (match_operand:SI 0 "register_operand" "=D")
    (set_attr "mode" "SI")
    (set_attr "memory" "both")])
 
-(define_insn "strmovsi_rex_1"
+(define_insn "*strmovsi_rex_1"
   [(set (mem:SI (match_operand:DI 2 "register_operand" "0"))
        (mem:SI (match_operand:DI 3 "register_operand" "1")))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "mode" "SI")
    (set_attr "memory" "both")])
 
-(define_insn "strmovhi_1"
+(define_insn "*strmovhi_1"
   [(set (mem:HI (match_operand:SI 2 "register_operand" "0"))
        (mem:HI (match_operand:SI 3 "register_operand" "1")))
    (set (match_operand:SI 0 "register_operand" "=D")
    (set_attr "memory" "both")
    (set_attr "mode" "HI")])
 
-(define_insn "strmovhi_rex_1"
+(define_insn "*strmovhi_rex_1"
   [(set (mem:HI (match_operand:DI 2 "register_operand" "0"))
        (mem:HI (match_operand:DI 3 "register_operand" "1")))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "memory" "both")
    (set_attr "mode" "HI")])
 
-(define_insn "strmovqi_1"
+(define_insn "*strmovqi_1"
   [(set (mem:QI (match_operand:SI 2 "register_operand" "0"))
        (mem:QI (match_operand:SI 3 "register_operand" "1")))
    (set (match_operand:SI 0 "register_operand" "=D")
    (set_attr "memory" "both")
    (set_attr "mode" "QI")])
 
-(define_insn "strmovqi_rex_1"
+(define_insn "*strmovqi_rex_1"
   [(set (mem:QI (match_operand:DI 2 "register_operand" "0"))
        (mem:QI (match_operand:DI 3 "register_operand" "1")))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "memory" "both")
    (set_attr "mode" "QI")])
 
-(define_insn "rep_movdi_rex64"
+(define_expand "rep_mov"
+  [(parallel [(set (match_operand 4 "register_operand" "") (const_int 0))
+             (set (match_operand 0 "register_operand" "")
+                  (match_operand 5 "" ""))
+             (set (match_operand 2 "register_operand" "")
+                  (match_operand 6 "" ""))
+             (set (match_operand 1 "memory_operand" "")
+                  (match_operand 3 "memory_operand" ""))
+             (use (match_dup 4))
+             (use (reg:SI 19))])]
+  ""
+  "")
+
+(define_insn "*rep_movdi_rex64"
   [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0))
    (set (match_operand:DI 0 "register_operand" "=D") 
         (plus:DI (ashift:DI (match_operand:DI 5 "register_operand" "2")
    (set_attr "memory" "both")
    (set_attr "mode" "DI")])
 
-(define_insn "rep_movsi"
+(define_insn "*rep_movsi"
   [(set (match_operand:SI 2 "register_operand" "=c") (const_int 0))
    (set (match_operand:SI 0 "register_operand" "=D") 
         (plus:SI (ashift:SI (match_operand:SI 5 "register_operand" "2")
    (set_attr "memory" "both")
    (set_attr "mode" "SI")])
 
-(define_insn "rep_movsi_rex64"
+(define_insn "*rep_movsi_rex64"
   [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0))
    (set (match_operand:DI 0 "register_operand" "=D") 
         (plus:DI (ashift:DI (match_operand:DI 5 "register_operand" "2")
    (set_attr "memory" "both")
    (set_attr "mode" "SI")])
 
-(define_insn "rep_movqi"
+(define_insn "*rep_movqi"
   [(set (match_operand:SI 2 "register_operand" "=c") (const_int 0))
    (set (match_operand:SI 0 "register_operand" "=D") 
         (plus:SI (match_operand:SI 3 "register_operand" "0")
    (set_attr "memory" "both")
    (set_attr "mode" "SI")])
 
-(define_insn "rep_movqi_rex64"
+(define_insn "*rep_movqi_rex64"
   [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0))
    (set (match_operand:DI 0 "register_operand" "=D") 
         (plus:DI (match_operand:DI 3 "register_operand" "0")
 ;; Most CPUs don't like single string operations
 ;; Handle this case here to simplify previous expander.
 
-(define_expand "strsetdi_rex64"
-  [(set (mem:DI (match_operand:DI 0 "register_operand" ""))
-       (match_operand:DI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 8)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strsetdi_rex_1 (operands[0], operands[0], operands[1]));
-      DONE;
-    }
-})
-
-(define_expand "strsetsi"
-  [(set (mem:SI (match_operand:SI 0 "register_operand" ""))
-       (match_operand:SI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 4)))
-             (clobber (reg:CC 17))])]
-  ""
-{
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_strsetsi_rex64 (operands[0], operands[1]));
-      DONE;
-    }
-  else if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strsetsi_1 (operands[0], operands[0], operands[1]));
-      DONE;
-    }
-})
-
-(define_expand "strsetsi_rex64"
-  [(set (mem:SI (match_operand:DI 0 "register_operand" ""))
-       (match_operand:SI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 4)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strsetsi_rex_1 (operands[0], operands[0], operands[1]));
-      DONE;
-    }
-})
-
-(define_expand "strsethi"
-  [(set (mem:HI (match_operand:SI 0 "register_operand" ""))
-       (match_operand:HI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 2)))
+(define_expand "strset"
+  [(set (match_operand 1 "memory_operand" "")
+       (match_operand 2 "register_operand" ""))
+   (parallel [(set (match_operand 0 "register_operand" "")
+                  (match_dup 3))
              (clobber (reg:CC 17))])]
   ""
 {
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_strsethi_rex64 (operands[0], operands[1]));
-      DONE;
-    }
-  else if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strsethi_1 (operands[0], operands[0], operands[1]));
-      DONE;
-    }
-})
+  if (GET_MODE (operands[1]) != GET_MODE (operands[2]))
+    operands[1] = adjust_address_nv (operands[1], GET_MODE (operands[2]), 0);
 
-(define_expand "strsethi_rex64"
-  [(set (mem:HI (match_operand:DI 0 "register_operand" ""))
-       (match_operand:HI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 2)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
+  /* If .md ever supports :P for Pmode, this can be directly
+     in the pattern above.  */
+  operands[3] = gen_rtx_PLUS (Pmode, operands[0],
+                             GEN_INT (GET_MODE_SIZE (GET_MODE
+                                                     (operands[2]))));
   if (TARGET_SINGLE_STRINGOP || optimize_size)
     {
-      emit_insn (gen_strsethi_rex_1 (operands[0], operands[0], operands[1]));
-      DONE;
-    }
-})
-
-(define_expand "strsetqi"
-  [(set (mem:QI (match_operand:SI 0 "register_operand" ""))
-       (match_operand:QI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 1)))
-             (clobber (reg:CC 17))])]
-  ""
-{
-  if (TARGET_64BIT)
-    {
-      emit_insn (gen_strsetqi_rex64 (operands[0], operands[1]));
-      DONE;
-    }
-  else if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strsetqi_1 (operands[0], operands[0], operands[1]));
+      emit_insn (gen_strset_singleop (operands[0], operands[1], operands[2],
+                                     operands[3]));
       DONE;
     }
 })
 
-(define_expand "strsetqi_rex64"
-  [(set (mem:QI (match_operand:DI 0 "register_operand" ""))
-       (match_operand:QI 1 "register_operand" ""))
-   (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (const_int 1)))
-             (clobber (reg:CC 17))])]
-  "TARGET_64BIT"
-{
-  if (TARGET_SINGLE_STRINGOP || optimize_size)
-    {
-      emit_insn (gen_strsetqi_rex_1 (operands[0], operands[0], operands[1]));
-      DONE;
-    }
-})
+(define_expand "strset_singleop"
+  [(parallel [(set (match_operand 1 "memory_operand" "")
+                  (match_operand 2 "register_operand" ""))
+             (set (match_operand 0 "register_operand" "")
+                  (match_operand 3 "" ""))
+             (use (reg:SI 19))])]
+  "TARGET_SINGLE_STRINGOP || optimize_size"
+  "")
 
-(define_insn "strsetdi_rex_1"
+(define_insn "*strsetdi_rex_1"
   [(set (mem:SI (match_operand:DI 1 "register_operand" "0"))
        (match_operand:SI 2 "register_operand" "a"))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "DI")])
 
-(define_insn "strsetsi_1"
+(define_insn "*strsetsi_1"
   [(set (mem:SI (match_operand:SI 1 "register_operand" "0"))
        (match_operand:SI 2 "register_operand" "a"))
    (set (match_operand:SI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "SI")])
 
-(define_insn "strsetsi_rex_1"
+(define_insn "*strsetsi_rex_1"
   [(set (mem:SI (match_operand:DI 1 "register_operand" "0"))
        (match_operand:SI 2 "register_operand" "a"))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "SI")])
 
-(define_insn "strsethi_1"
+(define_insn "*strsethi_1"
   [(set (mem:HI (match_operand:SI 1 "register_operand" "0"))
        (match_operand:HI 2 "register_operand" "a"))
    (set (match_operand:SI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "HI")])
 
-(define_insn "strsethi_rex_1"
+(define_insn "*strsethi_rex_1"
   [(set (mem:HI (match_operand:DI 1 "register_operand" "0"))
        (match_operand:HI 2 "register_operand" "a"))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "HI")])
 
-(define_insn "strsetqi_1"
+(define_insn "*strsetqi_1"
   [(set (mem:QI (match_operand:SI 1 "register_operand" "0"))
        (match_operand:QI 2 "register_operand" "a"))
    (set (match_operand:SI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "QI")])
 
-(define_insn "strsetqi_rex_1"
+(define_insn "*strsetqi_rex_1"
   [(set (mem:QI (match_operand:DI 1 "register_operand" "0"))
        (match_operand:QI 2 "register_operand" "a"))
    (set (match_operand:DI 0 "register_operand" "=D")
    (set_attr "memory" "store")
    (set_attr "mode" "QI")])
 
-(define_insn "rep_stosdi_rex64"
+(define_expand "rep_stos"
+  [(parallel [(set (match_operand 1 "register_operand" "") (const_int 0))
+             (set (match_operand 0 "register_operand" "")
+                  (match_operand 4 "" ""))
+             (set (match_operand 2 "memory_operand" "") (const_int 0))
+             (use (match_operand 3 "register_operand" ""))
+             (use (match_dup 1))
+             (use (reg:SI 19))])]
+  ""
+  "")
+
+(define_insn "*rep_stosdi_rex64"
   [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0))
    (set (match_operand:DI 0 "register_operand" "=D") 
         (plus:DI (ashift:DI (match_operand:DI 4 "register_operand" "1")
    (set_attr "memory" "store")
    (set_attr "mode" "DI")])
 
-(define_insn "rep_stossi"
+(define_insn "*rep_stossi"
   [(set (match_operand:SI 1 "register_operand" "=c") (const_int 0))
    (set (match_operand:SI 0 "register_operand" "=D") 
         (plus:SI (ashift:SI (match_operand:SI 4 "register_operand" "1")
    (set_attr "memory" "store")
    (set_attr "mode" "SI")])
 
-(define_insn "rep_stossi_rex64"
+(define_insn "*rep_stossi_rex64"
   [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0))
    (set (match_operand:DI 0 "register_operand" "=D") 
         (plus:DI (ashift:DI (match_operand:DI 4 "register_operand" "1")
    (set_attr "memory" "store")
    (set_attr "mode" "SI")])
 
-(define_insn "rep_stosqi"
+(define_insn "*rep_stosqi"
   [(set (match_operand:SI 1 "register_operand" "=c") (const_int 0))
    (set (match_operand:SI 0 "register_operand" "=D") 
         (plus:SI (match_operand:SI 3 "register_operand" "0")
    (set_attr "memory" "store")
    (set_attr "mode" "QI")])
 
-(define_insn "rep_stosqi_rex64"
+(define_insn "*rep_stosqi_rex64"
   [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0))
    (set (match_operand:DI 0 "register_operand" "=D") 
         (plus:DI (match_operand:DI 3 "register_operand" "0")
        (const_int 0))
    (use (match_operand:QI 2 "register_operand" "a"))
    (use (match_dup 4))
-   (use (reg:DI 19))]
+   (use (reg:SI 19))]
   "TARGET_64BIT"
   "{rep\;stosb|rep stosb}"
   [(set_attr "type" "str")
 
   addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
   addr2 = copy_to_mode_reg (Pmode, XEXP (operands[2], 0));
-  
+  if (addr1 != XEXP (operands[1], 0))
+    operands[1] = replace_equiv_address_nv (operands[1], addr1);
+  if (addr2 != XEXP (operands[2], 0))
+    operands[2] = replace_equiv_address_nv (operands[2], addr2);
+
   count = operands[3];
   countreg = ix86_zero_extend_to_Pmode (count);
 
          emit_move_insn (operands[0], const0_rtx);
          DONE;
        }
-      if (TARGET_64BIT)
-       emit_insn (gen_cmpstrqi_nz_rex_1 (addr1, addr2, countreg, align,
-                                         addr1, addr2, countreg));
-      else
-       emit_insn (gen_cmpstrqi_nz_1 (addr1, addr2, countreg, align,
-                                     addr1, addr2, countreg));
+      emit_insn (gen_cmpstrqi_nz_1 (addr1, addr2, countreg, align,
+                                   operands[1], operands[2]));
     }
   else
     {
       if (TARGET_64BIT)
-       {
-         emit_insn (gen_cmpdi_1_rex64 (countreg, countreg));
-         emit_insn (gen_cmpstrqi_rex_1 (addr1, addr2, countreg, align,
-                                        addr1, addr2, countreg));
-       }
+       emit_insn (gen_cmpdi_1_rex64 (countreg, countreg));
       else
-       {
-         emit_insn (gen_cmpsi_1 (countreg, countreg));
-         emit_insn (gen_cmpstrqi_1 (addr1, addr2, countreg, align,
-                                    addr1, addr2, countreg));
-       }
+       emit_insn (gen_cmpsi_1 (countreg, countreg));
+      emit_insn (gen_cmpstrqi_1 (addr1, addr2, countreg, align,
+                                operands[1], operands[2]));
     }
 
   outlow = gen_lowpart (QImode, out);
 ;; memcmp recognizers.  The `cmpsb' opcode does nothing if the count is
 ;; zero.  Emit extra code to make sure that a zero-length compare is EQ.
 
-(define_insn "cmpstrqi_nz_1"
+(define_expand "cmpstrqi_nz_1"
+  [(parallel [(set (reg:CC 17)
+                  (compare:CC (match_operand 4 "memory_operand" "")
+                              (match_operand 5 "memory_operand" "")))
+             (use (match_operand 2 "register_operand" ""))
+             (use (match_operand:SI 3 "immediate_operand" ""))
+             (use (reg:SI 19))
+             (clobber (match_operand 0 "register_operand" ""))
+             (clobber (match_operand 1 "register_operand" ""))
+             (clobber (match_dup 2))])]
+  ""
+  "")
+
+(define_insn "*cmpstrqi_nz_1"
   [(set (reg:CC 17)
        (compare:CC (mem:BLK (match_operand:SI 4 "register_operand" "0"))
                    (mem:BLK (match_operand:SI 5 "register_operand" "1"))))
    (set_attr "mode" "QI")
    (set_attr "prefix_rep" "1")])
 
-(define_insn "cmpstrqi_nz_rex_1"
+(define_insn "*cmpstrqi_nz_rex_1"
   [(set (reg:CC 17)
        (compare:CC (mem:BLK (match_operand:DI 4 "register_operand" "0"))
                    (mem:BLK (match_operand:DI 5 "register_operand" "1"))))
 
 ;; The same, but the count is not known to not be zero.
 
-(define_insn "cmpstrqi_1"
+(define_expand "cmpstrqi_1"
+  [(parallel [(set (reg:CC 17)
+               (if_then_else:CC (ne (match_operand 2 "register_operand" "")
+                                    (const_int 0))
+                 (compare:CC (match_operand 4 "memory_operand" "")
+                             (match_operand 5 "memory_operand" ""))
+                 (const_int 0)))
+             (use (match_operand:SI 3 "immediate_operand" ""))
+             (use (reg:CC 17))
+             (use (reg:SI 19))
+             (clobber (match_operand 0 "register_operand" ""))
+             (clobber (match_operand 1 "register_operand" ""))
+             (clobber (match_dup 2))])]
+  ""
+  "")
+
+(define_insn "*cmpstrqi_1"
   [(set (reg:CC 17)
        (if_then_else:CC (ne (match_operand:SI 6 "register_operand" "2")
                             (const_int 0))
    (set_attr "mode" "QI")
    (set_attr "prefix_rep" "1")])
 
-(define_insn "cmpstrqi_rex_1"
+(define_insn "*cmpstrqi_rex_1"
   [(set (reg:CC 17)
        (if_then_else:CC (ne (match_operand:DI 6 "register_operand" "2")
                             (const_int 0))
    FAIL;
 })
 
-(define_insn "strlenqi_1"
+(define_expand "strlenqi_1"
+  [(parallel [(set (match_operand 0 "register_operand" "") (match_operand 2 "" ""))
+             (use (reg:SI 19))
+             (clobber (match_operand 1 "register_operand" ""))
+             (clobber (reg:CC 17))])]
+  ""
+  "")
+
+(define_insn "*strlenqi_1"
   [(set (match_operand:SI 0 "register_operand" "=&c")
        (unspec:SI [(mem:BLK (match_operand:SI 5 "register_operand" "1"))
                    (match_operand:QI 2 "register_operand" "a")
    (set_attr "mode" "QI")
    (set_attr "prefix_rep" "1")])
 
-(define_insn "strlenqi_rex_1"
+(define_insn "*strlenqi_rex_1"
   [(set (match_operand:DI 0 "register_operand" "=&c")
        (unspec:DI [(mem:BLK (match_operand:DI 5 "register_operand" "1"))
                    (match_operand:QI 2 "register_operand" "a")
 ;; nand  op0, op3   -  load op3 to op0 if comparison was false
 ;; or   op2, op0   -  get the nonzero one into the result.
 (define_split
-  [(set (match_operand 0 "register_operand" "")
-       (if_then_else (match_operator 1 "sse_comparison_operator"
-                       [(match_operand 4 "register_operand" "")
-                        (match_operand 5 "nonimmediate_operand" "")])
-                     (match_operand 2 "register_operand" "")
-                     (match_operand 3 "register_operand" "")))
+  [(set (match_operand:SF 0 "register_operand" "")
+       (if_then_else (match_operator:SF 1 "sse_comparison_operator"
+                       [(match_operand:SF 4 "register_operand" "")
+                        (match_operand:SF 5 "nonimmediate_operand" "")])
+                     (match_operand:SF 2 "register_operand" "")
+                     (match_operand:SF 3 "register_operand" "")))
+   (clobber (match_operand 6 "" ""))
+   (clobber (reg:CC 17))]
+  "SSE_REG_P (operands[0]) && reload_completed"
+  [(set (match_dup 4) (match_op_dup 1 [(match_dup 4) (match_dup 5)]))
+   (set (match_dup 2) (and:V4SF (match_dup 2)
+                               (match_dup 8)))
+   (set (match_dup 8) (and:V4SF (not:V4SF (match_dup 8))
+                                         (match_dup 3)))
+   (set (match_dup 0) (ior:V4SF (match_dup 6)
+                               (match_dup 7)))]
+{
+  /* If op2 == op3, op3 would be clobbered before it is used.  */
+  if (operands_match_p (operands[2], operands[3]))
+    {
+      emit_move_insn (operands[0], operands[2]);
+      DONE;
+    }
+
+  PUT_MODE (operands[1], GET_MODE (operands[0]));
+  if (operands_match_p (operands[0], operands[4]))
+    operands[6] = operands[4], operands[7] = operands[2];
+  else
+    operands[6] = operands[2], operands[7] = operands[4];
+  operands[0] = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+  operands[2] = simplify_gen_subreg (V4SFmode, operands[2], SFmode, 0);
+  operands[3] = simplify_gen_subreg (V4SFmode, operands[3], SFmode, 0);
+  operands[8] = simplify_gen_subreg (V4SFmode, operands[4], SFmode, 0);
+  operands[6] = simplify_gen_subreg (V4SFmode, operands[6], SFmode, 0);
+  operands[7] = simplify_gen_subreg (V4SFmode, operands[7], SFmode, 0);
+})
+
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (if_then_else (match_operator:DF 1 "sse_comparison_operator"
+                       [(match_operand:DF 4 "register_operand" "")
+                        (match_operand:DF 5 "nonimmediate_operand" "")])
+                     (match_operand:DF 2 "register_operand" "")
+                     (match_operand:DF 3 "register_operand" "")))
    (clobber (match_operand 6 "" ""))
    (clobber (reg:CC 17))]
   "SSE_REG_P (operands[0]) && reload_completed"
   [(set (match_dup 4) (match_op_dup 1 [(match_dup 4) (match_dup 5)]))
-   (set (subreg:TI (match_dup 2) 0) (and:TI (subreg:TI (match_dup 2) 0)
-                                           (subreg:TI (match_dup 4) 0)))
-   (set (subreg:TI (match_dup 4) 0) (and:TI (not:TI (subreg:TI (match_dup 4) 0))
-                                           (subreg:TI (match_dup 3) 0)))
-   (set (subreg:TI (match_dup 0) 0) (ior:TI (subreg:TI (match_dup 6) 0)
-                                           (subreg:TI (match_dup 7) 0)))]
+   (set (match_dup 2) (and:V2DF (match_dup 2)
+                               (match_dup 8)))
+   (set (match_dup 8) (and:V2DF (not:V2DF (match_dup 8))
+                                         (match_dup 3)))
+   (set (match_dup 0) (ior:V2DF (match_dup 6)
+                               (match_dup 7)))]
 {
   if (GET_MODE (operands[2]) == DFmode
       && TARGET_SSE_PARTIAL_REGS && !optimize_size)
     operands[6] = operands[4], operands[7] = operands[2];
   else
     operands[6] = operands[2], operands[7] = operands[4];
+  operands[0] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
+  operands[2] = simplify_gen_subreg (V2DFmode, operands[2], DFmode, 0);
+  operands[3] = simplify_gen_subreg (V2DFmode, operands[3], DFmode, 0);
+  operands[8] = simplify_gen_subreg (V2DFmode, operands[4], DFmode, 0);
+  operands[6] = simplify_gen_subreg (V2DFmode, operands[6], DFmode, 0);
+  operands[7] = simplify_gen_subreg (V2DFmode, operands[7], DFmode, 0);
 })
 
 ;; Special case of conditional move we can handle effectively.
   "#")
 
 (define_split
-  [(set (match_operand 0 "register_operand" "")
-       (if_then_else (match_operator 1 "comparison_operator"
-                       [(match_operand 4 "nonimmediate_operand" "")
-                        (match_operand 5 "nonimmediate_operand" "")])
-                     (match_operand 2 "nonmemory_operand" "")
-                     (match_operand 3 "nonmemory_operand" "")))]
+  [(set (match_operand:SF 0 "register_operand" "")
+       (if_then_else (match_operator:SF 1 "comparison_operator"
+                       [(match_operand:SF 4 "nonimmediate_operand" "")
+                        (match_operand:SF 5 "nonimmediate_operand" "")])
+                     (match_operand:SF 2 "nonmemory_operand" "")
+                     (match_operand:SF 3 "nonmemory_operand" "")))]
+  "SSE_REG_P (operands[0]) && reload_completed
+   && (const0_operand (operands[2], GET_MODE (operands[0]))
+       || const0_operand (operands[3], GET_MODE (operands[0])))"
+  [(set (match_dup 0) (match_op_dup 1 [(match_dup 0) (match_dup 5)]))
+   (set (match_dup 8) (and:V4SF (match_dup 6) (match_dup 7)))]
+{
+  PUT_MODE (operands[1], GET_MODE (operands[0]));
+  if (!sse_comparison_operator (operands[1], VOIDmode)
+      || !rtx_equal_p (operands[0], operands[4]))
+    {
+      rtx tmp = operands[5];
+      operands[5] = operands[4];
+      operands[4] = tmp;
+      PUT_CODE (operands[1], swap_condition (GET_CODE (operands[1])));
+    }
+  if (!rtx_equal_p (operands[0], operands[4]))
+    abort ();
+  operands[8] = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+  if (const0_operand (operands[2], GET_MODE (operands[2])))
+    {
+      operands[7] = operands[3];
+      operands[6] = gen_rtx_NOT (V4SFmode, operands[5]);
+    }
+  else
+    {
+      operands[7] = operands[2];
+      operands[6] = operands[0];
+    }
+  operands[7] = simplify_gen_subreg (V4SFmode, operands[7], SFmode, 0);
+})
+
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (if_then_else (match_operator:DF 1 "comparison_operator"
+                       [(match_operand:DF 4 "nonimmediate_operand" "")
+                        (match_operand:DF 5 "nonimmediate_operand" "")])
+                     (match_operand:DF 2 "nonmemory_operand" "")
+                     (match_operand:DF 3 "nonmemory_operand" "")))]
   "SSE_REG_P (operands[0]) && reload_completed
    && (const0_operand (operands[2], GET_MODE (operands[0]))
        || const0_operand (operands[3], GET_MODE (operands[0])))"
   [(set (match_dup 0) (match_op_dup 1 [(match_dup 0) (match_dup 5)]))
-   (set (subreg:TI (match_dup 0) 0) (and:TI (match_dup 6)
-                                           (match_dup 7)))]
+   (set (match_dup 8) (and:V2DF (match_dup 6) (match_dup 7)))]
 {
   if (TARGET_SSE_PARTIAL_REGS && !optimize_size
       && GET_MODE (operands[2]) == DFmode)
     }
   if (!rtx_equal_p (operands[0], operands[4]))
     abort ();
-  if (const0_operand (operands[2], GET_MODE (operands[0])))
+  operands[8] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
+  if (const0_operand (operands[2], GET_MODE (operands[2])))
     {
       operands[7] = operands[3];
-      operands[6] = gen_rtx_NOT (TImode, gen_rtx_SUBREG (TImode, operands[0],
-                                                        0));
+      operands[6] = gen_rtx_NOT (V2DFmode, operands[8]);
     }
   else
     {
       operands[7] = operands[2];
-      operands[6] = gen_rtx_SUBREG (TImode, operands[0], 0);
+      operands[6] = operands[8];
     }
-  operands[7] = simplify_gen_subreg (TImode, operands[7],
-                                    GET_MODE (operands[7]), 0);
+  operands[7] = simplify_gen_subreg (V2DFmode, operands[7], DFmode, 0);
 })
 
 (define_expand "allocate_stack_worker"
 (define_insn "movv2di_internal"
   [(set (match_operand:V2DI 0 "nonimmediate_operand" "=x,x,m")
        (match_operand:V2DI 1 "vector_move_operand" "C,xm,x"))]
-  "TARGET_SSE2"
+  "TARGET_SSE"
 {
   switch (which_alternative)
     {
 ;; of DImode subregs again!
 ;; SSE1 single precision floating point logical operation
 (define_expand "sse_andv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
-        (and:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0)
-               (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V4SF 0 "register_operand" "")
+        (and:V4SF (match_operand:V4SF 1 "register_operand" "")
+                 (match_operand:V4SF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE"
   "")
 
 (define_insn "*sse_andv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
-        (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
-  "andps\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V4SF")])
-
-(define_insn "*sse_andsf3"
-  [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
-        (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V4SF 0 "register_operand" "=x")
+        (and:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
+                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "andps\t{%2, %0|%0, %2}"
    (set_attr "mode" "V4SF")])
 
 (define_expand "sse_nandv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
-        (and:TI (not:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0))
-               (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V4SF 0 "register_operand" "")
+        (and:V4SF (not:V4SF (match_operand:V4SF 1 "register_operand" ""))
+                 (match_operand:V4SF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE"
   "")
 
 (define_insn "*sse_nandv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
-        (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE"
-  "andnps\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V4SF")])
-
-(define_insn "*sse_nandsf3"
-  [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
-        (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V4SF 0 "register_operand" "=x")
+        (and:V4SF (not:V4SF (match_operand:V4SF 1 "register_operand" "0"))
+                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE"
   "andnps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
    (set_attr "mode" "V4SF")])
 
 (define_expand "sse_iorv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
-        (ior:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0)
-               (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V4SF 0 "register_operand" "")
+        (ior:V4SF (match_operand:V4SF 1 "register_operand" "")
+                 (match_operand:V4SF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE"
   "")
 
 (define_insn "*sse_iorv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
-        (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
-  "orps\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V4SF")])
-
-(define_insn "*sse_iorsf3"
-  [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
-        (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V4SF 0 "register_operand" "=x")
+        (ior:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
+                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "orps\t{%2, %0|%0, %2}"
    (set_attr "mode" "V4SF")])
 
 (define_expand "sse_xorv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
-        (xor:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0)
-               (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
-  "TARGET_SSE
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+  [(set (match_operand:V4SF 0 "register_operand" "")
+        (xor:V4SF (match_operand:V4SF 1 "register_operand" "")
+                 (match_operand:V4SF 2 "nonimmediate_operand" "")))]
+  "TARGET_SSE"
   "")
 
 (define_insn "*sse_xorv4sf3"
-  [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
-        (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
-  "xorps\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V4SF")])
-
-(define_insn "*sse_xorsf3"
-  [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
-        (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V4SF 0 "register_operand" "=x")
+        (xor:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
+                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "xorps\t{%2, %0|%0, %2}"
 ;; SSE2 double precision floating point logical operation
 
 (define_expand "sse2_andv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
-        (and:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "") 0)
-               (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V2DF 0 "register_operand" "")
+        (and:V2DF (match_operand:V2DF 1 "register_operand" "")
+                 (match_operand:V2DF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE2"
   "")
 
 (define_insn "*sse2_andv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
-        (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE2
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
-  "andpd\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V2DF")])
-
-(define_insn "*sse2_andv2df3"
-  [(set (subreg:TI (match_operand:DF 0 "register_operand" "=x") 0)
-        (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V2DF 0 "register_operand" "=x")
+        (and:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
+                 (match_operand:V2DF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE2
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "andpd\t{%2, %0|%0, %2}"
    (set_attr "mode" "V2DF")])
 
 (define_expand "sse2_nandv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
-        (and:TI (not:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "") 0))
-               (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V2DF 0 "register_operand" "")
+        (and:V2DF (not:V2DF (match_operand:V2DF 1 "register_operand" ""))
+                 (match_operand:V2DF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE2"
   "")
 
 (define_insn "*sse2_nandv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
-        (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE2"
-  "andnpd\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V2DF")])
-
-(define_insn "*sse_nandti3_df"
-  [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
-        (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
-               (match_operand:TI 2 "nonimmediate_operand" "Ym")))]
+  [(set (match_operand:V2DF 0 "register_operand" "=x")
+        (and:V2DF (not:V2DF (match_operand:V2DF 1 "register_operand" "0"))
+                 (match_operand:V2DF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE2"
   "andnpd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
    (set_attr "mode" "V2DF")])
 
 (define_expand "sse2_iorv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
-        (ior:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "") 0)
-               (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V2DF 0 "register_operand" "")
+        (ior:V2DF (match_operand:V2DF 1 "register_operand" "")
+                 (match_operand:V2DF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE2"
   "")
 
 (define_insn "*sse2_iorv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
-        (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE2
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
-  "orpd\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V2DF")])
-
-(define_insn "*sse2_iordf3"
-  [(set (subreg:TI (match_operand:DF 0 "register_operand" "=x") 0)
-        (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V2DF 0 "register_operand" "=x")
+        (ior:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
+                 (match_operand:V2DF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE2
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "orpd\t{%2, %0|%0, %2}"
    (set_attr "mode" "V2DF")])
 
 (define_expand "sse2_xorv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
-        (xor:TI (subreg:TI (match_operand:V2DF 1 "nonimmediate_operand" "") 0)
-               (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
+  [(set (match_operand:V2DF 0 "register_operand" "")
+        (xor:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "")
+                 (match_operand:V2DF 2 "nonimmediate_operand" "")))]
   "TARGET_SSE2"
   "")
 
 (define_insn "*sse2_xorv2df3"
-  [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
-        (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
-  "TARGET_SSE2
-   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
-  "xorpd\t{%2, %0|%0, %2}"
-  [(set_attr "type" "sselog")
-   (set_attr "mode" "V2DF")])
-
-(define_insn "*sse2_xordf3"
-  [(set (subreg:TI (match_operand:DF 0 "register_operand" "=x") 0)
-        (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
-               (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+  [(set (match_operand:V2DF 0 "register_operand" "=x")
+        (xor:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
+                 (match_operand:V2DF 2 "nonimmediate_operand" "xm")))]
   "TARGET_SSE2
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "xorpd\t{%2, %0|%0, %2}"
 
 (define_insn "mmx_pshufw"
   [(set (match_operand:V4HI 0 "register_operand" "=y")
-        (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "0")
+        (unspec:V4HI [(match_operand:V4HI 1 "nonimmediate_operand" "ym")
                      (match_operand:SI 2 "immediate_operand" "i")]
                     UNSPEC_SHUFFLE))]
   "TARGET_SSE || TARGET_3DNOW_A"
 
 (define_insn "sse2_pshufd"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
-        (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0")
+        (unspec:V4SI [(match_operand:V4SI 1 "nonimmediate_operand" "xm")
                      (match_operand:SI 2 "immediate_operand" "i")]
                     UNSPEC_SHUFFLE))]
   "TARGET_SSE2"
 
 (define_insn "sse2_pshuflw"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
-        (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "0")
+        (unspec:V8HI [(match_operand:V8HI 1 "nonimmediate_operand" "xm")
                      (match_operand:SI 2 "immediate_operand" "i")]
                     UNSPEC_PSHUFLW))]
   "TARGET_SSE2"
 
 (define_insn "sse2_pshufhw"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
-        (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "0")
+        (unspec:V8HI [(match_operand:V8HI 1 "nonimmediate_operand" "xm")
                      (match_operand:SI 2 "immediate_operand" "i")]
                     UNSPEC_PSHUFHW))]
   "TARGET_SSE2"
 (define_insn "ashrv8hi3"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
         (ashiftrt:V8HI (match_operand:V8HI 1 "register_operand" "0")
-                      (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                      (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psraw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashrv4si3"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
         (ashiftrt:V4SI (match_operand:V4SI 1 "register_operand" "0")
-                      (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                      (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psrad\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "lshrv8hi3"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
         (lshiftrt:V8HI (match_operand:V8HI 1 "register_operand" "0")
-                      (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                      (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psrlw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "lshrv4si3"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
         (lshiftrt:V4SI (match_operand:V4SI 1 "register_operand" "0")
-                      (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                      (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psrld\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "lshrv2di3"
   [(set (match_operand:V2DI 0 "register_operand" "=x")
         (lshiftrt:V2DI (match_operand:V2DI 1 "register_operand" "0")
-                      (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                      (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psrlq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashlv8hi3"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
         (ashift:V8HI (match_operand:V8HI 1 "register_operand" "0")
-                    (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                    (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psllw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashlv4si3"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
         (ashift:V4SI (match_operand:V4SI 1 "register_operand" "0")
-                    (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                    (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "pslld\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashlv2di3"
   [(set (match_operand:V2DI 0 "register_operand" "=x")
         (ashift:V2DI (match_operand:V2DI 1 "register_operand" "0")
-                    (match_operand:TI 2 "nonmemory_operand" "xi")))]
+                    (match_operand:SI 2 "nonmemory_operand" "xi")))]
   "TARGET_SSE2"
   "psllq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashrv8hi3_ti"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
         (ashiftrt:V8HI (match_operand:V8HI 1 "register_operand" "0")
-                      (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                      (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psraw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashrv4si3_ti"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
         (ashiftrt:V4SI (match_operand:V4SI 1 "register_operand" "0")
-                      (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                      (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psrad\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "lshrv8hi3_ti"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
         (lshiftrt:V8HI (match_operand:V8HI 1 "register_operand" "0")
-                      (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                      (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psrlw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "lshrv4si3_ti"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
         (lshiftrt:V4SI (match_operand:V4SI 1 "register_operand" "0")
-                      (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                      (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psrld\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "lshrv2di3_ti"
   [(set (match_operand:V2DI 0 "register_operand" "=x")
         (lshiftrt:V2DI (match_operand:V2DI 1 "register_operand" "0")
-                      (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                      (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psrlq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashlv8hi3_ti"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
         (ashift:V8HI (match_operand:V8HI 1 "register_operand" "0")
-                    (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                    (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psllw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashlv4si3_ti"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
         (ashift:V4SI (match_operand:V4SI 1 "register_operand" "0")
-                    (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                    (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "pslld\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
 (define_insn "ashlv2di3_ti"
   [(set (match_operand:V2DI 0 "register_operand" "=x")
         (ashift:V2DI (match_operand:V2DI 1 "register_operand" "0")
-                    (subreg:TI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
+                    (subreg:SI (match_operand:V2DI 2 "nonmemory_operand" "xi") 0)))]
   "TARGET_SSE2"
   "psllq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
   [(set_attr "type" "sse")
    (set_attr "memory" "unknown")])
 
-;; PNI
+;; SSE3
 
 (define_insn "mwait"
   [(unspec_volatile [(match_operand:SI 0 "register_operand" "a")
                     (match_operand:SI 1 "register_operand" "c")]
                    UNSPECV_MWAIT)]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "mwait\t%0, %1"
   [(set_attr "length" "3")])
 
                     (match_operand:SI 1 "register_operand" "c")
                     (match_operand:SI 2 "register_operand" "d")]
                    UNSPECV_MONITOR)]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "monitor\t%0, %1, %2"
   [(set_attr "length" "3")])
 
-;; PNI arithmetic
+;; SSE3 arithmetic
 
 (define_insn "addsubv4sf3"
   [(set (match_operand:V4SF 0 "register_operand" "=x")
         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "0")
                      (match_operand:V4SF 2 "nonimmediate_operand" "xm")]
                     UNSPEC_ADDSUB))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "addsubps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
    (set_attr "mode" "V4SF")])
         (unspec:V2DF [(match_operand:V2DF 1 "register_operand" "0")
                      (match_operand:V2DF 2 "nonimmediate_operand" "xm")]
                     UNSPEC_ADDSUB))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "addsubpd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
    (set_attr "mode" "V2DF")])
         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "0")
                      (match_operand:V4SF 2 "nonimmediate_operand" "xm")]
                     UNSPEC_HADD))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "haddps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
    (set_attr "mode" "V4SF")])
         (unspec:V2DF [(match_operand:V2DF 1 "register_operand" "0")
                      (match_operand:V2DF 2 "nonimmediate_operand" "xm")]
                     UNSPEC_HADD))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "haddpd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
    (set_attr "mode" "V2DF")])
         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "0")
                      (match_operand:V4SF 2 "nonimmediate_operand" "xm")]
                     UNSPEC_HSUB))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "hsubps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
    (set_attr "mode" "V4SF")])
         (unspec:V2DF [(match_operand:V2DF 1 "register_operand" "0")
                      (match_operand:V2DF 2 "nonimmediate_operand" "xm")]
                     UNSPEC_HSUB))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "hsubpd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
    (set_attr "mode" "V2DF")])
   [(set (match_operand:V4SF 0 "register_operand" "=x")
         (unspec:V4SF
         [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_MOVSHDUP))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "movshdup\t{%1, %0|%0, %1}"
   [(set_attr "type" "sse")
    (set_attr "mode" "V4SF")])
   [(set (match_operand:V4SF 0 "register_operand" "=x")
         (unspec:V4SF
         [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_MOVSLDUP))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "movsldup\t{%1, %0|%0, %1}"
   [(set_attr "type" "sse")
    (set_attr "mode" "V4SF")])
   [(set (match_operand:V16QI 0 "register_operand" "=x")
        (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "m")]
                       UNSPEC_LDQQU))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "lddqu\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
    (set_attr "mode" "TI")])
 (define_insn "loadddup"
   [(set (match_operand:V2DF 0 "register_operand" "=x")
        (vec_duplicate:V2DF (match_operand:DF 1 "memory_operand" "m")))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "movddup\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
    (set_attr "mode" "DF")])
        (vec_duplicate:V2DF
         (vec_select:DF (match_operand:V2DF 1 "register_operand" "x")
                        (parallel [(const_int 0)]))))]
-  "TARGET_PNI"
+  "TARGET_SSE3"
   "movddup\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
    (set_attr "mode" "DF")])