diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1992-04-03 10:33:45 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1992-04-03 10:33:45 +0000 |
commit | 83ad791a9a1e3c1861d496959d5cfbb2e3c05de7 (patch) | |
tree | 6f8e0d587e2cf1cd543cad5fe5378774b435752a /gcc/explow.c | |
parent | fdf0a5ad059b88c56a86b073ed9d65c54cb37a55 (diff) | |
download | gcc-83ad791a9a1e3c1861d496959d5cfbb2e3c05de7.tar.gz |
*** empty log message ***
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@673 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/explow.c')
-rw-r--r-- | gcc/explow.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/gcc/explow.c b/gcc/explow.c index 4a696446ef6..f33dba9898e 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -688,12 +688,15 @@ round_push (size) Any required stack pointer alignment is preserved. SIZE is an rtx representing the size of the area. - TARGET is a place in which the address can be placed. */ + TARGET is a place in which the address can be placed. + + KNOWN_ALIGN is the alignment (in bits) that we know SIZE has. */ rtx -allocate_dynamic_stack_space (size, target) +allocate_dynamic_stack_space (size, target, known_align) rtx size; rtx target; + int known_align; { /* Ensure the size is in the proper mode. */ if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode) @@ -761,11 +764,14 @@ allocate_dynamic_stack_space (size, target) way of knowing which systems have this problem. So we avoid even momentarily mis-aligning the stack. */ - size = round_push (size); + if (known_align % STACK_BOUNDARY != 0) + size = round_push (size); do_pending_stack_adjust (); - if (target == 0) + /* Don't use a TARGET that isn't a pseudo. */ + if (target == 0 || GET_CODE (target) != REG + || REGNO (target) < FIRST_PSEUDO_REGISTER) target = gen_reg_rtx (Pmode); #ifndef STACK_GROWS_DOWNWARD @@ -797,15 +803,18 @@ allocate_dynamic_stack_space (size, target) #endif #ifdef MUST_ALIGN - target = expand_divmod (0, CEIL_DIV_EXPR, Pmode, target, - gen_rtx (CONST_INT, VOIDmode, - BIGGEST_ALIGNMENT / BITS_PER_UNIT), - 0, 1); - - target = expand_mult (Pmode, target, - gen_rtx (CONST_INT, VOIDmode, - BIGGEST_ALIGNMENT / BITS_PER_UNIT), - 0, 1); + if (known_align % BIGGEST_ALIGNMENT != 0) + { + target = expand_divmod (0, CEIL_DIV_EXPR, Pmode, target, + gen_rtx (CONST_INT, VOIDmode, + BIGGEST_ALIGNMENT / BITS_PER_UNIT), + 0, 1); + + target = expand_mult (Pmode, target, + gen_rtx (CONST_INT, VOIDmode, + BIGGEST_ALIGNMENT / BITS_PER_UNIT), + 0, 1); + } #endif /* Some systems require a particular insn to refer to the stack |