i386.md (*cmpfp_0_sf, [...]): Remove instruction patterns.
authorUros Bizjak <uros@kss-loka.si>
Sun, 19 Jun 2005 08:51:54 +0000 (10:51 +0200)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 19 Jun 2005 08:51:54 +0000 (01:51 -0700)
2005-06-19  Uros Bizjak  <uros@kss-loka.si>

        * config/i386/i386.md (*cmpfp_0_sf, *cmpfp_0_df, cmpfp_0_xf):
        Remove instruction patterns.
        (*cmpfp_0): New instruction pattern. Set "unit" attribute to "i387".
        (*cmpfp_sf, *cmpfp_df, *cmpfp_xf, *cmpfp_u, *_cmpfp_<mode>):
        Set "unit" attribute to "i387".
        (*pushsf, *pushsf_rex64, *pushdf_nointeger, *pushdf_integer)
        (*pushxf_nointeger, *pushxf_integer): Set "unit" attribute to "i387"
        for alternative 0.
        (*truncdfsf_mixed, *truncdfsf_i387, *truncxfsf2_mixed)
        (*truncxfsf2_i387, *truncxfdf2_mixed, *truncxfdf2_i387): Set "unit"
        attribute to "i387" when "type" attribute equals "multi".
        (*floathisf2_i387, *floatsisf2_mixed, *floatsisf2_i387)
        (*floatdisf2_mixed, *floatdisf2_i387, *floathidf2_i387)
        (*floatsidf2_mixed, *floatsidf2_i387, *floatdidf2_mixed)
        (*floatdidf2_i387, floathixf2, floatsixf2, floatdixf2): Set "unit"
        attribute to "i387" when "type" attribute equals "multi".
        * config/i386/mmx.md (*mov<mode>_internal_rex64)
        (*mov<mode>_internal, *movv2sf_internal_rex64, *movv2sf_internal):
        Set "unit" attribute to "mmx" when "type" attribute equals "ssecvt".
        (mmx_pmovmskb): Correct wrong "type" and "mode" attributes.
        * config/i386/sse.md (sse_cvtps2pi, sse_cvttps2pi, sse_cvtpd2di)
        (sse_cvttpd2pi): Set "unit" attribute to "mmx".
        (sse2_cvtpi2pd): Split register constraints. Set "unit" attribute
        to "mmx" for "y" operand 1.

From-SVN: r101180

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

index c527a5d4673820890772b7ac9b0808fc80b7673c..cedf800e5f8bc925fcc3b1473cde792a50ee0aaa 100644 (file)
@@ -1,3 +1,30 @@
+2005-06-19  Uros Bizjak  <uros@kss-loka.si>
+
+       * config/i386/i386.md (*cmpfp_0_sf, *cmpfp_0_df, cmpfp_0_xf):
+       Remove instruction patterns.
+       (*cmpfp_0): New instruction pattern. Set "unit" attribute to "i387".
+       (*cmpfp_sf, *cmpfp_df, *cmpfp_xf, *cmpfp_u, *_cmpfp_<mode>):
+       Set "unit" attribute to "i387".
+       (*pushsf, *pushsf_rex64, *pushdf_nointeger, *pushdf_integer)
+       (*pushxf_nointeger, *pushxf_integer): Set "unit" attribute to "i387"
+       for alternative 0.
+       (*truncdfsf_mixed, *truncdfsf_i387, *truncxfsf2_mixed)
+       (*truncxfsf2_i387, *truncxfdf2_mixed, *truncxfdf2_i387): Set "unit"
+       attribute to "i387" when "type" attribute equals "multi".
+       (*floathisf2_i387, *floatsisf2_mixed, *floatsisf2_i387)
+       (*floatdisf2_mixed, *floatdisf2_i387, *floathidf2_i387)
+       (*floatsidf2_mixed, *floatsidf2_i387, *floatdidf2_mixed)
+       (*floatdidf2_i387, floathixf2, floatsixf2, floatdixf2): Set "unit"
+       attribute to "i387" when "type" attribute equals "multi".
+       * config/i386/mmx.md (*mov<mode>_internal_rex64)
+       (*mov<mode>_internal, *movv2sf_internal_rex64, *movv2sf_internal):
+       Set "unit" attribute to "mmx" when "type" attribute equals "ssecvt".
+       (mmx_pmovmskb): Correct wrong "type" and "mode" attributes.
+       * config/i386/sse.md (sse_cvtps2pi, sse_cvttps2pi, sse_cvtpd2di)
+       (sse_cvttpd2pi): Set "unit" attribute to "mmx".
+       (sse2_cvtpi2pd): Split register constraints. Set "unit" attribute
+       to "mmx" for "y" operand 1.
+
 2005-06-19  Uros Bizjak  <uros@kss-loka.si>
 
        * config/i386/i386.c (ix86_function_arg_regno_p): Add MMX_REGNO_P
