rs6000-protos.h (rs6000_find_base_term): Declare.
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 6 Oct 2008 19:08:04 +0000 (19:08 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 6 Oct 2008 19:08:04 +0000 (19:08 +0000)
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

gcc/ChangeLog
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h

index e5af008102e2238fda4c44d22a950393c100fb8c..cbafd381198909ec6ccde924aa2c1e4939f2fea5 100644 (file)
@@ -1,3 +1,9 @@
+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.
index 42e939bf741ea688fe2691c50fb57ffb8079e400..13e7becc526c24f14848e12f0e86b912a945bc8b 100644 (file)
@@ -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);
index 83a2753eb90cba9e610230460cc63b6ba4114103..9f48b611e6f88ca5748840d6a19a7d912b393723 100644 (file)
@@ -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
index 79250c87b0714538476ae835bb8792a1f6a451af..39fc0f6c9b68d1ff38984ec2793c2c5321a9a4b7 100644 (file)
@@ -1856,6 +1856,8 @@ do {                                                              \
   if (rs6000_mode_dependent_address (ADDR))                    \
     goto LABEL;                                                        \
 } while (0)
+
+#define FIND_BASE_TERM rs6000_find_base_term
 \f
 /* The register number of the register used to address a table of
    static data addresses in memory.  In some cases this register is