OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.md
index 49fde6b..f0bec12 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, 2004, 2005, 2006, 2007, 2008
+;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
 ;; Free Software Foundation, Inc.
 ;; Mostly by William Schelter.
 ;; x86_64 support added by Jan Hubicka
@@ -58,6 +58,7 @@
    (UNSPEC_GOTNTPOFF           7)
    (UNSPEC_INDNTPOFF           8)
    (UNSPEC_PLTOFF              9)
+   (UNSPEC_MACHOPIC_OFFSET     10)
 
    ; Prologue support
    (UNSPEC_STACK_ALLOC         11)
    (UNSPEC_LFENCE              45)
    (UNSPEC_PSADBW              46)
    (UNSPEC_LDDQU               47)
+   (UNSPEC_MS_TO_SYSV_CALL     48)
 
    ; Generic math support
    (UNSPEC_COPYSIGN            50)
 
    ; For PCLMUL support
    (UNSPEC_PCLMUL              165)
+
+   ; For AVX support
+   (UNSPEC_PCMP                        166)
+   (UNSPEC_VPERMIL             167)
+   (UNSPEC_VPERMIL2F128                168)
+   (UNSPEC_MASKLOAD            169)
+   (UNSPEC_MASKSTORE           170)
+   (UNSPEC_CAST                        171)
+   (UNSPEC_VTESTP              172)
   ])
 
 (define_constants
    (UNSPECV_ALIGN              7)
    (UNSPECV_MONITOR            8)
    (UNSPECV_MWAIT              9)
-   (UNSPECV_CMPXCHG_1          10)
-   (UNSPECV_CMPXCHG_2          11)
+   (UNSPECV_CMPXCHG            10)
    (UNSPECV_XCHG               12)
    (UNSPECV_LOCK               13)
    (UNSPECV_PROLOGUE_USE       14)
    (UNSPECV_CLD                        15)
+   (UNSPECV_VZEROALL           16)
+   (UNSPECV_VZEROUPPER         17)
   ])
 
 ;; Constants to represent pcomtrue/pcomfalse variants
    (FLAGS_REG                  17)
    (FPSR_REG                   18)
    (FPCR_REG                   19)
+   (XMM0_REG                   21)
+   (XMM1_REG                   22)
+   (XMM2_REG                   23)
+   (XMM3_REG                   24)
+   (XMM4_REG                   25)
+   (XMM5_REG                   26)
+   (XMM6_REG                   27)
+   (XMM7_REG                   28)
    (R10_REG                    39)
    (R11_REG                    40)
    (R13_REG                    42)
+   (XMM8_REG                   45)
+   (XMM9_REG                   46)
+   (XMM10_REG                  47)
+   (XMM11_REG                  48)
+   (XMM12_REG                  49)
+   (XMM13_REG                  50)
+   (XMM14_REG                  51)
+   (XMM15_REG                  52)
   ])
 
 ;; Insns whose names begin with "x86_" are emitted by gen_FOO calls
 ;; "reload_completed && TARGET_64BIT".
 
 \f
-;; Processor type.  This attribute must exactly match the processor_type
-;; enumeration in i386.h.
-(define_attr "cpu" "i386,i486,pentium,pentiumpro,geode,k6,athlon,pentium4,k8,
-                    nocona,core2,generic32,generic64,amdfam10"
-  (const (symbol_ref "ix86_tune")))
+;; Processor type.
+(define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,
+                   generic64,amdfam10"
+  (const (symbol_ref "ix86_schedule")))
 
 ;; A basic instruction type.  Refinements due to arguments to be
 ;; provided in other attributes.
 
 ;; Main data type used by the insn
 (define_attr "mode"
-  "unknown,none,QI,HI,SI,DI,TI,SF,DF,XF,TF,V4SF,V2DF,V2SF,V1DF"
+  "unknown,none,QI,HI,SI,DI,TI,OI,SF,DF,XF,TF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF"
   (const_string "unknown"))
 
 ;; The CPU unit operations uses.
 ;; There are also additional prefixes in SSSE3.
 (define_attr "prefix_extra" "" (const_int 0))
 
+;; Prefix used: original, VEX or maybe VEX.
+(define_attr "prefix" "orig,vex,maybe_vex"
+  (if_then_else (eq_attr "mode" "OI,V8SF,V4DF")
+    (const_string "vex")
+    (const_string "orig")))
+
+;; There is a 8bit immediate for VEX.
+(define_attr "prefix_vex_imm8" "" (const_int 0))
+
+;; VEX W bit is used.
+(define_attr "prefix_vex_w" "" (const_int 0))
+
+;; The length of VEX prefix
+(define_attr "length_vex" ""
+  (if_then_else (eq_attr "prefix_0f" "1")
+    (if_then_else (eq_attr "prefix_vex_w" "1")
+      (symbol_ref "ix86_attr_length_vex_default (insn, 1, 1)")
+      (symbol_ref "ix86_attr_length_vex_default (insn, 1, 0)"))
+    (if_then_else (eq_attr "prefix_vex_w" "1")
+      (symbol_ref "ix86_attr_length_vex_default (insn, 0, 1)")
+      (symbol_ref "ix86_attr_length_vex_default (insn, 0, 0)"))))
+
 ;; Set when modrm byte is used.
 (define_attr "modrm" ""
   (cond [(eq_attr "type" "str,leave")
         (eq_attr "unit" "i387")
           (plus (const_int 2)
                 (plus (attr "prefix_data16")
-                      (attr "length_address")))]
+                      (attr "length_address")))
+        (ior (eq_attr "prefix" "vex")
+             (and (eq_attr "prefix" "maybe_vex")
+                   (ne (symbol_ref "TARGET_AVX") (const_int 0))))
+          (plus (attr "length_vex")
+                (plus (attr "prefix_vex_imm8")
+                      (plus (attr "modrm")
+                            (attr "length_address"))))]
         (plus (plus (attr "modrm")
                     (plus (attr "prefix_0f")
                           (plus (attr "prefix_rex")
 ;; Mapping of unsigned max and min
 (define_code_iterator umaxmin [umax umin])
 
+;; Mapping of signed/unsigned max and min
+(define_code_iterator maxmin [smax smin umax umin])
+
 ;; Base name for integer and FP insn mnemonic
 (define_code_attr maxminiprefix [(smax "maxs") (smin "mins")
                                 (umax "maxu") (umin "minu")])
 ;; All single word integer modes.
 (define_mode_iterator SWI [QI HI SI (DI "TARGET_64BIT")])
 
+;; Single word integer modes without QImode.
+(define_mode_iterator SWI248 [HI SI (DI "TARGET_64BIT")])
+
 ;; Instruction suffix for integer modes.
 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
 
               [(match_operand:X87MODEI12 2 "memory_operand" "m")]))]
          UNSPEC_FNSTSW))]
   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
-   && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
    (clobber (match_operand:HI 0 "register_operand" "=a"))]
   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
    && TARGET_SAHF && !TARGET_CMOVE
