From e1d5ee28d3811018ef6ada106626643a36c39530 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Thu, 19 Aug 2004 21:37:32 +0000 Subject: [PATCH] s390-protos.h (preferred_la_operand_p): Adapt prototype. * 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 | 8 ++++++++ gcc/config/s390/s390-protos.h | 2 +- gcc/config/s390/s390.c | 16 ++++++++++++---- gcc/config/s390/s390.md | 12 ++++-------- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 934128274d7..6ac9d2f91f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-08-19 Ulrich Weigand + + * 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 * langhooks-def.h (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove. diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h index a7498e2d2f3..b099122b63f 100644 --- a/gcc/config/s390/s390-protos.h +++ b/gcc/config/s390/s390-protos.h @@ -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); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 89c95df8aec..02c245f6f33 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -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) diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index bbfed329f36..5ca28b5e5c2 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -971,8 +971,7 @@ (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))] "") @@ -986,8 +985,7 @@ (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)))] "") @@ -1113,8 +1111,7 @@ (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))] "") @@ -1128,8 +1125,7 @@ (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)))] "") -- 2.30.2