OSDN Git Service

Consolidate some sparc insn patterns using "enabled".
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Oct 2011 21:53:38 +0000 (21:53 +0000)
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Oct 2011 21:53:38 +0000 (21:53 +0000)
* config/sparc/sparc.md (cpu_feature, enabled): New attributes.
(*movsi_insn_novis3, *movsi_insn_vis3): Consolidate into one pattern
called *movsi_insn.
(*movdi_insn_sp32_v9_novis3, *movdi_insn_sp32_v9_vis3): Consolidate
into *movdi_insn_sp32.
(*movdi_insn_sp64_novis3, *movdi_insn_sp64_vis3): Consolidate into
one pattern called *movdi_insn_sp64.
(*movsf_insn_novis3, *movsf_insn_vis3, *movsf_insn_no_fpu):
Consolidate into one pattern called *movsf_insn.
(*movdf_insn_sp32_no_fpu, *movdf_insn_sp32_v9_novis3,
*movdf_insn_sp32_v9_vis3, *movdf_insn_sp32_v9_no_fpu): Consolidate
into *movdf_insn_sp32.
(*movdf_insn_sp64_novis3, *movdf_insn_sp64_vis3,
*movdf_insn_sp64_no_fpu): Consolidate into one pattern called
*movdf_insn_sp64.
(*zero_extendsidi2_insn_sp64_novis3,
*zero_extendsidi2_insn_sp64_vis3): Consolidate into one pattern
called *zero_extendsidi2_insn_sp64.
(*sign_extendsidi2_insn_novis3, *sign_extendsidi2_insn_vis3):
Consolidate into one pattern named *sign_extendsidi2_insn.
(*mov<VM32:mode>_insn_novis3, *mov<VM32:mode>_insn_vis3):
Consolidate into one pattern named *mov<VM32:mode>_insn.
(*mov<VM64:mode>_insn_sp64_novis3,
*mov<VM64:mode>_insn_sp64_novis3): Consolidate into one pattern
named *mov<VM64:mode>_insn_sp64.
(*mov<VM64:mode>_insn_sp32_novis3,
*mov<VM64:mode>_insn_sp32_vis3): Consolidate into one pattern
named *mov<VM64:mode>_insn_sp32.

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

gcc/ChangeLog
gcc/config/sparc/sparc.md

index bd04d77..1ccb189 100644 (file)
@@ -1,3 +1,34 @@
+2011-10-24  David S. Miller  <davem@davemloft.net>
+
+       * config/sparc/sparc.md (cpu_feature, enabled): New attributes.
+       (*movsi_insn_novis3, *movsi_insn_vis3): Consolidate into one pattern
+       called *movsi_insn.
+       (*movdi_insn_sp32_v9_novis3, *movdi_insn_sp32_v9_vis3): Consolidate
+       into *movdi_insn_sp32.
+       (*movdi_insn_sp64_novis3, *movdi_insn_sp64_vis3): Consolidate into
+       one pattern called *movdi_insn_sp64.
+       (*movsf_insn_novis3, *movsf_insn_vis3, *movsf_insn_no_fpu):
+       Consolidate into one pattern called *movsf_insn.
+       (*movdf_insn_sp32_no_fpu, *movdf_insn_sp32_v9_novis3,
+       *movdf_insn_sp32_v9_vis3, *movdf_insn_sp32_v9_no_fpu): Consolidate
+       into *movdf_insn_sp32.
+       (*movdf_insn_sp64_novis3, *movdf_insn_sp64_vis3,
+       *movdf_insn_sp64_no_fpu): Consolidate into one pattern called
+       *movdf_insn_sp64.
+       (*zero_extendsidi2_insn_sp64_novis3,
+       *zero_extendsidi2_insn_sp64_vis3): Consolidate into one pattern
+       called *zero_extendsidi2_insn_sp64.
+       (*sign_extendsidi2_insn_novis3, *sign_extendsidi2_insn_vis3):
+       Consolidate into one pattern named *sign_extendsidi2_insn.
+       (*mov<VM32:mode>_insn_novis3, *mov<VM32:mode>_insn_vis3):
+       Consolidate into one pattern named *mov<VM32:mode>_insn.
+       (*mov<VM64:mode>_insn_sp64_novis3,
+       *mov<VM64:mode>_insn_sp64_novis3): Consolidate into one pattern
+       named *mov<VM64:mode>_insn_sp64.
+       (*mov<VM64:mode>_insn_sp32_novis3,
+       *mov<VM64:mode>_insn_sp32_vis3): Consolidate into one pattern
+       named *mov<VM64:mode>_insn_sp32.
+
 2011-10-24  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * tree-ssa-strlen.c (get_string_length): Change assertion to STPCPY.
