"Andreas Krebbel" <kreb...@linux.vnet.ibm.com> writes: > 2011-04-18 Andreas Krebbel <andreas.kreb...@de.ibm.com> > > * calls.c (emit_library_call_value_1): Invoke > promote_function_mode hook on libcall arguments. > * explow.c (promote_function_mode, promote_mode): Handle TYPE > argument being NULL. > * targhooks.c (default_promote_function_mode): Lisewise. > * config/s390/s390.c (s390_promote_function_mode): Likewise. > * config/sparc/sparc.c (sparc_promote_function_mode): Likewise. > > * doc/tm.texi: Document that TYPE argument might be NULL.
> > > Index: gcc/calls.c > =================================================================== > *** gcc/calls.c.orig > --- gcc/calls.c > *************** emit_library_call_value_1 (int retval, r > *** 3484,3489 **** > --- 3484,3490 ---- > { > rtx val = va_arg (p, rtx); > enum machine_mode mode = (enum machine_mode) va_arg (p, int); > + int unsigned_p = 0; > > /* We cannot convert the arg value to the mode the library wants here; > must do it earlier where we know the signedness of the arg. */ > *************** emit_library_call_value_1 (int retval, r > *** 3531,3539 **** > val = force_operand (XEXP (slot, 0), NULL_RTX); > } > > ! argvec[count].value = val; > argvec[count].mode = mode; > ! > argvec[count].reg = targetm.calls.function_arg (&args_so_far, mode, > NULL_TREE, true); > > --- 3532,3540 ---- > val = force_operand (XEXP (slot, 0), NULL_RTX); > } > > ! mode = promote_function_mode (NULL_TREE, mode, &unsigned_p, > NULL_TREE, 0); > argvec[count].mode = mode; > ! argvec[count].value = convert_modes (mode, GET_MODE (val), val, 0); > argvec[count].reg = targetm.calls.function_arg (&args_so_far, mode, > NULL_TREE, true); It seems to me that you should pass unsigned_p to convert_modes. > Index: gcc/doc/tm.texi.in > =================================================================== > *** gcc/doc/tm.texi.in.orig > --- gcc/doc/tm.texi.in > *************** which an incoming parameter is copied, o > *** 952,957 **** > --- 952,959 ---- > then the hook should return the same mode as @code{promote_mode}, though > the signedness may be different. > > + @var{type} can be omitted when promoting function arguments of libcalls. > + > The default is to not promote arguments and return values. You can > also define the hook to @code{default_promote_function_mode_always_promote} > if you would like to apply the same rules given by @code{PROMOTE_MODE}. I think it would be clearer if you s/omitted/NULL/. The patch is OK with those changes. Thanks. Ian