From: Andreas Krebbel Date: Fri, 24 Mar 2006 19:09:11 +0000 (+0000) Subject: s390.c (s390_decompose_address): Allow SImode for index and base register. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=93fa842809e11c31a60d603dac8da965d0328869;p=gcc.git s390.c (s390_decompose_address): Allow SImode for index and base register. 2006-03-24 Andreas Krebbel * config/s390/s390.c (s390_decompose_address): Allow SImode for index and base register. (s390_expand_plug_operand, legitimate_address_p, preferred_la_operand_p, print_operand_address, print_operand): Replaced REG_OK_FOR_BASE_STRICT_P with REGNO_OK_FOR_BASE_P and REG_OK_FOR_INDEX_STRICT_P with REGNO_OK_FOR_INDEX_P. * config/s390/s390.h (REGNO_OK_FOR_INDEX_P): Replaced check with ADDR_REGNO_P. (REG_OK_FOR_INDEX_NONSTRICT_P, REG_OK_FOR_BASE_NONSTRICT_P, REG_OK_FOR_INDEX_STRICT_P, REG_OK_FOR_BASE_STRICT_P, REG_OK_FOR_INDEX_P, REG_OK_FOR_BASE_P): Definitions removed. From-SVN: r112357 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c97560826c..8bc62daa26e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2006-03-24 Andreas Krebbel + + * config/s390/s390.c (s390_decompose_address): Allow SImode for + index and base register. + (s390_expand_plug_operand, legitimate_address_p, preferred_la_operand_p, + print_operand_address, print_operand): Replaced REG_OK_FOR_BASE_STRICT_P + with REGNO_OK_FOR_BASE_P and REG_OK_FOR_INDEX_STRICT_P with + REGNO_OK_FOR_INDEX_P. + * config/s390/s390.h (REGNO_OK_FOR_INDEX_P): Replaced check with + ADDR_REGNO_P. + (REG_OK_FOR_INDEX_NONSTRICT_P, REG_OK_FOR_BASE_NONSTRICT_P, + REG_OK_FOR_INDEX_STRICT_P, REG_OK_FOR_BASE_STRICT_P, REG_OK_FOR_INDEX_P, + REG_OK_FOR_BASE_P): Definitions removed. + 2006-03-24 Jakub Jelinek PR middle-end/26611 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 2ebe8ac009f..0d03fa603d7 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -1617,7 +1617,9 @@ s390_decompose_address (rtx addr, struct s390_address *out) return false; } - if (GET_CODE (base) != REG || GET_MODE (base) != Pmode) + if (!REG_P (base) + || (GET_MODE (base) != SImode + && GET_MODE (base) != Pmode)) return false; if (REGNO (base) == STACK_POINTER_REGNUM @@ -1663,7 +1665,9 @@ s390_decompose_address (rtx addr, struct s390_address *out) return false; } - if (GET_CODE (indx) != REG || GET_MODE (indx) != Pmode) + if (!REG_P (indx) + || (GET_MODE (indx) != SImode + && GET_MODE (indx) != Pmode)) return false; if (REGNO (indx) == STACK_POINTER_REGNUM @@ -2678,8 +2682,8 @@ s390_expand_plus_operand (rtx target, rtx src, /* If the address is already strictly valid, there's nothing to do. */ if (!s390_decompose_address (src, &ad) - || (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base)) - || (ad.indx && !REG_OK_FOR_INDEX_STRICT_P (ad.indx))) + || (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base))) + || (ad.indx && !REGNO_OK_FOR_INDEX_P (REGNO (ad.indx)))) { /* Otherwise, one of the operands cannot be an address register; we reload its value into the scratch register. */ @@ -2727,19 +2731,24 @@ legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, if (strict) { - if (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base)) + if (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base))) return false; - if (ad.indx && !REG_OK_FOR_INDEX_STRICT_P (ad.indx)) + + if (ad.indx && !REGNO_OK_FOR_INDEX_P (REGNO (ad.indx))) return false; } else { - if (ad.base && !REG_OK_FOR_BASE_NONSTRICT_P (ad.base)) - return false; - if (ad.indx && !REG_OK_FOR_INDEX_NONSTRICT_P (ad.indx)) + if (ad.base + && !(REGNO (ad.base) >= FIRST_PSEUDO_REGISTER + || REGNO_REG_CLASS (REGNO (ad.base)) == ADDR_REGS)) return false; + + if (ad.indx + && !(REGNO (ad.indx) >= FIRST_PSEUDO_REGISTER + || REGNO_REG_CLASS (REGNO (ad.indx)) == ADDR_REGS)) + return false; } - return true; } @@ -2770,9 +2779,9 @@ preferred_la_operand_p (rtx op1, rtx op2) if (!s390_decompose_address (op1, &addr)) return false; - if (addr.base && !REG_OK_FOR_BASE_STRICT_P (addr.base)) + if (addr.base && !REGNO_OK_FOR_BASE_P (REGNO (addr.base))) return false; - if (addr.indx && !REG_OK_FOR_INDEX_STRICT_P (addr.indx)) + if (addr.indx && !REGNO_OK_FOR_INDEX_P (REGNO (addr.indx))) return false; if (!TARGET_64BIT && !addr.pointer) @@ -4500,8 +4509,8 @@ print_operand_address (FILE *file, rtx addr) struct s390_address ad; if (!s390_decompose_address (addr, &ad) - || (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base)) - || (ad.indx && !REG_OK_FOR_INDEX_STRICT_P (ad.indx))) + || (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base))) + || (ad.indx && !REGNO_OK_FOR_INDEX_P (REGNO (ad.indx)))) output_operand_lossage ("cannot decompose address"); if (ad.disp) @@ -4585,7 +4594,7 @@ print_operand (FILE *file, rtx x, int code) gcc_assert (GET_CODE (x) == MEM); ret = s390_decompose_address (XEXP (x, 0), &ad); gcc_assert (ret); - gcc_assert (!ad.base || REG_OK_FOR_BASE_STRICT_P (ad.base)); + gcc_assert (!ad.base || REGNO_OK_FOR_BASE_P (REGNO (ad.base))); gcc_assert (!ad.indx); if (ad.disp) @@ -4603,7 +4612,7 @@ print_operand (FILE *file, rtx x, int code) gcc_assert (GET_CODE (x) == MEM); ret = s390_decompose_address (XEXP (x, 0), &ad); gcc_assert (ret); - gcc_assert (!ad.base || REG_OK_FOR_BASE_STRICT_P (ad.base)); + gcc_assert (!ad.base || REGNO_OK_FOR_BASE_P (REGNO (ad.base))); gcc_assert (!ad.indx); if (ad.base) @@ -4621,7 +4630,7 @@ print_operand (FILE *file, rtx x, int code) gcc_assert (GET_CODE (x) == MEM); ret = s390_decompose_address (XEXP (x, 0), &ad); gcc_assert (ret); - gcc_assert (!ad.base || REG_OK_FOR_BASE_STRICT_P (ad.base)); + gcc_assert (!ad.base || REGNO_OK_FOR_BASE_P (REGNO (ad.base))); gcc_assert (!ad.indx); if (ad.disp) diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index 1a61158ba04..5feb9d5b7cf 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -476,8 +476,8 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; or a pseudo register currently allocated to one such. */ #define REGNO_OK_FOR_INDEX_P(REGNO) \ (((REGNO) < FIRST_PSEUDO_REGISTER \ - && REGNO_REG_CLASS ((REGNO)) == ADDR_REGS) \ - || (reg_renumber[REGNO] > 0 && reg_renumber[REGNO] < 16)) + && REGNO_REG_CLASS ((REGNO)) == ADDR_REGS) \ + || ADDR_REGNO_P (reg_renumber[REGNO])) #define REGNO_OK_FOR_BASE_P(REGNO) REGNO_OK_FOR_INDEX_P (REGNO) @@ -729,38 +729,6 @@ CUMULATIVE_ARGS; /* Maximum number of registers that can appear in a valid memory address. */ #define MAX_REGS_PER_ADDRESS 2 -/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx and check - its validity for a certain class. We have two alternate definitions - for each of them. The usual definition accepts all pseudo regs; the - other rejects them all. The symbol REG_OK_STRICT causes the latter - definition to be used. - - Most source files want to accept pseudo regs in the hope that they will - get allocated to the class that the insn wants them to be in. - Some source files that are used after register allocation - need to be strict. */ - -#define REG_OK_FOR_INDEX_NONSTRICT_P(X) \ -((GET_MODE (X) == Pmode) && \ - ((REGNO (X) >= FIRST_PSEUDO_REGISTER) \ - || REGNO_REG_CLASS (REGNO (X)) == ADDR_REGS)) - -#define REG_OK_FOR_BASE_NONSTRICT_P(X) REG_OK_FOR_INDEX_NONSTRICT_P (X) - -#define REG_OK_FOR_INDEX_STRICT_P(X) \ -((GET_MODE (X) == Pmode) && (REGNO_OK_FOR_INDEX_P (REGNO (X)))) - -#define REG_OK_FOR_BASE_STRICT_P(X) \ -((GET_MODE (X) == Pmode) && (REGNO_OK_FOR_BASE_P (REGNO (X)))) - -#ifndef REG_OK_STRICT -#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_NONSTRICT_P(X) -#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NONSTRICT_P(X) -#else -#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_STRICT_P(X) -#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P(X) -#endif - /* S/390 has no mode dependent addresses. */ #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)