OSDN Git Service

* config/rs6000/spe.md (SPE_ACC_REGNO): Delete definition.
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / spe.md
index 3b658b8..28c40c5 100644 (file)
@@ -1,41 +1,70 @@
 ;; e500 SPE description
-;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
+;; Free Software Foundation, Inc.
 ;; Contributed by Aldy Hernandez (aldy@quesejoda.com)
 
-;; This file is part of GNU CC.
+;; This file is part of GCC.
 
-;; GNU CC is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; GCC is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 2, or (at your
+;; option) any later version.
 
-;; GNU CC is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
+;; GCC is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+;; License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU CC; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GCC; see the file COPYING.  If not, write to the
+;; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
 
 (define_constants
-  [(SPE_ACC_REGNO      111)
-   (SPEFSCR_REGNO      112)])
+  [(CMPDFEQ_GPR                1006)
+   (TSTDFEQ_GPR                1007)
+   (CMPDFGT_GPR                1008)
+   (TSTDFGT_GPR                1009)
+   (CMPDFLT_GPR                1010)
+   (TSTDFLT_GPR                1011)
+   (CMPTFEQ_GPR                1012)
+   (TSTTFEQ_GPR                1013)
+   (CMPTFGT_GPR                1014)
+   (TSTTFGT_GPR                1015)
+   (CMPTFLT_GPR                1016)
+   (TSTTFLT_GPR                1017)
+   (E500_CR_IOR_COMPARE 1018)
+   ])
+
+;; Modes using a 64-bit register.
+(define_mode_macro SPE64 [DF V4HI V2SF V1DI V2SI])
+
+;; Likewise, but allow TFmode (two registers) as well.
+(define_mode_macro SPE64TF [DF V4HI V2SF V1DI V2SI TF])
+
+;; DImode and TImode.
+(define_mode_macro DITI [DI TI])
 
 (define_insn "*negsf2_gpr"
   [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
         (neg:SF (match_operand:SF 1 "gpc_reg_operand" "r")))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS"
   "efsneg %0,%1"
-  [(set_attr "type" "fp")])
+  [(set_attr "type" "fpsimple")])
 
 (define_insn "*abssf2_gpr"
   [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
        (abs:SF (match_operand:SF 1 "gpc_reg_operand" "r")))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS"
   "efsabs %0,%1"
-  [(set_attr "type" "fp")])
+  [(set_attr "type" "fpsimple")])
+
+(define_insn "*nabssf2_gpr"
+  [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
+       (neg:SF (abs:SF (match_operand:SF 1 "gpc_reg_operand" "r"))))]
+  "TARGET_HARD_FLOAT && !TARGET_FPRS"
+  "efsnabs %0,%1"
+  [(set_attr "type" "fpsimple")])
 
 (define_insn "*addsf3_gpr"
   [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
                 (match_operand:SF 2 "gpc_reg_operand" "r")))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS"
   "efsdiv %0,%1,%2"
-  [(set_attr "type" "fp")])
+  [(set_attr "type" "vecfdiv")])
+
+;; Floating point conversion instructions.
 
-(define_insn "spe_efsctuiz"
+(define_insn "fixuns_truncdfsi2"
   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
-        (unspec:SI [(match_operand:SF 1 "gpc_reg_operand" "r")] 700))]
-  "TARGET_HARD_FLOAT && !TARGET_FPRS"
-  "efsctuiz %0,%1"
+       (unsigned_fix:SI (match_operand:DF 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdctuiz %0,%1"
+  [(set_attr "type" "fp")])
+
+(define_insn "spe_extendsfdf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (float_extend:DF (match_operand:SF 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdcfs %0,%1"
   [(set_attr "type" "fp")])
 
-(define_insn "spe_fixunssfsi2"
+(define_insn "spe_fixuns_truncsfsi2"
   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
-       (unsigned_fix:SI (fix:SF (match_operand:SF 1 "gpc_reg_operand" "r"))))]
+       (unsigned_fix:SI (match_operand:SF 1 "gpc_reg_operand" "r")))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS"
-  "efsctui %0,%1"
+  "efsctuiz %0,%1"
   [(set_attr "type" "fp")])
 
 (define_insn "spe_fix_truncsfsi2"
   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
        (fix:SI (match_operand:SF 1 "gpc_reg_operand" "r")))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS"
