expr.c (move_by_pieces): Honor the alignment of TO and FROM.
* expr.c (move_by_pieces): Honor the alignment of TO and FROM. (emit_push_insn): Don't use push when the source alignment is less than the stack's push rounding. From-SVN: r66770
This commit is contained in:
parent
fa6ef81367
commit
f26aca6db2
@ -1,3 +1,9 @@
|
||||
2003-05-12 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* expr.c (move_by_pieces): Honor the alignment of TO and FROM.
|
||||
(emit_push_insn): Don't use push when the source alignment is less
|
||||
than the stack's push rounding.
|
||||
|
||||
2003-05-13 Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* diagnostic.c (output_format): Add support for %m.
|
||||
|
@ -1463,7 +1463,7 @@ convert_modes (mode, oldmode, x, unsignedp)
|
||||
If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
|
||||
used to push FROM to the stack.
|
||||
|
||||
ALIGN is maximum alignment we can assume. */
|
||||
ALIGN is maximum stack alignment we can assume. */
|
||||
|
||||
void
|
||||
move_by_pieces (to, from, len, align)
|
||||
@ -1477,6 +1477,8 @@ move_by_pieces (to, from, len, align)
|
||||
enum machine_mode mode = VOIDmode, tmode;
|
||||
enum insn_code icode;
|
||||
|
||||
align = MIN (to ? MEM_ALIGN (to) : align, MEM_ALIGN (from));
|
||||
|
||||
data.offset = 0;
|
||||
data.from_addr = from_addr;
|
||||
if (to)
|
||||
@ -3849,6 +3851,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
|
||||
&& PUSH_ARGS
|
||||
&& GET_CODE (size) == CONST_INT
|
||||
&& skip == 0
|
||||
&& MEM_ALIGN (xinner) >= align
|
||||
&& (MOVE_BY_PIECES_P ((unsigned) INTVAL (size) - used, align))
|
||||
/* Here we avoid the case of a structure whose weak alignment
|
||||
forces many pushes of a small amount of data,
|
||||
|
Loading…
Reference in New Issue
Block a user