-   && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
   "#"
   "&& reload_completed"
    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 0);"
   [(set_attr "type" "fcmp,ssecomi")
+   (set_attr "prefix" "orig,maybe_vex")
    (set (attr "mode")
      (if_then_else (match_operand:SF 1 "" "")
         (const_string "SF")
    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 0);"
   [(set_attr "type" "ssecomi")
+   (set_attr "prefix" "maybe_vex")
    (set (attr "mode")
      (if_then_else (match_operand:SF 1 "" "")
         (const_string "SF")
    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 1);"
   [(set_attr "type" "fcmp,ssecomi")
+   (set_attr "prefix" "orig,maybe_vex")
    (set (attr "mode")
      (if_then_else (match_operand:SF 1 "" "")
         (const_string "SF")
    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 1);"
   [(set_attr "type" "ssecomi")
+   (set_attr "prefix" "maybe_vex")
    (set (attr "mode")
      (if_then_else (match_operand:SF 1 "" "")
         (const_string "SF")
     {
     case TYPE_SSELOG1:
       if (get_attr_mode (insn) == MODE_TI)
-        return "pxor\t%0, %0";
-      return "xorps\t%0, %0";
+        return "%vpxor\t%0, %d0";
+      return "%vxorps\t%0, %d0";
 
     case TYPE_SSEMOV:
       switch (get_attr_mode (insn))
        {
        case MODE_TI:
-         return "movdqa\t{%1, %0|%0, %1}";
+         return "%vmovdqa\t{%1, %0|%0, %1}";
        case MODE_V4SF:
-         return "movaps\t{%1, %0|%0, %1}";
+         return "%vmovaps\t{%1, %0|%0, %1}";
        case MODE_SI:
-          return "movd\t{%1, %0|%0, %1}";
+          return "%vmovd\t{%1, %0|%0, %1}";
        case MODE_SF:
-          return "movss\t{%1, %0|%0, %1}";
+          return "%vmovss\t{%1, %0|%0, %1}";
        default:
          gcc_unreachable ();
        }
              (const_string "lea")
           ]
           (const_string "imov")))
+   (set (attr "prefix")
+     (if_then_else (eq_attr "alternative" "0,1,2,3,4,5")
+       (const_string "orig")
+       (const_string "maybe_vex")))
    (set (attr "mode")
      (cond [(eq_attr "alternative" "2,3")
              (const_string "DI")
     }
 }
   [(set (attr "type")
-     (cond [(ne (symbol_ref "optimize_size") (const_int 0))
+     (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0))
              (const_string "imov")
            (and (eq_attr "alternative" "0")
                 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
        (match_operand:HI 1 "register_operand" "+r"))
    (set (match_dup 1)
        (match_dup 0))]
-  "!TARGET_PARTIAL_REG_STALL || optimize_size"
+  "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
   "xchg{l}\t%k1, %k0"
   [(set_attr "type" "imov")
    (set_attr "mode" "SI")
 (define_expand "movstricthi"
   [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" ""))
        (match_operand:HI 1 "general_operand" ""))]
-  "! TARGET_PARTIAL_REG_STALL || optimize_size"
+  ""
 {
+  if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
+    FAIL;
   /* Don't generate memory->memory moves, go through a register */
   if (MEM_P (operands[0]) && MEM_P (operands[1]))
     operands[1] = force_reg (HImode, operands[1]);
 (define_insn "*movstricthi_1"
   [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" "+rm,r"))
        (match_operand:HI 1 "general_operand" "rn,m"))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "mov{w}\t{%1, %0|%0, %1}"
   [(set_attr "type" "imov")
      (cond [(and (eq_attr "alternative" "5")
                 (not (match_operand:QI 1 "aligned_operand" "")))
              (const_string "imovx")
-           (ne (symbol_ref "optimize_size") (const_int 0))
+           (ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0))
              (const_string "imov")
            (and (eq_attr "alternative" "3")
                 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
                  (and (eq_attr "alternative" "0,1")
                       (and (ne (symbol_ref "TARGET_PARTIAL_REG_DEPENDENCY")
                                (const_int 0))
-                           (and (eq (symbol_ref "optimize_size")
+                           (and (eq (symbol_ref "optimize_function_for_size_p (cfun)")
                                     (const_int 0))
                                 (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
                                     (const_int 0))))))
        (match_operand:QI 1 "register_operand" "+r"))
    (set (match_dup 1)
        (match_dup 0))]
-  "!TARGET_PARTIAL_REG_STALL || optimize_size"
+  "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
   "xchg{l}\t%k1, %k0"
   [(set_attr "type" "imov")
    (set_attr "mode" "SI")
 (define_expand "movstrictqi"
   [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))
        (match_operand:QI 1 "general_operand" ""))]
-  "! TARGET_PARTIAL_REG_STALL || optimize_size"
+  ""
 {
+  if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
+    FAIL;
   /* Don't generate memory->memory moves, go through a register.  */
   if (MEM_P (operands[0]) && MEM_P (operands[1]))
     operands[1] = force_reg (QImode, operands[1]);
 (define_insn "*movstrictqi_1"
   [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" "+qm,q"))
        (match_operand:QI 1 "general_operand" "*qn,m"))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "mov{b}\t{%1, %0|%0, %1}"
   [(set_attr "type" "imov")
    pxor\t%0, %0
    movq\t{%1, %0|%0, %1}
    movq\t{%1, %0|%0, %1}
-   pxor\t%0, %0
-   movq\t{%1, %0|%0, %1}
-   movdqa\t{%1, %0|%0, %1}
-   movq\t{%1, %0|%0, %1}
+   %vpxor\t%0, %d0
+   %vmovq\t{%1, %0|%0, %1}
+   %vmovdqa\t{%1, %0|%0, %1}
+   %vmovq\t{%1, %0|%0, %1}
    xorps\t%0, %0
    movlps\t{%1, %0|%0, %1}
    movaps\t{%1, %0|%0, %1}
    movlps\t{%1, %0|%0, %1}"
   [(set_attr "type" "*,*,mmx,mmxmov,mmxmov,sselog1,ssemov,ssemov,ssemov,sselog1,ssemov,ssemov,ssemov")
+   (set (attr "prefix")
+     (if_then_else (eq_attr "alternative" "5,6,7,8")
+       (const_string "vex")
+       (const_string "orig")))
    (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,TI,DI,V4SF,V2SF,V4SF,V2SF")])
 
 (define_split
        return "movdq2q\t{%1, %0|%0, %1}";
 
     case TYPE_SSEMOV:
+      if (TARGET_AVX)
+       {
+         if (get_attr_mode (insn) == MODE_TI)
+           return "vmovdqa\t{%1, %0|%0, %1}";
+         else
+           return "vmovq\t{%1, %0|%0, %1}";
+       }
+
       if (get_attr_mode (insn) == MODE_TI)
        return "movdqa\t{%1, %0|%0, %1}";
       /* FALLTHRU */
       return "movq\t{%1, %0|%0, %1}";
 
     case TYPE_SSELOG1:
+      return "%vpxor\t%0, %d0";
+
     case TYPE_MMXADD:
       return "pxor\t%0, %0";
 
           (const_string "imov")))
    (set_attr "modrm" "*,0,0,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*")
    (set_attr "length_immediate" "*,4,8,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*")
+   (set (attr "prefix")
+     (if_then_else (eq_attr "alternative" "11,12,13,14,15,16")
+       (const_string "maybe_vex")
+       (const_string "orig")))
    (set_attr "mode" "SI,DI,DI,DI,SI,DI,DI,DI,DI,DI,DI,TI,TI,DI,DI,DI,DI,DI,DI")])
 
 ;; Stores and loads of ax to arbitrary constant address.
    (set_attr "athlon_decode" "vector")
    (set_attr "amdfam10_decode" "double")])
 
+(define_expand "movoi"
+  [(set (match_operand:OI 0 "nonimmediate_operand" "")
+       (match_operand:OI 1 "general_operand" ""))]
+  "TARGET_AVX"
+  "ix86_expand_move (OImode, operands); DONE;")
+
+(define_insn "*movoi_internal"
+  [(set (match_operand:OI 0 "nonimmediate_operand" "=x,x,m")
+       (match_operand:OI 1 "vector_move_operand" "C,xm,x"))]
+  "TARGET_AVX
+   && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+{
+  switch (which_alternative)
+    {
+    case 0:
+      return "vxorps\t%0, %0, %0";
+    case 1:
+    case 2:
+      if (misaligned_operand (operands[0], OImode)
+         || misaligned_operand (operands[1], OImode))
+       return "vmovdqu\t{%1, %0|%0, %1}";
+      else
+       return "vmovdqa\t{%1, %0|%0, %1}";
+    default:
+      gcc_unreachable ();
+    }
+}
+  [(set_attr "type" "sselog1,ssemov,ssemov")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "OI")])
+
 (define_expand "movti"
   [(set (match_operand:TI 0 "nonimmediate_operand" "")
        (match_operand:TI 1 "nonimmediate_operand" ""))]
     {
     case 0:
       if (get_attr_mode (insn) == MODE_V4SF)
-       return "xorps\t%0, %0";
+       return "%vxorps\t%0, %d0";
       else
-       return "pxor\t%0, %0";
+       return "%vpxor\t%0, %d0";
     case 1:
     case 2:
       /* TDmode values are passed as TImode on the stack.  Moving them
         to stack may result in unaligned memory access.  */
       if (misaligned_operand (operands[0], TImode)
          || misaligned_operand (operands[1], TImode))
-       { 
+       {
          if (get_attr_mode (insn) == MODE_V4SF)
-           return "movups\t{%1, %0|%0, %1}";
+           return "%vmovups\t{%1, %0|%0, %1}";
         else
-          return "movdqu\t{%1, %0|%0, %1}";
+          return "%vmovdqu\t{%1, %0|%0, %1}";
        }
       else
-       { 
+       {
          if (get_attr_mode (insn) == MODE_V4SF)
-           return "movaps\t{%1, %0|%0, %1}";
+           return "%vmovaps\t{%1, %0|%0, %1}";
         else
-          return "movdqa\t{%1, %0|%0, %1}";
+          return "%vmovdqa\t{%1, %0|%0, %1}";
        }
     default:
       gcc_unreachable ();
     }
 }
   [(set_attr "type" "sselog1,ssemov,ssemov")
+   (set_attr "prefix" "maybe_vex")
    (set (attr "mode")
        (cond [(ior (eq (symbol_ref "TARGET_SSE2") (const_int 0))
-                   (ne (symbol_ref "optimize_size") (const_int 0)))
+                   (ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0)))
                 (const_string "V4SF")
               (and (eq_attr "alternative" "2")
                    (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
       return "#";
     case 2:
       if (get_attr_mode (insn) == MODE_V4SF)
-       return "xorps\t%0, %0";
+       return "%vxorps\t%0, %d0";
       else
-       return "pxor\t%0, %0";
+       return "%vpxor\t%0, %d0";
     case 3:
     case 4:
       /* TDmode values are passed as TImode on the stack.  Moving them
         to stack may result in unaligned memory access.  */
       if (misaligned_operand (operands[0], TImode)
          || misaligned_operand (operands[1], TImode))
-       { 
+       {
          if (get_attr_mode (insn) == MODE_V4SF)
-           return "movups\t{%1, %0|%0, %1}";
+           return "%vmovups\t{%1, %0|%0, %1}";
         else
-          return "movdqu\t{%1, %0|%0, %1}";
+          return "%vmovdqu\t{%1, %0|%0, %1}";
        }
       else
-       { 
+       {
          if (get_attr_mode (insn) == MODE_V4SF)
-           return "movaps\t{%1, %0|%0, %1}";
+           return "%vmovaps\t{%1, %0|%0, %1}";
         else
-          return "movdqa\t{%1, %0|%0, %1}";
+          return "%vmovdqa\t{%1, %0|%0, %1}";
        }
     default:
       gcc_unreachable ();
     }
 }
   [(set_attr "type" "*,*,sselog1,ssemov,ssemov")
+   (set_attr "prefix" "*,*,maybe_vex,maybe_vex,maybe_vex")
    (set (attr "mode")
         (cond [(eq_attr "alternative" "2,3")
                 (if_then_else
-                  (ne (symbol_ref "optimize_size")
+                  (ne (symbol_ref "optimize_function_for_size_p (cfun)")
                       (const_int 0))
                   (const_string "V4SF")
                   (const_string "TI"))
                 (if_then_else
                   (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
                            (const_int 0))
-                       (ne (symbol_ref "optimize_size")
+                       (ne (symbol_ref "optimize_function_for_size_p (cfun)")
                            (const_int 0)))
                   (const_string "V4SF")
                   (const_string "TI"))]
   "!(MEM_P (operands[0]) && MEM_P (operands[1]))
    && (reload_in_progress || reload_completed
        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
-       || (!TARGET_SSE_MATH && optimize_size
+       || (!TARGET_SSE_MATH && optimize_function_for_size_p (cfun)
           && standard_80387_constant_p (operands[1]))
        || GET_CODE (operands[1]) != CONST_DOUBLE
        || memory_operand (operands[0], SFmode))"
       return "mov{l}\t{%1, %0|%0, %1}";
     case 5:
       if (get_attr_mode (insn) == MODE_TI)
-       return "pxor\t%0, %0";
+       return "%vpxor\t%0, %d0";
       else
-       return "xorps\t%0, %0";
+       return "%vxorps\t%0, %d0";
     case 6:
       if (get_attr_mode (insn) == MODE_V4SF)
-       return "movaps\t{%1, %0|%0, %1}";
+       return "%vmovaps\t{%1, %0|%0, %1}";
+      else
+       return "%vmovss\t{%1, %d0|%d0, %1}";
+    case 7:
+      if (TARGET_AVX)
+       return REG_P (operands[1]) ? "vmovss\t{%1, %0, %0|%0, %0, %1}"
+                                  : "vmovss\t{%1, %0|%0, %1}";
       else
        return "movss\t{%1, %0|%0, %1}";
-    case 7: case 8:
-      return "movss\t{%1, %0|%0, %1}";
+    case 8:
+      return "%vmovss\t{%1, %0|%0, %1}";
 
-    case 9: case 10:
-    case 12: case 13: case 14: case 15:
+    case 9: case 10: case 14: case 15:
       return "movd\t{%1, %0|%0, %1}";
+    case 12: case 13:
+      return "%vmovd\t{%1, %0|%0, %1}";
 
     case 11:
       return "movq\t{%1, %0|%0, %1}";
     }
 }
   [(set_attr "type" "fmov,fmov,fmov,imov,imov,sselog1,ssemov,ssemov,ssemov,mmxmov,mmxmov,mmxmov,ssemov,ssemov,mmxmov,mmxmov")
+   (set (attr "prefix")
+     (if_then_else (eq_attr "alternative" "5,6,7,8,12,13")
+       (const_string "maybe_vex")
+       (const_string "orig")))
    (set (attr "mode")
         (cond [(eq_attr "alternative" "3,4,9,10")
                 (const_string "SI")
                                 (const_int 0))
                             (ne (symbol_ref "TARGET_SSE2")
                                 (const_int 0)))
-                       (eq (symbol_ref "optimize_size")
+                       (eq (symbol_ref "optimize_function_for_size_p (cfun)")
                            (const_int 0)))
                   (const_string "TI")
                   (const_string "V4SF"))
        (match_operand:DF 1 "general_operand"
                        "fm,f,G,*roF,*Fr,C   ,Y2*x,mY2*x,Y2*x"))]
   "!(MEM_P (operands[0]) && MEM_P (operands[1]))
-   && ((optimize_size || !TARGET_INTEGER_DFMODE_MOVES) && !TARGET_64BIT)
+   && ((optimize_function_for_size_p (cfun)
+       || !TARGET_INTEGER_DFMODE_MOVES) && !TARGET_64BIT)
    && (reload_in_progress || reload_completed
        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
-       || (!(TARGET_SSE2 && TARGET_SSE_MATH) && optimize_size
+       || (!(TARGET_SSE2 && TARGET_SSE_MATH)
+           && optimize_function_for_size_p (cfun)
            && !memory_operand (operands[0], DFmode)
           && standard_80387_constant_p (operands[1]))
        || GET_CODE (operands[1]) != CONST_DOUBLE
-       || ((optimize_size
+       || ((optimize_function_for_size_p (cfun)
             || !TARGET_MEMORY_MISMATCH_STALL
            || reload_in_progress || reload_completed)
           && memory_operand (operands[0], DFmode)))"
       switch (get_attr_mode (insn))
        {
        case MODE_V4SF:
-         return "xorps\t%0, %0";
+         return "%vxorps\t%0, %d0";
        case MODE_V2DF:
-         return "xorpd\t%0, %0";
+         return "%vxorpd\t%0, %d0";
        case MODE_TI:
-         return "pxor\t%0, %0";
+         return "%vpxor\t%0, %d0";
        default:
          gcc_unreachable ();
        }
       switch (get_attr_mode (insn))
        {
        case MODE_V4SF:
-         return "movaps\t{%1, %0|%0, %1}";
+         return "%vmovaps\t{%1, %0|%0, %1}";
        case MODE_V2DF:
-         return "movapd\t{%1, %0|%0, %1}";
+         return "%vmovapd\t{%1, %0|%0, %1}";
        case MODE_TI:
-         return "movdqa\t{%1, %0|%0, %1}";
+         return "%vmovdqa\t{%1, %0|%0, %1}";
        case MODE_DI:
-         return "movq\t{%1, %0|%0, %1}";
+         return "%vmovq\t{%1, %0|%0, %1}";
        case MODE_DF:
-         return "movsd\t{%1, %0|%0, %1}";
+         if (TARGET_AVX)
+           {
+             if (REG_P (operands[0]) && REG_P (operands[1]))
+               return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
+             else
+               return "vmovsd\t{%1, %0|%0, %1}";
+           }
+         else
+           return "movsd\t{%1, %0|%0, %1}";
        case MODE_V1DF:
-         return "movlpd\t{%1, %0|%0, %1}";
+         if (TARGET_AVX)
+           {
+             if (REG_P (operands[0]))
+               return "vmovlpd\t{%1, %0, %0|%0, %0, %1}";
+             else
+               return "vmovlpd\t{%1, %0|%0, %1}";
+           }
+         else
+           return "movlpd\t{%1, %0|%0, %1}";
        case MODE_V2SF:
-         return "movlps\t{%1, %0|%0, %1}";
+         if (TARGET_AVX)
+           {
+             if (REG_P (operands[0]))
+               return "vmovlps\t{%1, %0, %0|%0, %0, %1}";
+             else
+               return "vmovlps\t{%1, %0|%0, %1}";
+           }
+         else
+           return "movlps\t{%1, %0|%0, %1}";
        default:
          gcc_unreachable ();
        }
     }
 }
   [(set_attr "type" "fmov,fmov,fmov,multi,multi,sselog1,ssemov,ssemov,ssemov")
+   (set (attr "prefix")
+     (if_then_else (eq_attr "alternative" "0,1,2,3,4")
+       (const_string "orig")
+       (const_string "maybe_vex")))
    (set (attr "mode")
         (cond [(eq_attr "alternative" "0,1,2")
                 (const_string "DF")
 
               /* xorps is one byte shorter.  */
               (eq_attr "alternative" "5")
-                (cond [(ne (symbol_ref "optimize_size")
+                (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
                            (const_int 0))
                          (const_string "V4SF")
                        (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
                  movaps encodes one byte shorter.  */
               (eq_attr "alternative" "6")
                 (cond
-                  [(ne (symbol_ref "optimize_size")
+                  [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
                        (const_int 0))
                      (const_string "V4SF")
                    (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
    && (reload_in_progress || reload_completed
        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
-       || (!(TARGET_SSE2 && TARGET_SSE_MATH) && optimize_size
+       || (!(TARGET_SSE2 && TARGET_SSE_MATH)
+           && optimize_function_for_size_p (cfun)
           && standard_80387_constant_p (operands[1]))
        || GET_CODE (operands[1]) != CONST_DOUBLE
        || memory_operand (operands[0], DFmode))"
       switch (get_attr_mode (insn))
        {
        case MODE_V4SF:
-         return "xorps\t%0, %0";
+         return "%vxorps\t%0, %d0";
        case MODE_V2DF:
-         return "xorpd\t%0, %0";
+         return "%vxorpd\t%0, %d0";
        case MODE_TI:
-         return "pxor\t%0, %0";
+         return "%vpxor\t%0, %d0";
        default:
          gcc_unreachable ();
        }
       switch (get_attr_mode (insn))
        {
        case MODE_V4SF:
-         return "movaps\t{%1, %0|%0, %1}";
+         return "%vmovaps\t{%1, %0|%0, %1}";
        case MODE_V2DF:
-         return "movapd\t{%1, %0|%0, %1}";
+         return "%vmovapd\t{%1, %0|%0, %1}";
        case MODE_TI:
-         return "movdqa\t{%1, %0|%0, %1}";
+         return "%vmovdqa\t{%1, %0|%0, %1}";
        case MODE_DI:
-         return "movq\t{%1, %0|%0, %1}";
+         return "%vmovq\t{%1, %0|%0, %1}";
        case MODE_DF:
-         return "movsd\t{%1, %0|%0, %1}";
+         if (TARGET_AVX)
+           {
+             if (REG_P (operands[0]) && REG_P (operands[1]))
+               return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
+             else
+               return "vmovsd\t{%1, %0|%0, %1}";
+           }
+         else
+           return "movsd\t{%1, %0|%0, %1}";
        case MODE_V1DF:
-         return "movlpd\t{%1, %0|%0, %1}";
+         return "%vmovlpd\t{%1, %d0|%d0, %1}";
        case MODE_V2SF:
-         return "movlps\t{%1, %0|%0, %1}";
+         return "%vmovlps\t{%1, %d0|%d0, %1}";
        default:
          gcc_unreachable ();
        }
 
     case 9:
     case 10:
-      return "movd\t{%1, %0|%0, %1}";
+    return "%vmovd\t{%1, %0|%0, %1}";
 
     default:
       gcc_unreachable();
     }
 }
   [(set_attr "type" "fmov,fmov,fmov,multi,multi,sselog1,ssemov,ssemov,ssemov,ssemov,ssemov")
+   (set (attr "prefix")
+     (if_then_else (eq_attr "alternative" "0,1,2,3,4")
+       (const_string "orig")
+       (const_string "maybe_vex")))
    (set (attr "mode")
         (cond [(eq_attr "alternative" "0,1,2")
                 (const_string "DF")
 
               /* xorps is one byte shorter.  */
               (eq_attr "alternative" "5")
-                (cond [(ne (symbol_ref "optimize_size")
+                (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
                            (const_int 0))
                          (const_string "V4SF")
                        (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
                  movaps encodes one byte shorter.  */
               (eq_attr "alternative" "6")
                 (cond
-                  [(ne (symbol_ref "optimize_size")
+                  [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
                        (const_int 0))
                      (const_string "V4SF")
                    (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
        (match_operand:DF 1 "general_operand"
                "fm,f,G,roF,Fr,C   ,Y2*x,m   ,Y2*x"))]
   "!(MEM_P (operands[0]) && MEM_P (operands[1]))
-   && !optimize_size && TARGET_INTEGER_DFMODE_MOVES
+   && optimize_function_for_speed_p (cfun)
+   && TARGET_INTEGER_DFMODE_MOVES
    && (reload_in_progress || reload_completed
        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
-       || (!(TARGET_SSE2 && TARGET_SSE_MATH) && optimize_size
+       || (!(TARGET_SSE2 && TARGET_SSE_MATH)
+           && optimize_function_for_size_p (cfun)
           && standard_80387_constant_p (operands[1]))
        || GET_CODE (operands[1]) != CONST_DOUBLE
        || memory_operand (operands[0], DFmode))"
 
               /* xorps is one byte shorter.  */
               (eq_attr "alternative" "5")
-                (cond [(ne (symbol_ref "optimize_size")
+                (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
                            (const_int 0))
                          (const_string "V4SF")
                        (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
                  movaps encodes one byte shorter.  */
               (eq_attr "alternative" "6")
                 (cond
-                  [(ne (symbol_ref "optimize_size")
+                  [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
                        (const_int 0))
                      (const_string "V4SF")
                    (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
 (define_insn "*pushxf_nointeger"
   [(set (match_operand:XF 0 "push_operand" "=X,X,X")
        (match_operand:XF 1 "general_no_elim_operand" "f,Fo,*r"))]
-  "optimize_size"
+  "optimize_function_for_size_p (cfun)"
 {
   /* This insn should be already split before reg-stack.  */
   gcc_unreachable ();
 (define_insn "*pushxf_integer"
   [(set (match_operand:XF 0 "push_operand" "=<,<")
        (match_operand:XF 1 "general_no_elim_operand" "f,ro"))]
-  "!optimize_size"
+  "optimize_function_for_speed_p (cfun)"
 {
   /* This insn should be already split before reg-stack.  */
   gcc_unreachable ();
 (define_insn "*movxf_nointeger"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,*r,o")
        (match_operand:XF 1 "general_operand" "fm,f,G,*roF,F*r"))]
-  "optimize_size
+  "optimize_function_for_size_p (cfun)
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))
    && (reload_in_progress || reload_completed
-       || (optimize_size && standard_80387_constant_p (operands[1]))
+       || standard_80387_constant_p (operands[1])
        || GET_CODE (operands[1]) != CONST_DOUBLE
        || memory_operand (operands[0], XFmode))"
 {
 (define_insn "*movxf_integer"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,r,o")
        (match_operand:XF 1 "general_operand" "fm,f,G,roF,Fr"))]
-  "!optimize_size
+  "optimize_function_for_speed_p (cfun)
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))
    && (reload_in_progress || reload_completed
-       || (optimize_size && standard_80387_constant_p (operands[1]))
        || GET_CODE (operands[1]) != CONST_DOUBLE
        || memory_operand (operands[0], XFmode))"
 {
     case 0:
     case 1:
       if (get_attr_mode (insn) == MODE_V4SF)
-       return "movaps\t{%1, %0|%0, %1}";
+       return "%vmovaps\t{%1, %0|%0, %1}";
       else
-       return "movdqa\t{%1, %0|%0, %1}";
+       return "%vmovdqa\t{%1, %0|%0, %1}";
     case 2:
       if (get_attr_mode (insn) == MODE_V4SF)
-       return "xorps\t%0, %0";
+       return "%vxorps\t%0, %d0";
       else
-       return "pxor\t%0, %0";
+       return "%vpxor\t%0, %d0";
     case 3:
     case 4:
        return "#";
     }
 }
   [(set_attr "type" "ssemov,ssemov,sselog1,*,*")
+   (set_attr "prefix" "maybe_vex,maybe_vex,maybe_vex,*,*")
    (set (attr "mode")
         (cond [(eq_attr "alternative" "0,2")
                 (if_then_else
-                  (ne (symbol_ref "optimize_size")
+                  (ne (symbol_ref "optimize_function_for_size_p (cfun)")
                       (const_int 0))
                   (const_string "V4SF")
                   (const_string "TI"))
                 (if_then_else
                   (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
                            (const_int 0))
-                       (ne (symbol_ref "optimize_size")
+                       (ne (symbol_ref "optimize_function_for_size_p (cfun)")
                            (const_int 0)))
                   (const_string "V4SF")
                   (const_string "TI"))]
      (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
   ""
 {
-  if (TARGET_ZERO_EXTEND_WITH_AND && !optimize_size)
+  if (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
     {
       operands[1] = force_reg (HImode, operands[1]);
       emit_insn (gen_zero_extendhisi2_and (operands[0], operands[1]));
   [(set (match_operand:SI 0 "register_operand" "=r")
      (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
+  "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "alu1")
    (set_attr "mode" "SI")])
   [(set (match_operand:SI 0 "register_operand" "")
        (zero_extend:SI (match_operand:HI 1 "register_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "reload_completed && TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
+  "reload_completed && TARGET_ZERO_EXTEND_WITH_AND
+   && optimize_function_for_speed_p (cfun)"
   [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (const_int 65535)))
              (clobber (reg:CC FLAGS_REG))])]
   "")
 (define_insn "*zero_extendhisi2_movzwl"
   [(set (match_operand:SI 0 "register_operand" "=r")
      (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
-  "!TARGET_ZERO_EXTEND_WITH_AND || optimize_size"
+  "!TARGET_ZERO_EXTEND_WITH_AND
+   || optimize_function_for_size_p (cfun)"
   "movz{wl|x}\t{%1, %0|%0, %1}"
   [(set_attr "type" "imovx")
    (set_attr "mode" "SI")])
   [(set (match_operand:HI 0 "register_operand" "=r,?&q")
      (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0,qm")))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
+  "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "alu1")
    (set_attr "mode" "HI")])
   [(set (match_operand:HI 0 "register_operand" "=r,r")
      (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "qm,0")))
    (clobber (reg:CC FLAGS_REG))]
-  "!TARGET_ZERO_EXTEND_WITH_AND || optimize_size"
+  "!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun)"
   "#"
   [(set_attr "type" "imovx,alu1")
    (set_attr "mode" "HI")])
 (define_insn "*zero_extendqihi2_movzbl"
   [(set (match_operand:HI 0 "register_operand" "=r")
      (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
-  "(!TARGET_ZERO_EXTEND_WITH_AND || optimize_size) && reload_completed"
+  "(!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))
+   && reload_completed"
   "movz{bl|x}\t{%1, %k0|%k0, %1}"
   [(set_attr "type" "imovx")
    (set_attr "mode" "SI")])
        (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "reload_completed
-   && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_size)
+   && (!TARGET_ZERO_EXTEND_WITH_AND
+       || optimize_function_for_size_p (cfun))
    && (!REG_P (operands[1]) || ANY_QI_REG_P (operands[1]))"
   [(set (match_operand:HI 0 "register_operand" "")
        (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))])
    (clobber (reg:CC FLAGS_REG))]
   "reload_completed
    && ANY_QI_REG_P (operands[0])
-   && (TARGET_ZERO_EXTEND_WITH_AND && !optimize_size)
+   && (TARGET_ZERO_EXTEND_WITH_AND
+       && optimize_function_for_speed_p (cfun))
    && !reg_overlap_mentioned_p (operands[0], operands[1])"
   [(set (match_dup 0) (const_int 0))
    (set (strict_low_part (match_dup 2)) (match_dup 1))]
   [(set (match_operand:SI 0 "register_operand" "=r,?&q")
      (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,qm")))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
+  "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "alu1")
    (set_attr "mode" "SI")])
   [(set (match_operand:SI 0 "register_operand" "=r,r")
      (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm,0")))
    (clobber (reg:CC FLAGS_REG))]
-  "!TARGET_ZERO_EXTEND_WITH_AND || optimize_size"
+  "!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun)"
   "#"
   [(set_attr "type" "imovx,alu1")
    (set_attr "mode" "SI")])
 (define_insn "*zero_extendqisi2_movzbw"
   [(set (match_operand:SI 0 "register_operand" "=r")
      (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
-  "(!TARGET_ZERO_EXTEND_WITH_AND || optimize_size) && reload_completed"
+  "(!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))
+   && reload_completed"
   "movz{bl|x}\t{%1, %0|%0, %1}"
   [(set_attr "type" "imovx")
    (set_attr "mode" "SI")])
        (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "reload_completed
-   && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_size)
+   && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))
    && (!REG_P (operands[1]) || ANY_QI_REG_P (operands[1]))"
   [(set (match_dup 0)
        (zero_extend:SI (match_dup 1)))])
   "reload_completed
    && ANY_QI_REG_P (operands[0])
    && (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]))
-   && (TARGET_ZERO_EXTEND_WITH_AND && !optimize_size)
+   && (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
    && !reg_overlap_mentioned_p (operands[0], operands[1])"
   [(set (match_dup 0) (const_int 0))
    (set (strict_low_part (match_dup 2)) (match_dup 1))]
    #
    movd\t{%1, %0|%0, %1}
    movd\t{%1, %0|%0, %1}
-   movd\t{%1, %0|%0, %1}
-   movd\t{%1, %0|%0, %1}"
-  [(set_attr "mode" "SI,SI,SI,DI,DI,TI,TI")
-   (set_attr "type" "multi,multi,multi,mmxmov,mmxmov,ssemov,ssemov")])
+   %vmovd\t{%1, %0|%0, %1}
+   %vmovd\t{%1, %0|%0, %1}"
+  [(set_attr "type" "multi,multi,multi,mmxmov,mmxmov,ssemov,ssemov")
+   (set_attr "prefix" "*,*,*,orig,orig,maybe_vex,maybe_vex")
+   (set_attr "mode" "SI,SI,SI,DI,DI,TI,TI")])
 
 (define_insn "zero_extendsidi2_rex64"
   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,?*Ym,?*y,?*Yi,*Y2")
    #
    movd\t{%1, %0|%0, %1}
    movd\t{%1, %0|%0, %1}
-   movd\t{%1, %0|%0, %1}
-   movd\t{%1, %0|%0, %1}"
+   %vmovd\t{%1, %0|%0, %1}
+   %vmovd\t{%1, %0|%0, %1}"
   [(set_attr "type" "imovx,imov,mmxmov,mmxmov,ssemov,ssemov")
+   (set_attr "prefix" "orig,*,orig,orig,maybe_vex,maybe_vex")
    (set_attr "mode" "SI,DI,DI,DI,TI,TI")])
 
 (define_split
   emit_move_insn (operands[3], operands[1]);
 
   /* Generate a cltd if possible and doing so it profitable.  */
-  if ((optimize_size || TARGET_USE_CLTD)
+  if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
       && true_regnum (operands[1]) == AX_REG
       && true_regnum (operands[2]) == DX_REG)
     {
     emit_move_insn (operands[3], operands[1]);
 
   /* Generate a cltd if possible and doing so it profitable.  */
-  if ((optimize_size || TARGET_USE_CLTD)
+  if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
       && true_regnum (operands[3]) == AX_REG)
     {
       emit_insn (gen_ashrsi3_31 (operands[4], operands[3], GEN_INT (31)));
   [(set (match_operand:DF 0 "register_operand" "")
         (float_extend:DF
          (match_operand:SF 1 "nonimmediate_operand" "")))]
-  "(TARGET_USE_VECTOR_CONVERTS || TARGET_GENERIC) && !optimize_size
+  "TARGET_USE_VECTOR_FP_CONVERTS
+   && optimize_insn_for_speed_p ()
    && reload_completed && SSE_REG_P (operands[0])"
    [(set (match_dup 2)
         (float_extend:V2DF
       return output_387_reg_move (insn, operands);
 
     case 2:
-      return "cvtss2sd\t{%1, %0|%0, %1}";
+      return "%vcvtss2sd\t{%1, %d0|%d0, %1}";
 
     default:
       gcc_unreachable ();
     }
 }
   [(set_attr "type" "fmov,fmov,ssecvt")
+   (set_attr "prefix" "orig,orig,maybe_vex")
    (set_attr "mode" "SF,XF,DF")])
 
 (define_insn "*extendsfdf2_sse"
   [(set (match_operand:DF 0 "nonimmediate_operand" "=x")
         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "xm")))]
   "TARGET_SSE2 && TARGET_SSE_MATH"
-  "cvtss2sd\t{%1, %0|%0, %1}"
+  "%vcvtss2sd\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "DF")])
 
 (define_insn "*extendsfdf2_i387"
   [(set (match_operand:SF 0 "register_operand" "")
         (float_truncate:SF
          (match_operand:DF 1 "nonimmediate_operand" "")))]
-  "(TARGET_USE_VECTOR_CONVERTS || TARGET_GENERIC) && !optimize_size
+  "TARGET_USE_VECTOR_FP_CONVERTS
+   && optimize_insn_for_speed_p ()
    && reload_completed && SSE_REG_P (operands[0])"
    [(set (match_dup 2)
         (vec_concat:V4SF
     case 0:
       return output_387_reg_move (insn, operands);
     case 1:
-      return "cvtsd2ss\t{%1, %0|%0, %1}";
+      return "%vcvtsd2ss\t{%1, %d0|%d0, %1}";
     default:
       gcc_unreachable ();
     }
 }
   [(set_attr "type" "fmov,ssecvt")
+   (set_attr "prefix" "orig,maybe_vex")
    (set_attr "mode" "SF")])
 
 ;; Yes, this one doesn't depend on flag_unsafe_math_optimizations,
         (float_truncate:SF
           (match_operand:DF 1 "nonimmediate_operand" "xm")))]
   "TARGET_SSE2 && TARGET_SSE_MATH"
-  "cvtsd2ss\t{%1, %0|%0, %1}"
+  "%vcvtsd2ss\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "SF")])
 
 (define_insn "*truncdfsf_fast_i387"
     case 1:
       return "#";
     case 2:
-      return "cvtsd2ss\t{%1, %0|%0, %1}";
+      return "%vcvtsd2ss\t{%1, %d0|%d0, %1}";
     default:
       gcc_unreachable ();
     }
 }
   [(set_attr "type" "fmov,multi,ssecvt")
    (set_attr "unit" "*,i387,*")
+   (set_attr "prefix" "orig,orig,maybe_vex")
    (set_attr "mode" "SF")])
 
 (define_insn "*truncdfsf_i387"
    (use (match_operand:<ssevecmode> 4  "nonimmediate_operand" "m,x"))
    (clobber (match_scratch:<ssevecmode> 1 "=x,&x"))
    (clobber (match_scratch:<ssevecmode> 2 "=x,x"))]
-  "!TARGET_64BIT && TARGET_SSE2 && TARGET_SSE_MATH && !optimize_size"
+  "!TARGET_64BIT && TARGET_SSE2 && TARGET_SSE_MATH
+   && optimize_function_for_speed_p (cfun)"
   "#"
   "&& reload_completed"
   [(const_int 0)]
        (fix:DI (match_operand:MODEF 1 "nonimmediate_operand" "x,m")))]
   "TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode)
    && (!TARGET_FISTTP || TARGET_SSE_MATH)"
-  "cvtts<ssemodefsuffix>2si{q}\t{%1, %0|%0, %1}"
+  "%vcvtts<ssemodefsuffix>2si{q}\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")])
        (fix:SI (match_operand:MODEF 1 "nonimmediate_operand" "x,m")))]
   "SSE_FLOAT_MODE_P (<MODE>mode)
    && (!TARGET_FISTTP || TARGET_SSE_MATH)"
-  "cvtts<ssemodefsuffix>2si\t{%1, %0|%0, %1}"
+  "%vcvtts<ssemodefsuffix>2si\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")])
   [(match_scratch:DF 2 "Y2")
    (set (match_operand:SSEMODEI24 0 "register_operand" "")
        (fix:SSEMODEI24 (match_operand:DF 1 "memory_operand" "")))]
-  "TARGET_AVOID_VECTOR_DECODE && !optimize_size"
+  "TARGET_AVOID_VECTOR_DECODE && optimize_insn_for_speed_p ()"
   [(set (match_dup 2) (match_dup 1))
    (set (match_dup 0) (fix:SSEMODEI24 (match_dup 2)))]
   "")
   [(match_scratch:SF 2 "x")
    (set (match_operand:SSEMODEI24 0 "register_operand" "")
        (fix:SSEMODEI24 (match_operand:SF 1 "memory_operand" "")))]
-  "TARGET_AVOID_VECTOR_DECODE && !optimize_size"
+  "TARGET_AVOID_VECTOR_DECODE && optimize_insn_for_speed_p ()"
   [(set (match_dup 2) (match_dup 1))
    (set (match_dup 0) (fix:SSEMODEI24 (match_dup 2)))]
   "")
     || ((<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
        && SSE_FLOAT_MODE_P (<X87MODEF:MODE>mode) && TARGET_SSE_MATH
        && ((<SSEMODEI24:MODE>mode == SImode
-            && TARGET_SSE2 && TARGET_USE_VECTOR_CONVERTS && !optimize_size
+            && TARGET_SSE2 && TARGET_USE_VECTOR_CONVERTS
+            && optimize_function_for_speed_p (cfun)
             && flag_trapping_math)
-           || !(TARGET_INTER_UNIT_CONVERSIONS || optimize_size))))
+           || !(TARGET_INTER_UNIT_CONVERSIONS
+                || optimize_function_for_size_p (cfun)))))
    && !(reload_completed || reload_in_progress)"
   "#"
   "&& 1"
 
   /* Avoid store forwarding (partial memory) stall penalty
      by passing DImode value through XMM registers.  */
-  if (<SSEMODEI24:MODE>mode == DImode && !TARGET_64BIT 
-      && TARGET_80387 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES 
-      && !optimize_size)
+  if (<SSEMODEI24:MODE>mode == DImode && !TARGET_64BIT
+      && TARGET_80387 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES
+      && optimize_function_for_speed_p (cfun))
     {
       emit_insn (gen_floatdi<X87MODEF:mode>2_i387_with_xmm (operands[0],
                                                            operands[1],
          (match_operand:SI 1 "nonimmediate_operand" "m,?r,r,m,!x")))
    (clobber (match_operand:SI 2 "memory_operand" "=X,m,m,X,m"))]
   "TARGET_SSE2 && TARGET_MIX_SSE_I387
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size"
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "fmov,multi,sseicvt,sseicvt,sseicvt")
    (set_attr "mode" "<MODE>,<MODE>,<MODE>,<MODE>,<ssevecmode>")
   [(set (match_operand:MODEF 0 "register_operand" "=f,x")
        (float:MODEF (match_operand:SI 1 "memory_operand" "m,m")))]
   "TARGET_SSE2 && TARGET_MIX_SSE_I387
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size"
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)"
   "@
    fild%z1\t%1
    #"
    (clobber (match_operand:SSEMODEI24 2 "memory_operand" ""))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_MIX_SSE_I387
-   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_size)
+   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
          (match_operand:SSEMODEI24 1 "nonimmediate_operand" "m,r,m")))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_MIX_SSE_I387
-   && (TARGET_INTER_UNIT_CONVERSIONS || optimize_size)"
+   && (TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))"
   "@
    fild%z1\t%1
-   cvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %0|%0, %1}
-   cvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %0|%0, %1}"
+   %vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}
+   %vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "fmov,sseicvt,sseicvt")
+   (set_attr "prefix" "orig,maybe_vex,maybe_vex")
    (set_attr "mode" "<MODEF:MODE>")
    (set_attr "unit" "i387,*,*")
    (set_attr "athlon_decode" "*,double,direct")
          (match_operand:SSEMODEI24 1 "memory_operand" "m,m")))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_MIX_SSE_I387
-   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_size)"
+   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))"
   "@
    fild%z1\t%1
-   cvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %0|%0, %1}"
+   %vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "fmov,sseicvt")
+   (set_attr "prefix" "orig,maybe_vex")
    (set_attr "mode" "<MODEF:MODE>")
    (set_attr "athlon_decode" "*,direct")
    (set_attr "amdfam10_decode" "*,double")
          (match_operand:SI 1 "nonimmediate_operand" "r,m,!x")))
    (clobber (match_operand:SI 2 "memory_operand" "=m,X,m"))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size"
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "sseicvt")
    (set_attr "mode" "<MODE>,<MODE>,<ssevecmode>")
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (float:MODEF (match_operand:SI 1 "memory_operand" "m")))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size"
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "sseicvt")
    (set_attr "mode" "<MODE>")
        (float:MODEF (match_operand:SI 1 "register_operand" "")))
    (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
        (float:MODEF (match_operand:SI 1 "memory_operand" "")))
    (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
   [(set (match_operand:MODEF 0 "register_operand" "")
        (float:MODEF (match_operand:SI 1 "register_operand" "")))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
     operands[4] = simplify_gen_subreg (V4SImode, operands[1], SImode, 0);
   else
     gcc_unreachable ();
+  emit_insn
+    (gen_sse2_cvtdq2p<ssemodefsuffix> (operands[3], operands[4]));
+  DONE;
 })
 
 (define_split
   [(set (match_operand:MODEF 0 "register_operand" "")
        (float:MODEF (match_operand:SI 1 "memory_operand" "")))]
   "TARGET_SSE2 && TARGET_SSE_MATH
-   && TARGET_USE_VECTOR_CONVERTS && !optimize_size
+   && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
          (match_operand:SSEMODEI24 1 "nonimmediate_operand" "r,m")))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
-   && (TARGET_INTER_UNIT_CONVERSIONS || optimize_size)"
-  "cvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %0|%0, %1}"
+   && (TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))"
+  "%vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODEF:MODE>")
    (set_attr "athlon_decode" "double,direct")
    (set_attr "amdfam10_decode" "vector,double")
    (clobber (match_operand:SSEMODEI24 2 "memory_operand" ""))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
-   && (TARGET_INTER_UNIT_CONVERSIONS || optimize_size)
+   && (TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
          (match_operand:SSEMODEI24 1 "memory_operand" "m")))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
-   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_size)"
-  "cvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %0|%0, %1}"
+   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))"
+  "%vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODEF:MODE>")
    (set_attr "athlon_decode" "direct")
    (set_attr "amdfam10_decode" "double")
    (clobber (match_operand:SSEMODEI24 2 "memory_operand" ""))]
   "(<SSEMODEI24:MODE>mode != DImode || TARGET_64BIT)
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
-   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_size)
+   && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))
    && reload_completed
    && (SSE_REG_P (operands[0])
        || (GET_CODE (operands[0]) == SUBREG
    (clobber (match_scratch:V4SI 4 "=X,x"))
    (clobber (match_operand:DI 2 "memory_operand" "=X,m"))]
   "TARGET_80387 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES
-   && !TARGET_64BIT && !optimize_size"
+   && !TARGET_64BIT && optimize_function_for_speed_p (cfun)"
   "#"
   [(set_attr "type" "multi")
    (set_attr "mode" "<X87MODEF:MODE>")
    (clobber (match_scratch:V4SI 4 ""))
    (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES
-   && !TARGET_64BIT && !optimize_size
+   && !TARGET_64BIT && optimize_function_for_speed_p (cfun)
    && reload_completed
    && FP_REG_P (operands[0])"
   [(set (match_dup 2) (match_dup 3))
    (clobber (match_scratch:V4SI 4 ""))
    (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES
-   && !TARGET_64BIT && !optimize_size
+   && !TARGET_64BIT && optimize_function_for_speed_p (cfun)
    && reload_completed
    && FP_REG_P (operands[0])"
   [(set (match_dup 0) (float:X87MODEF (match_dup 1)))]
              (match_operand 3 "immediate_operand" "i")))]
   "(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
     || (TARGET_64BIT && GET_MODE (operands[0]) == SImode))
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && GET_MODE (operands[0]) == GET_MODE (operands[1])
    && GET_MODE (operands[0]) == GET_MODE (operands[2])
    && (GET_MODE (operands[0]) == GET_MODE (operands[3])
              (match_operand 3 "nonmemory_operand" "ri")))]
   "(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
     || (TARGET_64BIT && GET_MODE (operands[0]) == SImode))
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && GET_MODE (operands[0]) == GET_MODE (operands[1])
    && (GET_MODE (operands[0]) == GET_MODE (operands[3])
        || GET_MODE (operands[3]) == VOIDmode)"
              (match_operand 4 "immediate_operand" "i")))]
   "(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
     || (TARGET_64BIT && GET_MODE (operands[0]) == SImode))
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && GET_MODE (operands[0]) == GET_MODE (operands[1])
    && GET_MODE (operands[0]) == GET_MODE (operands[3])"
   "#"
        (plus:QI (match_dup 0)
                 (match_operand:QI 1 "general_operand" "qn,qnm")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
 {
   switch (get_attr_type (insn))
        (minus:QI (match_dup 0)
                  (match_operand:QI 1 "general_operand" "qn,qm")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "sub{b}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu1")
    (set (match_operand:DI 1 "register_operand" "=&d,&d")
        (mod:DI (match_dup 2) (match_dup 3)))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_64BIT && !optimize_size && !TARGET_USE_CLTD"
+  "TARGET_64BIT && optimize_function_for_speed_p (cfun) && !TARGET_USE_CLTD"
   "#"
   [(set_attr "type" "multi")])
 
    (set (match_operand:DI 1 "register_operand" "=&d")
        (mod:DI (match_dup 2) (match_dup 3)))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_64BIT && (optimize_size || TARGET_USE_CLTD)"
+  "TARGET_64BIT && (optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)"
   "#"
   [(set_attr "type" "multi")])
 
              (clobber (reg:CC FLAGS_REG))])]
 {
   /* Avoid use of cltd in favor of a mov+shift.  */
-  if (!TARGET_USE_CLTD && !optimize_size)
+  if (!TARGET_USE_CLTD && optimize_function_for_speed_p (cfun))
     {
       if (true_regnum (operands[1]))
         emit_move_insn (operands[0], operands[1]);
    (set (match_operand:SI 1 "register_operand" "=&d,&d")
        (mod:SI (match_dup 2) (match_dup 3)))
    (clobber (reg:CC FLAGS_REG))]
-  "!optimize_size && !TARGET_USE_CLTD"
+  "optimize_function_for_speed_p (cfun) && !TARGET_USE_CLTD"
   "#"
   [(set_attr "type" "multi")])
 
    (set (match_operand:SI 1 "register_operand" "=&d")
        (mod:SI (match_dup 2) (match_dup 3)))
    (clobber (reg:CC FLAGS_REG))]
