Fix rs6000 -maix64 -mstring
authorTom Rix <trix@redhat.com>
Sun, 9 Dec 2001 07:23:05 +0000 (07:23 +0000)
committerTom Rix <trix@gcc.gnu.org>
Sun, 9 Dec 2001 07:23:05 +0000 (07:23 +0000)
From-SVN: r47806

gcc/ChangeLog
gcc/config/rs6000/aix43.h
gcc/config/rs6000/aix51.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 5155954714b1bbbbf34cadcfd82495016e45ce12..490a579a36f4a7fef8ab8a84b95758d1a224f6f6 100644 (file)
@@ -1,3 +1,14 @@
+2001-12-08  Tom Rix  <trix@redhat.com>
+
+       * config/rs6000/aix43.h (NON_POWERPC_MASKS): Delete MASK_STRING.
+       * config/rs6000/aix51.h (NON_POWERPC_MASKS): Same.
+       * config/rs6000/rs6000.md (load_multiple, store_multiple): Do not use 
+       for powerpc64.
+       * config/rs6000/rs6000.md (movstrsi_8reg, movstrsi_6reg, 
+       movstrsi_4reg, movstrsi_1_reg): Add powerpc64.
+       * config/rs6000/rs6000.c (expand_block_move): Do not use 
+       gen_movstrsi_2reg and powerpc64.
+
 2001-10-08  Aldy Hernandez  <aldyh@redhat.com>
 
        * c-common.h (rid): Add RID_CHOOSE_EXPR and
index 89c965442b8178164821bc2f5b3623a97663af13..93e186ca2a0f57e863e30cd5a1f4782dcafa3fb7 100644 (file)
@@ -40,7 +40,7 @@ Boston, MA 02111-1307, USA.  */
    The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
    get control.  */
 
-#define NON_POWERPC_MASKS (MASK_POWER | MASK_POWER2 | MASK_STRING)
+#define NON_POWERPC_MASKS (MASK_POWER | MASK_POWER2)
 #define SUBTARGET_OVERRIDE_OPTIONS                                     \
 do {                                                                   \
   if (TARGET_64BIT && (target_flags & NON_POWERPC_MASKS))              \
index 0d49ff039f508646c2a2ecc07b3dfb867eb92c73..ae01440f5d345542eab0bec1739c6d15a1267e81 100644 (file)
@@ -40,7 +40,7 @@ Boston, MA 02111-1307, USA.  */
    The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
    get control.  */
 
-#define NON_POWERPC_MASKS (MASK_POWER | MASK_POWER2 | MASK_STRING)
+#define NON_POWERPC_MASKS (MASK_POWER | MASK_POWER2)
 #define SUBTARGET_OVERRIDE_OPTIONS                                     \
 do {                                                                   \
   if (TARGET_64BIT && (target_flags & NON_POWERPC_MASKS))              \
index 129122199b479ec8d0c52d0e34fc5368309abf07..0cabac305cc9886eff75b9be0721889a196418b6 100644 (file)
@@ -4074,7 +4074,7 @@ expand_block_move (operands)
                                                     dest_reg, orig_dest),
                              tmp_reg);
            }
-         else if (bytes > 4)
+         else if (bytes > 4 && !TARGET_POWERPC64)
            {                   /* move up to 8 bytes at a time */
              move_bytes = (bytes > 8) ? 8 : bytes;
              emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode,
index 0a0d998c8396bd4e44768bfc00ec072e078c5162..b0c89191213e719748d47f64ac1918cc452174dd 100644 (file)
   [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
                          (match_operand:SI 1 "" ""))
                     (use (match_operand:SI 2 "" ""))])]
-  "TARGET_STRING"
+  "TARGET_STRING && !TARGET_POWERPC64"
   "
 {
   int regno;
                          (match_operand:SI 1 "" ""))
                     (clobber (scratch:SI))
                     (use (match_operand:SI 2 "" ""))])]
