From: iains Date: Fri, 10 Dec 2010 10:13:36 +0000 (+0000) Subject: gcc: X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc8788d51783c21bb740f5a6dc13d5c5bd13bb9b;p=thirdparty%2Fgcc.git gcc: * config/rs6000/rs6000.c (rs6000_darwin64_record_arg_advance_recurse): Name register increment explicitly. (rs6000_darwin64_record_arg_recurse): Make sure we split long doubles when we run out of regs. Also flag that this requires stack and therefore cannot be returned by value. (rs6000_darwin64_record_arg): Update comment. (rs6000_function_value): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167682 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66ece2c3f5e1..6828fcdcd0ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-12-10 Iain Sandoe + + * config/rs6000/rs6000.c + (rs6000_darwin64_record_arg_advance_recurse): Name register increment + explicitly. (rs6000_darwin64_record_arg_recurse): Make sure we split + long doubles when we run out of regs. Also flag that this requires + stack and therefore cannot be returned by value. + (rs6000_darwin64_record_arg): Update comment. + (rs6000_function_value): Likewise. + 2010-12-10 Nicola Pero * c-parser.c (c_parser_objc_class_definition): Recognize diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index df7a428b7be7..bc27f73b8f43 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -8150,8 +8150,9 @@ rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum, rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos); else if (USE_FP_FOR_ARG_P (cum, mode, ftype)) { + unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3; rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0); - cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3; + cum->fregno += n_fpregs; /* Single-precision floats present a special problem for us, because they are smaller than an 8-byte GPR, and so the structure-packing rules combined with the standard @@ -8186,7 +8187,7 @@ rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum, } } else - cum->words += (GET_MODE_SIZE (mode) + 7) >> 3; + cum->words += n_fpregs; } else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1)) { @@ -8612,6 +8613,7 @@ rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type, rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k); else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype)) { + unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3; #if 0 switch (mode) { @@ -8622,6 +8624,14 @@ rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type, } #endif rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k); + if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1) + { + gcc_assert (cum->fregno == FP_ARG_MAX_REG + && (mode == TFmode || mode == TDmode)); + /* Long double or _Decimal128 split over regs and memory. */ + mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode; + cum->use_stack=1; + } rvec[(*k)++] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, cum->fregno++), @@ -8679,7 +8689,7 @@ rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type, for the chunks of memory that go in int regs. Note we start at element 1; 0 is reserved for an indication of using memory, and may or may not be filled in below. */ - rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k); + rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k); rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k); /* If any part of the struct went on the stack put all of it there. @@ -8807,7 +8817,7 @@ rs6000_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type)) { - rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false); + rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false); if (rslt != NULL_RTX) return rslt; /* Else fall through to usual handling. */ @@ -26902,7 +26912,7 @@ rs6000_function_value (const_tree valtype, valcum.vregno = ALTIVEC_ARG_MIN_REG; /* Do a trial code generation as if this were going to be passed as an argument; if any part goes in memory, we return NULL. */ - valret = rs6000_darwin64_record_arg (&valcum, valtype, true, true); + valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true); if (valret) return valret; /* Otherwise fall through to standard ABI rules. */