OSDN Git Service

2007-04-23 H.J. Lu <hongjiu.lu@intel.com>
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Apr 2007 19:02:57 +0000 (19:02 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Apr 2007 19:02:57 +0000 (19:02 +0000)
* config/i386/i386.md (prefix_extra): New attribute.
(length): Add prefix_extra.

* onfig/i386/sse.md (sse2_movdqu): Set prefix_data16.
(sse2_movntv2di): Likewise.
(sse2_cvtps2dq): Likewise.
(sse2_cvtpd2pi): Likewise.
(sse2_cvttpd2pi): Likewise.
(*sse2_cvtpd2ps): Likewise.
(*add<mode>3): Likewise.
(sse2_ssadd<mode>3): Likewise.
(sse2_usadd<mode>3): Likewise.
(*sub<mode>3): Likewise.
(sse2_sssub<mode>3): Likewise.
(sse2_ussub<mode>3): Likewise.
(*mulv8hi3): Likewise.
(*smulv8hi3_highpart): Likewise.
(*umulv8hi3_highpart): Likewise.
(sse2_umulv2siv2di3): Likewise.
(sse2_pmaddwd): Likewise.
(ashr<mode>3): Likewise.
(lshr<mode>3): Likewise.
(ashl<mode>3): Likewise.
(sse2_ashlti3): Likewise.
(sse2_lshrti3): Likewise.
(*umaxv16qi3): Likewise.
(*smaxv8hi3): Likewise.
(*uminv16qi3): Likewise.
(*sminv8hi3): Likewise.
(sse2_eq<mode>3): Likewise.
(sse2_gt<mode>3): Likewise.
(*and<mode>3): Likewise.
(sse2_nand<mode>3): Likewise.
(*ior<mode>3): Likewise.
(*xor<mode>3): Likewise.
(sse2_packsswb): Likewise.
(sse2_packssdw): Likewise.
(sse2_packuswb): Likewise.
(sse2_punpckhbw): Likewise.
(sse2_punpcklbw): Likewise.
(sse2_punpckhwd): Likewise.
(sse2_punpcklwd): Likewise.
(sse2_punpckhdq): Likewise.
(sse2_punpckldq): Likewise.
(sse2_punpckhqdq): Likewise.
(sse2_punpcklqdq): Likewise.
(*sse2_pinsrw): Likewise.
(*sse2_pextrw): Likewise.
(sse2_pshufd_1): Likewise.
(sse2_uavgv16qi3): Likewise.
(sse2_uavgv8hi3): Likewise.
(sse2_psadbw): Likewise.
(sse2_pmovmskb): Likewise.
(*sse2_maskmovdqu): Likewise.
(*sse2_maskmovdqu_rex64): Likewise.
(sse4a_extrqi): Likewise.
(sse4a_extrq): Likewise.
(sse3_lddqu): Set prefix_rep.
(sse3_addsubv4sf3): Likewise.
(sse3_haddv4sf3): Likewise.
(sse3_hsubv4sf3): Likewise.
(sse_cvtss2si): Likewise.
(sse_cvtss2si_2): Likewise.
(sse_cvtss2siq): Likewise.
(sse_cvtss2siq_2): Likewise.
(sse_cvttss2si): Likewise.
(sse_cvttss2siq): Likewise.
(sse2_cvttps2dq): Likewise.
(sse3_movshdup): Likewise.
(sse3_movsldup): Likewise.
(sse2_cvtsd2si): Likewise.
(sse2_cvtsd2si_2): Likewise.
(sse2_cvtsd2siq): Likewise.
(sse2_cvtsd2siq_2): Likewise.
(sse2_cvttsd2si): Likewise.
(sse2_cvttsd2siq): Likewise.
(*sse2_cvtpd2dq): Likewise.
(*sse2_cvttpd2dq): Likewise.
(sse2_pshuflw_1): Likewise.
(sse2_pshufhw_1): Likewise.
(sse4a_insertqi): Likewise.
(sse4a_insertq): Likewise.
(ssse3_phaddwv8hi3): Set prefix_data16 and prefix_extra.
(ssse3_phadddv4si3): Likewise.
(ssse3_phaddswv8hi3): Likewise.
(ssse3_phsubwv8hi3): Likewise.
(ssse3_phsubdv4si3): Likewise.
(ssse3_phsubswv8hi3): Likewise.
(ssse3_pmaddubswv8hi3): Likewise.
(ssse3_pmulhrswv8hi3): Likewise.
(ssse3_pshufbv16qi3): Likewise.
(ssse3_psign<mode>3): Likewise.
(ssse3_palignrti): Likewise.
(abs<mode>2): Likewise.
(ssse3_phaddwv4hi3): Set prefix_extra.
(ssse3_phadddv2si3): Likewise.
(ssse3_phaddswv4hi3): Likewise.
(ssse3_phsubwv4hi3): Likewise.
(ssse3_phsubdv2si3): Likewise.
(ssse3_phsubswv4hi3): Likewise.
(ssse3_pmaddubswv4hi3): Likewise.
(ssse3_pmulhrswv4hi3): Likewise.
(ssse3_pshufbv8qi3): Likewise.
(ssse3_psign<mode>3): Likewise.
(ssse3_palignrdi): Likewise.
(abs<mode>2): Likewise.
(sse2_cvtdq2ps): Set mode to V4SF instead of V2DF.
(*vec_dupv2df): Set mode to V2DF instead of V4SF.
(sse2_pmovmskb): Set mode to SI instead of V2DF.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124077 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/config/i386/sse.md

index 8650b80..46866c3 100644 (file)
@@ -1,3 +1,115 @@
+2007-04-23  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.md (prefix_extra): New attribute.
+       (length): Add prefix_extra.
+
+       * onfig/i386/sse.md (sse2_movdqu): Set prefix_data16.
+       (sse2_movntv2di): Likewise.
+       (sse2_cvtps2dq): Likewise.
+       (sse2_cvtpd2pi): Likewise.
+       (sse2_cvttpd2pi): Likewise.
+       (*sse2_cvtpd2ps): Likewise.
+       (*add<mode>3): Likewise.
+       (sse2_ssadd<mode>3): Likewise.
+       (sse2_usadd<mode>3): Likewise.
+       (*sub<mode>3): Likewise.
+       (sse2_sssub<mode>3): Likewise.
+       (sse2_ussub<mode>3): Likewise.
+       (*mulv8hi3): Likewise.
+       (*smulv8hi3_highpart): Likewise.
+       (*umulv8hi3_highpart): Likewise.
+       (sse2_umulv2siv2di3): Likewise.
+       (sse2_pmaddwd): Likewise.
+       (ashr<mode>3): Likewise.
+       (lshr<mode>3): Likewise.
+       (ashl<mode>3): Likewise.
+       (sse2_ashlti3): Likewise.
+       (sse2_lshrti3): Likewise.
+       (*umaxv16qi3): Likewise.
+       (*smaxv8hi3): Likewise.
+       (*uminv16qi3): Likewise.
+       (*sminv8hi3): Likewise.
+       (sse2_eq<mode>3): Likewise.
+       (sse2_gt<mode>3): Likewise.
+       (*and<mode>3): Likewise.
+       (sse2_nand<mode>3): Likewise.
+       (*ior<mode>3): Likewise.
+       (*xor<mode>3): Likewise.
+       (sse2_packsswb): Likewise.
+       (sse2_packssdw): Likewise.
+       (sse2_packuswb): Likewise.
+       (sse2_punpckhbw): Likewise.
+       (sse2_punpcklbw): Likewise.
+       (sse2_punpckhwd): Likewise.
+       (sse2_punpcklwd): Likewise.
+       (sse2_punpckhdq): Likewise.
+       (sse2_punpckldq): Likewise.
+       (sse2_punpckhqdq): Likewise.
+       (sse2_punpcklqdq): Likewise.
+       (*sse2_pinsrw): Likewise.
+       (*sse2_pextrw): Likewise.
+       (sse2_pshufd_1): Likewise.
+       (sse2_uavgv16qi3): Likewise.
+       (sse2_uavgv8hi3): Likewise.
+       (sse2_psadbw): Likewise.
+       (sse2_pmovmskb): Likewise.
+       (*sse2_maskmovdqu): Likewise.
+       (*sse2_maskmovdqu_rex64): Likewise.
+       (sse4a_extrqi): Likewise.
+       (sse4a_extrq): Likewise.
+       (sse3_lddqu): Set prefix_rep.
+       (sse3_addsubv4sf3): Likewise.
+       (sse3_haddv4sf3): Likewise.
+       (sse3_hsubv4sf3): Likewise.
+       (sse_cvtss2si): Likewise.
+       (sse_cvtss2si_2): Likewise.
+       (sse_cvtss2siq): Likewise.
+       (sse_cvtss2siq_2): Likewise.
+       (sse_cvttss2si): Likewise.
+       (sse_cvttss2siq): Likewise.
+       (sse2_cvttps2dq): Likewise.
+       (sse3_movshdup): Likewise.
+       (sse3_movsldup): Likewise.
+       (sse2_cvtsd2si): Likewise.
+       (sse2_cvtsd2si_2): Likewise.
+       (sse2_cvtsd2siq): Likewise.
+       (sse2_cvtsd2siq_2): Likewise.
+       (sse2_cvttsd2si): Likewise.
+       (sse2_cvttsd2siq): Likewise.
+       (*sse2_cvtpd2dq): Likewise.
+       (*sse2_cvttpd2dq): Likewise.
+       (sse2_pshuflw_1): Likewise.
+       (sse2_pshufhw_1): Likewise.
+       (sse4a_insertqi): Likewise.
+       (sse4a_insertq): Likewise.
+       (ssse3_phaddwv8hi3): Set prefix_data16 and prefix_extra.
+       (ssse3_phadddv4si3): Likewise.
+       (ssse3_phaddswv8hi3): Likewise.
+       (ssse3_phsubwv8hi3): Likewise.
+       (ssse3_phsubdv4si3): Likewise.
+       (ssse3_phsubswv8hi3): Likewise.
+       (ssse3_pmaddubswv8hi3): Likewise.
+       (ssse3_pmulhrswv8hi3): Likewise.
+       (ssse3_pshufbv16qi3): Likewise.
+       (ssse3_psign<mode>3): Likewise.
+       (ssse3_palignrti): Likewise.
+       (abs<mode>2): Likewise.
+       (ssse3_phaddwv4hi3): Set prefix_extra.
+       (ssse3_phadddv2si3): Likewise.
+       (ssse3_phaddswv4hi3): Likewise.
+       (ssse3_phsubwv4hi3): Likewise.
+       (ssse3_phsubdv2si3): Likewise.
+       (ssse3_phsubswv4hi3): Likewise.
+       (ssse3_pmaddubswv4hi3): Likewise.
+       (ssse3_pmulhrswv4hi3): Likewise.
+       (ssse3_pshufbv8qi3): Likewise.
+       (ssse3_psign<mode>3): Likewise.
+       (ssse3_palignrdi): Likewise.
+       (abs<mode>2): Likewise.
+       (sse2_cvtdq2ps): Set mode to V4SF instead of V2DF.
+       (*vec_dupv2df): Set mode to V2DF instead of V4SF.
+       (sse2_pmovmskb): Set mode to SI instead of V2DF.
+
 2007-04-23  Nick Clifton  <nickc@redhat.com>
 
        * params.def: Fix formatting of emacs local variables.
index b306e05..5beb901 100644 (file)
        ]
        (const_int 0)))
 
