m32c.c (m32c_return_addr_rtx): Change pointer type for A24 to PSImode.
authorDJ Delorie <dj@redhat.com>
Sat, 24 May 2008 00:46:59 +0000 (20:46 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Sat, 24 May 2008 00:46:59 +0000 (20:46 -0400)
* config/m32c/m32c.c (m32c_return_addr_rtx): Change pointer type
for A24 to PSImode.
(m32c_address_cost): Detail costs for indirect offsets.

From-SVN: r135842

gcc/ChangeLog
gcc/config/m32c/m32c.c

index 2eda8f40bda564669dc39aa61ab8d070ccacbec5..cde9086127626e3e0646f5611c2023d092aecc95 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-23  DJ Delorie  <dj@redhat.com>
+
+       * config/m32c/m32c.c (m32c_return_addr_rtx): Change pointer type
+       for A24 to PSImode.
+       (m32c_address_cost): Detail costs for indirect offsets.
+
 2008-05-23  Rafael Espindola  <espindola@google.com>
 
        * see.c (see_get_extension_data): Don't use SUBREG_REG to test
index 2e5558fd92d55fc0881da10d13f5952132e7bf2b..697e42a79485b7dcc9c1e7df9f8121c0c6c99e4b 100644 (file)
@@ -1099,7 +1099,8 @@ m32c_return_addr_rtx (int count)
 
   if (TARGET_A24)
     {
-      mode = SImode;
+      /* It's four bytes */
+      mode = PSImode;
       offset = 4;
     }
   else
@@ -2199,16 +2200,36 @@ m32c_rtx_costs (rtx x, int code, int outer_code, int *total)
 static int
 m32c_address_cost (rtx addr)
 {
+  int i;
   /*  fprintf(stderr, "\naddress_cost\n");
       debug_rtx(addr);*/
   switch (GET_CODE (addr))
     {
     case CONST_INT:
-      return COSTS_N_INSNS(1);
+      i = INTVAL (addr);
+      if (i == 0)
+       return COSTS_N_INSNS(1);
+      if (0 < i && i <= 255)
+       return COSTS_N_INSNS(2);
+      if (0 < i && i <= 65535)
+       return COSTS_N_INSNS(3);
+      return COSTS_N_INSNS(4);
     case SYMBOL_REF:
-      return COSTS_N_INSNS(3);
+      return COSTS_N_INSNS(4);
     case REG:
-      return COSTS_N_INSNS(2);
+      return COSTS_N_INSNS(1);
+    case PLUS:
+      if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
+       {
+         i = INTVAL (XEXP (addr, 1));
+         if (i == 0)
+           return COSTS_N_INSNS(1);
+         if (0 < i && i <= 255)
+           return COSTS_N_INSNS(2);
+         if (0 < i && i <= 65535)
+           return COSTS_N_INSNS(3);
+       }
+      return COSTS_N_INSNS(4);
     default:
       return 0;
     }