bfin.c (bfin_delegitimize_address): New.
authorJie Zhang <jie.zhang@analog.com>
Wed, 31 May 2006 15:42:22 +0000 (15:42 +0000)
committerJie Zhang <jiez@gcc.gnu.org>
Wed, 31 May 2006 15:42:22 +0000 (15:42 +0000)
* config/bfin/bfin.c (bfin_delegitimize_address): New.
(TARGET_DELEGITIMIZE_ADDRESS): Define.

From-SVN: r114269

gcc/ChangeLog
gcc/config/bfin/bfin.c

index 4b2fceabf84fb4599ed90d1f2df47d809161d45b..fb4974c7a6e0445a05c17cec260ade06ff6f4277 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-31  Jie Zhang  <jie.zhang@analog.com>
+
+       * config/bfin/bfin.c (bfin_delegitimize_address): New.
+       (TARGET_DELEGITIMIZE_ADDRESS): Define.
+
 2006-05-31  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * Makefile.in (CATALOGS): Add po/ prefix.
index 5234bfde50f582fb7e3208629713ea7fc0e52d5f..288e32703a3f16ab115ac62b73bceb3946fadfc5 100644 (file)
@@ -1030,6 +1030,25 @@ legitimize_address (rtx x ATTRIBUTE_UNUSED, rtx oldx ATTRIBUTE_UNUSED,
   return NULL_RTX;
 }
 
+static rtx
+bfin_delegitimize_address (rtx orig_x)
+{
+  rtx x = orig_x, y;
+
+  if (GET_CODE (x) != MEM)
+    return orig_x;
+
+  x = XEXP (x, 0);
+  if (GET_CODE (x) == PLUS
+      && GET_CODE (XEXP (x, 1)) == UNSPEC
+      && XINT (XEXP (x, 1), 1) == UNSPEC_MOVE_PIC
+      && GET_CODE (XEXP (x, 0)) == REG
+      && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM)
+    return XVECEXP (XEXP (x, 1), 0, 0);
+
+  return orig_x;
+}
+
 /* This predicate is used to compute the length of a load/store insn.
    OP is a MEM rtx, we return nonzero if its addressing mode requires a
    32 bit instruction.  */
@@ -3643,4 +3662,7 @@ bfin_expand_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
 #undef TARGET_SECONDARY_RELOAD
 #define TARGET_SECONDARY_RELOAD bfin_secondary_reload
 
+#undef TARGET_DELEGITIMIZE_ADDRESS
+#define TARGET_DELEGITIMIZE_ADDRESS bfin_delegitimize_address
+
 struct gcc_target targetm = TARGET_INITIALIZER;