diff options
author | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-24 19:09:11 +0000 |
---|---|---|
committer | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-24 19:09:11 +0000 |
commit | 1e2806231ce236a53afca13b9ea8466053315cb9 (patch) | |
tree | 7c3fbb686b7ffebd06bf1b284b40151addcb088e /gcc/config | |
parent | 8f2a88edcd09290f720bad664a138483de55af7a (diff) | |
download | gcc-1e2806231ce236a53afca13b9ea8466053315cb9.tar.gz |
2006-03-24 Andreas Krebbel <krebbel1@de.ibm.com>
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112357 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/s390/s390.c | 43 | ||||
-rw-r--r-- | gcc/config/s390/s390.h | 36 |
2 files changed, 28 insertions, 51 deletions
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) |