-  "optimize_size || TARGET_USE_CLTD"
+  "optimize_function_for_size_p (cfun) || TARGET_USE_CLTD"
   "#"
   [(set_attr "type" "multi")])
 
              (clobber (reg:CC FLAGS_REG))])]
 {
   /* Avoid use of cltd in favor of a mov+shift.  */
-  if (!TARGET_USE_CLTD && !optimize_size)
+  if (!TARGET_USE_CLTD && optimize_function_for_speed_p (cfun))
     {
       if (true_regnum (operands[1]))
         emit_move_insn (operands[0], operands[1]);
        (and (match_dup 0)
             (const_int -65536)))
    (clobber (reg:CC FLAGS_REG))]
-  "optimize_size || (TARGET_FAST_PREFIX && !TARGET_PARTIAL_REG_STALL)"
+  "optimize_function_for_size_p (cfun) || (TARGET_FAST_PREFIX && !TARGET_PARTIAL_REG_STALL)"
   [(set (strict_low_part (match_dup 1)) (const_int 0))]
   "operands[1] = gen_lowpart (HImode, operands[0]);")
 
        (and (match_dup 0)
             (const_int -256)))
    (clobber (reg:CC FLAGS_REG))]
-  "(optimize_size || !TARGET_PARTIAL_REG_STALL) && reload_completed"
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_REG_STALL) && reload_completed"
   [(set (strict_low_part (match_dup 1)) (const_int 0))]
   "operands[1] = gen_lowpart (QImode, operands[0]);")
 
        (and (match_dup 0)
             (const_int -65281)))
    (clobber (reg:CC FLAGS_REG))]