index 000a18e80929edf1afdb38e0f0054a0daeccf97a..5ab7e848a1d73857d4ac71482b37e341f21b9ae8 100644 (file)
 ;; We may not use "#" to split and emit these, since the REG_DEAD notes
 ;; used to manage the reg stack popping would not be preserved.
 
-(define_insn "*cmpfp_0_sf"
+(define_insn "*cmpfp_0"
   [(set (match_operand:HI 0 "register_operand" "=a")
        (unspec:HI
          [(compare:CCFP
-            (match_operand:SF 1 "register_operand" "f")
-            (match_operand:SF 2 "const0_operand" "X"))]
-       UNSPEC_FNSTSW))]
-  "TARGET_80387"
-  "* return output_fp_compare (insn, operands, 0, 0);"
-  [(set_attr "type" "multi")
-   (set_attr "mode" "SF")])
-
-(define_insn "*cmpfp_0_df"
-  [(set (match_operand:HI 0 "register_operand" "=a")
-       (unspec:HI
-         [(compare:CCFP
-            (match_operand:DF 1 "register_operand" "f")
-            (match_operand:DF 2 "const0_operand" "X"))]
-       UNSPEC_FNSTSW))]
-  "TARGET_80387"
-  "* return output_fp_compare (insn, operands, 0, 0);"
-  [(set_attr "type" "multi")
-   (set_attr "mode" "DF")])
-
-(define_insn "*cmpfp_0_xf"
-  [(set (match_operand:HI 0 "register_operand" "=a")
-       (unspec:HI
-         [(compare:CCFP
-            (match_operand:XF 1 "register_operand" "f")
-            (match_operand:XF 2 "const0_operand" "X"))]
+            (match_operand 1 "register_operand" "f")
+            (match_operand 2 "const0_operand" "X"))]
        UNSPEC_FNSTSW))]