index 0f716d6..a2a49df 100644 (file)
         (symbol_ref "TARGET_SPARCLET") (const_string "sparclet")]
        (const_string "v7"))))
 
+(define_attr "cpu_feature" "none,fpu,fpunotv9,v9,vis,vis3" (const_string "none"))
+
+(define_attr "enabled" ""
+  (cond [(eq_attr "cpu_feature" "none") (const_int 1)
+         (eq_attr "cpu_feature" "fpu") (symbol_ref "TARGET_FPU")
+        (eq_attr "cpu_feature" "fpunotv9") (symbol_ref "TARGET_FPU && ! TARGET_V9")
+         (eq_attr "cpu_feature" "v9") (symbol_ref "TARGET_V9")
+         (eq_attr "cpu_feature" "vis") (symbol_ref "TARGET_VIS")
+         (eq_attr "cpu_feature" "vis3") (symbol_ref "TARGET_VIS3")]
+        (const_int 0)))
+
 ;; Insn type.
 (define_attr "type"
   "ialu,compare,shift,
     DONE;
 })
 
-(define_insn "*movsi_insn_novis3"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,m,!f,!f,!m,d,d")
-       (match_operand:SI 1 "input_operand"   "rI,K,m,rJ,f,m,f,J,P"))]
-  "(! TARGET_VIS3
-    && (register_operand (operands[0], SImode)
-        || register_or_zero_or_all_ones_operand (operands[1], SImode)))"
-  "@
-   mov\t%1, %0
-   sethi\t%%hi(%a1), %0
-   ld\t%1, %0
-   st\t%r1, %0
-   fmovs\t%1, %0
-   ld\t%1, %0
-   st\t%1, %0
-   fzeros\t%0
-   fones\t%0"
-  [(set_attr "type" "*,*,load,store,fpmove,fpload,fpstore,fga,fga")])
-
-(define_insn "*movsi_insn_vis3"
+(define_insn "*movsi_insn"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r, m, r,*f,*f,*f, m,d,d")
        (match_operand:SI 1 "input_operand"        "rI,K,m,rJ,*f, r, f, m,*f,J,P"))]
-  "(TARGET_VIS3
-    && (register_operand (operands[0], SImode)
-        || register_or_zero_or_all_ones_operand (operands[1], SImode)))"
+  "register_operand (operands[0], SImode)
+   || register_or_zero_or_all_ones_operand (operands[1], SImode)"
   "@
    mov\t%1, %0
    sethi\t%%hi(%a1), %0
    st\t%1, %0
    fzeros\t%0
    fones\t%0"