-  "(optimize_size || !TARGET_PARTIAL_REG_STALL) && reload_completed"
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_REG_STALL) && reload_completed"
   [(parallel [(set (zero_extract:SI (match_dup 0)
                                    (const_int 8)
                                    (const_int 8))
        (and:QI (match_dup 0)
                (match_operand:QI 1 "general_operand" "qn,qmn")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "and{b}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu1")
                 (const_int 0)))
    (set (strict_low_part (match_dup 0))
        (and:QI (match_dup 0) (match_dup 1)))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCNOmode)
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "and{b}\t{%1, %0|%0, %1}"
    (clobber (reg:CC FLAGS_REG))]
    "reload_completed
     && QI_REG_P (operands[0])
-    && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+    && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
     && !(~INTVAL (operands[2]) & ~(255 << 8))
     && GET_MODE (operands[0]) != QImode"
   [(parallel [(set (zero_extract:SI (match_dup 0) (const_int 8) (const_int 8))
    (clobber (reg:CC FLAGS_REG))]
    "reload_completed
     && ANY_QI_REG_P (operands[0])
-    && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+    && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
     && !(~INTVAL (operands[2]) & ~255)
     && !(INTVAL (operands[2]) & 128)
     && GET_MODE (operands[0]) != QImode"
        (ior:QI (match_dup 0)
                (match_operand:QI 1 "general_operand" "qmn,qn")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "or{b}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu1")
                 (const_int 0)))
    (set (strict_low_part (match_dup 0))
        (ior:QI (match_dup 0) (match_dup 1)))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCNOmode)
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "or{b}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu")
    (set_attr "mode" "QI")])
 