-  "TARGET_80387"
+  "TARGET_80387
+   && FLOAT_MODE_P (GET_MODE (operands[1]))
+   && GET_MODE (operands[1]) == GET_MODE (operands[2])"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
-   (set_attr "mode" "XF")])
+   (set_attr "unit" "i387")
+   (set (attr "mode")
+     (cond [(match_operand:SF 1 "" "")
+             (const_string "SF")
+           (match_operand:DF 1 "" "")
+             (const_string "DF")
+          ]
+          (const_string "XF")))])
 
 (define_insn "*cmpfp_sf"
   [(set (match_operand:HI 0 "register_operand" "=a")
   "TARGET_80387"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387")
    (set_attr "mode" "SF")])
 
 (define_insn "*cmpfp_df"
   "TARGET_80387"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387")
    (set_attr "mode" "DF")])
 
 (define_insn "*cmpfp_xf"
   "TARGET_80387"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387")
    (set_attr "mode" "XF")])
 
 (define_insn "*cmpfp_u"
    && GET_MODE (operands[1]) == GET_MODE (operands[2])"
   "* return output_fp_compare (insn, operands, 0, 1);"
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387")
    (set (attr "mode")
      (cond [(match_operand:SF 1 "" "")
              (const_string "SF")
    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387")
    (set_attr "fp_int_src" "true")
    (set_attr "mode" "<MODE>")])
 
   return "push{l}\t%1";
 }
   [(set_attr "type" "multi,push,multi")
+   (set_attr "unit" "i387,*,*")
    (set_attr "mode" "SF,SI,SF")])
 
 (define_insn "*pushsf_rex64"
   return "push{q}\t%q1";
 }
   [(set_attr "type" "multi,push,multi")
+   (set_attr "unit" "i387,*,*")
    (set_attr "mode" "SF,DI,SF")])
 
 (define_split
   gcc_unreachable ();
 }
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387,*,*,*")
    (set_attr "mode" "DF,SI,SI,DF")])
 
 (define_insn "*pushdf_integer"
   gcc_unreachable ();
 }
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387,*,*")
    (set_attr "mode" "DF,SI,DF")])
 
 ;; %%% Kill this when call knows how to work this out.
   gcc_unreachable ();
 }
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387,*,*")
    (set_attr "mode" "XF,SI,SI")])
 
 (define_insn "*pushxf_integer"
   gcc_unreachable ();
 }
   [(set_attr "type" "multi")
+   (set_attr "unit" "i387,*")
    (set_attr "mode" "XF,SI")])
 
 (define_split
     }
 }
   [(set_attr "type" "fmov,multi,ssecvt")
+   (set_attr "unit" "*,i387,*")
    (set_attr "mode" "SF")])
 
 (define_insn "*truncdfsf_i387"
     }
 }
   [(set_attr "type" "fmov,multi")
+   (set_attr "unit" "*,i387")
    (set_attr "mode" "SF")])
 
 (define_insn "*truncdfsf2_i387_1"
     return "fst%z0\t%y0";
 }
   [(set_attr "type" "fmov,multi,multi,multi")
+   (set_attr "unit" "*,i387,i387,i387")
    (set_attr "mode" "SF")])
 
 (define_insn "truncxfsf2_i387_noop"
      return "fst%z0\t%y0";
 }
   [(set_attr "type" "fmov,multi,multi")
+   (set_attr "unit" "*,i387,i387")
    (set_attr "mode" "SF")])
 
 (define_insn "*truncxfsf2_i387_1"
     return "fst%z0\t%y0";
 }
   [(set_attr "type" "fmov,multi,multi,multi")
+   (set_attr "unit" "*,i387,i387,i387")
    (set_attr "mode" "DF")])
 
 (define_insn "truncxfdf2_i387_noop"
     return "fst%z0\t%y0";
 }
   [(set_attr "type" "fmov,multi,multi")
+   (set_attr "unit" "*,i387,i387")
    (set_attr "mode" "DF")])
 
 (define_insn "*truncxfdf2_i387_1"
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "SF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_expand "floatsisf2"
    cvtsi2ss\t{%1, %0|%0, %1}"
   [(set_attr "type" "fmov,multi,sseicvt,sseicvt")
    (set_attr "mode" "SF")
+   (set_attr "unit" "*,i387,*,*")
    (set_attr "athlon_decode" "*,*,vector,double")
    (set_attr "fp_int_src" "true")])
 
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "SF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_expand "floatdisf2"
    cvtsi2ss{q}\t{%1, %0|%0, %1}"
   [(set_attr "type" "fmov,multi,sseicvt,sseicvt")
    (set_attr "mode" "SF")
+   (set_attr "unit" "*,i387,*,*")
    (set_attr "athlon_decode" "*,*,vector,double")
    (set_attr "fp_int_src" "true")])
 
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "SF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_expand "floathidf2"
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "DF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_expand "floatsidf2"
    cvtsi2sd\t{%1, %0|%0, %1}"
   [(set_attr "type" "fmov,multi,sseicvt,sseicvt")
    (set_attr "mode" "DF")
+   (set_attr "unit" "*,i387,*,*")
    (set_attr "athlon_decode" "*,*,double,direct")
    (set_attr "fp_int_src" "true")])
 
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "DF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_expand "floatdidf2"
    cvtsi2sd{q}\t{%1, %0|%0, %1}"
   [(set_attr "type" "fmov,multi,sseicvt,sseicvt")
    (set_attr "mode" "DF")
+   (set_attr "unit" "*,i387,*,*")
    (set_attr "athlon_decode" "*,*,double,direct")
    (set_attr "fp_int_src" "true")])
 
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "DF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_insn "floathixf2"
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "XF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_insn "floatsixf2"
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "XF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 (define_insn "floatdixf2"
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "XF")
+   (set_attr "unit" "*,i387")
    (set_attr "fp_int_src" "true")])
 
 ;; %%% Kill these when reload knows how to do it.
