diff options
author | Alan Modra <amodra@bigpond.net.au> | 2005-04-21 15:36:01 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2005-04-21 15:36:01 +0000 |
commit | ac7e839c63bfb19d83e6c81aee68c4435c1915c2 (patch) | |
tree | 2dfc5e3a6714299a3a9c32fe836f4a5b8d767a57 /gcc | |
parent | 452ff12a5abd0007509eee1a5d98448841f35923 (diff) | |
download | gcc-ac7e839c63bfb19d83e6c81aee68c4435c1915c2.zip gcc-ac7e839c63bfb19d83e6c81aee68c4435c1915c2.tar.gz gcc-ac7e839c63bfb19d83e6c81aee68c4435c1915c2.tar.bz2 |
Fix for latent bug in splitting arguments exposed by rs6000_arg_partial_bytes rewrite.
Fix for latent bug in splitting arguments exposed by
rs6000_arg_partial_bytes rewrite.
Oked by Richard Henderson.
Co-Authored-By: Fariborz Jahanian <fjahanian@apple.com>
From-SVN: r98507
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 6 | ||||
-rw-r--r-- | gcc/expr.c | 5 |
3 files changed, 13 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ccf6e64..7ab26e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-04-21 Alan Modra <amodra@bigpond.net.au> + Fariborz Jahanian <fjahanian@apple.com> + + * config/rs6000/rs6000.c (rs6000_arg_partial_bytes): Fix size of + portion of argument passed in fpr. + *expr.c (emit_push_insn): Fix computation of 'offset' used to + decide on partial argument save on stack. + 2005-04-21 Kazu Hirata <kazu@cs.umass.edu> * config/sparc/predicates.md, config/sparc/sparc.md: Fix diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index d2d44c7..e3ef745 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4951,16 +4951,14 @@ rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode, && align_words >= GP_ARG_NUM_REG)))) { if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3) > FP_ARG_MAX_REG + 1) - ret = FP_ARG_MAX_REG + 1 - cum->fregno; + ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8; else if (cum->nargs_prototype >= 0) return 0; } if (align_words < GP_ARG_NUM_REG && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type)) - ret = GP_ARG_NUM_REG - align_words; - - ret *= (TARGET_32BIT ? 4 : 8); + ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8); if (ret != 0 && TARGET_DEBUG_ARG) fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret); @@ -3544,7 +3544,7 @@ emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size, int not_stack; /* # bytes of start of argument that we must make space for but need not store. */ - int offset = partial % (PARM_BOUNDARY / BITS_PER_WORD); + int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT); int args_offset = INTVAL (args_so_far); int skip; @@ -3562,8 +3562,9 @@ emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size, offset = 0; /* Now NOT_STACK gets the number of words that we don't need to - allocate on the stack. */ + allocate on the stack. Convert OFFSET to words too. */ not_stack = (partial - offset) / UNITS_PER_WORD; + offset /= UNITS_PER_WORD; /* If the partial register-part of the arg counts in its stack size, skip the part of stack space corresponding to the registers. |