-(define_insn "iorqi_ext_0"
+(define_insn "*iorqi_ext_0"
   [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "=Q")
                         (const_int 8)
                         (const_int 8))
            (const_int 8))
          (match_operand 2 "const_int_operand" "n")))
    (clobber (reg:CC FLAGS_REG))]
-  "(!TARGET_PARTIAL_REG_STALL || optimize_size)"
+  "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "or{b}\t{%2, %h0|%h0, %2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "1")
            (match_operand:QI 2 "general_operand" "Qm"))))
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)"
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "or{b}\t{%2, %h0|%h0, %2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "0")
            (match_operand 2 "ext_register_operand" "Q"))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)"
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "or{b}\t{%2, %h0|%h0, %2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "0")
                           (const_int 8)
                           (const_int 8))))
    (clobber (reg:CC FLAGS_REG))]
-  "(!TARGET_PARTIAL_REG_STALL || optimize_size)"
+  "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "ior{b}\t{%h2, %h0|%h0, %h2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "0")
    (clobber (reg:CC FLAGS_REG))]
    "reload_completed
     && QI_REG_P (operands[0])
-    && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+    && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
     && !(INTVAL (operands[2]) & ~(255 << 8))
     && GET_MODE (operands[0]) != QImode"
   [(parallel [(set (zero_extract:SI (match_dup 0) (const_int 8) (const_int 8))
    (clobber (reg:CC FLAGS_REG))]
    "reload_completed
     && ANY_QI_REG_P (operands[0])
-    && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+    && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
     && !(INTVAL (operands[2]) & ~255)
     && (INTVAL (operands[2]) & 128)
     && GET_MODE (operands[0]) != QImode"
        (xor:QI (match_dup 0)
                (match_operand:QI 1 "general_operand" "qn,qmn")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "xor{b}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu1")
    (set_attr "mode" "QI")])
 
-(define_insn "xorqi_ext_0"
+(define_insn "*xorqi_ext_0"
   [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "=Q")
                         (const_int 8)
                         (const_int 8))
            (const_int 8))
          (match_operand 2 "const_int_operand" "n")))
    (clobber (reg:CC FLAGS_REG))]
-  "(!TARGET_PARTIAL_REG_STALL || optimize_size)"
+  "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "xor{b}\t{%2, %h0|%h0, %2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "1")
            (match_operand:QI 2 "general_operand" "Qm"))))
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)"
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "xor{b}\t{%2, %h0|%h0, %2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "0")
            (match_operand 2 "ext_register_operand" "Q"))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (!TARGET_PARTIAL_REG_STALL || optimize_size)"
+   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "xor{b}\t{%2, %h0|%h0, %2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "0")
                           (const_int 8)
                           (const_int 8))))
    (clobber (reg:CC FLAGS_REG))]
-  "(!TARGET_PARTIAL_REG_STALL || optimize_size)"
+  "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))"
   "xor{b}\t{%h2, %h0|%h0, %h2}"
   [(set_attr "type" "alu")
    (set_attr "length_immediate" "0")
                 (const_int 0)))
    (set (strict_low_part (match_dup 0))
        (xor:QI (match_dup 0) (match_dup 1)))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCNOmode)
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "xor{b}\t{%1, %0|%0, %1}"
    (clobber (reg:CC FLAGS_REG))]
    "reload_completed
     && QI_REG_P (operands[0])
-    && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+    && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
     && !(INTVAL (operands[2]) & ~(255 << 8))
     && GET_MODE (operands[0]) != QImode"
   [(parallel [(set (zero_extract:SI (match_dup 0) (const_int 8) (const_int 8))
    (clobber (reg:CC FLAGS_REG))]
    "reload_completed
     && ANY_QI_REG_P (operands[0])
-    && (!TARGET_PARTIAL_REG_STALL || optimize_size)
+    && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
     && !(INTVAL (operands[2]) & ~255)
     && (INTVAL (operands[2]) & 128)
     && GET_MODE (operands[0]) != QImode"
 ;; This pattern must be defined before *ashlti3_1 to prevent
 ;; combine pass from converting sse2_ashlti3 to *ashlti3_1.
 
+(define_insn "*avx_ashlti3"
+  [(set (match_operand:TI 0 "register_operand" "=x")
+       (ashift:TI (match_operand:TI 1 "register_operand" "x")
+                  (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
+  "TARGET_AVX"
+{
+  operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
+  return "vpslldq\t{%2, %1, %0|%0, %1, %2}";
+}
+  [(set_attr "type" "sseishft")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "TI")])
+
 (define_insn "sse2_ashlti3"
   [(set (match_operand:TI 0 "register_operand" "=x")
        (ashift:TI (match_operand:TI 1 "register_operand" "0")
       if (REG_P (operands[2]))
        return "sal{q}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{q}\t%0";
       else
        return "sal{q}\t{%2, %0|%0, %2}";
    (set (match_operand:DI 0 "nonimmediate_operand" "=rm")
        (ashift:DI (match_dup 1) (match_dup 2)))]
   "TARGET_64BIT
-   && (optimize_size
+   && (optimize_function_for_size_p (cfun)
        || !TARGET_PARTIAL_FLAG_REG_STALL
        || (operands[2] == const1_rtx
           && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{q}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{q}\t%0";
       else
        return "sal{q}\t{%2, %0|%0, %2}";
          (const_int 0)))
    (clobber (match_scratch:DI 0 "=r"))]
   "TARGET_64BIT
-   && (optimize_size
+   && (optimize_function_for_size_p (cfun)
        || !TARGET_PARTIAL_FLAG_REG_STALL
        || (operands[2] == const1_rtx
           && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{q}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{q}\t%0";
       else
        return "sal{q}\t{%2, %0|%0, %2}";
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{l}\t%0";
       else
        return "sal{l}\t{%2, %0|%0, %2}";
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %k0|%k0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{l}\t%k0";
       else
        return "sal{l}\t{%2, %k0|%k0, %2}";
          (const_int 0)))
    (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
        (ashift:SI (match_dup 1) (match_dup 2)))]
-   "(optimize_size
+   "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
      || (operands[2] == const1_rtx
         && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{l}\t%0";
       else
        return "sal{l}\t{%2, %0|%0, %2}";
                     (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:SI 0 "=r"))]
-  "(optimize_size
+  "(optimize_function_for_size_p (cfun)
     || !TARGET_PARTIAL_FLAG_REG_STALL
     || (operands[2] == const1_rtx
        && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{l}\t%0";
       else
        return "sal{l}\t{%2, %0|%0, %2}";
    (set (match_operand:DI 0 "register_operand" "=r")
        (zero_extend:DI (ashift:SI (match_dup 1) (match_dup 2))))]
   "TARGET_64BIT
-   && (optimize_size
+   && (optimize_function_for_size_p (cfun)
        || !TARGET_PARTIAL_FLAG_REG_STALL
        || (operands[2] == const1_rtx
           && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{l}\t{%b2, %k0|%k0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{l}\t%k0";
       else
        return "sal{l}\t{%2, %k0|%k0, %2}";
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{w}\t%0";
       else
        return "sal{w}\t{%2, %0|%0, %2}";
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{w}\t%0";
       else
        return "sal{w}\t{%2, %0|%0, %2}";
          (const_int 0)))
    (set (match_operand:HI 0 "nonimmediate_operand" "=rm")
        (ashift:HI (match_dup 1) (match_dup 2)))]
-  "(optimize_size
+  "(optimize_function_for_size_p (cfun)
     || !TARGET_PARTIAL_FLAG_REG_STALL
     || (operands[2] == const1_rtx
        && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{w}\t%0";
       else
        return "sal{w}\t{%2, %0|%0, %2}";
                     (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:HI 0 "=r"))]
-  "(optimize_size
+  "(optimize_function_for_size_p (cfun)
     || !TARGET_PARTIAL_FLAG_REG_STALL
     || (operands[2] == const1_rtx
        && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{w}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{w}\t%0";
       else
        return "sal{w}\t{%2, %0|%0, %2}";
            return "sal{b}\t{%b2, %0|%0, %b2}";
        }
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        {
          if (get_attr_mode (insn) == MODE_SI)
            return "sal{l}\t%0";
            return "sal{b}\t{%b2, %0|%0, %b2}";
        }
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        {
          if (get_attr_mode (insn) == MODE_SI)
            return "sal{l}\t%0";
          (const_int 0)))
    (set (match_operand:QI 0 "nonimmediate_operand" "=qm")
        (ashift:QI (match_dup 1) (match_dup 2)))]
-  "(optimize_size
+  "(optimize_function_for_size_p (cfun)
     || !TARGET_PARTIAL_FLAG_REG_STALL
     || (operands[2] == const1_rtx
        && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{b}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{b}\t%0";
       else
        return "sal{b}\t{%2, %0|%0, %2}";
                     (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:QI 0 "=q"))]
-  "(optimize_size
+  "(optimize_function_for_size_p (cfun)
     || !TARGET_PARTIAL_FLAG_REG_STALL
     || (operands[2] == const1_rtx
        && (TARGET_SHIFT1
       if (REG_P (operands[2]))
        return "sal{b}\t{%b2, %0|%0, %b2}";
       else if (operands[2] == const1_rtx
-              && (TARGET_SHIFT1 || optimize_size))
+              && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
        return "sal{b}\t%0";
       else
        return "sal{b}\t{%2, %0|%0, %2}";
                     (match_operand:DI 2 "const_int_operand" "i,i")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT && INTVAL (operands[2]) == 63
-   && (TARGET_USE_CLTD || optimize_size)
+   && (TARGET_USE_CLTD || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, DImode, operands)"
   "@
    {cqto|cqo}
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, DImode, operands)"
   "sar{q}\t%0"
   [(set_attr "type" "ishift")
    (set (match_operand:DI 0 "nonimmediate_operand" "=rm")
        (ashiftrt:DI (match_dup 1) (match_dup 2)))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, DImode, operands)"
   "sar{q}\t%0"
          (const_int 0)))
    (clobber (match_scratch:DI 0 "=r"))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, DImode, operands)"
   "sar{q}\t%0"
    (set (match_operand:DI 0 "nonimmediate_operand" "=rm")
        (ashiftrt:DI (match_dup 1) (match_dup 2)))]
   "TARGET_64BIT
-   && (optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+   && (optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, DImode, operands)"
   "sar{q}\t{%2, %0|%0, %2}"
          (const_int 0)))
    (clobber (match_scratch:DI 0 "=r"))]
   "TARGET_64BIT
-   && (optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+   && (optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, DImode, operands)"
   "sar{q}\t{%2, %0|%0, %2}"
   DONE;
 })
 
-(define_insn "ashrsi3_31"
+(define_expand "ashrsi3_31"
+  [(parallel [(set (match_operand:SI 0 "nonimmediate_operand" "=*d,rm")
+                  (ashiftrt:SI (match_operand:SI 1 "nonimmediate_operand" "*a,0")
+                               (match_operand:SI 2 "const_int_operand" "i,i")))
+              (clobber (reg:CC FLAGS_REG))])]
+  "")
+
+(define_insn "*ashrsi3_31"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=*d,rm")
        (ashiftrt:SI (match_operand:SI 1 "nonimmediate_operand" "*a,0")
                     (match_operand:SI 2 "const_int_operand" "i,i")))
    (clobber (reg:CC FLAGS_REG))]
-  "INTVAL (operands[2]) == 31 && (TARGET_USE_CLTD || optimize_size)
+  "INTVAL (operands[2]) == 31
+   && (TARGET_USE_CLTD || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "@
    {cltd|cdq}
        (zero_extend:DI (ashiftrt:SI (match_operand:SI 1 "register_operand" "*a,0")
                                     (match_operand:SI 2 "const_int_operand" "i,i"))))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_64BIT && (TARGET_USE_CLTD || optimize_size)