-  "efsctsi %0,%1"
+  "efsctsiz %0,%1"
+  [(set_attr "type" "fp")])
+
+(define_insn "spe_fix_truncdfsi2"
+  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+       (fix:SI (match_operand:DF 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdctsiz %0,%1"
   [(set_attr "type" "fp")])
 
 (define_insn "spe_floatunssisf2"
   "efscfui %0,%1"
   [(set_attr "type" "fp")])
 
+(define_insn "spe_floatunssidf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+        (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdcfui %0,%1"
+  [(set_attr "type" "fp")])
+
 (define_insn "spe_floatsisf2"
   [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
         (float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
   "efscfsi %0,%1"
   [(set_attr "type" "fp")])
 
+(define_insn "spe_floatsidf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdcfsi %0,%1"
+  [(set_attr "type" "fp")])
 
 ;; SPE SIMD instructions
 
    (set_attr  "length" "4")])
 
 (define_insn "spe_evlhhesplat"
-  [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
-       (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
+  [(set (match_operand:V2SI 0 "gpc_reg_operand"  "=r")
+       (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand"   "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 509)]
-  "TARGET_SPE"
-  "evlhhesplat %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlhhesplat %0,%2*2(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 511)]
-  "TARGET_SPE"
-  "evlhhossplat %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlhhossplat %0,%2*2(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 513)]
-  "TARGET_SPE"
-  "evlhhousplat %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlhhousplat %0,%2*2(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 515)]
-  "TARGET_SPE"
-  "evlwhsplat %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlwhsplat %0,%2*4(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 517)]
-  "TARGET_SPE"
-  "evlwwsplat %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlwwsplat %0,%2*4(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
   [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
-(define_insn "spe_evneg"
+(define_insn "negv2si2"
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (neg:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")))]
   "TARGET_SPE"
   [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
-(define_insn "spe_evxor"
+;; vector xors
+
+(define_insn "xorv2si3"
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (xor:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")
                  (match_operand:V2SI 2 "gpc_reg_operand" "r")))]
   [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
+(define_insn "xorv4hi3"
+  [(set (match_operand:V4HI 0 "gpc_reg_operand" "=r")
+        (xor:V4HI (match_operand:V4HI 1 "gpc_reg_operand" "r")
+                 (match_operand:V4HI 2 "gpc_reg_operand" "r")))]
+  "TARGET_SPE"
+  "evxor %0,%1,%2"
+  [(set_attr "type" "vecsimple")
+   (set_attr  "length" "4")])
+
+(define_insn "xorv1di3"
+  [(set (match_operand:V1DI 0 "gpc_reg_operand" "=r")
+        (xor:V1DI (match_operand:V1DI 1 "gpc_reg_operand" "r")
+                 (match_operand:V1DI 2 "gpc_reg_operand" "r")))]
+  "TARGET_SPE"
+  "evxor %0,%1,%2"
+  [(set_attr "type" "vecsimple")
+   (set_attr  "length" "4")])
+
+;; end of vector xors
+
 (define_insn "spe_evfsabs"
   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=r")
         (abs:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "r")))]
   "TARGET_SPE"
   "evfsabs %0,%1"
-  [(set_attr "type" "vecfloat")
+  [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evfsadd"
    (set_attr  "length" "4")])
 
 (define_insn "spe_evfscfsi"
-  [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
-        (fix:V2SI (match_operand:V2SF 1 "gpc_reg_operand" "r")))]
+  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=r")
+        (float:V2SF (match_operand:V2SI 1 "gpc_reg_operand" "r")))]
   "TARGET_SPE"
   "evfscfsi %0,%1"
   [(set_attr "type" "vecfloat")
    (clobber (reg:SI SPEFSCR_REGNO))]
   "TARGET_SPE"
   "evfsdiv %0,%1,%2"
-  [(set_attr "type" "vecfloat")
+  [(set_attr "type" "vecfdiv")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evfsmul"
        (unspec:V2SF [(match_operand:V2SF 1 "gpc_reg_operand" "r")] 537))]
   "TARGET_SPE"
   "evfsnabs %0,%1"
-  [(set_attr "type" "vecfloat")
+  [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evfsneg"
         (neg:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "r")))]
   "TARGET_SPE"
   "evfsneg %0,%1"
-  [(set_attr "type" "vecfloat")
+  [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evfssub"
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 544)]
   "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
-  "evldd %0,%1,%2"
+  "evldd %0,%2*8(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 546)]
   "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
-  "evldh %0,%1,%2"
+  "evldh %0,%2*8(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 548)]
-  "TARGET_SPE"
-  "evldw %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evldw %0,%2*8(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 550)]
-  "TARGET_SPE"
-  "evlwhe %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlwhe %0,%2*4(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 552)]
-  "TARGET_SPE"
-  "evlwhos %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlwhos %0,%2*4(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
        (mem:V2SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
                           (match_operand:QI 2 "immediate_operand" "i"))))
    (unspec [(const_int 0)] 554)]
-  "TARGET_SPE"
-  "evlwhou %0,%1,%2"
+  "TARGET_SPE && INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 31"
+  "evlwhou %0,%2*4(%1)"
   [(set_attr "type" "vecload")
    (set_attr  "length" "4")])
 
                    (match_operand:SI 2 "gpc_reg_operand" "r")] 556))]
   "TARGET_SPE"
   "brinc %0,%1,%2"
-  [(set_attr "type" "veccomplex")
+  [(set_attr "type" "brinc")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evmhegsmfaa"
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 557))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhegsmfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 558))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhegsmfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 559))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhegsmiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 560))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhegsmian %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 561))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhegumiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 562))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhegumian %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 563))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhesmfaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 564))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhesmfanw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 565))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhesmfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 567))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhesmiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 568))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhesmianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 569))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhesmia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 571))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhessfaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 572))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhessfanw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 573))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhessfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 575))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhessiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 576))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhessianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 577))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmheumiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 578))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmheumianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 579))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmheumia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 581))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmheusiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 582))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmheusianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 583))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhogsmfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 584))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhogsmfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 585))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhogsmiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 586))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhogsmian %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 587))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhogumiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 588))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhogumian %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 589))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhosmfaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 590))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhosmfanw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 592))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhosmf %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 593))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhosmiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 594))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhosmianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 595))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhosmia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 597))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhossfaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 598))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhossfanw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 599))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhossfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 601))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhossiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 602))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhossianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 603))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhoumiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 604))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhoumianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 605))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhoumia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 607))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhousiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 608))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmhousianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 611))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhsmfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 613))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhsmia %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 615))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhssfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 629))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhumia %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 635))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlsmiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 636))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlsmianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 641))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlssiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 642))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlssianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 643))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlumiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 644))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlumianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 645))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlumia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 647))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlusiaaw %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 648))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwlusianw %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 649))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwsmfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 650))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwsmfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 651))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwsmfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 653))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwsmiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 654))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwsmian %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 655))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwsmia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 657))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwssfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 658))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwssfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 659))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwssfa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 661))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwumiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 662))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwumian %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 663))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwumia %0,%1,%2"
   [(set_attr "type" "veccomplex")
                   (match_operand:V2SI 2 "gpc_reg_operand" "r")))]
   "TARGET_SPE"
   "evaddw %0,%1,%2"