-  [(set_attr "type" "*,*,load,store,*,*,fpmove,fpload,fpstore,fga,fga")])
+  [(set_attr "type" "*,*,load,store,*,*,fpmove,fpload,fpstore,fga,fga")
+   (set_attr "cpu_feature" "*,*,*,*,vis3,vis3,*,*,*,vis,vis")])
 
 (define_insn "*movsi_lo_sum"
   [(set (match_operand:SI 0 "register_operand" "=r")
 
 (define_insn "*movdi_insn_sp32"
   [(set (match_operand:DI 0 "nonimmediate_operand"
-                               "=o,T,U,o,r,r,r,?T,?f,?f,?o,?f")
+                                       "=T,o,T,U,o,r,r,r,?T,?*f,?*f,?o,?*e,?*e,  r,?*f,?*e,?W,b,b")
         (match_operand:DI 1 "input_operand"
-                               " J,U,T,r,o,i,r, f, T, o, f, f"))]
-  "! TARGET_V9
-   && (register_operand (operands[0], DImode)
-       || register_or_zero_operand (operands[1], DImode))"
-  "@
-   #
-   std\t%1, %0
-   ldd\t%1, %0
-   #
-   #
-   #
-   #
-   std\t%1, %0
-   ldd\t%1, %0
-   #
-   #
-   #"
-  [(set_attr "type" "store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
-   (set_attr "length" "2,*,*,2,2,2,2,*,*,2,2,2")])
-
-(define_insn "*movdi_insn_sp32_v9_novis3"
-  [(set (match_operand:DI 0 "nonimmediate_operand"
-                                       "=T,o,T,U,o,r,r,r,?T,?f,?f,?o,?e,?e,?W,b,b")
-        (match_operand:DI 1 "input_operand"
-                                       " J,J,U,T,r,o,i,r, f, T, o, f, e, W, e,J,P"))]
+                                       " J,J,U,T,r,o,i,r,*f,  T,  o,*f, *e, *e,?*f,  r,  W,*e,J,P"))]
   "! TARGET_ARCH64
-   && TARGET_V9
-   && ! TARGET_VIS3
-   && (register_operand (operands[0], DImode)
-       || register_or_zero_operand (operands[1], DImode))"
-  "@
-   stx\t%%g0, %0
-   #
-   std\t%1, %0
-   ldd\t%1, %0
-   #
-   #
-   #
-   #
-   std\t%1, %0
-   ldd\t%1, %0
-   #
-   #
-   fmovd\\t%1, %0
-   ldd\\t%1, %0
-   std\\t%1, %0
-   fzero\t%0
-   fone\t%0"
-  [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,fpmove,fpload,fpstore,fga,fga")
-   (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,*,*,*,*,*")
-   (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*,double,double")])
-
-(define_insn "*movdi_insn_sp32_v9_vis3"
-  [(set (match_operand:DI 0 "nonimmediate_operand"
-                                       "=T,o,T,U,o,r,r,r,?T,?*f,?*f,?o,?*e,  r,?*f,?*e,?W,b,b")
-        (match_operand:DI 1 "input_operand"
-                                       " J,J,U,T,r,o,i,r,*f,  T,  o,*f, *e,?*f,  r,  W,*e,J,P"))]
-  "! TARGET_ARCH64
-   && TARGET_V9
-   && TARGET_VIS3
    && (register_operand (operands[0], DImode)
        || register_or_zero_operand (operands[1], DImode))"
   "@
    fmovd\t%1, %0
    #
    #
+   #
    ldd\t%1, %0
    std\t%1, %0
    fzero\t%0
    fone\t%0"
-  [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,*,*,fpmove,fpload,fpstore,fga,fga")
-   (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,*,2,2,*,*,*,*")
-   (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*,*,*,double,double")])
-
-(define_insn "*movdi_insn_sp64_novis3"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,m,?e,?e,?W,b,b")
-        (match_operand:DI 1 "input_operand"   "rI,N,m,rJ,e,W,e,J,P"))]
-  "TARGET_ARCH64
-   && ! TARGET_VIS3
-   && (register_operand (operands[0], DImode)
-       || register_or_zero_or_all_ones_operand (operands[1], DImode))"
-  "@
-   mov\t%1, %0
-   sethi\t%%hi(%a1), %0
-   ldx\t%1, %0
-   stx\t%r1, %0
-   fmovd\t%1, %0
-   ldd\t%1, %0
-   std\t%1, %0
-   fzero\t%0
-   fone\t%0"
-  [(set_attr "type" "*,*,load,store,fpmove,fpload,fpstore,fga,fga")
-   (set_attr "fptype" "*,*,*,*,double,*,*,double,double")])
+  [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,fpmove,*,*,*,fpload,fpstore,fga,fga")
+   (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,*,2,2,2,*,*,*,*")
+   (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*,*,*,*,double,double")
+   (set_attr "cpu_feature" "v9,*,*,*,*,*,*,*,fpu,fpu,fpu,fpu,v9,fpunotv9,vis3,vis3,fpu,fpu,vis,vis")])
 
-(define_insn "*movdi_insn_sp64_vis3"
+(define_insn "*movdi_insn_sp64"
   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r, m, r,*e,?*e,?*e,?W,b,b")
         (match_operand:DI 1 "input_operand"        "rI,N,m,rJ,*e, r, *e,  W,*e,J,P"))]
   "TARGET_ARCH64
-   && TARGET_VIS3
    && (register_operand (operands[0], DImode)
        || register_or_zero_or_all_ones_operand (operands[1], DImode))"
   "@
    fzero\t%0
    fone\t%0"
   [(set_attr "type" "*,*,load,store,*,*,fpmove,fpload,fpstore,fga,fga")
-   (set_attr "fptype" "*,*,*,*,*,*,double,*,*,double,double")])
+   (set_attr "fptype" "*,*,*,*,*,*,double,*,*,double,double")
+   (set_attr "cpu_feature" "*,*,*,*,vis3,vis3,*,*,*,vis,vis")])
 
 (define_expand "movdi_pic_label_ref"
   [(set (match_dup 3) (high:DI
     DONE;
 })
 
-(define_insn "*movsf_insn_novis3"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=d, d,f,  *r,*r,*r,f,*r,m,   m")
-       (match_operand:SF 1 "input_operand"        "GY,ZC,f,*rRY, Q, S,m, m,f,*rGY"))]
-  "TARGET_FPU
-   && ! TARGET_VIS3
-   && (register_operand (operands[0], SFmode)
-       || register_or_zero_or_all_ones_operand (operands[1], SFmode))"
-{
-  if (GET_CODE (operands[1]) == CONST_DOUBLE
-      && (which_alternative == 3
-          || which_alternative == 4
-          || which_alternative == 5))
-    {
-      REAL_VALUE_TYPE r;
-      long i;
-
-      REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
-      REAL_VALUE_TO_TARGET_SINGLE (r, i);
-      operands[1] = GEN_INT (i);
-    }
-
-  switch (which_alternative)
-    {
-    case 0:
-      return "fzeros\t%0";
-    case 1:
-      return "fones\t%0";
-    case 2:
-      return "fmovs\t%1, %0";
-    case 3:
-      return "mov\t%1, %0";
-    case 4:
-      return "sethi\t%%hi(%a1), %0";
-    case 5:
-      return "#";
-    case 6:
-    case 7:
-      return "ld\t%1, %0";
-    case 8:
-    case 9:
-      return "st\t%r1, %0";
-    default:
-      gcc_unreachable ();
-    }
-}
-  [(set_attr "type" "fga,fga,fpmove,*,*,*,fpload,load,fpstore,store")])
-
-(define_insn "*movsf_insn_vis3"
+(define_insn "*movsf_insn"
   [(set (match_operand:SF 0 "nonimmediate_operand" "=d, d,f,  *r,*r,*r,*r, f, f,*r, m,   m")
        (match_operand:SF 1 "input_operand"        "GY,ZC,f,*rRY, Q, S, f,*r, m, m, f,*rGY"))]
-  "TARGET_FPU
-   && TARGET_VIS3
-   && (register_operand (operands[0], SFmode)
-       || register_or_zero_or_all_ones_operand (operands[1], SFmode))"
+  "(register_operand (operands[0], SFmode)
+    || register_or_zero_or_all_ones_operand (operands[1], SFmode))"
 {
   if (GET_CODE (operands[1]) == CONST_DOUBLE
       && (which_alternative == 3
       gcc_unreachable ();
     }
 }
-  [(set_attr "type" "fga,fga,fpmove,*,*,*,*,*,fpload,load,fpstore,store")])
-
-;; Exactly the same as above, except that all `f' cases are deleted.
-;; This is necessary to prevent reload from ever trying to use a `f' reg
-;; when -mno-fpu.
-
-(define_insn "*movsf_insn_no_fpu"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,r,m")
-       (match_operand:SF 1 "input_operand"    "rR,Q,S,m,rG"))]
-  "! TARGET_FPU
-   && (register_operand (operands[0], SFmode)
-       || register_or_zero_operand (operands[1], SFmode))"
-{
-  if (GET_CODE (operands[1]) == CONST_DOUBLE
-      && (which_alternative == 0
-          || which_alternative == 1
-          || which_alternative == 2))
-    {
-      REAL_VALUE_TYPE r;
-      long i;
-
-      REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
-      REAL_VALUE_TO_TARGET_SINGLE (r, i);
-      operands[1] = GEN_INT (i);
-    }
-
-  switch (which_alternative)
-    {
-    case 0:
-      return "mov\t%1, %0";
-    case 1:
-      return "sethi\t%%hi(%a1), %0";
-    case 2:
-      return "#";
-    case 3:
-      return "ld\t%1, %0";
-    case 4:
-      return "st\t%r1, %0";
-    default:
-      gcc_unreachable ();
-    }
-}
-  [(set_attr "type" "*,*,*,load,store")])
+  [(set_attr "type" "fga,fga,fpmove,*,*,*,*,*,fpload,load,fpstore,store")
+   (set_attr "cpu_feature" "vis,vis,fpu,*,*,*,vis3,vis3,fpu,*,fpu,*")])
 
 ;; The following 3 patterns build SFmode constants in integer registers.
 
     DONE;
 })
 