+  "TARGET_64BIT && (TARGET_USE_CLTD || optimize_function_for_size_p (cfun))
    && INTVAL (operands[2]) == 31
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "@
        (ashiftrt:SI (match_operand:SI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t%0"
   [(set_attr "type" "ishift")
                                     (match_operand:QI 2 "const1_operand" ""))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t%k0"
   [(set_attr "type" "ishift")
          (const_int 0)))
    (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
        (ashiftrt:SI (match_dup 1) (match_dup 2)))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t%0"
                       (match_operand:QI 2 "const1_operand" ""))
          (const_int 0)))
    (clobber (match_scratch:SI 0 "=r"))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t%0"
    (set (match_operand:DI 0 "register_operand" "=r")
        (zero_extend:DI (ashiftrt:SI (match_dup 1) (match_dup 2))))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCmode)
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t%k0"
          (const_int 0)))
    (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
        (ashiftrt:SI (match_dup 1) (match_dup 2)))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t{%2, %0|%0, %2}"
                       (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:SI 0 "=r"))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t{%2, %0|%0, %2}"
    (set (match_operand:DI 0 "register_operand" "=r")
        (zero_extend:DI (ashiftrt:SI (match_dup 1) (match_dup 2))))]
   "TARGET_64BIT
-   && (optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+   && (optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
   "sar{l}\t{%2, %k0|%k0, %2}"
        (ashiftrt:HI (match_operand:HI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, HImode, operands)"
   "sar{w}\t%0"
   [(set_attr "type" "ishift")
          (const_int 0)))
    (set (match_operand:HI 0 "nonimmediate_operand" "=rm")
        (ashiftrt:HI (match_dup 1) (match_dup 2)))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, HImode, operands)"
   "sar{w}\t%0"
                       (match_operand:QI 2 "const1_operand" ""))
          (const_int 0)))
    (clobber (match_scratch:HI 0 "=r"))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, HImode, operands)"
   "sar{w}\t%0"
          (const_int 0)))
    (set (match_operand:HI 0 "nonimmediate_operand" "=rm")
        (ashiftrt:HI (match_dup 1) (match_dup 2)))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, HImode, operands)"
   "sar{w}\t{%2, %0|%0, %2}"
                       (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:HI 0 "=r"))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, HImode, operands)"
   "sar{w}\t{%2, %0|%0, %2}"
        (ashiftrt:QI (match_operand:QI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
   "sar{b}\t%0"
   [(set_attr "type" "ishift")
        (ashiftrt:QI (match_dup 0)
                     (match_operand:QI 1 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
-   && (TARGET_SHIFT1 || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
   "sar{b}\t%0"
   [(set_attr "type" "ishift1")
        (ashiftrt:QI (match_dup 0)
                     (match_operand:QI 1 "nonmemory_operand" "I,c")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "@
    sar{b}\t{%1, %0|%0, %1}
          (const_int 0)))
    (set (match_operand:QI 0 "nonimmediate_operand" "=qm")
        (ashiftrt:QI (match_dup 1) (match_dup 2)))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
   "sar{b}\t%0"
                       (match_operand:QI 2 "const1_operand" ""))
          (const_int 0)))
    (clobber (match_scratch:QI 0 "=q"))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
   "sar{b}\t%0"
          (const_int 0)))
    (set (match_operand:QI 0 "nonimmediate_operand" "=qm")
        (ashiftrt:QI (match_dup 1) (match_dup 2)))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
   "sar{b}\t{%2, %0|%0, %2}"
                       (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:QI 0 "=q"))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
   "sar{b}\t{%2, %0|%0, %2}"
 ;; This pattern must be defined before *lshrti3_1 to prevent
 ;; combine pass from converting sse2_lshrti3 to *lshrti3_1.
 
+(define_insn "*avx_lshrti3"
+  [(set (match_operand:TI 0 "register_operand" "=x")
+       (lshiftrt:TI (match_operand:TI 1 "register_operand" "x")
+                    (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
+  "TARGET_AVX"
+{
+  operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
+  return "vpsrldq\t{%2, %1, %0|%0, %1, %2}";
+}
+  [(set_attr "type" "sseishft")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "TI")])
+
 (define_insn "sse2_lshrti3"
   [(set (match_operand:TI 0 "register_operand" "=x")
        (lshiftrt:TI (match_operand:TI 1 "register_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{q}\t%0"
   [(set_attr "type" "ishift")
    (set (match_operand:DI 0 "nonimmediate_operand" "=rm")
        (lshiftrt:DI (match_dup 1) (match_dup 2)))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{q}\t%0"
          (const_int 0)))
    (clobber (match_scratch:DI 0 "=r"))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{q}\t%0"
    (set (match_operand:DI 0 "nonimmediate_operand" "=rm")
        (lshiftrt:DI (match_dup 1) (match_dup 2)))]
   "TARGET_64BIT
-   && (optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+   && (optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{q}\t{%2, %0|%0, %2}"
          (const_int 0)))
    (clobber (match_scratch:DI 0 "=r"))]
   "TARGET_64BIT
-   && (optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+   && (optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{q}\t{%2, %0|%0, %2}"
        (lshiftrt:SI (match_operand:SI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t%0"
   [(set_attr "type" "ishift")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t%k0"
   [(set_attr "type" "ishift")
          (const_int 0)))
    (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
        (lshiftrt:SI (match_dup 1) (match_dup 2)))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t%0"
                       (match_operand:QI 2 "const1_operand" ""))
          (const_int 0)))
    (clobber (match_scratch:SI 0 "=r"))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t%0"
    (set (match_operand:DI 0 "register_operand" "=r")
        (lshiftrt:DI (zero_extend:DI (match_dup 1)) (match_dup 2)))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t%k0"
          (const_int 0)))
    (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
        (lshiftrt:SI (match_dup 1) (match_dup 2)))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t{%2, %0|%0, %2}"
                     (match_operand:QI 2 "const_1_to_31_operand" "I"))
         (const_int 0)))
    (clobber (match_scratch:SI 0 "=r"))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t{%2, %0|%0, %2}"
    (set (match_operand:DI 0 "register_operand" "=r")
        (lshiftrt:DI (zero_extend:DI (match_dup 1)) (match_dup 2)))]
   "TARGET_64BIT
-   && (optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+   && (optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{l}\t{%2, %k0|%k0, %2}"
        (lshiftrt:HI (match_operand:HI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{w}\t%0"
   [(set_attr "type" "ishift")
          (const_int 0)))
    (set (match_operand:HI 0 "nonimmediate_operand" "=rm")
        (lshiftrt:HI (match_dup 1) (match_dup 2)))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{w}\t%0"
                       (match_operand:QI 2 "const1_operand" ""))
          (const_int 0)))
    (clobber (match_scratch:HI 0 "=r"))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{w}\t%0"
          (const_int 0)))
    (set (match_operand:HI 0 "nonimmediate_operand" "=rm")
        (lshiftrt:HI (match_dup 1) (match_dup 2)))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{w}\t{%2, %0|%0, %2}"
                       (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:HI 0 "=r"))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
   "shr{w}\t{%2, %0|%0, %2}"
        (lshiftrt:QI (match_operand:QI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (LSHIFTRT, QImode, operands)"
   "shr{b}\t%0"
   [(set_attr "type" "ishift")
        (lshiftrt:QI (match_dup 0)
                     (match_operand:QI 1 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
-   && (TARGET_SHIFT1 || optimize_size)"
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))"
   "shr{b}\t%0"
   [(set_attr "type" "ishift1")
    (set (attr "length")
        (lshiftrt:QI (match_dup 0)
                     (match_operand:QI 1 "nonmemory_operand" "I,c")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "@
    shr{b}\t{%1, %0|%0, %1}
          (const_int 0)))
    (set (match_operand:QI 0 "nonimmediate_operand" "=qm")
        (lshiftrt:QI (match_dup 1) (match_dup 2)))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, QImode, operands)"
   "shr{b}\t%0"
                       (match_operand:QI 2 "const1_operand" ""))
          (const_int 0)))
    (clobber (match_scratch:QI 0 "=q"))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, QImode, operands)"
   "shr{b}\t%0"
          (const_int 0)))
    (set (match_operand:QI 0 "nonimmediate_operand" "=qm")
        (lshiftrt:QI (match_dup 1) (match_dup 2)))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, QImode, operands)"
   "shr{b}\t{%2, %0|%0, %2}"
                       (match_operand:QI 2 "const_1_to_31_operand" "I"))
          (const_int 0)))
    (clobber (match_scratch:QI 0 "=q"))]
-  "(optimize_size || !TARGET_PARTIAL_FLAG_REG_STALL)
+  "(optimize_function_for_size_p (cfun) || !TARGET_PARTIAL_FLAG_REG_STALL)
    && ix86_match_ccmode (insn, CCGOCmode)
    && ix86_binary_operator_ok (LSHIFTRT, QImode, operands)"
   "shr{b}\t{%2, %0|%0, %2}"
                   (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATE, DImode, operands)"
   "rol{q}\t%0"
   [(set_attr "type" "rotate")
        (rotate:SI (match_operand:SI 1 "nonimmediate_operand" "0")
                   (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATE, SImode, operands)"
   "rol{l}\t%0"
   [(set_attr "type" "rotate")
                     (match_operand:QI 2 "const1_operand" ""))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATE, SImode, operands)"
   "rol{l}\t%k0"
   [(set_attr "type" "rotate")
        (rotate:HI (match_operand:HI 1 "nonimmediate_operand" "0")
                   (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATE, HImode, operands)"
   "rol{w}\t%0"
   [(set_attr "type" "rotate")
        (rotate:QI (match_dup 0)
                   (match_operand:QI 1 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
-   && (TARGET_SHIFT1 || optimize_size)"
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))"
   "rol{b}\t%0"
   [(set_attr "type" "rotate1")
    (set (attr "length")
        (rotate:QI (match_operand:QI 1 "nonimmediate_operand" "0")
                   (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATE, QImode, operands)"
   "rol{b}\t%0"
   [(set_attr "type" "rotate")
        (rotate:QI (match_dup 0)
                   (match_operand:QI 1 "nonmemory_operand" "I,c")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "@
    rol{b}\t{%1, %0|%0, %1}
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATERT, DImode, operands)"
   "ror{q}\t%0"
   [(set_attr "type" "rotate")
        (rotatert:SI (match_operand:SI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATERT, SImode, operands)"
   "ror{l}\t%0"
   [(set_attr "type" "rotate")
                       (match_operand:QI 2 "const1_operand" ""))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT
-   && (TARGET_SHIFT1 || optimize_size)
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATERT, SImode, operands)"
   "ror{l}\t%k0"
   [(set_attr "type" "rotate")
        (rotatert:HI (match_operand:HI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATERT, HImode, operands)"
   "ror{w}\t%0"
   [(set_attr "type" "rotate")
        (rotatert:QI (match_operand:QI 1 "nonimmediate_operand" "0")
                     (match_operand:QI 2 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(TARGET_SHIFT1 || optimize_size)
+  "(TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
    && ix86_binary_operator_ok (ROTATERT, QImode, operands)"
   "ror{b}\t%0"
   [(set_attr "type" "rotate")
        (rotatert:QI (match_dup 0)
                     (match_operand:QI 1 "const1_operand" "")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
-   && (TARGET_SHIFT1 || optimize_size)"
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
+   && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))"
   "ror{b}\t%0"
   [(set_attr "type" "rotate1")
    (set (attr "length")
        (rotatert:QI (match_dup 0)
                     (match_operand:QI 1 "nonmemory_operand" "I,c")))
    (clobber (reg:CC FLAGS_REG))]
-  "(! TARGET_PARTIAL_REG_STALL || optimize_size)
+  "(! TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "@
    ror{b}\t{%1, %0|%0, %1}
            (const_int 1)
            (match_operand:DI 1 "nonmemory_operand" "rN"))
          (const_int 0)))]
-  "TARGET_64BIT && (TARGET_USE_BT || optimize_size)"
+  "TARGET_64BIT && (TARGET_USE_BT || optimize_function_for_size_p (cfun))"
   "bt{q}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu1")])
 
            (const_int 1)
            (match_operand:SI 1 "nonmemory_operand" "rN"))
          (const_int 0)))]
-  "TARGET_USE_BT || optimize_size"
+  "TARGET_USE_BT || optimize_function_for_size_p (cfun)"
   "bt{l}\t{%1, %0|%0, %1}"
   [(set_attr "type" "alu1")])
 \f
 ;; 0xffffffff is NaN, but not in normalized form, so we can't represent
 ;; it directly.
 
+(define_insn "*avx_setcc<mode>"
+  [(set (match_operand:MODEF 0 "register_operand" "=x")
+       (match_operator:MODEF 1 "avx_comparison_float_operator"
+         [(match_operand:MODEF 2 "register_operand" "x")
+          (match_operand:MODEF 3 "nonimmediate_operand" "xm")]))]
+  "TARGET_AVX"
+  "vcmp%D1s<ssemodefsuffix>\t{%3, %2, %0|%0, %2, %3}"
+  [(set_attr "type" "ssecmp")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*sse_setcc<mode>"
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (match_operator:MODEF 1 "sse_comparison_operator"
             (const_int 2)
             (const_int 6)))])
 
-;; ??? Handle alignment requirements for compare and branch fused macro-op;
-;; the branch instruction does not start at a 16-byte boundary or cross
-;; a 16-byte boundary.
-
-(define_insn "*jcc_fused_1"
-  [(set (pc)
-       (if_then_else (match_operator 1 "comparison_operator"
-                       [(match_operand:SWI 2 "register_operand" "<r>")
-                        (match_operand:SWI 3 "const0_operand" "")])
-        (label_ref (match_operand 0 "" ""))
-        (pc)))]
-  "TARGET_FUSE_CMP_AND_BRANCH && !TARGET_64BIT"
-{
-  return "test{<imodesuffix>}\t%2, %2\n\t"
-        "%+j%E1\t%l0\t" ASM_COMMENT_START " fused";
-}
-  [(set_attr "type" "multi")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "*jcc_fused_2"
-  [(set (pc)
-       (if_then_else (match_operator 1 "comparison_operator"
-                       [(match_operand:SWI 2 "register_operand" "<r>")
-                        (match_operand:SWI 3 "const0_operand" "")])
-        (pc)
-        (label_ref (match_operand 0 "" ""))))]
-  "TARGET_FUSE_CMP_AND_BRANCH && !TARGET_64BIT"
-{
-  return "test{<imodesuffix>}\t%2, %2\n\t"
-        "%+j%e1\t%l0\t" ASM_COMMENT_START " fused";
-}
-  [(set_attr "type" "multi")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "*jcc_fused_3"
-  [(set (pc)
-       (if_then_else
-         (match_operator 1 "ix86_comparison_uns_operator"
-           [(match_operand:SWI 2 "nonimmediate_operand" "<r>,m,<r>")
-            (match_operand:SWI 3 "<general_operand>" "<r><i>,<r>,m")])
-        (label_ref (match_operand 0 "" ""))
-        (pc)))]
-  "TARGET_FUSE_CMP_AND_BRANCH && !TARGET_64BIT
-   && !(MEM_P (operands[2])
-       && (MEM_P (operands[3]) || CONST_INT_P (operands[3])))"
-{
-  return "cmp{<imodesuffix>}\t{%3, %2|%2, %3}\n\t"
-        "%+j%E1\t%l0\t" ASM_COMMENT_START " fused";
-}
-  [(set_attr "type" "multi")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "*jcc_fused_4"
-  [(set (pc)
-       (if_then_else
-         (match_operator 1 "ix86_comparison_uns_operator"
-           [(match_operand:SWI 2 "nonimmediate_operand" "<r>,m,<r>")
-            (match_operand:SWI 3 "<general_operand>" "<r><i>,<r>,m")])
-        (pc)
-        (label_ref (match_operand 0 "" ""))))]
-  "TARGET_FUSE_CMP_AND_BRANCH && !TARGET_64BIT
-   && !(MEM_P (operands[2])
-       && (MEM_P (operands[3]) || CONST_INT_P (operands[3])))"
-{
-  return "cmp{<imodesuffix>}\t{%3, %2|%2, %3}\n\t"
-        "%+j%e1\t%l0\t" ASM_COMMENT_START " fused";
-}
-  [(set_attr "type" "multi")
-   (set_attr "mode" "<MODE>")])
-
 ;; In general it is not safe to assume too much about CCmode registers,
 ;; so simplify-rtx stops when it sees a second one.  Under certain
 ;; conditions this is safe on x86, so help combine not create
                             (match_operand:QI 2 "register_operand" "r")))
                         (const_int 0)])
                      (label_ref (match_operand 3 "" ""))