index ceb520c008f38d1154877c414da4c27051eebcb9..ffb8d541a33a23e68ca85e5c9ad952a11b93f9f5 100644 (file)
@@ -83,6 +83,7 @@
     movd\t{%1, %0|%0, %1}
     movd\t{%1, %0|%0, %1}"
   [(set_attr "type" "imov,imov,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,ssemov")
+   (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*")
    (set_attr "mode" "DI")])
 
 (define_insn "*mov<mode>_internal"
     #
     #"
   [(set_attr "type" "mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,ssemov,ssemov,ssemov,*,*")
+   (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*,*,*,*")
    (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")])
 
 (define_expand "movv2sf"
     movd\t{%1, %0|%0, %1}
     movd\t{%1, %0|%0, %1}"
   [(set_attr "type" "imov,imov,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,ssemov,ssemov")
+   (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*,*")
    (set_attr "mode" "DI,DI,DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")])
 
 (define_insn "*movv2sf_internal"
     #
     #"
   [(set_attr "type" "mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,*,*")
+   (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*")
    (set_attr "mode" "DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")])
 
 ;; %%% This multiword shite has got to go.
                   UNSPEC_MOVMSK))]
   "TARGET_SSE || TARGET_3DNOW_A"
   "pmovmskb\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssecvt")
-   (set_attr "mode" "V4SF")])
+  [(set_attr "type" "mmxcvt")
+   (set_attr "mode" "DI")])
 
 (define_expand "mmx_maskmovq"
   [(set (match_operand:V8QI 0 "memory_operand" "")
index e323937f592b49434f96d9defe12a975cfcb8310..35a07cefc1217bca075d88ad817d21b57ef4e6a9 100644 (file)
   "TARGET_SSE"
   "cvtps2pi\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "unit" "mmx")
    (set_attr "mode" "DI")])
 
 (define_insn "sse_cvttps2pi"
   "TARGET_SSE"
   "cvttps2pi\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "unit" "mmx")
    (set_attr "mode" "SF")])
 
 (define_insn "sse_cvtsi2ss"
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (define_insn "sse2_cvtpi2pd"
-  [(set (match_operand:V2DF 0 "register_operand" "=x")
-       (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "ym")))]
+  [(set (match_operand:V2DF 0 "register_operand" "=x,x")
+       (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "y,m")))]
   "TARGET_SSE2"
   "cvtpi2pd\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "unit" "mmx,*")
    (set_attr "mode" "V2DF")])
 
 (define_insn "sse2_cvtpd2pi"
   "TARGET_SSE2"
   "cvtpd2pi\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "unit" "mmx")
    (set_attr "mode" "DI")])
 
 (define_insn "sse2_cvttpd2pi"
   "TARGET_SSE2"
   "cvttpd2pi\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
+   (set_attr "unit" "mmx")
    (set_attr "mode" "TI")])
 
 (define_insn "sse2_cvtsi2sd"