diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-18 15:21:32 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-18 15:21:32 +0000 |
commit | 172258a4248d493377261eb1dfd0c19d5a50c382 (patch) | |
tree | 8ba0ef49d9742b4adcda26a5026f5f7d2948ba36 /gcc/config/pa | |
parent | abad9af1943b046046b8b14d04908014e8ab52be (diff) | |
download | gcc-172258a4248d493377261eb1dfd0c19d5a50c382.tar.gz |
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
Diffstat (limited to 'gcc/config/pa')
-rw-r--r-- | gcc/config/pa/pa.c | 30 | ||||
-rw-r--r-- | gcc/config/pa/predicates.md | 13 |
2 files changed, 13 insertions, 30 deletions
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; |