-  [(set_attr "type" "veccomplex")
+  [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evaddusiaaw"
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 673))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evaddusiaaw %0,%1"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 674))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evaddumiaaw %0,%1"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 675))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evaddssiaaw %0,%1"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 676))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evaddsmiaaw %0,%1"
   [(set_attr "type" "veccomplex")
                      (match_operand:QI 2 "immediate_operand" "i")] 677))]
   "TARGET_SPE"
   "evaddiw %0,%1,%2"
-  [(set_attr "type" "veccomplex")
+  [(set_attr "type" "vecsimple")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evsubifw"
         (minus:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")
                    (match_operand:V2SI 2 "gpc_reg_operand" "r")))]
   "TARGET_SPE"
-  "evsubfw %0,%1,%2"
+  "evsubfw %0,%2,%1"
   [(set_attr "type" "veccomplex")
    (set_attr  "length" "4")])
 
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 679))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evsubfusiaaw %0,%1"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 680))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evsubfumiaaw %0,%1"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 681))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evsubfssiaaw %0,%1"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                      (reg:V2SI SPE_ACC_REGNO)] 682))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evsubfsmiaaw %0,%1"
   [(set_attr "type" "veccomplex")
    (clobber (reg:SI SPEFSCR_REGNO))]
   "TARGET_SPE"
   "evdivws %0,%1,%2"
-  [(set_attr "type" "veccomplex")
+  [(set_attr "type" "vecdiv")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evdivwu"
       (clobber (reg:SI SPEFSCR_REGNO))]
   "TARGET_SPE"
   "evdivwu %0,%1,%2"
-  [(set_attr "type" "veccomplex")
+  [(set_attr "type" "vecdiv")
    (set_attr  "length" "4")])
 
 (define_insn "spe_evsplatfi"
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 686)]
-  "TARGET_SPE"
-  "evstdd %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstdd %2,%1*8(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 688)]
-  "TARGET_SPE"
-  "evstdh %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstdh %2,%1*8(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 690)]
-  "TARGET_SPE"
-  "evstdw %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstdw %2,%1*8(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 692)]
-  "TARGET_SPE"
-  "evstwhe %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstwhe %2,%1*4(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 694)]
-  "TARGET_SPE"
-  "evstwho %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstwho %2,%1*4(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 696)]
-  "TARGET_SPE"
-  "evstwwe %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstwwe %2,%1*4(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
                           (match_operand:QI 1 "immediate_operand" "i")))
        (match_operand:V2SI 2 "gpc_reg_operand" "r"))
    (unspec [(const_int 0)] 698)]
-  "TARGET_SPE"
-  "evstwwo %2,%0,%1"
+  "TARGET_SPE && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 31"
+  "evstwwo %2,%1*4(%0)"
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
   [(set_attr "type" "vecstore")
    (set_attr  "length" "4")])
 
-;; SPE vector clears
+;; Double-precision floating point instructions.
 