-;; Be careful, fmovd does not exist when !v9.
 (define_insn "*movdf_insn_sp32"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=e,W,U,T,o,e,  *r, o,  e,o")
-       (match_operand:DF 1 "input_operand"       "W#F,e,T,U,G,e,*rFo,*r,o#F,e"))]
-  "TARGET_FPU
-   && ! TARGET_V9
-   && (register_operand (operands[0], DFmode)
-       || register_or_zero_operand (operands[1], DFmode))"
-  "@
-  ldd\t%1, %0
-  std\t%1, %0
-  ldd\t%1, %0
-  std\t%1, %0
-  #
-  #
-  #
-  #
-  #
-  #"
- [(set_attr "type" "fpload,fpstore,load,store,*,*,*,*,*,*")
-  (set_attr "length" "*,*,*,*,2,2,2,2,2,2")])
-
-(define_insn "*movdf_insn_sp32_no_fpu"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=U,T,o,r,o")
-       (match_operand:DF 1 "input_operand"    "T,U,G,ro,r"))]
-  "! TARGET_FPU
-   && ! TARGET_V9
-   && (register_operand (operands[0], DFmode)
-       || register_or_zero_operand (operands[1], DFmode))"
-  "@
-  ldd\t%1, %0
-  std\t%1, %0
-  #
-  #
-  #"
-  [(set_attr "type" "load,store,*,*,*")
-   (set_attr "length" "*,*,2,2,2")])
-
-;; We have available v9 double floats but not 64-bit integer registers.
-(define_insn "*movdf_insn_sp32_v9_novis3"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=b, b,e,  e, T,W,U,T,  f,     *r,    o")
-        (match_operand:DF 1 "input_operand"        "GY,ZC,e,W#F,GY,e,T,U,o#F,*roGYDF,*rGYf"))]
-  "TARGET_FPU
-   && TARGET_V9
-   && ! TARGET_VIS3
-   && ! TARGET_ARCH64
+  [(set (match_operand:DF 0 "nonimmediate_operand" "=b, b,e,e,*r, f,  e, T,W,U,T,  f,     *r,   o,o")
+        (match_operand:DF 1 "input_operand"        "GY,ZC,e,e, f,*r,W#F,GY,e,T,U,o#F,*roGYDF,*rGY,f"))]
+  "! TARGET_ARCH64
    && (register_operand (operands[0], DFmode)
        || register_or_zero_or_all_ones_operand (operands[1], DFmode))"
   "@
   fzero\t%0
   fone\t%0
   fmovd\t%1, %0
