* 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
+Tue Apr 27 20:19:47 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * 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 <zack@rabi.columbia.edu>
* expr.c (emit_move_insn_1): Abort if MODE argument is invalid.
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)));
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;
{
free (insn_lengths);
insn_lengths = 0;
+ insn_lengths_max_uid = 0;
}
if (insn_addresses)
{
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))
/* 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);