diff options
| author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-10-06 19:08:04 +0000 |
|---|---|---|
| committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-10-06 19:08:04 +0000 |
| commit | 27e16789fb7635fa20a9806ad24415db133de802 (patch) | |
| tree | 873b04eb6022557d9e36c8ab48d15fc6900a6c22 | |
| parent | a914e728c526c1cb7e13fdae8c5efdc151887ff9 (diff) | |
| download | ppe42-gcc-27e16789fb7635fa20a9806ad24415db133de802.tar.gz ppe42-gcc-27e16789fb7635fa20a9806ad24415db133de802.zip | |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140912 138bc75d-0d04-0410-961f-82ee72b054a4
| -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 e5af008102e..cbafd381198 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 42e939bf741..13e7becc526 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 83a2753eb90..9f48b611e6f 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 79250c87b07..39fc0f6c9b6 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 |

