sh-protos.h (sh_mark_label): Declare.
authorRichard Sandiford <rsandifo@redhat.com>
Mon, 18 Nov 2002 14:01:23 +0000 (14:01 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 18 Nov 2002 14:01:23 +0000 (14:01 +0000)
* config/sh/sh-protos.h (sh_mark_label): Declare.
* config/sh/sh.c (sh_mark_label): New function, taken from
movdi_const, but fixing the case when the address has an addend.
* config/sh/sh.md (movdi_const, movdi_const_32bit): Use it.

From-SVN: r59217

gcc/ChangeLog
gcc/config/sh/sh-protos.h
gcc/config/sh/sh.c
gcc/config/sh/sh.md

index 5a61cca728e045658c765b54aa72bc977915cad8..715b380e9383571923b6e1525c88d55d459b55d1 100644 (file)
@@ -1,3 +1,10 @@
+2002-11-18  Richard Sandiford  <rsandifo@redhat.com>
+
+       * config/sh/sh-protos.h (sh_mark_label): Declare.
+       * config/sh/sh.c (sh_mark_label): New function, taken from
+       movdi_const, but fixing the case when the address has an addend.
+       * config/sh/sh.md (movdi_const, movdi_const_32bit): Use it.
+
 2002-11-18  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/sh/sh.c (pool_node): New field: part_of_sequence_p.
index a729462393eed3a5cafd867ae41b4cb2dad7afc3..c87000bceebf235a59efe76cc8d3f851e535d778 100644 (file)
@@ -128,6 +128,7 @@ extern int sh_cfun_interrupt_handler_p PARAMS ((void));
 extern void sh_initialize_trampoline PARAMS ((rtx, rtx, rtx));
 extern enum reg_class sh_cannot_change_mode_class
              PARAMS ((enum machine_mode, enum machine_mode));
+extern void sh_mark_label PARAMS ((rtx, int));
 
 #ifdef HARD_CONST
 extern void fpscr_set_from_mem PARAMS ((int, HARD_REG_SET));
index a26d92b8339681f2f2027062c21917dd7f951ffb..7ea35dc5261966f1ecea3dcabc0e350dff83f6dc 100644 (file)
@@ -7764,4 +7764,26 @@ sh_cannot_change_mode_class (from, to)
   return NO_REGS;
 }
 
+
+/* If ADDRESS refers to a CODE_LABEL, add NUSES to the number of times
+   that label is used.  */
+
+void
+sh_mark_label (address, nuses)
+     rtx address;
+     int nuses;
+{
+  if (GOTOFF_P (address))
+    {
+      /* Extract the label or symbol.  */
+      address = XEXP (address, 0);
+      if (GET_CODE (address) == PLUS)
+       address = XEXP (address, 0);
+      address = XVECEXP (address, 0, 0);
+    }
+  if (GET_CODE (address) == LABEL_REF
+      && GET_CODE (XEXP (address, 0)) == CODE_LABEL)
+    LABEL_NUSES (XEXP (address, 0)) += nuses;
+}
+
 #include "gt-sh.h"
index c945496a4fc6bc473808c80f7559766aa97d2c62..d57583bf6ac25dff2955030fcc9bbcce8f707870 100644 (file)
    && MOVI_SHORI_BASE_OPERAND_P (operands[1])"
   "
 {
-  if (GET_CODE (operands[1]) == LABEL_REF
-      && GET_CODE (XEXP (operands[1], 0)) == CODE_LABEL)
-    LABEL_NUSES (XEXP (operands[1], 0)) += 4;
-  else if (GOTOFF_P (operands[1])
-          && GET_CODE (XVECEXP (XEXP (operands[1], 0), 0, 0)) == LABEL_REF
-          && (GET_CODE (XEXP (XVECEXP (XEXP (operands[1], 0), 0, 0), 0))
-              == CODE_LABEL))
-    LABEL_NUSES (XEXP (XVECEXP (XEXP (operands[1], 0), 0, 0), 0)) += 4;
+  sh_mark_label (operands[1], 4);
 }")
 
 (define_expand "movdi_const_32bit"
    && MOVI_SHORI_BASE_OPERAND_P (operands[1])"
   "
 {
-  if (GET_CODE (operands[1]) == LABEL_REF
-      && GET_CODE (XEXP (operands[1], 0)) == CODE_LABEL)
-    LABEL_NUSES (XEXP (operands[1], 0)) += 2;
-  else if (GOTOFF_P (operands[1])
-          && GET_CODE (XVECEXP (XEXP (operands[1], 0), 0, 0)) == LABEL_REF
-          && (GET_CODE (XEXP (XVECEXP (XEXP (operands[1], 0), 0, 0), 0))
-              == CODE_LABEL))
-    LABEL_NUSES (XEXP (XVECEXP (XEXP (operands[1], 0), 0, 0), 0)) += 2;
+  sh_mark_label (operands[1], 2);
 }")
 
 (define_expand "movdi_const_16bit"