-  ldd\t%1, %0
-  stx\t%r1, %0
-  std\t%1, %0
-  ldd\t%1, %0
-  std\t%1, %0
   #
   #
-  #"
-  [(set_attr "type" "fga,fga,fpmove,load,store,store,load,store,*,*,*")
-   (set_attr "length" "*,*,*,*,*,*,*,*,2,2,2")
-   (set_attr "fptype" "double,double,double,*,*,*,*,*,*,*,*")])
-
-(define_insn "*movdf_insn_sp32_v9_vis3"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=b, b,e,*r, f,  e, T,W,U,T,  f,     *r,    o")
-        (match_operand:DF 1 "input_operand"        "GY,ZC,e, f,*r,W#F,GY,e,T,U,o#F,*roGYDF,*rGYf"))]
-  "TARGET_FPU
-   && TARGET_V9
-   && TARGET_VIS3
-   && ! TARGET_ARCH64
-   && (register_operand (operands[0], DFmode)
-       || register_or_zero_or_all_ones_operand (operands[1], DFmode))"
-  "@
-  fzero\t%0
-  fone\t%0
-  fmovd\t%1, %0
-  #
   #
   ldd\t%1, %0
   stx\t%r1, %0
   std\t%1, %0
   #
   #
-  #"
-  [(set_attr "type" "fga,fga,fpmove,*,*,load,store,store,load,store,*,*,*")
-   (set_attr "length" "*,*,*,2,2,*,*,*,*,*,2,2,2")
-   (set_attr "fptype" "double,double,double,*,*,*,*,*,*,*,*,*,*")])
-
-(define_insn "*movdf_insn_sp32_v9_no_fpu"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=U,T,T,r,o")
-       (match_operand:DF 1 "input_operand"    "T,U,G,ro,rG"))]
-  "! TARGET_FPU
-   && TARGET_V9
-   && ! TARGET_ARCH64
-   && (register_operand (operands[0], DFmode)
-       || register_or_zero_operand (operands[1], DFmode))"
-  "@
-  ldd\t%1, %0
-  std\t%1, %0
-  stx\t%r1, %0
   #
   #"