-                     (pc)))]
-  "TARGET_64BIT && (TARGET_USE_BT || optimize_size)"
+                     (pc)))
+   (clobber (reg:CC FLAGS_REG))]
+  "TARGET_64BIT && (TARGET_USE_BT || optimize_function_for_size_p (cfun))"
   "#"
   "&& 1"
   [(set (reg:CCC FLAGS_REG)
                             (match_operand:SI 2 "register_operand" "r")
                             (match_operand:SI 3 "const_int_operand" "n")))])
                      (label_ref (match_operand 4 "" ""))
-                     (pc)))]
-  "TARGET_64BIT && (TARGET_USE_BT || optimize_size)
+                     (pc)))
+   (clobber (reg:CC FLAGS_REG))]
+  "TARGET_64BIT && (TARGET_USE_BT || optimize_function_for_size_p (cfun))
    && (INTVAL (operands[3]) & 0x3f) == 0x3f"
   "#"
   "&& 1"
                             (match_operand:QI 2 "register_operand" "r")))
                         (const_int 0)])
                      (label_ref (match_operand 3 "" ""))
-                     (pc)))]
-  "TARGET_USE_BT || optimize_size"
+                     (pc)))
+   (clobber (reg:CC FLAGS_REG))]
+  "TARGET_USE_BT || optimize_function_for_size_p (cfun)"
   "#"
   "&& 1"
   [(set (reg:CCC FLAGS_REG)
                             (match_operand:SI 2 "register_operand" "r")
                             (match_operand:SI 3 "const_int_operand" "n")))])
                      (label_ref (match_operand 4 "" ""))
-                     (pc)))]
-  "(TARGET_USE_BT || optimize_size)
+                     (pc)))
+   (clobber (reg:CC FLAGS_REG))]
+  "(TARGET_USE_BT || optimize_function_for_size_p (cfun))
    && (INTVAL (operands[3]) & 0x1f) == 0x1f"
   "#"
   "&& 1"
                           (const_int 1))
                         (const_int 0)])
                      (label_ref (match_operand 3 "" ""))
-                     (pc)))]
-  "TARGET_USE_BT || optimize_size"
+                     (pc)))
+   (clobber (reg:CC FLAGS_REG))]
+  "TARGET_USE_BT || optimize_function_for_size_p (cfun)"
   "#"
   "&& 1"
   [(set (reg:CCC FLAGS_REG)
               (const_int 1))
             (const_int 0)])
          (label_ref (match_operand 4 "" ""))
-         (pc)))]
-  "(TARGET_USE_BT || optimize_size)
+         (pc)))
+   (clobber (reg:CC FLAGS_REG))]
+  "(TARGET_USE_BT || optimize_function_for_size_p (cfun))
    && (INTVAL (operands[3]) & 0x1f) == 0x1f"
   "#"
   "&& 1"
    (clobber (reg:CCFP FLAGS_REG))
    (clobber (match_scratch:HI 5 "=a,a"))]
   "X87_FLOAT_MODE_P (GET_MODE (operands[3]))
-   && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
    && GET_MODE (operands[1]) == GET_MODE (operands[3])
    && !ix86_use_fcomi_compare (swap_condition (GET_CODE (operands[0])))
    && ix86_fp_compare_mode (swap_condition (GET_CODE (operands[0]))) == CCFPmode
 }
   [(set_attr "type" "call")])
 
