diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a61cca728e..715b380e938 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-11-18 Richard Sandiford + + * 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 * config/sh/sh.c (pool_node): New field: part_of_sequence_p. diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h index a729462393e..c87000bceeb 100644 --- a/gcc/config/sh/sh-protos.h +++ b/gcc/config/sh/sh-protos.h @@ -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)); diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index a26d92b8339..7ea35dc5261 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -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" diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index c945496a4fc..d57583bf6ac 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -3867,14 +3867,7 @@ && 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" @@ -3896,14 +3889,7 @@ && 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"