-  "TARGET_STRING"
+  "TARGET_STRING && !TARGET_POWERPC64"
   "
 {
   int regno;
   [(set_attr "type" "load")
    (set_attr "length" "8")])
 
+(define_insn ""
+  [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
+       (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
+   (use (match_operand:SI 2 "immediate_operand" "i"))
+   (use (match_operand:SI 3 "immediate_operand" "i"))
+   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
+   (clobber (reg:SI  6))
+   (clobber (reg:SI  7))
+   (clobber (reg:SI  8))
+   (clobber (reg:SI  9))
+   (clobber (reg:SI 10))
+   (clobber (reg:SI 11))
+   (clobber (reg:SI 12))
+   (clobber (match_scratch:SI 5 "X"))]
+  "TARGET_STRING && TARGET_POWERPC64
+   && ((INTVAL (operands[2]) > 24 && INTVAL (operands[2]) < 32)
+       || INTVAL (operands[2]) == 0)
+   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 12)
+   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 12)
+   && REGNO (operands[4]) == 5"
+  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
+  [(set_attr "type" "load")
+   (set_attr "length" "8")])
+
 ;; Move up to 24 bytes at a time.  The fixed registers are needed because the
 ;; register allocator doesn't have a clue about allocating 6 word registers.
 ;; rD/rS = r5 is preferred, efficient form.
   [(set_attr "type" "load")
    (set_attr "length" "8")])
 
+(define_insn ""
+  [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
+       (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
+   (use (match_operand:SI 2 "immediate_operand" "i"))
+   (use (match_operand:SI 3 "immediate_operand" "i"))
+   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
+   (clobber (reg:SI  6))
+   (clobber (reg:SI  7))
+   (clobber (reg:SI  8))
+   (clobber (reg:SI  9))
+   (clobber (reg:SI 10))
+   (clobber (match_scratch:SI 5 "X"))]
+  "TARGET_STRING && TARGET_POWERPC64
+   && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 32
+   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 10)
+   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 10)
+   && REGNO (operands[4]) == 5"
+  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
+  [(set_attr "type" "load")
+   (set_attr "length" "8")])
+
 ;; Move up to 16 bytes at a time, using 4 fixed registers to avoid spill
 ;; problems with TImode.
 ;; rD/rS = r5 is preferred, efficient form.
   [(set_attr "type" "load")
    (set_attr "length" "8")])
 
+(define_insn ""
+  [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
+       (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
+   (use (match_operand:SI 2 "immediate_operand" "i"))
+   (use (match_operand:SI 3 "immediate_operand" "i"))
+   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
+   (clobber (reg:SI 6))
+   (clobber (reg:SI 7))
+   (clobber (reg:SI 8))
+   (clobber (match_scratch:SI 5 "X"))]
+  "TARGET_STRING && TARGET_POWERPC64
+   && INTVAL (operands[2]) > 8 && INTVAL (operands[2]) <= 16
+   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 8)
+   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 8)
+   && REGNO (operands[4]) == 5"
+  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
+  [(set_attr "type" "load")
+   (set_attr "length" "8")])
+
 ;; Move up to 8 bytes at a time.
 (define_expand "movstrsi_2reg"
   [(parallel [(set (match_operand 0 "" "")
   [(set_attr "type" "load")
    (set_attr "length" "8")])
 
+(define_insn ""
+  [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
+       (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
+   (use (match_operand:SI 2 "immediate_operand" "i"))
+   (use (match_operand:SI 3 "immediate_operand" "i"))
+   (clobber (match_scratch:SI 4 "=&r"))
+   (clobber (match_scratch:SI 5 "X"))]
+  "TARGET_STRING && TARGET_POWERPC64
+   && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 4"
+  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
+  [(set_attr "type" "load")
+   (set_attr "length" "8")])
+
 \f
 ;; Define insns that do load or store with update.  Some of these we can
 ;; get by using pre-decrement or pre-increment, but the hardware can also