-(define_insn "*movv2si_const0"
-  [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
-       (match_operand:V2SI 1 "zero_constant" ""))]
-  "TARGET_SPE"
-  "evxor %0,%0,%0"
-  [(set_attr "type" "vecsimple")])
+;; FIXME: Add o=r option.
+(define_insn "*frob_<SPE64:mode>_<DITI:mode>"
+  [(set (match_operand:SPE64 0 "nonimmediate_operand" "=r,r")
+        (subreg:SPE64 (match_operand:DITI 1 "input_operand" "r,m") 0))]
+  "(TARGET_E500_DOUBLE && <SPE64:MODE>mode == DFmode)
+   || (TARGET_SPE && <SPE64:MODE>mode != DFmode)"
+  "@
+   evmergelo %0,%1,%L1
+   evldd%X1 %0,%y1")
+
+(define_insn "*frob_tf_ti"
+  [(set (match_operand:TF 0 "gpc_reg_operand" "=r")
+        (subreg:TF (match_operand:TI 1 "gpc_reg_operand" "r") 0))]
+  "TARGET_E500_DOUBLE"
+  "evmergelo %0,%1,%L1\;evmergelo %L0,%Y1,%Z1"
+  [(set_attr "length" "8")])
+
+(define_insn "*frob_<mode>_di_2"
+  [(set (subreg:DI (match_operand:SPE64TF 0 "nonimmediate_operand" "+&r,r") 0)
+        (match_operand:DI 1 "input_operand" "r,m"))]
+  "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+   || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode)"
+  "@
+   evmergelo %0,%1,%L1
+   evldd%X1 %0,%y1")
 
-(define_insn "*movv2sf_const0"
-  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=r")
-       (match_operand:V2SF 1 "zero_constant" ""))]
-  "TARGET_SPE"
-  "evxor %0,%0,%0"
-  [(set_attr "type" "vecsimple")])
+(define_insn "*frob_tf_di_8_2"
+  [(set (subreg:DI (match_operand:TF 0 "nonimmediate_operand" "+&r,r") 8)
+        (match_operand:DI 1 "input_operand" "r,m"))]
+  "TARGET_E500_DOUBLE"
+  "@
+   evmergelo %L0,%1,%L1
+   evldd%X1 %L0,%y1")
+
+(define_insn "*frob_di_<mode>"
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=&r")
+        (subreg:DI (match_operand:SPE64TF 1 "input_operand" "r") 0))]
+  "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+   || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode)"
+  "evmergehi %0,%1,%1\;mr %L0,%1"
+  [(set_attr "length" "8")])
+
+(define_insn "*frob_ti_tf"
+  [(set (match_operand:TI 0 "nonimmediate_operand" "=&r")
+        (subreg:TI (match_operand:TF 1 "input_operand" "r") 0))]
+  "TARGET_E500_DOUBLE"
+  "evmergehi %0,%1,%1\;mr %L0,%1\;evmergehi %Y0,%L1,%L1\;mr %Z0,%L1"
+  [(set_attr "length" "16")])
+
+(define_insn "*frob_<DITI:mode>_<SPE64:mode>_2"
+  [(set (subreg:SPE64 (match_operand:DITI 0 "register_operand" "+&r,r") 0)
+       (match_operand:SPE64 1 "input_operand" "r,m"))]
+  "(TARGET_E500_DOUBLE && <SPE64:MODE>mode == DFmode)
+   || (TARGET_SPE && <SPE64:MODE>mode != DFmode)"
+  "*
+{
+  switch (which_alternative)
+    {
+    default: 
+      gcc_unreachable ();
+    case 0:
+      return \"evmergehi %0,%1,%1\;mr %L0,%1\";
+    case 1:
+      /* If the address is not offsettable we need to load the whole
+        doubleword into a 64-bit register and then copy the high word
+        to form the correct output layout.  */
+      if (!offsettable_nonstrict_memref_p (operands[1]))
+       return \"evldd%X1 %L0,%y1\;evmergehi %0,%L0,%L0\";
+      /* If the low-address word is used in the address, we must load
+       it last.  Otherwise, load it first.  Note that we cannot have
+       auto-increment in that case since the address register is
+       known to be dead.  */
+      if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
+                            operands[1], 0))
+       return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\";
+      else
+        return \"{l%U1%X1|lwz%U1%X1} %0,%1\;{l|lwz} %L0,%L1\";
+    }
+}"
+  [(set_attr "length" "8,8")])
+
+; As the above, but TImode at offset 8.
+(define_insn "*frob_ti_<mode>_8_2"
+  [(set (subreg:SPE64 (match_operand:TI 0 "register_operand" "+&r,r") 8)
+       (match_operand:SPE64 1 "input_operand" "r,m"))]
+  "(TARGET_E500_DOUBLE && <MODE>mode == DFmode)
+   || (TARGET_SPE && <MODE>mode != DFmode)"
+  "*
+{
+  switch (which_alternative)
+    {
+    default: 
+      gcc_unreachable ();
+    case 0:
+      return \"evmergehi %Y0,%1,%1\;mr %Z0,%1\";
+    case 1:
+      if (!offsettable_nonstrict_memref_p (operands[1]))
+       return \"evldd%X1 %Z0,%y1\;evmergehi %Y0,%Z0,%Z0\";
+      if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
+                            operands[1], 0))
+       return \"{l|lwz} %Z0,%L1\;{l|lwz} %Y0,%1\";
+      else
+        return \"{l%U1%X1|lwz%U1%X1} %Y0,%1\;{l|lwz} %Z0,%L1\";
+    }
+}"
+  [(set_attr "length" "8,8")])
+
+(define_insn "*frob_ti_tf_2"
+  [(set (subreg:TF (match_operand:TI 0 "gpc_reg_operand" "=&r") 0)
+       (match_operand:TF 1 "input_operand" "r"))]
+  "TARGET_E500_DOUBLE"
+  "evmergehi %0,%1,%1\;mr %L0,%1\;evmergehi %Y0,%L1,%L1\;mr %Z0,%L1"
+  [(set_attr "length" "16")])
+
+(define_insn "*mov_si<mode>_e500_subreg0"
+  [(set (subreg:SI (match_operand:SPE64TF 0 "register_operand" "+r,&r") 0)
+       (match_operand:SI 1 "input_operand" "r,m"))]
+  "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+   || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode)"
+  "@
+   evmergelo %0,%1,%0
+   evmergelohi %0,%0,%0\;{l%U1%X1|lwz%U1%X1} %0,%1\;evmergelohi %0,%0,%0"
+  [(set_attr "length" "4,12")])
+
+;; ??? Could use evstwwe for memory stores in some cases, depending on
+;; the offset.
+(define_insn "*mov_si<mode>_e500_subreg0_2"
+  [(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
+       (subreg:SI (match_operand:SPE64TF 1 "register_operand" "+r,&r") 0))]
+  "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+   || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode)"
+  "@
+   evmergehi %0,%0,%1
+   evmergelohi %1,%1,%1\;{st%U0%X0|stw%U0%X0} %1,%0"
+  [(set_attr "length" "4,8")])
+
+(define_insn "*mov_si<mode>_e500_subreg4"
+  [(set (subreg:SI (match_operand:SPE64TF 0 "register_operand" "+r,r") 4)
+       (match_operand:SI 1 "input_operand" "r,m"))]
+  "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+   || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode)"
+  "@
+   mr %0,%1
+   {l%U1%X1|lwz%U1%X1} %0,%1")
+
+(define_insn "*mov_si<mode>_e500_subreg4_2"
+  [(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
+       (subreg:SI (match_operand:SPE64TF 1 "register_operand" "r,r") 4))]
+  "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+   || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode)"
+  "@
+   mr %0,%1
+   {st%U0%X0|stw%U0%X0} %1,%0")
 
-(define_insn "*movv4hi_const0"
-  [(set (match_operand:V4HI 0 "gpc_reg_operand" "=r")
-       (match_operand:V4HI 1 "zero_constant" ""))]
-  "TARGET_SPE"
-  "evxor %0,%0,%0"
-  [(set_attr "type" "vecsimple")])
+(define_insn "*mov_sitf_e500_subreg8"
+  [(set (subreg:SI (match_operand:TF 0 "register_operand" "+r,&r") 8)
+       (match_operand:SI 1 "input_operand" "r,m"))]
+  "TARGET_E500_DOUBLE"
+  "@
+   evmergelo %L0,%1,%L0
+   evmergelohi %L0,%L0,%L0\;{l%U1%X1|lwz%U1%X1} %L0,%1\;evmergelohi %L0,%L0,%L0"
+  [(set_attr "length" "4,12")])
+
+(define_insn "*mov_sitf_e500_subreg8_2"
+  [(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
+       (subreg:SI (match_operand:TF 1 "register_operand" "+r,&r") 8))]
+  "TARGET_E500_DOUBLE"
+  "@
+   evmergehi %0,%0,%L1
+   evmergelohi %L1,%L1,%L1\;{st%U0%X0|stw%U0%X0} %L1,%0"
+  [(set_attr "length" "4,8")])
+
+(define_insn "*mov_sitf_e500_subreg12"
+  [(set (subreg:SI (match_operand:TF 0 "register_operand" "+r,r") 12)
+       (match_operand:SI 1 "input_operand" "r,m"))]
+  "TARGET_E500_DOUBLE"
+  "@
+   mr %L0,%1
+   {l%U1%X1|lwz%U1%X1} %L0,%1")
 
-(define_insn "*movv1di_const0"
-  [(set (match_operand:V1DI 0 "gpc_reg_operand" "=r")
-       (match_operand:V1DI 1 "zero_constant" ""))]
-  "TARGET_SPE"
-  "evxor %0,%0,%0"
-  [(set_attr "type" "vecsimple")])
+(define_insn "*mov_sitf_e500_subreg12_2"
+  [(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
+       (subreg:SI (match_operand:TF 1 "register_operand" "r,r") 12))]
+  "TARGET_E500_DOUBLE"
+  "@
+   mr %0,%L1
+   {st%U0%X0|stw%U0%X0} %L1,%0")
+
+;; FIXME: Allow r=CONST0.
+(define_insn "*movdf_e500_double"
+  [(set (match_operand:DF 0 "rs6000_nonimmediate_operand" "=r,r,m")
+       (match_operand:DF 1 "input_operand" "r,m,r"))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE
+    && (gpc_reg_operand (operands[0], DFmode)
+        || gpc_reg_operand (operands[1], DFmode))"
+  "*
+ {
+   switch (which_alternative)
+     {
+     case 0:
+       return \"evor %0,%1,%1\";
+     case 1:
+       return \"evldd%X1 %0,%y1\";
+     case 2:
+       return \"evstdd%X0 %1,%y0\";
+     default:
+       gcc_unreachable ();
+     }
+ }"
+  [(set_attr "type" "*,vecload,vecstore")
+   (set_attr "length" "*,*,*")])
+
+(define_insn "spe_truncdfsf2"
+  [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
+       (float_truncate:SF (match_operand:DF 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efscfd %0,%1")
+
+(define_insn "spe_absdf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (abs:DF (match_operand:DF 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdabs %0,%1")
+
+(define_insn "spe_nabsdf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (neg:DF (abs:DF (match_operand:DF 1 "gpc_reg_operand" "r"))))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdnabs %0,%1")
+
+(define_insn "spe_negdf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (neg:DF (match_operand:DF 1 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdneg %0,%1")
+
+(define_insn "spe_adddf3"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (plus:DF (match_operand:DF 1 "gpc_reg_operand" "r")
+                (match_operand:DF 2 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdadd %0,%1,%2")
+
+(define_insn "spe_subdf3"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (minus:DF (match_operand:DF 1 "gpc_reg_operand" "r")
+                 (match_operand:DF 2 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdsub %0,%1,%2")
+
+(define_insn "spe_muldf3"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (mult:DF (match_operand:DF 1 "gpc_reg_operand" "r")
+                (match_operand:DF 2 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efdmul %0,%1,%2")
+
+(define_insn "spe_divdf3"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
+       (div:DF (match_operand:DF 1 "gpc_reg_operand" "r")
+               (match_operand:DF 2 "gpc_reg_operand" "r")))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE"
+  "efddiv %0,%1,%2")
+
+;; Double-precision floating point instructions for IBM long double.
+
+(define_insn_and_split "spe_trunctfdf2_internal1"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=r,?r")
+       (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "0,r")))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "@
+   #
+   evor %0,%1,%1"
+  "&& reload_completed && REGNO (operands[0]) == REGNO (operands[1])"
+  [(const_int 0)]
+{
+  emit_note (NOTE_INSN_DELETED);
+  DONE;
+})
+
+(define_insn_and_split "spe_trunctfsf2"
+  [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
+       (float_truncate:SF (match_operand:TF 1 "gpc_reg_operand" "r")))
+   (clobber (match_scratch:DF 2 "=r"))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "#"
+  "&& reload_completed"
+  [(set (match_dup 2)
+       (float_truncate:DF (match_dup 1)))
+   (set (match_dup 0)
+       (float_truncate:SF (match_dup 2)))]
+  "")
+
+(define_insn "spe_extenddftf2"
+  [(set (match_operand:TF 0 "rs6000_nonimmediate_operand" "=r,?r,r,o")
+       (float_extend:TF (match_operand:DF 1 "input_operand" "0,r,m,r")))
+   (clobber (match_scratch:DF 2 "=X,X,X,&r"))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "@
+   evxor %L0,%L0,%L0
+   evor %0,%1,%1\;evxor %L0,%L0,%L0
+   evldd%X1 %0,%y1\;evxor %L0,%L0,%L0
+   evstdd%X0 %1,%y0\;evxor %2,%2,%2\;evstdd %2,%Y0"
+  [(set_attr "length" "4,8,8,12")])
+
+(define_expand "spe_fix_trunctfsi2"
+  [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
+                  (fix:SI (match_operand:TF 1 "gpc_reg_operand" "")))
+             (clobber (match_dup 2))
+             (clobber (match_dup 3))
+             (clobber (match_dup 4))])]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+{
+  operands[2] = gen_reg_rtx (DFmode);
+  operands[3] = gen_reg_rtx (SImode);
+  operands[4] = gen_reg_rtx (SImode);
+})
+
+; Like fix_trunc_helper, add with rounding towards 0.
+(define_insn "spe_fix_trunctfsi2_internal"
+  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+        (fix:SI (match_operand:TF 1 "gpc_reg_operand" "r")))
+   (clobber (match_operand:DF 2 "gpc_reg_operand" "=r"))
+   (clobber (match_operand:SI 3 "gpc_reg_operand" "=&r"))
+   (clobber (match_operand:SI 4 "gpc_reg_operand" "=&r"))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "mfspefscr %3\;rlwinm %4,%3,0,0,29\;ori %4,%4,1\;efdadd %2,%1,%L1\;mtspefscr %3\;efdctsiz %0, %2"
+  [(set_attr "length" "24")])
+
+(define_insn "spe_negtf2_internal"
+  [(set (match_operand:TF 0 "gpc_reg_operand" "=r")
+       (neg:TF (match_operand:TF 1 "gpc_reg_operand" "r")))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "*
+{
+  if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
+    return \"efdneg %L0,%L1\;efdneg %0,%1\";
+  else
+    return \"efdneg %0,%1\;efdneg %L0,%L1\";
+}"
+  [(set_attr "length" "8")])
+
+(define_expand "spe_abstf2_cmp"
+  [(set (match_operand:TF 0 "gpc_reg_operand" "=f")
+       (match_operand:TF 1 "gpc_reg_operand" "f"))
+   (set (match_dup 3) (match_dup 5))
+   (set (match_dup 5) (abs:DF (match_dup 5)))
+   (set (match_dup 4) (unspec:CCFP [(compare:CCFP (match_dup 3)
+                                                  (match_dup 5))] CMPDFEQ_GPR))
+   (set (pc) (if_then_else (eq (match_dup 4) (const_int 0))
+                          (label_ref (match_operand 2 "" ""))
+                          (pc)))
+   (set (match_dup 6) (neg:DF (match_dup 6)))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "
+{
+  const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode);
+  const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0;
+  operands[3] = gen_reg_rtx (DFmode);
+  operands[4] = gen_reg_rtx (CCFPmode);
+  operands[5] = simplify_gen_subreg (DFmode, operands[0], TFmode, hi_word);
+  operands[6] = simplify_gen_subreg (DFmode, operands[0], TFmode, lo_word);
+}")
+
+(define_expand "spe_abstf2_tst"
+  [(set (match_operand:TF 0 "gpc_reg_operand" "=f")
+       (match_operand:TF 1 "gpc_reg_operand" "f"))
+   (set (match_dup 3) (match_dup 5))
+   (set (match_dup 5) (abs:DF (match_dup 5)))
+   (set (match_dup 4) (unspec:CCFP [(compare:CCFP (match_dup 3)
+                                                  (match_dup 5))] TSTDFEQ_GPR))
+   (set (pc) (if_then_else (eq (match_dup 4) (const_int 0))
+                          (label_ref (match_operand 2 "" ""))
+                          (pc)))
+   (set (match_dup 6) (neg:DF (match_dup 6)))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
+  "
+{
+  const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode);
+  const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0;
+  operands[3] = gen_reg_rtx (DFmode);
+  operands[4] = gen_reg_rtx (CCFPmode);
+  operands[5] = simplify_gen_subreg (DFmode, operands[0], TFmode, hi_word);
+  operands[6] = simplify_gen_subreg (DFmode, operands[0], TFmode, lo_word);
+}")
 
 ;; Vector move instructions.
 
   "TARGET_SPE"
   "{ rs6000_emit_move (operands[0], operands[1], V2SImode); DONE; }")
 
-
 (define_insn "*movv2si_internal"
-  [(set (match_operand:V2SI 0 "nonimmediate_operand" "=m,r,r")
-       (match_operand:V2SI 1 "input_operand" "r,m,r"))]
-  "TARGET_SPE"
-  "@
-   evstdd%X0 %1,%y0
-   evldd%X1 %0,%y1
-   evor %0,%1,%1"
-  [(set_attr "type" "vecload")])
+  [(set (match_operand:V2SI 0 "nonimmediate_operand" "=m,r,r,r")
+       (match_operand:V2SI 1 "input_operand" "r,m,r,W"))]
+  "TARGET_SPE
+   && (gpc_reg_operand (operands[0], V2SImode)
+       || gpc_reg_operand (operands[1], V2SImode))"
+  "*
+{
+  switch (which_alternative)
+    {
+    case 0: return \"evstdd%X0 %1,%y0\";
+    case 1: return \"evldd%X1 %0,%y1\";
+    case 2: return \"evor %0,%1,%1\";
+    case 3: return output_vec_const_move (operands);
+    default: gcc_unreachable ();
+    }
+}"
+  [(set_attr "type" "vecload,vecstore,*,*")
+   (set_attr "length" "*,*,*,12")])
+
+(define_split
+  [(set (match_operand:V2SI 0 "register_operand" "")
+       (match_operand:V2SI 1 "zero_constant" ""))]
+  "TARGET_SPE && reload_completed"
+  [(set (match_dup 0)
+       (xor:V2SI (match_dup 0) (match_dup 0)))]
+  "")
 
 (define_expand "movv1di"
   [(set (match_operand:V1DI 0 "nonimmediate_operand" "")
   "{ rs6000_emit_move (operands[0], operands[1], V1DImode); DONE; }")
 
 (define_insn "*movv1di_internal"
-  [(set (match_operand:V1DI 0 "nonimmediate_operand" "=m,r,r")
-       (match_operand:V1DI 1 "input_operand" "r,m,r"))]
-  "TARGET_SPE"
+  [(set (match_operand:V1DI 0 "nonimmediate_operand" "=m,r,r,r")
+       (match_operand:V1DI 1 "input_operand" "r,m,r,W"))]
+  "TARGET_SPE
+   && (gpc_reg_operand (operands[0], V1DImode)
+       || gpc_reg_operand (operands[1], V1DImode))"
   "@
    evstdd%X0 %1,%y0
    evldd%X1 %0,%y1
-   evor %0,%1,%1"
-  [(set_attr "type" "vecload")])
+   evor %0,%1,%1
+   evxor %0,%0,%0"
+  [(set_attr "type" "vecload,vecstore,*,*")
+   (set_attr "length" "*,*,*,*")])
 
 (define_expand "movv4hi"
   [(set (match_operand:V4HI 0 "nonimmediate_operand" "")
   "{ rs6000_emit_move (operands[0], operands[1], V4HImode); DONE; }")
 
 (define_insn "*movv4hi_internal"
-  [(set (match_operand:V4HI 0 "nonimmediate_operand" "=m,r,r")
-       (match_operand:V4HI 1 "input_operand" "r,m,r"))]
-  "TARGET_SPE"
+  [(set (match_operand:V4HI 0 "nonimmediate_operand" "=m,r,r,r")
+       (match_operand:V4HI 1 "input_operand" "r,m,r,W"))]
+  "TARGET_SPE
+   && (gpc_reg_operand (operands[0], V4HImode)
+       || gpc_reg_operand (operands[1], V4HImode))"
   "@
    evstdd%X0 %1,%y0
    evldd%X1 %0,%y1
-   evor %0,%1,%1"
+   evor %0,%1,%1
+   evxor %0,%0,%0"
   [(set_attr "type" "vecload")])
 
 (define_expand "movv2sf"
   "{ rs6000_emit_move (operands[0], operands[1], V2SFmode); DONE; }")
 
 (define_insn "*movv2sf_internal"
-  [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,r,r")
-       (match_operand:V2SF 1 "input_operand" "r,m,r"))]
-  "TARGET_SPE"
+  [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,r,r,r")
+       (match_operand:V2SF 1 "input_operand" "r,m,r,W"))]
+  "TARGET_SPE
+   && (gpc_reg_operand (operands[0], V2SFmode)
+       || gpc_reg_operand (operands[1], V2SFmode))"
   "@
    evstdd%X0 %1,%y0
    evldd%X1 %0,%y1
-   evor %0,%1,%1"
-  [(set_attr "type" "vecload")])
+   evor %0,%1,%1
+   evxor %0,%0,%0"
+  [(set_attr "type" "vecload,vecstore,*,*")
+   (set_attr "length" "*,*,*,*")])
+
+;; End of vector move instructions.
 
 (define_insn "spe_evmwhssfaa"
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 702))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhssfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 703))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhssmaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 704))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhsmfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 705))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhsmiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 706))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhusiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 707))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhumiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 708))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhssfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 709))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhssian %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 710))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhsmfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 711))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhsmian %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 713))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhumian %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 714))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgssfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 715))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgsmfaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 716))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgsmiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 717))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgumiaa %0,%1,%2"
   [(set_attr "type" "veccomplex")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 718))
    (clobber (reg:SI SPEFSCR_REGNO))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgssfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 719))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgsmfan %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 720))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgsmian %0,%1,%2"
   [(set_attr "type" "veccomplex")
   [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
         (unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
                       (match_operand:V2SI 2 "gpc_reg_operand" "r")] 721))
