aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-08-01 20:14:21 +0000
committerRichard Stallman <rms@gnu.org>1993-08-01 20:14:21 +0000
commit04e61bd4dd50def56f95dc0f00c428d29cab9242 (patch)
tree663e3537e84702b88590a15e609eb577db03a7b9
parent19b2fd27ea262649afb3869fa0b1e98153121829 (diff)
downloadgcc-04e61bd4dd50def56f95dc0f00c428d29cab9242.zip
gcc-04e61bd4dd50def56f95dc0f00c428d29cab9242.tar.gz
gcc-04e61bd4dd50def56f95dc0f00c428d29cab9242.tar.bz2
(PIC_CASE_VECTOR_ADDRESS): Defined.
(GO_IF_LEGITIMATE_ADDRESS): If pic, accept LABEL+INDEX. From-SVN: r5051
-rw-r--r--gcc/config/m68k/m68k.h16
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 215d41b..72d9457 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -1217,9 +1217,19 @@ __transfer_from_trampoline () \
|| INTVAL (XEXP (X, 1)) == 4 \
|| INTVAL (XEXP (X, 1)) == 8)))
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
-{ GO_IF_NONINDEXED_ADDRESS (X, ADDR); \
- GO_IF_INDEXED_ADDRESS (X, ADDR); }
+/* If pic, we accept INDEX+LABEL, which is what do_tablejump makes. */
+#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
+{ GO_IF_NONINDEXED_ADDRESS (X, ADDR); \
+ GO_IF_INDEXED_ADDRESS (X, ADDR); \
+ if (flag_pic && MODE == CASE_VECTOR_MODE && GET_CODE (X) == PLUS \
+ && LEGITIMATE_INDEX_P (XEXP (X, 0)) \
+ && GET_CODE (XEXP (X, 1)) == LABEL_REF) \
+ goto ADDR; }
+
+/* Don't call memory_address_noforce for the address to fetch
+ the switch offset. This address is ok as it stands (see above),
+ but memory_address_noforce would alter it. */
+#define PIC_CASE_VECTOR_ADDRESS(index) index
/* Try machine-dependent ways of modifying an illegitimate address
to be legitimate. If we find one, return the new, valid address.