s390-protos.h (preferred_la_operand_p): Adapt prototype.
authorUlrich Weigand <uweigand@de.ibm.com>
Thu, 19 Aug 2004 21:37:32 +0000 (21:37 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Thu, 19 Aug 2004 21:37:32 +0000 (21:37 +0000)
* config/s390/s390-protos.h (preferred_la_operand_p): Adapt prototype.
* config/s390/s390.c (preferred_la_operand_p): Accept two operands
instead of one.  Check for strictly legitimate address.
* config/s390/s390.md ("*la_31"/"*la_64" peepholes): Adapt call
to preferred_la_operand_p, do not call gen_rtx_PLUS in predicate.

From-SVN: r86278

gcc/ChangeLog
gcc/config/s390/s390-protos.h
gcc/config/s390/s390.c
gcc/config/s390/s390.md

index 934128274d7b12563d8bd556cb62125be50c31ea..6ac9d2f91f3f05ed42077e619d90a177cfbd32f6 100644 (file)
@@ -1,3 +1,11 @@
+2004-08-19  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * config/s390/s390-protos.h (preferred_la_operand_p): Adapt prototype.
+       * config/s390/s390.c (preferred_la_operand_p): Accept two operands
+       instead of one.  Check for strictly legitimate address.
+       * config/s390/s390.md ("*la_31"/"*la_64" peepholes): Adapt call
+       to preferred_la_operand_p, do not call gen_rtx_PLUS in predicate.
+
 2004-08-19  Eric Christopher  <echristo@redhat.com>
 
        * langhooks-def.h (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove.
index a7498e2d2f36d117e18879156f861c73ec1e993d..b099122b63f40ba8af86a14b03e982f1d86449c3 100644 (file)
@@ -58,7 +58,7 @@ extern void s390_emit_jump (rtx, rtx);
 extern int symbolic_reference_mentioned_p (rtx);
 extern int tls_symbolic_reference_mentioned_p (rtx);
 extern int legitimate_la_operand_p (rtx);
-extern int preferred_la_operand_p (rtx);
+extern int preferred_la_operand_p (rtx, rtx);
 extern int legitimate_pic_operand_p (rtx);
 extern int legitimate_constant_p (rtx);
 extern int legitimate_reload_constant_p (rtx);
index 89c95df8aec91dc5c00da1ac188c118c8cd4285f..02c245f6f33b35b5dbcd2e34a3b081ba072d0f13 100644 (file)
@@ -2495,14 +2495,22 @@ legitimate_la_operand_p (register rtx op)
   return FALSE;
 }
 
-/* Return 1 if OP is a valid operand for the LA instruction,
-   and we prefer to use LA over addition to compute it.  */
+/* Return 1 if it is valid *and* preferrable to use LA to
+   compute the sum of OP1 and OP2.  */
 
 int
-preferred_la_operand_p (register rtx op)
+preferred_la_operand_p (rtx op1, rtx op2)
 {
   struct s390_address addr;
-  if (!s390_decompose_address (op, &addr))
+
+  if (op2 != const0_rtx)
+    op1 = gen_rtx_PLUS (Pmode, op1, op2);
+
+  if (!s390_decompose_address (op1, &addr))
+    return FALSE;
+  if (addr.base && !REG_OK_FOR_BASE_STRICT_P (addr.base))
+    return FALSE;
+  if (addr.indx && !REG_OK_FOR_INDEX_STRICT_P (addr.indx))
     return FALSE;
 
   if (!TARGET_64BIT && !addr.pointer)
index bbfed329f36232ad62cdb7771fa5a61635d8f3ae..5ca28b5e5c2f5eefc683218fcf3023e94eeb5725 100644 (file)
           (match_operand:QI 1 "address_operand" ""))
      (clobber (reg:CC 33))])]
   "TARGET_64BIT
-   && strict_memory_address_p (VOIDmode, operands[1])
-   && preferred_la_operand_p (operands[1])"
+   && preferred_la_operand_p (operands[1], const0_rtx)"
   [(set (match_dup 0) (match_dup 1))]
   "")
 
      (clobber (reg:CC 33))])]
   "TARGET_64BIT
    && !reg_overlap_mentioned_p (operands[0], operands[2])
-   && strict_memory_address_p (VOIDmode, gen_rtx_PLUS (DImode, operands[1], operands[2]))
-   && preferred_la_operand_p (gen_rtx_PLUS (DImode, operands[1], operands[2]))"
+   && preferred_la_operand_p (operands[1], operands[2])"
   [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 2)))]
   "")
 
           (match_operand:QI 1 "address_operand" ""))
      (clobber (reg:CC 33))])]
   "!TARGET_64BIT
-   && strict_memory_address_p (VOIDmode, operands[1])
-   && preferred_la_operand_p (operands[1])"
+   && preferred_la_operand_p (operands[1], const0_rtx)"
   [(set (match_dup 0) (match_dup 1))]
   "")
 
      (clobber (reg:CC 33))])]
   "!TARGET_64BIT
    && !reg_overlap_mentioned_p (operands[0], operands[2])
-   && strict_memory_address_p (VOIDmode, gen_rtx_PLUS (SImode, operands[1], operands[2]))
-   && preferred_la_operand_p (gen_rtx_PLUS (SImode, operands[1], operands[2]))"
+   && preferred_la_operand_p (operands[1], operands[2])"
   [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))]
   "")