From: J"orn Rennecke Date: Tue, 27 Apr 1999 12:23:20 +0000 (+0000) Subject: sh.md (insv): Use copy_addr_to_reg. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ea3cbda50176e5229b8adc2899a2b8bb05d52360;p=gcc.git sh.md (insv): Use copy_addr_to_reg. * sh.md (insv): Use copy_addr_to_reg. * final.c (insn_lengths_max_uid) New variable. (init_insn_lengths, shorten_branches): Set it. (get_attr_lengths): Test insn uid against insn_lengths_max_uid. From-SVN: r26676 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90bbe68247d..d7ad46e154b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Tue Apr 27 20:19:47 1999 J"orn Rennecke + + * sh.md (insv): Use copy_addr_to_reg. + + * final.c (insn_lengths_max_uid) New variable. + (init_insn_lengths, shorten_branches): Set it. + (get_attr_lengths): Test insn uid against insn_lengths_max_uid. + 1999-04-27 08:32 -0400 Zack Weinberg * expr.c (emit_move_insn_1): Abort if MODE argument is invalid. diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index f5bd532f167..04992a18773 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -4414,10 +4414,9 @@ size /= 8; orig_address = XEXP (operands[0], 0); - addr_target = gen_reg_rtx (SImode); shift_reg = gen_reg_rtx (SImode); emit_insn (gen_movsi (shift_reg, operands[3])); - emit_insn (gen_addsi3 (addr_target, orig_address, GEN_INT (size - 1))); + addr_target = copy_addr_to_reg (plus_constant (orig_address, size - 1)); operands[0] = change_address (operands[0], QImode, addr_target); emit_insn (gen_movqi (operands[0], gen_rtx (SUBREG, QImode, shift_reg, 0))); diff --git a/gcc/final.c b/gcc/final.c index bacc0932249..4695590dc5e 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -627,6 +627,9 @@ dbr_sequence_length () static short *insn_lengths; int *insn_addresses; +/* Max uid for which the above arrays are valid. */ +static int insn_lengths_max_uid; + /* Address of insn being processed. Used by `insn_current_length'. */ int insn_current_address; @@ -673,6 +676,7 @@ init_insn_lengths () { free (insn_lengths); insn_lengths = 0; + insn_lengths_max_uid = 0; } if (insn_addresses) { @@ -698,7 +702,7 @@ get_attr_length (insn) int i; int length = 0; - if (insn_lengths) + if (insn_lengths_max_uid > INSN_UID (insn)) return insn_lengths[INSN_UID (insn)]; else switch (GET_CODE (insn)) @@ -1128,6 +1132,7 @@ shorten_branches (first) /* Allocate the rest of the arrays. */ insn_lengths = (short *) xmalloc (max_uid * sizeof (short)); insn_addresses = (int *) xmalloc (max_uid * sizeof (int)); + insn_lengths_max_uid = max_uid; /* Syntax errors can lead to labels being outside of the main insn stream. Initialize insn_addresses, so that we get reproducible results. */ bzero ((char *)insn_addresses, max_uid * sizeof *insn_addresses);