-   (clobber (reg:V2SI SPE_ACC_REGNO))]
+   (set (reg:V2SI SPE_ACC_REGNO) (unspec:V2SI  [(const_int 0)] 0))]
   "TARGET_SPE"
   "evmwhgumian %0,%1,%2"
   [(set_attr "type" "veccomplex")
   "mfspefscr %0"
   [(set_attr "type" "vecsimple")])
 
+;; FP comparison stuff.
+
+;; Flip the GT bit.
+(define_insn "e500_flip_gt_bit"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(match_operand:CCFP 1 "cc_reg_operand" "y")] 999))]
+  "!TARGET_FPRS && TARGET_HARD_FLOAT"
+  "*
+{
+  return output_e500_flip_gt_bit (operands[0], operands[1]);
+}"
+  [(set_attr "type" "cr_logical")])
+
 ;; MPC8540 single-precision FP instructions on GPRs.
 ;; We have 2 variants for each.  One for IEEE compliant math and one
 ;; for non IEEE compliant math.
 
 (define_insn "cmpsfeq_gpr"
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
-       (eq:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
-                (match_operand:SF 2 "gpc_reg_operand" "r")))]
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
+                       (match_operand:SF 2 "gpc_reg_operand" "r"))]
+        1000))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS && !flag_unsafe_math_optimizations"
   "efscmpeq %0,%1,%2"