-  [(set_attr "type" "load,store,store,*,*")
-   (set_attr "length" "*,*,*,2,2")])
-
-;; We have available both v9 double floats and 64-bit integer registers.
-(define_insn "*movdf_insn_sp64_novis3"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=b, b,e,  e,W,  *r,*r,   m,*r")
-        (match_operand:DF 1 "input_operand"        "GY,ZC,e,W#F,e,*rGY, m,*rGY,DF"))]
-  "TARGET_FPU
-   && ! TARGET_VIS3
-   && TARGET_ARCH64
-   && (register_operand (operands[0], DFmode)
-       || register_or_zero_or_all_ones_operand (operands[1], DFmode))"
-  "@
-  fzero\t%0
-  fone\t%0
-  fmovd\t%1, %0
-  ldd\t%1, %0
-  std\t%1, %0
-  mov\t%r1, %0
-  ldx\t%1, %0
-  stx\t%r1, %0
-  #"
-  [(set_attr "type" "fga,fga,fpmove,load,store,*,load,store,*")
-   (set_attr "length" "*,*,*,*,*,*,*,*,2")
-   (set_attr "fptype" "double,double,double,*,*,*,*,*,*")])
+  [(set_attr "type" "fga,fga,fpmove,*,*,*,fpload,store,fpstore,load,store,*,*,*,*")
+   (set_attr "length" "*,*,*,2,2,2,*,*,*,*,*,2,2,2,2")
+   (set_attr "fptype" "double,double,double,*,*,*,*,*,*,*,*,*,*,*,*")
+   (set_attr "cpu_feature" "vis,vis,v9,fpunotv9,vis3,vis3,fpu,v9,fpu,*,*,fpu,*,*,fpu")])
 
-(define_insn "*movdf_insn_sp64_vis3"
+(define_insn "*movdf_insn_sp64"
   [(set (match_operand:DF 0 "nonimmediate_operand" "=b, b,e,*r, e,  e,W,  *r,*r,   m,*r")
         (match_operand:DF 1 "input_operand"        "GY,ZC,e, e,*r,W#F,e,*rGY, m,*rGY,DF"))]
-  "TARGET_FPU
-   && TARGET_ARCH64
-   && TARGET_VIS3
+  "TARGET_ARCH64
    && (register_operand (operands[0], DFmode)
        || register_or_zero_or_all_ones_operand (operands[1], DFmode))"
   "@
   #"
   [(set_attr "type" "fga,fga,fpmove,*,*,load,store,*,load,store,*")
    (set_attr "length" "*,*,*,*,*,*,*,*,*,*,2")
-   (set_attr "fptype" "double,double,double,double,double,*,*,*,*,*,*")])
-
-(define_insn "*movdf_insn_sp64_no_fpu"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,m")
-        (match_operand:DF 1 "input_operand"    "r,m,rG"))]
-  "! TARGET_FPU
-   && TARGET_ARCH64
-   && (register_operand (operands[0], DFmode)
-       || register_or_zero_operand (operands[1], DFmode))"
-  "@
-  mov\t%1, %0
-  ldx\t%1, %0
-  stx\t%r1, %0"
-  [(set_attr "type" "*,load,store")])
+   (set_attr "fptype" "double,double,double,double,double,*,*,*,*,*,*")
+   (set_attr "cpu_feature" "vis,vis,fpu,vis3,vis3,fpu,fpu,*,*,*,*")])
 
 ;; This pattern builds DFmode constants in integer registers.
 (define_split
   ""
   "")
 
