aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2008-10-06 19:08:04 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2008-10-06 19:08:04 +0000
commit944258ebc661d4e3ade20c12dfa5ae5101b87db4 (patch)
tree873b04eb6022557d9e36c8ab48d15fc6900a6c22
parent08a6a74b917d3a7b0070c264374cd076edfacc9e (diff)
downloadgcc-944258ebc661d4e3ade20c12dfa5ae5101b87db4.zip
gcc-944258ebc661d4e3ade20c12dfa5ae5101b87db4.tar.gz
gcc-944258ebc661d4e3ade20c12dfa5ae5101b87db4.tar.bz2
rs6000-protos.h (rs6000_find_base_term): Declare.
gcc/ * config/rs6000/rs6000-protos.h (rs6000_find_base_term): Declare. * config/rs6000/rs6000.h (FIND_BASE_TERM): New macro. * config/rs6000/rs6000.c (rs6000_find_base_term): New function. From-SVN: r140912
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000-protos.h1
-rw-r--r--gcc/config/rs6000/rs6000.c21
-rw-r--r--gcc/config/rs6000/rs6000.h2
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e5af008..cbafd38 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2008-10-06 Richard Sandiford <rdsandiford@googlemail.com>
+ * config/rs6000/rs6000-protos.h (rs6000_find_base_term): Declare.
+ * config/rs6000/rs6000.h (FIND_BASE_TERM): New macro.
+ * config/rs6000/rs6000.c (rs6000_find_base_term): New function.
+
+2008-10-06 Richard Sandiford <rdsandiford@googlemail.com>
+
* config/darwin-protos.h (machopic_function_base_name): Delete.
(machopic_function_base_sym): Likewise.
(machopic_gen_offset): Declare.
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 42e939b..13e7bec 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -112,6 +112,7 @@ extern rtx rs6000_legitimize_reload_address (rtx, enum machine_mode,
extern int rs6000_legitimate_address (enum machine_mode, rtx, int);
extern bool rs6000_legitimate_offset_address_p (enum machine_mode, rtx, int);
extern bool rs6000_mode_dependent_address (rtx);
+extern rtx rs6000_find_base_term (rtx);
extern bool rs6000_offsettable_memref_p (rtx);
extern rtx rs6000_return_addr (int, rtx);
extern void rs6000_output_symbol_ref (FILE*, rtx);
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 83a2753..9f48b61 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4455,6 +4455,27 @@ rs6000_mode_dependent_address (rtx addr)
return false;
}
+/* Implement FIND_BASE_TERM. */
+
+rtx
+rs6000_find_base_term (rtx op)
+{
+ rtx base, offset;
+
+ split_const (op, &base, &offset);
+ if (GET_CODE (base) == UNSPEC)
+ switch (XINT (base, 1))
+ {
+ case UNSPEC_TOCREL:
+ case UNSPEC_MACHOPIC_OFFSET:
+ /* OP represents SYM [+ OFFSET] - ANCHOR. SYM is the base term
+ for aliasing purposes. */
+ return XVECEXP (base, 0, 0);
+ }
+
+ return op;
+}
+
/* More elaborate version of recog's offsettable_memref_p predicate
that works around the ??? note of rs6000_mode_dependent_address.
In particular it accepts
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 79250c8..39fc0f6 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1856,6 +1856,8 @@ do { \
if (rs6000_mode_dependent_address (ADDR)) \
goto LABEL; \
} while (0)
+
+#define FIND_BASE_TERM rs6000_find_base_term
/* The register number of the register used to address a table of
static data addresses in memory. In some cases this register is