diff options
author | Jan Hubicka <jh@suse.cz> | 2002-04-23 14:29:43 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-04-23 12:29:43 +0000 |
commit | 7441103929d092d04f1b1b87062b4b49c9b5d7af (patch) | |
tree | f83589b318bbe45bd7a32929c3720d5ce25c9b96 /gcc | |
parent | 1a887f860a2905e95ab853fb1f8adef14515d74e (diff) | |
download | gcc-7441103929d092d04f1b1b87062b4b49c9b5d7af.zip gcc-7441103929d092d04f1b1b87062b4b49c9b5d7af.tar.gz gcc-7441103929d092d04f1b1b87062b4b49c9b5d7af.tar.bz2 |
i386.c (ix86_output_addr_diff_elt): Avoid x86_64 binutils bug workaround.
* i386.c (ix86_output_addr_diff_elt): Avoid x86_64 binutils bug
workaround.
(ix86_expand_int_movcc): Avoid x86_64 compilation chrash.
(ix86_expand_clrstr): Fix typo.
* loop.c (gen_load_of_final_value): New.
(loop_givs_rescan, strength_reduce, check_dbra_loop):
Use it.
From-SVN: r52664
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 12 | ||||
-rw-r--r-- | gcc/loop.c | 30 |
3 files changed, 42 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 571ba03..145cb20 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Tue Apr 23 14:24:25 CEST 2002 Jan Hubicka <jh@suse.cz> + + * i386.c (ix86_output_addr_diff_elt): Avoid x86_64 binutils bug + workaround. + (ix86_expand_int_movcc): Avoid x86_64 compilation chrash. + (ix86_expand_clrstr): Fix typo. + * loop.c (gen_load_of_final_value): New. + (loop_givs_rescan, strength_reduce, check_dbra_loop): + Use it. + 2002-04-23 Roger Sayle <roger@eyesopen.com> * builtins.c (builtin_memset_gen_str): New function. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index f134a21..091a49c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6686,7 +6686,7 @@ ix86_output_addr_diff_elt (file, value, rel) int value, rel; { if (TARGET_64BIT) - fprintf (file, "%s%s%d-.+(.-%s%d)\n", + fprintf (file, "%s%s%d-%s%d\n", ASM_LONG, LPREFIX, value, LPREFIX, rel); else if (HAVE_AS_GOTOFF_IN_DATA) fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value); @@ -7983,6 +7983,10 @@ ix86_expand_int_movcc (operands) && GET_CODE (ix86_compare_op1) == CONST_INT && mode != HImode && (unsigned int) INTVAL (ix86_compare_op1) != 0xffffffff + /* The operand still must be representable as sign extended value. */ + && (!TARGET_64BIT + || GET_MODE (ix86_compare_op0) != DImode + || (unsigned int) INTVAL (ix86_compare_op1) != 0x7fffffff) && GET_CODE (operands[2]) == CONST_INT && GET_CODE (operands[3]) == CONST_INT) { @@ -9528,7 +9532,7 @@ ix86_expand_clrstr (src, count_exp, align_exp) gen_rtx_SUBREG (SImode, zeroreg, 0))); if (TARGET_64BIT && (align <= 4 || count == 0)) { - rtx label = ix86_expand_aligntest (destreg, 2); + rtx label = ix86_expand_aligntest (countreg, 2); emit_insn (gen_strsetsi (destreg, gen_rtx_SUBREG (SImode, zeroreg, 0))); emit_label (label); @@ -9539,7 +9543,7 @@ ix86_expand_clrstr (src, count_exp, align_exp) gen_rtx_SUBREG (HImode, zeroreg, 0))); if (align <= 2 || count == 0) { - rtx label = ix86_expand_aligntest (destreg, 2); + rtx label = ix86_expand_aligntest (countreg, 2); emit_insn (gen_strsethi (destreg, gen_rtx_SUBREG (HImode, zeroreg, 0))); emit_label (label); @@ -9550,7 +9554,7 @@ ix86_expand_clrstr (src, count_exp, align_exp) gen_rtx_SUBREG (QImode, zeroreg, 0))); if (align <= 1 || count == 0) { - rtx label = ix86_expand_aligntest (destreg, 1); + rtx label = ix86_expand_aligntest (countreg, 1); emit_insn (gen_strsetqi (destreg, gen_rtx_SUBREG (QImode, zeroreg, 0))); emit_label (label); @@ -354,6 +354,7 @@ static rtx loop_insn_sink_or_swim PARAMS((const struct loop *, rtx)); static void loop_dump_aux PARAMS ((const struct loop *, FILE *, int)); static void loop_delete_insns PARAMS ((rtx, rtx)); static HOST_WIDE_INT remove_constant_addition PARAMS ((rtx *)); +static rtx gen_load_of_final_value PARAMS ((rtx, rtx)); void debug_ivs PARAMS ((const struct loop *)); void debug_iv_class PARAMS ((const struct iv_class *)); void debug_biv PARAMS ((const struct induction *)); @@ -4798,7 +4799,8 @@ loop_givs_rescan (loop, bl, reg_map) v->mult_val, v->add_val, v->dest_reg); else if (v->final_value) loop_insn_sink_or_swim (loop, - gen_move_insn (v->dest_reg, v->final_value)); + gen_load_of_final_value (v->dest_reg, + v->final_value)); if (loop_dump_stream) { @@ -5155,8 +5157,9 @@ strength_reduce (loop, flags) value, so we don't need another one. We can't calculate the proper final value for such a biv here anyways. */ if (bl->final_value && ! bl->reversed) - loop_insn_sink_or_swim (loop, gen_move_insn - (bl->biv->dest_reg, bl->final_value)); + loop_insn_sink_or_swim (loop, + gen_load_of_final_value (bl->biv->dest_reg, + bl->final_value)); if (loop_dump_stream) fprintf (loop_dump_stream, "Reg %d: biv eliminated\n", @@ -5165,8 +5168,8 @@ strength_reduce (loop, flags) /* See above note wrt final_value. But since we couldn't eliminate the biv, we must set the value after the loop instead of before. */ else if (bl->final_value && ! bl->reversed) - loop_insn_sink (loop, gen_move_insn (bl->biv->dest_reg, - bl->final_value)); + loop_insn_sink (loop, gen_load_of_final_value (bl->biv->dest_reg, + bl->final_value)); } /* Go through all the instructions in the loop, making all the @@ -8361,7 +8364,7 @@ check_dbra_loop (loop, insn_count) if ((REGNO_LAST_UID (bl->regno) != INSN_UID (first_compare)) || ! bl->init_insn || REGNO_FIRST_UID (bl->regno) != INSN_UID (bl->init_insn)) - loop_insn_sink (loop, gen_move_insn (reg, final_value)); + loop_insn_sink (loop, gen_load_of_final_value (reg, final_value)); /* Delete compare/branch at end of loop. */ delete_related_insns (PREV_INSN (loop_end)); @@ -10352,6 +10355,21 @@ loop_insn_sink (loop, pattern) return loop_insn_emit_before (loop, 0, loop->sink, pattern); } +/* bl->final_value can be eighter general_operand or PLUS of general_operand + and constant. Emit sequence of intructions to load it into REG */ +static rtx +gen_load_of_final_value (reg, final_value) + rtx reg, final_value; +{ + rtx seq; + start_sequence (); + final_value = force_operand (final_value, reg); + if (final_value != reg) + emit_move_insn (reg, final_value); + seq = gen_sequence (); + end_sequence (); + return seq; +} /* If the loop has multiple exits, emit insn for PATTERN before the loop to ensure that it will always be executed no matter how the |