+;; There are also additional prefixes in SSSE3.
+(define_attr "prefix_extra" "" (const_int 0))
+
 ;; Set when modrm byte is used.
 (define_attr "modrm" ""
   (cond [(eq_attr "type" "str,leave")
         (plus (plus (attr "modrm")
                     (plus (attr "prefix_0f")
                           (plus (attr "prefix_rex")
-                                (const_int 1))))
+                                (plus (attr "prefix_extra")
+                                      (const_int 1)))))
               (plus (attr "prefix_rep")
                     (plus (attr "prefix_data16")
                           (plus (attr "length_immediate")
index 279e18e..63f0eac 100644 (file)
   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
   "movdqu\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssemov")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse_movntv4sf"
   "TARGET_SSE2"
   "movntdq\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_movntsi"
   "TARGET_SSE3"
   "lddqu\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")])
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   "TARGET_SSE3"
   "addsubps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "V4SF")])
 
 (define_insn "sse3_haddv4sf3"
   "TARGET_SSE3"
   "haddps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "V4SF")])
 
 (define_insn "sse3_hsubv4sf3"
   "TARGET_SSE3"
   "hsubps\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseadd")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "V4SF")])
 
 (define_expand "reduc_splus_v4sf"
   "cvtss2si\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "SI")])
 
 (define_insn "sse_cvtss2si_2"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "SI")])
 
 (define_insn "sse_cvtss2siq"
   "cvtss2siq\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "sse_cvtss2siq_2"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "sse_cvttss2si"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "SI")])
 
 (define_insn "sse_cvttss2siq"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "sse2_cvtdq2ps"
   "TARGET_SSE2"
   "cvtdq2ps\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
-   (set_attr "mode" "V2DF")])
+   (set_attr "mode" "V4SF")])
 
 (define_insn "sse2_cvtps2dq"
   [(set (match_operand:V4SI 0 "register_operand" "=x")
   "TARGET_SSE2"
   "cvtps2dq\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_cvttps2dq"
   "TARGET_SSE2"
   "cvttps2dq\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")])
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   "TARGET_SSE3"
   "movshdup\t{%1, %0|%0, %1}"
   [(set_attr "type" "sse")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "V4SF")])
 
 (define_insn "sse3_movsldup"
   "TARGET_SSE3"
   "movsldup\t{%1, %0|%0, %1}"
   [(set_attr "type" "sse")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "V4SF")])
 
 (define_expand "sse_shufps"
   "cvtpd2pi\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
    (set_attr "unit" "mmx")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "sse2_cvttpd2pi"
   "cvttpd2pi\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
    (set_attr "unit" "mmx")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_cvtsi2sd"
   "cvtsd2si\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "SI")])
 
 (define_insn "sse2_cvtsd2si_2"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "SI")])
 
 (define_insn "sse2_cvtsd2siq"
   "cvtsd2siq\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "sse2_cvtsd2siq_2"
   [(set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "sse2_cvttsd2si"
   "TARGET_SSE2"
   "cvttsd2si\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "SI")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")])
   "TARGET_SSE2 && TARGET_64BIT"
   "cvttsd2siq\t{%1, %0|%0, %1}"
   [(set_attr "type" "sseicvt")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "DI")
    (set_attr "athlon_decode" "double,vector")
    (set_attr "amdfam10_decode" "double,double")])
   "TARGET_SSE2"
   "cvtpd2dq\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")
    (set_attr "amdfam10_decode" "double")])
 
   "TARGET_SSE2"
   "cvttpd2dq\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")
    (set_attr "amdfam10_decode" "double")])
 
   "TARGET_SSE2"
   "cvtpd2ps\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "V4SF")
    (set_attr "amdfam10_decode" "double")])
 
   "TARGET_SSE2"
   "unpcklpd\t%0, %0"
   [(set_attr "type" "sselog1")
-   (set_attr "mode" "V4SF")])
+   (set_attr "mode" "V2DF")])
 
 (define_insn "*vec_concatv2df_sse3"
   [(set (match_operand:V2DF 0 "register_operand" "=x")
   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, <MODE>mode, operands)"
   "padd<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_ssadd<mode>3"
   "TARGET_SSE2 && ix86_binary_operator_ok (SS_PLUS, <MODE>mode, operands)"
   "padds<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_usadd<mode>3"
   "TARGET_SSE2 && ix86_binary_operator_ok (US_PLUS, <MODE>mode, operands)"
   "paddus<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "sub<mode>3"
   "TARGET_SSE2"
   "psub<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_sssub<mode>3"
   "TARGET_SSE2"
   "psubs<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_ussub<mode>3"
   "TARGET_SSE2"
   "psubus<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "mulv16qi3"
   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
   "pmullw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseimul")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "smulv8hi3_highpart"
   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
   "pmulhw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseimul")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "umulv8hi3_highpart"
   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
   "pmulhuw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseimul")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_umulv2siv2di3"
   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
   "pmuludq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseimul")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_pmaddwd"
   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
   "pmaddwd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "mulv4si3"
   "TARGET_SSE2"
   "psra<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "lshr<mode>3"
   "TARGET_SSE2"
   "psrl<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ashl<mode>3"
   "TARGET_SSE2"
   "psll<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_ashlti3"
   return "pslldq\t{%2, %0|%0, %2}";
 }
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "vec_shl_<mode>"
   return "psrldq\t{%2, %0|%0, %2}";
 }
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "vec_shr_<mode>"
   "TARGET_SSE2 && ix86_binary_operator_ok (UMAX, V16QImode, operands)"
   "pmaxub\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "smaxv8hi3"
   "TARGET_SSE2 && ix86_binary_operator_ok (SMAX, V8HImode, operands)"
   "pmaxsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "umaxv8hi3"
   "TARGET_SSE2 && ix86_binary_operator_ok (UMIN, V16QImode, operands)"
   "pminub\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "sminv8hi3"
   "TARGET_SSE2 && ix86_binary_operator_ok (SMIN, V8HImode, operands)"
   "pminsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "smin<mode>3"
   "TARGET_SSE2 && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
   "pcmpeq<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "ssecmp")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_gt<mode>3"
   "TARGET_SSE2"
   "pcmpgt<ssevecsize>\t{%2, %0|%0, %2}"
   [(set_attr "type" "ssecmp")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "vcond<mode>"
   "TARGET_SSE2 && ix86_binary_operator_ok (AND, <MODE>mode, operands)"
   "pand\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_nand<mode>3"
   "TARGET_SSE2"
   "pandn\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "ior<mode>3"
   "TARGET_SSE2 && ix86_binary_operator_ok (IOR, <MODE>mode, operands)"
   "por\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "xor<mode>3"
   "TARGET_SSE2 && ix86_binary_operator_ok (XOR, <MODE>mode, operands)"
   "pxor\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   "TARGET_SSE2"
   "packsswb\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_packssdw"
   "TARGET_SSE2"
   "packssdw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_packuswb"
   "TARGET_SSE2"
   "packuswb\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpckhbw"
   "TARGET_SSE2"
   "punpckhbw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpcklbw"
   "TARGET_SSE2"
   "punpcklbw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpckhwd"
   "TARGET_SSE2"
   "punpckhwd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpcklwd"
   "TARGET_SSE2"
   "punpcklwd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpckhdq"
   "TARGET_SSE2"
   "punpckhdq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpckldq"
   "TARGET_SSE2"
   "punpckldq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpckhqdq"
   "TARGET_SSE2"
   "punpckhqdq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_punpcklqdq"
   "TARGET_SSE2"
   "punpcklqdq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "*sse2_pinsrw"
   return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}";
 }
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "*sse2_pextrw"
   "TARGET_SSE2"
   "pextrw\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "type" "sselog")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "sse2_pshufd"
   return "pshufd\t{%2, %1, %0|%0, %1, %2}";
 }
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "sse2_pshuflw"
   return "pshuflw\t{%2, %1, %0|%0, %1, %2}";
 }
   [(set_attr "type" "sselog")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "sse2_pshufhw"
   return "pshufhw\t{%2, %1, %0|%0, %1, %2}";
 }
   [(set_attr "type" "sselog")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")])
 
 (define_expand "sse2_loadd"
   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V16QImode, operands)"
   "pavgb\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_uavgv8hi3"
   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V8HImode, operands)"
   "pavgw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 ;; The correct representation for this is absolutely enormous, and 
   "TARGET_SSE2"
   "psadbw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse_movmskps"
   "TARGET_SSE2"
   "pmovmskb\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
