From 172258a4248d493377261eb1dfd0c19d5a50c382 Mon Sep 17 00:00:00 2001 From: danglin Date: Mon, 18 Feb 2013 15:21:32 +0000 Subject: PR target/56214 * config/pa/predicates.md (base14_operand): Except for BLKmode, QImode and HImode, require all displacements to be an integer multiple of the mode size. * config/pa/pa.c (pa_legitimate_address_p): For REG+BASE addresses, only allow QImode and HImode when reload is in progress and strict is true. Likewise for symbolic addresses. Use base14_operand to check displacements in REG+BASE addresses. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196122 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/pa/pa.c | 30 +++++++++++------------------- gcc/config/pa/predicates.md | 13 ++----------- 2 files changed, 13 insertions(+), 30 deletions(-) (limited to 'gcc/config/pa') diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 36eba24d623..0d39483d908 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -10517,21 +10517,13 @@ pa_legitimate_address_p (enum machine_mode mode, rtx x, bool strict) the majority of accesses will use floating point instructions that don't support 14-bit offsets. */ if (!INT14_OK_STRICT - && (GET_MODE_CLASS (mode) == MODE_FLOAT - || (reload_in_progress - && strict - && (mode == SImode || mode == DImode)))) - return false; - - if (INT_14_BITS (index) - && (mode == BLKmode - || mode == QImode - || mode == HImode - /* Displacement must be a multiple of its size. */ - || (INTVAL (index) % GET_MODE_SIZE (mode)) == 0)) - return true; + && reload_in_progress + && strict + && mode != QImode + && mode != HImode) + return false; - return false; + return base14_operand (index, mode); } if (!TARGET_DISABLE_INDEXING @@ -10586,11 +10578,11 @@ pa_legitimate_address_p (enum machine_mode mode, rtx x, bool strict) return true; if (!INT14_OK_STRICT - && (GET_MODE_CLASS (mode) == MODE_FLOAT - || (reload_in_progress - && strict - && (mode == SImode || mode == DImode)))) - return false; + && reload_in_progress + && strict + && mode != QImode + && mode != HImode) + return false; if (CONSTANT_P (XEXP (x, 1))) return true; diff --git a/gcc/config/pa/predicates.md b/gcc/config/pa/predicates.md index 8823706026b..ba105f2e8cc 100644 --- a/gcc/config/pa/predicates.md +++ b/gcc/config/pa/predicates.md @@ -272,22 +272,13 @@ assumed in the instruction encoding. */ switch (mode) { + case BLKmode: case QImode: case HImode: return true; - case SImode: - case SFmode: - case SCmode: - return (INTVAL (op) % 4) == 0; - - case DImode: - case DFmode: - case DCmode: - return (INTVAL (op) % 8) == 0; - default: - break; + return (INTVAL (op) % GET_MODE_SIZE (mode)) == 0; } return false; -- cgit v1.2.1