-(define_insn "*zero_extendsidi2_insn_sp64_novis3"
-  [(set (match_operand:DI 0 "register_operand" "=r,r")
-       (zero_extend:DI (match_operand:SI 1 "input_operand" "r,m")))]
-  "TARGET_ARCH64
-   && ! TARGET_VIS3
-   && GET_CODE (operands[1]) != CONST_INT"
-  "@
-   srl\t%1, 0, %0
-   lduw\t%1, %0"
-  [(set_attr "type" "shift,load")])
-
-(define_insn "*zero_extendsidi2_insn_sp64_vis3"
+(define_insn "*zero_extendsidi2_insn_sp64"
   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
        (zero_extend:DI (match_operand:SI 1 "input_operand" "r,m,*f")))]
   "TARGET_ARCH64
-   && TARGET_VIS3
    && GET_CODE (operands[1]) != CONST_INT"
   "@
    srl\t%1, 0, %0
    lduw\t%1, %0
    movstouw\t%1, %0"
-  [(set_attr "type" "shift,load,*")])
+  [(set_attr "type" "shift,load,*")
+   (set_attr "cpu_feature" "*,*,vis3")])
 
 (define_insn_and_split "*zero_extendsidi2_insn_sp32"
   [(set (match_operand:DI 0 "register_operand" "=r")
   "TARGET_ARCH64"
   "")
 
-(define_insn "*sign_extendsidi2_insn_novis3"
-  [(set (match_operand:DI 0 "register_operand" "=r,r")
-       (sign_extend:DI (match_operand:SI 1 "input_operand" "r,m")))]
-  "TARGET_ARCH64 && ! TARGET_VIS3"
-  "@
-  sra\t%1, 0, %0
-  ldsw\t%1, %0"
-  [(set_attr "type" "shift,sload")
-   (set_attr "us3load_type" "*,3cycle")])
-
-(define_insn "*sign_extendsidi2_insn_vis3"
+(define_insn "*sign_extendsidi2_insn"
   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
        (sign_extend:DI (match_operand:SI 1 "input_operand" "r,m,*f")))]
-  "TARGET_ARCH64 && TARGET_VIS3"
+  "TARGET_ARCH64"
   "@
   sra\t%1, 0, %0
   ldsw\t%1, %0
   movstosw\t%1, %0"
   [(set_attr "type" "shift,sload,*")
-   (set_attr "us3load_type" "*,3cycle,*")])
+   (set_attr "us3load_type" "*,3cycle,*")
+   (set_attr "cpu_feature" "*,*,vis3")])
 
 
 ;; Special pattern for optimizing bit-field compares.  This is needed
     DONE;
 })
 