-  [(set_attr "type" "fpcompare")])
+  [(set_attr "type" "veccmp")])
 
 (define_insn "tstsfeq_gpr"
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
-       (eq:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
-                (match_operand:SF 2 "gpc_reg_operand" "r")))]
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
+                       (match_operand:SF 2 "gpc_reg_operand" "r"))]
+        1001))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS && flag_unsafe_math_optimizations"
   "efststeq %0,%1,%2"
-  [(set_attr "type" "fpcompare")])
+  [(set_attr "type" "veccmpsimple")])
 
 (define_insn "cmpsfgt_gpr"
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
-       (gt:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
-                (match_operand:SF 2 "gpc_reg_operand" "r")))]
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
+                       (match_operand:SF 2 "gpc_reg_operand" "r"))]
+        1002))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS && !flag_unsafe_math_optimizations"
   "efscmpgt %0,%1,%2"
-  [(set_attr "type" "fpcompare")])
+  [(set_attr "type" "veccmp")])
 
 (define_insn "tstsfgt_gpr"
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
-       (gt:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
-                (match_operand:SF 2 "gpc_reg_operand" "r")))]
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
+                       (match_operand:SF 2 "gpc_reg_operand" "r"))]
+        1003))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS && flag_unsafe_math_optimizations"
   "efststgt %0,%1,%2"
