diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2008-10-06 19:08:04 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2008-10-06 19:08:04 +0000 |
commit | 944258ebc661d4e3ade20c12dfa5ae5101b87db4 (patch) | |
tree | 873b04eb6022557d9e36c8ab48d15fc6900a6c22 | |
parent | 08a6a74b917d3a7b0070c264374cd076edfacc9e (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 21 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 2 |
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 |