diff options
author | Kaz Kojima <kkojima@gcc.gnu.org> | 2003-02-19 02:15:04 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@gcc.gnu.org> | 2003-02-19 02:15:04 +0000 |
commit | 9f3a9a0809f65d74496810557542663a3ceabe0e (patch) | |
tree | b6084c1968eba4a4e54581a0a994c2454351e950 /gcc | |
parent | d7ddbe241a953a4ba9adae1f3a38ade24f9121f0 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/sh/sh.c | 57 |
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}; |