aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaz Kojima <kkojima@gcc.gnu.org>2003-02-19 02:15:04 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2003-02-19 02:15:04 +0000
commit9f3a9a0809f65d74496810557542663a3ceabe0e (patch)
treeb6084c1968eba4a4e54581a0a994c2454351e950
parentd7ddbe241a953a4ba9adae1f3a38ade24f9121f0 (diff)
downloadgcc-9f3a9a0809f65d74496810557542663a3ceabe0e.zip
gcc-9f3a9a0809f65d74496810557542663a3ceabe0e.tar.gz
gcc-9f3a9a0809f65d74496810557542663a3ceabe0e.tar.bz2
sh.c (unspec_caller_rtx_p): New.
* config/sh/sh.c (unspec_caller_rtx_p): New. (sh_cannot_copy_insn_p): New. (TARGET_CANNOT_COPY_INSN_P): New. From-SVN: r63084
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sh/sh.c57
2 files changed, 63 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 04b7f81..07ba997 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-02-18 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ * config/sh/sh.c (unspec_caller_rtx_p): New.
+ (sh_cannot_copy_insn_p): New.
+ (TARGET_CANNOT_COPY_INSN_P): New.
+
2003-02-18 Richard Henderson <rth@redhat.com>
* c-common.c (handle_used_attribute): Accept static data too.
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 0bb0d94..b6af3de 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -218,6 +218,8 @@ static int shiftcosts PARAMS ((rtx));
static int andcosts PARAMS ((rtx));
static int addsubcosts PARAMS ((rtx));
static int multcosts PARAMS ((rtx));
+static bool unspec_caller_rtx_p PARAMS ((rtx));
+static bool sh_cannot_copy_insn_p PARAMS ((rtx));
static bool sh_rtx_costs PARAMS ((rtx, int, int, int *));
static int sh_address_cost PARAMS ((rtx));
@@ -271,6 +273,8 @@ static int sh_address_cost PARAMS ((rtx));
#undef TARGET_FUNCTION_OK_FOR_SIBCALL
#define TARGET_FUNCTION_OK_FOR_SIBCALL sh_function_ok_for_sibcall
+#undef TARGET_CANNOT_COPY_INSN_P
+#define TARGET_CANNOT_COPY_INSN_P sh_cannot_copy_insn_p
#undef TARGET_RTX_COSTS
#define TARGET_RTX_COSTS sh_rtx_costs
#undef TARGET_ADDRESS_COST
@@ -1215,6 +1219,59 @@ output_file_start (file)
TARGET_SHMEDIA64 ? 64 : 32);
}
+/* Check if PAT includes UNSPEC_CALLER unspec pattern. */
+
+static bool
+unspec_caller_rtx_p (pat)
+ rtx pat;
+{
+ switch (GET_CODE (pat))
+ {
+ case CONST:
+ return unspec_caller_rtx_p (XEXP (pat, 0));
+ case PLUS:
+ case MINUS:
+ if (unspec_caller_rtx_p (XEXP (pat, 0)))
+ return true;
+ return unspec_caller_rtx_p (XEXP (pat, 1));
+ case UNSPEC:
+ if (XINT (pat, 1) == UNSPEC_CALLER)
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
+/* Indicate that INSN cannot be duplicated. This is true for insn
+ that generates an unique label. */
+
+static bool
+sh_cannot_copy_insn_p (insn)
+ rtx insn;
+{
+ rtx pat;
+
+ if (!reload_completed || !flag_pic)
+ return false;
+
+ if (GET_CODE (insn) != INSN)
+ return false;
+ if (asm_noperands (insn) >= 0)
+ return false;
+
+ pat = PATTERN (insn);
+ if (GET_CODE (pat) != SET)
+ return false;
+ pat = SET_SRC (pat);
+
+ if (unspec_caller_rtx_p (pat))
+ return true;
+
+ return false;
+}
+
/* Actual number of instructions used to make a shift by N. */
static const char ashiftrt_insns[] =
{ 0,1,2,3,4,5,8,8,8,8,8,8,8,8,8,8,2,3,4,5,8,8,8,8,8,8,8,8,8,8,8,2};