aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-05-28 19:01:21 +0000
committerRichard Stallman <rms@gnu.org>1993-05-28 19:01:21 +0000
commit4d01c30fb52de3af8ebfda893e84a61563f6b78a (patch)
tree96da3e9f8d216ab77581f93b17c0c946941ebc4a
parent6e498949dba764fa067f14f5d03b763bebda905d (diff)
downloadgcc-4d01c30fb52de3af8ebfda893e84a61563f6b78a.zip
gcc-4d01c30fb52de3af8ebfda893e84a61563f6b78a.tar.gz
gcc-4d01c30fb52de3af8ebfda893e84a61563f6b78a.tar.bz2
(GO_IF_LEGITIMATE_INDEX): Check explicitly for
upper and lower bounds of valid INDEX. From-SVN: r4584
-rw-r--r--gcc/config/arm/arm.h53
1 files changed, 28 insertions, 25 deletions
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 9172925..2f26583 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -678,31 +678,34 @@ enum reg_class
/* A C statement (sans semicolon) to jump to LABEL for legitimate index RTXs
used by the macro GO_IF_LEGITIMATE_ADDRESS. Floating point indices can
only be small constants. */
-#define GO_IF_LEGITIMATE_INDEX(MODE, BASE_REGNO, INDEX, LABEL) \
-do \
-{ \
- int range; \
- \
- if (GET_MODE_CLASS (MODE) == MODE_FLOAT) \
- range = 1024; \
- else \
- { \
- if (INDEX_REGISTER_RTX_P (INDEX)) \
- goto LABEL; \
- if (GET_MODE_SIZE (MODE) <= 4 && GET_CODE (INDEX) == MULT) \
- { \
- rtx xiop0 = XEXP (INDEX, 0); \
- rtx xiop1 = XEXP (INDEX, 1); \
- if (INDEX_REGISTER_RTX_P (xiop0) && power_of_two_operand (xiop1, SImode)) \
- goto LABEL; \
- if (INDEX_REGISTER_RTX_P (xiop1) && power_of_two_operand (xiop0, SImode)) \
- goto LABEL; \
- } \
- range = 4096; \
- } \
- \
- if (GET_CODE (INDEX) == CONST_INT && abs (INTVAL (INDEX)) < range) \
- goto LABEL; \
+#define GO_IF_LEGITIMATE_INDEX(MODE, BASE_REGNO, INDEX, LABEL) \
+do \
+{ \
+ int range; \
+ \
+ if (GET_MODE_CLASS (MODE) == MODE_FLOAT) \
+ range = 1024; \
+ else \
+ { \
+ if (INDEX_REGISTER_RTX_P (INDEX)) \
+ goto LABEL; \
+ if (GET_MODE_SIZE (MODE) <= 4 && GET_CODE (INDEX) == MULT) \
+ { \
+ rtx xiop0 = XEXP (INDEX, 0); \
+ rtx xiop1 = XEXP (INDEX, 1); \
+ if (INDEX_REGISTER_RTX_P (xiop0) \
+ && power_of_two_operand (xiop1, SImode)) \
+ goto LABEL; \
+ if (INDEX_REGISTER_RTX_P (xiop1) \
+ && power_of_two_operand (xiop0, SImode)) \
+ goto LABEL; \
+ } \
+ range = 4096; \
+ } \
+ \
+ if (GET_CODE (INDEX) == CONST_INT && INTVAL (INDEX) < range \
+ && INTVAL (INDEX) > -range) \
+ goto LABEL; \
} while (0)
/* Jump to LABEL if X is a valid address RTX. This must also take