-  [(set_attr "type" "fpcompare")])
+  [(set_attr "type" "veccmpsimple")])
 
 (define_insn "cmpsflt_gpr"
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
-       (lt:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
-                (match_operand:SF 2 "gpc_reg_operand" "r")))]
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
+                       (match_operand:SF 2 "gpc_reg_operand" "r"))]
+        1004))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS && !flag_unsafe_math_optimizations"
   "efscmplt %0,%1,%2"
-  [(set_attr "type" "fpcompare")])
+  [(set_attr "type" "veccmp")])
 
 (define_insn "tstsflt_gpr"
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
-       (lt:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
-                (match_operand:SF 2 "gpc_reg_operand" "r")))]
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "r")
+                       (match_operand:SF 2 "gpc_reg_operand" "r"))]
+        1005))]
   "TARGET_HARD_FLOAT && !TARGET_FPRS && flag_unsafe_math_optimizations"
   "efststlt %0,%1,%2"
-  [(set_attr "type" "fpcompare")])
+  [(set_attr "type" "veccmpsimple")])
+
+;; Same thing, but for double-precision.
+
+(define_insn "cmpdfeq_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "r")
+                       (match_operand:DF 2 "gpc_reg_operand" "r"))]
+        CMPDFEQ_GPR))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && !flag_unsafe_math_optimizations"
+  "efdcmpeq %0,%1,%2"
+  [(set_attr "type" "veccmp")])
+
+(define_insn "tstdfeq_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "r")
+                       (match_operand:DF 2 "gpc_reg_operand" "r"))]
+        TSTDFEQ_GPR))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && flag_unsafe_math_optimizations"
+  "efdtsteq %0,%1,%2"
+  [(set_attr "type" "veccmpsimple")])
+
+(define_insn "cmpdfgt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "r")
+                       (match_operand:DF 2 "gpc_reg_operand" "r"))]
+        CMPDFGT_GPR))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && !flag_unsafe_math_optimizations"
+  "efdcmpgt %0,%1,%2"
+  [(set_attr "type" "veccmp")])
+
+(define_insn "tstdfgt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "r")
+                       (match_operand:DF 2 "gpc_reg_operand" "r"))]
+        TSTDFGT_GPR))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && flag_unsafe_math_optimizations"
+  "efdtstgt %0,%1,%2"
+  [(set_attr "type" "veccmpsimple")])
+
+(define_insn "cmpdflt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "r")
+                       (match_operand:DF 2 "gpc_reg_operand" "r"))]
+        CMPDFLT_GPR))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && !flag_unsafe_math_optimizations"
+  "efdcmplt %0,%1,%2"
+  [(set_attr "type" "veccmp")])
+
+(define_insn "tstdflt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "r")
+                       (match_operand:DF 2 "gpc_reg_operand" "r"))]
+        TSTDFLT_GPR))]
+  "TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && flag_unsafe_math_optimizations"
+  "efdtstlt %0,%1,%2"
+  [(set_attr "type" "veccmpsimple")])
 