-(define_insn "*mov<VM32:mode>_insn_novis3"
-  [(set (match_operand:VM32 0 "nonimmediate_operand" "=f, f,f,f,m, m,r,m,*r")
-       (match_operand:VM32 1 "input_operand"        "GY,ZC,f,m,f,GY,m,r,*r"))]
-  "TARGET_VIS
-   && ! TARGET_VIS3
-   && (register_operand (operands[0], <VM32:MODE>mode)
-       || register_or_zero_or_all_ones_operand (operands[1], <VM32:MODE>mode))"
-  "@
-  fzeros\t%0
-  fones\t%0
-  fsrc1s\t%1, %0
-  ld\t%1, %0
-  st\t%1, %0
-  st\t%r1, %0
-  ld\t%1, %0
-  st\t%1, %0
-  mov\t%1, %0"
-  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*")])
-
-(define_insn "*mov<VM32:mode>_insn_vis3"
+(define_insn "*mov<VM32:mode>_insn"
   [(set (match_operand:VM32 0 "nonimmediate_operand" "=f, f,f,f,m, m,*r, m,*r,*r, f")
        (match_operand:VM32 1 "input_operand"        "GY,ZC,f,m,f,GY, m,*r,*r, f,*r"))]
   "TARGET_VIS
-   && TARGET_VIS3
    && (register_operand (operands[0], <VM32:MODE>mode)
        || register_or_zero_or_all_ones_operand (operands[1], <VM32:MODE>mode))"
   "@
   mov\t%1, %0
   movstouw\t%1, %0
   movwtos\t%1, %0"
-  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*,*,*")])
-
-(define_insn "*mov<VM64:mode>_insn_sp64_novis3"
-  [(set (match_operand:VM64 0 "nonimmediate_operand" "=e, e,e,e,m, m,r,m,*r")
-       (match_operand:VM64 1 "input_operand"        "GY,ZC,e,m,e,GY,m,r,*r"))]
-  "TARGET_VIS
-   && ! TARGET_VIS3
-   && TARGET_ARCH64
-   && (register_operand (operands[0], <VM64:MODE>mode)
-       || register_or_zero_or_all_ones_operand (operands[1], <VM64:MODE>mode))"
-  "@
-  fzero\t%0
-  fone\t%0
-  fsrc1\t%1, %0
-  ldd\t%1, %0
-  std\t%1, %0
-  stx\t%r1, %0
-  ldx\t%1, %0
-  stx\t%1, %0
-  mov\t%1, %0"
-  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*")])
+  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*,*,*")
+   (set_attr "cpu_feature" "vis,vis,vis,*,*,*,*,*,*,vis3,vis3")])
 
-(define_insn "*mov<VM64:mode>_insn_sp64_vis3"
+(define_insn "*mov<VM64:mode>_insn_sp64"
   [(set (match_operand:VM64 0 "nonimmediate_operand" "=e, e,e,e,m, m,*r, m,*r, f,*r")
        (match_operand:VM64 1 "input_operand"        "GY,ZC,e,m,e,GY, m,*r, f,*r,*r"))]
   "TARGET_VIS
-   && TARGET_VIS3
    && TARGET_ARCH64
    && (register_operand (operands[0], <VM64:MODE>mode)
        || register_or_zero_or_all_ones_operand (operands[1], <VM64:MODE>mode))"
   movdtox\t%1, %0
   movxtod\t%1, %0
   mov\t%1, %0"
-  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*,*,*")])
-
-(define_insn "*mov<VM64:mode>_insn_sp32_novis3"
-  [(set (match_operand:VM64 0 "nonimmediate_operand" "=e, e,e,e,m, m,U,T,o,*r")
-       (match_operand:VM64 1 "input_operand"        "GY,ZC,e,m,e,GY,T,U,r,*r"))]
-  "TARGET_VIS
-   && ! TARGET_VIS3
-   && ! TARGET_ARCH64
-   && (register_operand (operands[0], <VM64:MODE>mode)
-       || register_or_zero_or_all_ones_operand (operands[1], <VM64:MODE>mode))"
-  "@
-  fzero\t%0
-  fone\t%0
-  fsrc1\t%1, %0
-  ldd\t%1, %0
-  std\t%1, %0
-  stx\t%r1, %0
-  ldd\t%1, %0
-  std\t%1, %0
-  #
-  #"
-  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*,*")
-   (set_attr "length" "*,*,*,*,*,*,*,*,2,2")])
+  [(set_attr "type" "fga,fga,fga,fpload,fpstore,store,load,store,*,*,*")
+   (set_attr "cpu_feature" "vis,vis,vis,*,*,*,*,*,vis3,vis3,*")])
 
-(define_insn "*mov<VM64:mode>_insn_sp32_vis3"
+(define_insn "*mov<VM64:mode>_insn_sp32"
   [(set (match_operand:VM64 0 "nonimmediate_operand" "=e, e,e,*r, f,e,m, m,U,T, o,*r")
        (match_operand:VM64 1 "input_operand"        "GY,ZC,e, f,*r,m,e,GY,T,U,*r,*r"))]
   "TARGET_VIS
-   && TARGET_VIS3
    && ! TARGET_ARCH64
    && (register_operand (operands[0], <VM64:MODE>mode)
        || register_or_zero_or_all_ones_operand (operands[1], <VM64:MODE>mode))"
   #
   #"
   [(set_attr "type" "fga,fga,fga,*,*,fpload,fpstore,store,load,store,*,*")
-   (set_attr "length" "*,*,*,2,2,*,*,*,*,*,2,2")])
+   (set_attr "length" "*,*,*,2,2,*,*,*,*,*,2,2")
+   (set_attr "cpu_feature" "vis,vis,vis,vis3,vis3,*,*,*,*,*,*,*")])
 
 (define_split
   [(set (match_operand:VM64 0 "memory_operand" "")