rs6000.c (init_cumulative_args): Add and handle LIBCALL argument.

2003-06-18  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>

	* config/rs6000/rs6000.c (init_cumulative_args): Add and handle LIBCALL
	argument.
	(function_arg): Handle CALL_LIBCALL flag.
	* config/rs6000/rs6000-protos.h (init_cumulative_args): Update
	prototype.
	* config/rs6000/rs6000.h (CALL_LIBCALL): New macro.
	(INIT_CUMULATIVE_LIBCALL_ARGS): New macro.
	(INIT_CUMULATIVE_ARGS): Add LIBCALL argument.
	(INIT_CUMULATIVE_INCOMING_ARGS): Likewise.

From-SVN: r68139
This commit is contained in:
Franz Sirl 2003-06-18 06:19:01 +00:00 committed by Franz Sirl
parent 903caebf49
commit b9599e4675
4 changed files with 27 additions and 7 deletions

View File

@ -1,3 +1,15 @@
2003-06-18 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
* config/rs6000/rs6000.c (init_cumulative_args): Add and handle LIBCALL
argument.
(function_arg): Handle CALL_LIBCALL flag.
* config/rs6000/rs6000-protos.h (init_cumulative_args): Update
prototype.
* config/rs6000/rs6000.h (CALL_LIBCALL): New macro.
(INIT_CUMULATIVE_LIBCALL_ARGS): New macro.
(INIT_CUMULATIVE_ARGS): Add LIBCALL argument.
(INIT_CUMULATIVE_INCOMING_ARGS): Likewise.
2003-06-18 Neil Booth <neil@daikokuya.co.uk>
* Makefile.in: Update.

View File

@ -27,7 +27,7 @@
#ifdef RTX_CODE
#ifdef TREE_CODE
extern void init_cumulative_args PARAMS ((CUMULATIVE_ARGS *, tree, rtx, int));
extern void init_cumulative_args PARAMS ((CUMULATIVE_ARGS *, tree, rtx, int, int));
extern void rs6000_va_start PARAMS ((tree, rtx));
#endif /* TREE_CODE */

View File

@ -3639,11 +3639,12 @@ rs6000_emit_move (dest, source, mode)
so we never return a PARALLEL. */
void
init_cumulative_args (cum, fntype, libname, incoming)
init_cumulative_args (cum, fntype, libname, incoming, libcall)
CUMULATIVE_ARGS *cum;
tree fntype;
rtx libname ATTRIBUTE_UNUSED;
int incoming;
int libcall;
{
static CUMULATIVE_ARGS zero_cumulative;
@ -3652,7 +3653,7 @@ init_cumulative_args (cum, fntype, libname, incoming)
cum->fregno = FP_ARG_MIN_REG;
cum->vregno = ALTIVEC_ARG_MIN_REG;
cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
cum->call_cookie = CALL_NORMAL;
cum->call_cookie = libcall ? CALL_LIBCALL : CALL_NORMAL;
cum->sysv_gregno = GP_ARG_MIN_REG;
cum->stdarg = fntype
&& (TYPE_ARG_TYPES (fntype) != 0
@ -3901,7 +3902,7 @@ rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type
If this is floating-point and no prototype is specified, we use
both an FP and integer register (or possibly FP reg and stack). Library
functions (when TYPE is zero) always have the proper types for args,
functions (when CALL_LIBCALL is set) always have the proper types for args,
so we can pass the FP value just in one register. emit_library_function
doesn't support PARALLEL anyway. */
@ -3922,7 +3923,8 @@ function_arg (cum, mode, type, named)
{
if (abi == ABI_V4
&& cum->nargs_prototype < 0
&& type && (cum->prototype || TARGET_NO_PROTOTYPE))
&& (cum->call_cookie & CALL_LIBCALL) == 0
&& (cum->prototype || TARGET_NO_PROTOTYPE))
{
/* For the SPE, we need to crxor CR6 always. */
if (TARGET_SPE_ABI)

View File

@ -1665,6 +1665,7 @@ typedef struct rs6000_stack {
#define CALL_V4_CLEAR_FP_ARGS 0x00000002 /* V.4, no FP args passed */
#define CALL_V4_SET_FP_ARGS 0x00000004 /* V.4, FP args were passed */
#define CALL_LONG 0x00000008 /* always call indirect */
#define CALL_LIBCALL 0x00000010 /* libcall */
/* 1 if N is a possible register number for a function value
as seen by the caller.
@ -1743,13 +1744,18 @@ typedef struct rs6000_args
For a library call, FNTYPE is 0. */
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \
init_cumulative_args (&CUM, FNTYPE, LIBNAME, FALSE)
init_cumulative_args (&CUM, FNTYPE, LIBNAME, FALSE, FALSE)
/* Similar, but when scanning the definition of a procedure. We always
set NARGS_PROTOTYPE large so we never return an EXPR_LIST. */
#define INIT_CUMULATIVE_INCOMING_ARGS(CUM,FNTYPE,LIBNAME) \
init_cumulative_args (&CUM, FNTYPE, LIBNAME, TRUE)
init_cumulative_args (&CUM, FNTYPE, LIBNAME, TRUE, FALSE)
/* Like INIT_CUMULATIVE_ARGS' but only used for outgoing libcalls. */
#define INIT_CUMULATIVE_LIBCALL_ARGS(CUM, MODE, LIBNAME) \
init_cumulative_args (&CUM, NULL_TREE, LIBNAME, FALSE, TRUE)
/* Update the data in CUM to advance over an argument
of mode MODE and data type TYPE.