From ac7e839c63bfb19d83e6c81aee68c4435c1915c2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 21 Apr 2005 15:36:01 +0000 Subject: [PATCH] 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 From-SVN: r98507 --- gcc/ChangeLog | 8 ++++++++ gcc/config/rs6000/rs6000.c | 6 ++---- gcc/expr.c | 5 +++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ccf6e64d198..7ab26e5894a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-04-21 Alan Modra + Fariborz Jahanian + + * 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 * config/sparc/predicates.md, config/sparc/sparc.md: Fix diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index d2d44c7997b..e3ef7452e4c 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); diff --git a/gcc/expr.c b/gcc/expr.c index b334453efd5..02236af2c3d 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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. -- 2.30.2