+(define_insn "*call_1_rex64_ms_sysv"
+  [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rsm"))
+        (match_operand 1 "" ""))
+   (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
+   (clobber (reg:DI SI_REG))
+   (clobber (reg:DI DI_REG))]
+  "!SIBLING_CALL_P (insn) && TARGET_64BIT"
+{
+  if (constant_call_address_operand (operands[0], Pmode))
+    return "call\t%P0";
+  return "call\t%A0";
+}
+  [(set_attr "type" "call")])
+
 (define_insn "*call_1_rex64_large"
   [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rm"))
         (match_operand 1 "" ""))]
 (define_expand "ffs_cmove"
   [(set (match_dup 2) (const_int -1))
    (parallel [(set (reg:CCZ FLAGS_REG)
-                  (compare:CCZ (match_operand:SI 1 "register_operand" "")
+                  (compare:CCZ (match_operand:SI 1 "nonimmediate_operand" "")
                                (const_int 0)))
-             (set (match_operand:SI 0 "nonimmediate_operand" "")
+             (set (match_operand:SI 0 "register_operand" "")
                   (ctz:SI (match_dup 1)))])
    (set (match_dup 0) (if_then_else:SI
                        (eq (reg:CCZ FLAGS_REG) (const_int 0))
   "operands[2] = gen_reg_rtx (SImode);")
 
 (define_insn_and_split "*ffs_no_cmove"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r")
        (ffs:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))
    (clobber (match_scratch:SI 2 "=&q"))
    (clobber (reg:CC FLAGS_REG))]
 (define_expand "ffsdi2"
   [(set (match_dup 2) (const_int -1))
    (parallel [(set (reg:CCZ FLAGS_REG)
-                  (compare:CCZ (match_operand:DI 1 "register_operand" "")
+                  (compare:CCZ (match_operand:DI 1 "nonimmediate_operand" "")
                                (const_int 0)))
-             (set (match_operand:DI 0 "nonimmediate_operand" "")
+             (set (match_operand:DI 0 "register_operand" "")
                   (ctz:DI (match_dup 1)))])
    (set (match_dup 0) (if_then_else:DI
                        (eq (reg:CCZ FLAGS_REG) (const_int 0))
   [(set_attr "prefix_0f" "1")
    (set_attr "mode" "SI")])
 
-(define_insn "popcountsi2"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))
+(define_insn "popcount<mode>2"
+  [(set (match_operand:SWI248 0 "register_operand" "=r")
+       (popcount:SWI248
+         (match_operand:SWI248 1 "nonimmediate_operand" "rm")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_POPCNT"
-  "popcnt{l}\t{%1, %0|%0, %1}"
+{
+#if TARGET_MACHO
+  return "popcnt\t{%1, %0|%0, %1}";
+#else
+  return "popcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+#endif
+}
   [(set_attr "prefix_rep" "1")
    (set_attr "type" "bitmanip")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "*popcountsi2_cmp"
+(define_insn "*popcount<mode>2_cmp"
   [(set (reg FLAGS_REG)
        (compare
-         (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm"))
+         (popcount:SWI248
+           (match_operand:SWI248 1 "nonimmediate_operand" "rm"))
          (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (popcount:SI (match_dup 1)))]
+   (set (match_operand:SWI248 0 "register_operand" "=r")
+       (popcount:SWI248 (match_dup 1)))]
   "TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{l}\t{%1, %0|%0, %1}"
+{
+#if TARGET_MACHO
+  return "popcnt\t{%1, %0|%0, %1}";
+#else
+  return "popcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+#endif
+}
   [(set_attr "prefix_rep" "1")
    (set_attr "type" "bitmanip")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
 (define_insn "*popcountsi2_cmp_zext"
   [(set (reg FLAGS_REG)
    (set (match_operand:DI 0 "register_operand" "=r")
         (zero_extend:DI(popcount:SI (match_dup 1))))]
   "TARGET_64BIT && TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{l}\t{%1, %0|%0, %1}"
+{
+#if TARGET_MACHO
+  return "popcnt\t{%1, %0|%0, %1}";
+#else
+  return "popcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+#endif
+}
   [(set_attr "prefix_rep" "1")
    (set_attr "type" "bitmanip")
    (set_attr "mode" "SI")])
   [(set (strict_low_part (match_operand:HI 0 "register_operand" "+Q,r"))
        (bswap:HI (match_dup 0)))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_USE_XCHGB || optimize_size"
+  "TARGET_USE_XCHGB || optimize_function_for_size_p (cfun)"
   "@
     xchg{b}\t{%h0, %b0|%b0, %h0}
     rol{w}\t{$8, %0|%0, 8}"
   [(set_attr "prefix_0f" "1")
    (set_attr "mode" "DI")])
 
-(define_insn "popcountdi2"
-  [(set (match_operand:DI 0 "register_operand" "=r")
-       (popcount:DI (match_operand:DI 1 "nonimmediate_operand" "rm")))
-   (clobber (reg:CC FLAGS_REG))]
-  "TARGET_64BIT && TARGET_POPCNT"
-  "popcnt{q}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "DI")])
-
-(define_insn "*popcountdi2_cmp"
-  [(set (reg FLAGS_REG)
-       (compare
-         (popcount:DI (match_operand:DI 1 "nonimmediate_operand" "rm"))
-         (const_int 0)))
-   (set (match_operand:DI 0 "register_operand" "=r")
-       (popcount:DI (match_dup 1)))]
-  "TARGET_64BIT && TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{q}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "DI")])
-
 (define_expand "clzhi2"
   [(parallel
      [(set (match_operand:HI 0 "register_operand" "")
   [(set_attr "prefix_0f" "1")
    (set_attr "mode" "HI")])
 
-(define_insn "popcounthi2"
-  [(set (match_operand:HI 0 "register_operand" "=r")
-       (popcount:HI (match_operand:HI 1 "nonimmediate_operand" "rm")))
-   (clobber (reg:CC FLAGS_REG))]
-  "TARGET_POPCNT"
-  "popcnt{w}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "HI")])
-
-(define_insn "*popcounthi2_cmp"
-  [(set (reg FLAGS_REG)
-        (compare
-          (popcount:HI (match_operand:HI 1 "nonimmediate_operand" "rm"))
-          (const_int 0)))
-   (set (match_operand:HI 0 "register_operand" "=r")
-        (popcount:HI (match_dup 1)))]
-  "TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{w}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "HI")])
-
 (define_expand "paritydi2"
   [(set (match_operand:DI 0 "register_operand" "")
        (parity:DI (match_operand:DI 1 "register_operand" "")))]
 ;; Gcc is slightly more smart about handling normal two address instructions
 ;; so use special patterns for add and mull.
 
+(define_insn "*fop_<mode>_comm_mixed_avx"
+  [(set (match_operand:MODEF 0 "register_operand" "=f,x")
+       (match_operator:MODEF 3 "binary_fp_operator"
+         [(match_operand:MODEF 1 "nonimmediate_operand" "%0,x")
+          (match_operand:MODEF 2 "nonimmediate_operand" "fm,xm")]))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_MIX_SSE_I387
+   && COMMUTATIVE_ARITH_P (operands[3])
+   && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type")
+       (if_then_else (eq_attr "alternative" "1")
+          (if_then_else (match_operand:MODEF 3 "mult_operator" "")
+             (const_string "ssemul")
+             (const_string "sseadd"))
+          (if_then_else (match_operand:MODEF 3 "mult_operator" "")
+             (const_string "fmul")
+             (const_string "fop"))))
+   (set_attr "prefix" "orig,maybe_vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fop_<mode>_comm_mixed"
   [(set (match_operand:MODEF 0 "register_operand" "=f,x")
        (match_operator:MODEF 3 "binary_fp_operator"
              (const_string "fop"))))
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*fop_<mode>_comm_avx"
+  [(set (match_operand:MODEF 0 "register_operand" "=x")
+       (match_operator:MODEF 3 "binary_fp_operator"
+         [(match_operand:MODEF 1 "nonimmediate_operand" "%x")
+          (match_operand:MODEF 2 "nonimmediate_operand" "xm")]))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
+   && COMMUTATIVE_ARITH_P (operands[3])
+   && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type")
+        (if_then_else (match_operand:MODEF 3 "mult_operator" "")
+          (const_string "ssemul")
+          (const_string "sseadd")))
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fop_<mode>_comm_sse"
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (match_operator:MODEF 3 "binary_fp_operator"
           (const_string "fop")))
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*fop_<mode>_1_mixed_avx"
+  [(set (match_operand:MODEF 0 "register_operand" "=f,f,x")
+       (match_operator:MODEF 3 "binary_fp_operator"
+         [(match_operand:MODEF 1 "nonimmediate_operand" "0,fm,x")
+          (match_operand:MODEF 2 "nonimmediate_operand" "fm,0,xm")]))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_MIX_SSE_I387
+   && !COMMUTATIVE_ARITH_P (operands[3])
+   && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type")
+        (cond [(and (eq_attr "alternative" "2")
+                   (match_operand:MODEF 3 "mult_operator" ""))
+                 (const_string "ssemul")
+              (and (eq_attr "alternative" "2")
+                   (match_operand:MODEF 3 "div_operator" ""))
+                 (const_string "ssediv")
+              (eq_attr "alternative" "2")
+                 (const_string "sseadd")
+              (match_operand:MODEF 3 "mult_operator" "")
+                 (const_string "fmul")
+               (match_operand:MODEF 3 "div_operator" "")
+                 (const_string "fdiv")
+              ]
+              (const_string "fop")))
+   (set_attr "prefix" "orig,orig,maybe_vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fop_<mode>_1_mixed"
   [(set (match_operand:MODEF 0 "register_operand" "=f,f,x")
        (match_operator:MODEF 3 "binary_fp_operator"
        (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm")]
                   UNSPEC_RCP))]
   "TARGET_SSE_MATH"
-  "rcpss\t{%1, %0|%0, %1}"
+  "%vrcpss\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "sse")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "SF")])
 
+(define_insn "*fop_<mode>_1_avx"
+  [(set (match_operand:MODEF 0 "register_operand" "=x")
+       (match_operator:MODEF 3 "binary_fp_operator"
+         [(match_operand:MODEF 1 "register_operand" "x")
+          (match_operand:MODEF 2 "nonimmediate_operand" "xm")]))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
+   && !COMMUTATIVE_ARITH_P (operands[3])"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type")
+        (cond [(match_operand:MODEF 3 "mult_operator" "")
+                 (const_string "ssemul")
+              (match_operand:MODEF 3 "div_operator" "")
+                 (const_string "ssediv")
+              ]
+              (const_string "sseadd")))
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fop_<mode>_1_sse"
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (match_operator:MODEF 3 "binary_fp_operator"
             (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
           (match_operand:MODEF 2 "register_operand" "0,0")]))]
   "TARGET_80387 && !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)
-   && (TARGET_USE_<X87MODEI12:MODE>MODE_FIOP || optimize_size)"
+   && (TARGET_USE_<X87MODEI12:MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:MODEF 3 "mult_operator" "")
           (float:MODEF
             (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
   "TARGET_80387 && !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)
-   && (TARGET_USE_<X87MODEI12:MODE>MODE_FIOP || optimize_size)"
+   && (TARGET_USE_<X87MODEI12:MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:MODEF 3 "mult_operator" "")
          [(float:XF
             (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
           (match_operand:XF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)"
+  "TARGET_80387 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:XF 3 "mult_operator" "")
          [(match_operand:XF 1 "register_operand" "0,0")
           (float:XF
             (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)"
+  "TARGET_80387 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:XF 3 "mult_operator" "")
        (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm")]
                   UNSPEC_RSQRT))]
   "TARGET_SSE_MATH"
-  "rsqrtss\t{%1, %0|%0, %1}"
+  "%vrsqrtss\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "sse")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "SF")])
 
 (define_expand "rsqrtsf2"
        (sqrt:MODEF
          (match_operand:MODEF 1 "nonimmediate_operand" "xm")))]
   "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
-  "sqrts<ssemodefsuffix>\t{%1, %0|%0, %1}"
+  "%vsqrts<ssemodefsuffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "sse")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")
    (set_attr "athlon_decode" "*")
    (set_attr "amdfam10_decode" "*")])
    || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
 {
   if (<MODE>mode == SFmode
-      && TARGET_SSE_MATH && TARGET_RECIP && !optimize_size
+      && TARGET_SSE_MATH && TARGET_RECIP && !optimize_function_for_size_p (cfun)
       && flag_finite_math_only && !flag_trapping_math
       && flag_unsafe_math_optimizations)
     {
                       (match_operand:SI 2 "const_0_to_15_operand" "n")]
                      UNSPEC_ROUND))]
   "TARGET_ROUND"
-  "rounds<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
+  "%vrounds<ssemodefsuffix>\t{%2, %1, %d0|%d0, %1, %2}"
   [(set_attr "type" "ssecvt")
    (set_attr "prefix_extra" "1")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "rintxf2"
 ;; Since both the tree-level MAX_EXPR and the rtl-level SMAX operator
 ;; are undefined in this condition, we're certain this is correct.
 
+(define_insn "*avx_<code><mode>3"
+  [(set (match_operand:MODEF 0 "register_operand" "=x")
+       (smaxmin:MODEF
+         (match_operand:MODEF 1 "nonimmediate_operand" "%x")
+         (match_operand:MODEF 2 "nonimmediate_operand" "xm")))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
+  "v<maxminfprefix>s<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "sseadd")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "<code><mode>3"
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (smaxmin:MODEF
 ;; Their operands are not commutative, and thus they may be used in the
 ;; presence of -0.0 and NaN.
 
+(define_insn "*avx_ieee_smin<mode>3"
+  [(set (match_operand:MODEF 0 "register_operand" "=x")
+       (unspec:MODEF
+         [(match_operand:MODEF 1 "register_operand" "x")
+          (match_operand:MODEF 2 "nonimmediate_operand" "xm")]
+        UNSPEC_IEEE_MIN))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
+  "vmins<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "sseadd")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*ieee_smin<mode>3"
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (unspec:MODEF
   [(set_attr "type" "sseadd")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx_ieee_smax<mode>3"
+  [(set (match_operand:MODEF 0 "register_operand" "=x")
+       (unspec:MODEF
+         [(match_operand:MODEF 1 "register_operand" "0")
+          (match_operand:MODEF 2 "nonimmediate_operand" "xm")]
+        UNSPEC_IEEE_MAX))]
+  "AVX_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
+  "vmaxs<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "sseadd")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*ieee_smax<mode>3"
   [(set (match_operand:MODEF 0 "register_operand" "=x")
        (unspec:MODEF
    (set_attr "mode" "DI")])
 
 (define_insn "allocate_stack_worker_32"
-  [(set (match_operand:SI 0 "register_operand" "+a")
-       (unspec_volatile:SI [(match_dup 0)] UNSPECV_STACK_PROBE))
-   (set (reg:SI SP_REG) (minus:SI (reg:SI SP_REG) (match_dup 0)))
+  [(set (match_operand:SI 0 "register_operand" "=a")
+       (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "0")]
+                           UNSPECV_STACK_PROBE))
+   (set (reg:SI SP_REG) (minus:SI (reg:SI SP_REG) (match_dup 1)))
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT && TARGET_STACK_PROBE"
   "call\t___chkstk"
    (set_attr "length" "5")])
 
 (define_insn "allocate_stack_worker_64"
-  [(set (match_operand:DI 0 "register_operand" "+a")
-       (unspec_volatile:DI [(match_dup 0)] UNSPECV_STACK_PROBE))
-   (set (reg:DI SP_REG) (minus:DI (reg:DI SP_REG) (match_dup 0)))
+  [(set (match_operand:DI 0 "register_operand" "=a")
+       (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "0")]
+                           UNSPECV_STACK_PROBE))
+   (set (reg:DI SP_REG) (minus:DI (reg:DI SP_REG) (match_dup 1)))
    (clobber (reg:DI R10_REG))
    (clobber (reg:DI R11_REG))
    (clobber (reg:CC FLAGS_REG))]
     {
       x = copy_to_mode_reg (Pmode, operands[1]);
       if (TARGET_64BIT)
-       x = gen_allocate_stack_worker_64 (x);
+       x = gen_allocate_stack_worker_64 (x, x);
       else
-       x = gen_allocate_stack_worker_32 (x);
+       x = gen_allocate_stack_worker_32 (x, x);
       emit_insn (x);
     }
 
   [(label_ref (match_operand 0 "" ""))]
   "!TARGET_64BIT && flag_pic"
 {
+#if TARGET_MACHO
   if (TARGET_MACHO)
     {
       rtx xops[3];
       rtx label_rtx = gen_label_rtx ();
       emit_insn (gen_set_got_labelled (pic_offset_table_rtx, label_rtx));
       xops[0] = xops[1] = picreg;
-      xops[2] = gen_rtx_CONST (SImode,
-                 gen_rtx_MINUS (SImode,
-                   gen_rtx_LABEL_REF (SImode, label_rtx),
-                   gen_rtx_SYMBOL_REF (SImode, GOT_SYMBOL_NAME)));
+      xops[2] = machopic_gen_offset (gen_rtx_LABEL_REF (SImode, label_rtx));
       ix86_expand_binary_operator (MINUS, SImode, xops);
     }
   else
+#endif
     emit_insn (gen_set_got (pic_offset_table_rtx));
   DONE;
 })
    (clobber (reg:CC FLAGS_REG))]
   "! TARGET_PARTIAL_REG_STALL && reload_completed
    && ((GET_MODE (operands[0]) == HImode
-       && ((!optimize_size && !TARGET_FAST_PREFIX)
+       && ((optimize_function_for_speed_p (cfun) && !TARGET_FAST_PREFIX)
             /* ??? next two lines just !satisfies_constraint_K (...) */
            || !CONST_INT_P (operands[2])
            || satisfies_constraint_K (operands[2])))
        || (GET_MODE (operands[0]) == QImode
-          && (TARGET_PROMOTE_QImode || optimize_size)))"
+          && (TARGET_PROMOTE_QImode || optimize_function_for_size_p (cfun))))"
   [(parallel [(set (match_dup 0)
                   (match_op_dup 3 [(match_dup 1) (match_dup 2)]))
              (clobber (reg:CC FLAGS_REG))])]
    (set (match_operand 1 "register_operand" "")
        (and (match_dup 3) (match_dup 4)))]
   "! TARGET_PARTIAL_REG_STALL && reload_completed
-   && ! optimize_size
+   && optimize_insn_for_speed_p ()
    && ((GET_MODE (operands[1]) == HImode && ! TARGET_FAST_PREFIX)
        || (GET_MODE (operands[1]) == QImode && TARGET_PROMOTE_QImode))
    /* Ensure that the operand will remain sign-extended immediate.  */
                      [(match_dup 0)
                       (match_operand:SI 1 "memory_operand" "")]))
               (clobber (reg:CC FLAGS_REG))])]
-  "optimize_insn_for_speed_p ()"
+  "optimize_insn_for_speed_p () && ! TARGET_READ_MODIFY"
   [(set (match_dup 2) (match_dup 1))
    (parallel [(set (match_dup 0)
                    (match_op_dup 3 [(match_dup 0) (match_dup 2)]))
   "")
 \f
 ;; Convert compares with 1 to shorter inc/dec operations when CF is not
-;; required and register dies.  Similarly for 128 to plus -128.
+;; required and register dies.  Similarly for 128 to -128.
 (define_peephole2
   [(set (match_operand 0 "flags_reg_operand" "")
        (match_operator 1 "compare_operator"
          [(match_operand 2 "register_operand" "")
           (match_operand 3 "const_int_operand" "")]))]
-  "(INTVAL (operands[3]) == -1
-    || INTVAL (operands[3]) == 1
-    || INTVAL (operands[3]) == 128)
+  "(((!TARGET_FUSE_CMP_AND_BRANCH || optimize_size)
+     && incdec_operand (operands[3], GET_MODE (operands[3])))
+    || (!TARGET_FUSE_CMP_AND_BRANCH
+       && INTVAL (operands[3]) == 128))
    && ix86_match_ccmode (insn, CCGCmode)
    && peep2_reg_dead_p (1, operands[2])"
   [(parallel [(set (match_dup 0)
 }
   [(set_attr "type" "callv")])
 
+(define_insn "*call_value_0_rex64_ms_sysv"
+  [(set (match_operand 0 "" "")
+       (call (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
+             (match_operand:DI 2 "const_int_operand" "")))
+   (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
+   (clobber (reg:DI SI_REG))
+   (clobber (reg:DI DI_REG))]
+  "!SIBLING_CALL_P (insn) && TARGET_64BIT"
+{
+  if (SIBLING_CALL_P (insn))
+    return "jmp\t%P1";
+  else
+    return "call\t%P1";
+}
+  [(set_attr "type" "callv")])
+
 (define_insn "*call_value_1"
   [(set (match_operand 0 "" "")
        (call (mem:QI (match_operand:SI 1 "call_insn_operand" "rsm"))
 }
   [(set_attr "type" "callv")])
 
+(define_insn "*call_value_1_rex64_ms_sysv"
+  [(set (match_operand 0 "" "")
+       (call (mem:QI (match_operand:DI 1 "call_insn_operand" "rsm"))
+             (match_operand:DI 2 "" "")))
+   (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
+   (clobber (reg:DI SI_REG))
+   (clobber (reg:DI DI_REG))]
+  "!SIBLING_CALL_P (insn) && TARGET_64BIT"
+{
+  if (constant_call_address_operand (operands[1], Pmode))
+    return "call\t%P1";
+  return "call\t%A1";
+}
+  [(set_attr "type" "callv")])
+
 (define_insn "*call_value_1_rex64_large"
   [(set (match_operand 0 "" "")
        (call (mem:QI (match_operand:DI 1 "call_insn_operand" "rm"))
   int i;
   operands[0] = gen_rtx_MEM (Pmode,
                             gen_rtx_PLUS (Pmode, operands[0], operands[4]));
+  /* VEX instruction with a REX prefix will #UD.  */
+  if (TARGET_AVX && GET_CODE (XEXP (operands[0], 0)) != PLUS)
+    gcc_unreachable ();
+
   output_asm_insn ("jmp\t%A1", operands);
   for (i = X86_64_SSE_REGPARM_MAX - 1; i >= INTVAL (operands[2]); i--)
     {
       PUT_MODE (operands[4], TImode);
       if (GET_CODE (XEXP (operands[0], 0)) != PLUS)
         output_asm_insn ("rex", operands);
-      output_asm_insn ("movaps\t{%5, %4|%4, %5}", operands);
+      output_asm_insn ("%vmovaps\t{%5, %4|%4, %5}", operands);
     }
   (*targetm.asm_out.internal_label) (asm_out_file, "L",
                                     CODE_LABEL_NUMBER (operands[3]));
   [(set_attr "type" "other")
    (set_attr "length_immediate" "0")
    (set_attr "length_address" "0")
-   (set_attr "length" "34")
+   (set (attr "length")
+     (if_then_else
+       (eq (symbol_ref "TARGET_AVX") (const_int 0))
+       (const_string "34")
+       (const_string "42")))
    (set_attr "memory" "store")
    (set_attr "modrm" "0")
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "DI")])
 
 (define_expand "prefetch"