-   (set_attr "mode" "V2DF")])
+   (set_attr "prefix_data16" "1")
+   (set_attr "mode" "SI")])
 
 (define_expand "sse2_maskmovdqu"
   [(set (match_operand:V16QI 0 "memory_operand" "")
   ;; @@@ check ordering of operands in intel/nonintel syntax
   "maskmovdqu\t{%2, %1|%1, %2}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "*sse2_maskmovdqu_rex64"
   ;; @@@ check ordering of operands in intel/nonintel syntax
   "maskmovdqu\t{%2, %1|%1, %2}"
   [(set_attr "type" "ssecvt")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse_ldmxcsr"
   "TARGET_SSSE3"
   "phaddw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_phaddwv4hi3"
   "TARGET_SSSE3"
   "phaddw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_phadddv4si3"
   "TARGET_SSSE3"
   "phaddd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_phadddv2si3"
   "TARGET_SSSE3"
   "phaddd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_phaddswv8hi3"
   "TARGET_SSSE3"
   "phaddsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_phaddswv4hi3"
   "TARGET_SSSE3"
   "phaddsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_phsubwv8hi3"
   "TARGET_SSSE3"
   "phsubw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_phsubwv4hi3"
   "TARGET_SSSE3"
   "phsubw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_phsubdv4si3"
   "TARGET_SSSE3"
   "phsubd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_phsubdv2si3"
   "TARGET_SSSE3"
   "phsubd\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_phsubswv8hi3"
   "TARGET_SSSE3"
   "phsubsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_phsubswv4hi3"
   "TARGET_SSSE3"
   "phsubsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_pmaddubswv8hi3"
   "TARGET_SSSE3"
   "pmaddubsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_pmaddubswv4hi3"
   "TARGET_SSSE3"
   "pmaddubsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseiadd")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_pmulhrswv8hi3"
   "TARGET_SSSE3 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
   "pmulhrsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseimul")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_pmulhrswv4hi3"
   "TARGET_SSSE3 && ix86_binary_operator_ok (MULT, V4HImode, operands)"
   "pmulhrsw\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseimul")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_pshufbv16qi3"
   "TARGET_SSSE3"
   "pshufb\t{%2, %0|%0, %2}";
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_pshufbv8qi3"
   "TARGET_SSSE3"
   "pshufb\t{%2, %0|%0, %2}";
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_psign<mode>3"
   "TARGET_SSSE3"
   "psign<ssevecsize>\t{%2, %0|%0, %2}";
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_psign<mode>3"
   "TARGET_SSSE3"
   "psign<mmxvecsize>\t{%2, %0|%0, %2}";
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "ssse3_palignrti"
   return "palignr\t{%3, %2, %0|%0, %2, %3}";
 }
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "ssse3_palignrdi"
   return "palignr\t{%3, %2, %0|%0, %2, %3}";
 }
   [(set_attr "type" "sseishft")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 (define_insn "abs<mode>2"
   "TARGET_SSSE3"
   "pabs<ssevecsize>\t{%1, %0|%0, %1}";
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_data16" "1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "abs<mode>2"
   "TARGET_SSSE3"
   "pabs<mmxvecsize>\t{%1, %0|%0, %1}";
   [(set_attr "type" "sselog1")
+   (set_attr "prefix_extra" "1")
    (set_attr "mode" "DI")])
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   "TARGET_SSE4A"
   "extrq\t{%3, %2, %0|%0, %2, %3}"
   [(set_attr "type" "sse")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse4a_extrq"
   "TARGET_SSE4A"
   "extrq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sse")
+   (set_attr "prefix_data16" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse4a_insertqi"
   "TARGET_SSE4A"
   "insertq\t{%4, %3, %2, %0|%0, %2, %3, %4}"
   [(set_attr "type" "sseins")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")])
 
 (define_insn "sse4a_insertq"
   "TARGET_SSE4A"
   "insertq\t{%2, %0|%0, %2}"
   [(set_attr "type" "sseins")
+   (set_attr "prefix_rep" "1")
    (set_attr "mode" "TI")])