+;; Same thing, but for IBM long double.
+
+(define_insn "cmptfeq_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "r")
+                       (match_operand:TF 2 "gpc_reg_operand" "r"))]
+        CMPTFEQ_GPR))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128
+   && !flag_unsafe_math_optimizations"
+  "efdcmpeq %0,%1,%2\;bng %0,$+8\;efdcmpeq %0,%L1,%L2"
+  [(set_attr "type" "veccmp")
+   (set_attr "length" "12")])
+
+(define_insn "tsttfeq_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "r")
+                       (match_operand:TF 2 "gpc_reg_operand" "r"))]
+        TSTTFEQ_GPR))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128
+   && flag_unsafe_math_optimizations"
+  "efdtsteq %0,%1,%2\;bng %0,$+8\;efdtsteq %0,%L1,%L2"
+  [(set_attr "type" "veccmpsimple")
+   (set_attr "length" "12")])
+
+(define_insn "cmptfgt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "r")
+                       (match_operand:TF 2 "gpc_reg_operand" "r"))]
+        CMPTFGT_GPR))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128
+   && !flag_unsafe_math_optimizations"
+  "efdcmpgt %0,%1,%2\;bgt %0,$+16\;efdcmpeq %0,%1,%2\;bng %0,$+8\;efdcmpgt %0,%L1,%L2"
+  [(set_attr "type" "veccmp")
+   (set_attr "length" "20")])
+
+(define_insn "tsttfgt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "r")
+                       (match_operand:TF 2 "gpc_reg_operand" "r"))]
+        TSTTFGT_GPR))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128
+   && flag_unsafe_math_optimizations"
+  "efdtstgt %0,%1,%2\;bgt %0,$+16\;efdtsteq %0,%1,%2\;bng %0,$+8\;efdtstgt %0,%L1,%L2"
+  [(set_attr "type" "veccmpsimple")
+   (set_attr "length" "20")])
+
+(define_insn "cmptflt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "r")
+                       (match_operand:TF 2 "gpc_reg_operand" "r"))]
+        CMPTFLT_GPR))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128
+   && !flag_unsafe_math_optimizations"
+  "efdcmplt %0,%1,%2\;bgt %0,$+16\;efdcmpeq %0,%1,%2\;bng %0,$+8\;efdcmplt %0,%L1,%L2"
+  [(set_attr "type" "veccmp")
+   (set_attr "length" "20")])
+
+(define_insn "tsttflt_gpr"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP
+        [(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "r")
+                       (match_operand:TF 2 "gpc_reg_operand" "r"))]
+        TSTTFLT_GPR))]
+  "!TARGET_IEEEQUAD
+   && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128
+   && flag_unsafe_math_optimizations"
+  "efdtstlt %0,%1,%2\;bgt %0,$+16\;efdtsteq %0,%1,%2\;bng %0,$+8\;efdtstlt %0,%L1,%L2"
+  [(set_attr "type" "veccmpsimple")
+   (set_attr "length" "20")])
+
+;; Like cceq_ior_compare, but compare the GT bits.
+(define_insn "e500_cr_ior_compare"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+       (unspec:CCFP [(match_operand 1 "cc_reg_operand" "y")
+                     (match_operand 2 "cc_reg_operand" "y")]
+                    E500_CR_IOR_COMPARE))]
+  "TARGET_E500"
+  "cror 4*%0+gt,4*%1+gt,4*%2+gt"
+  [(set_attr "type" "cr_logical")])