OSDN Git Service

2003-06-18 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
authorsirl <sirl@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Jun 2003 06:19:01 +0000 (06:19 +0000)
committersirl <sirl@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Jun 2003 06:19:01 +0000 (06:19 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68139 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h

index 5c05442..aa29d39 100644 (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.
index 75f7d90..9c5df76 100644 (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 */
 
index c2133a8..bc8a5ca 100644 (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)
index f0c7ef9..8d63a4f 100644 (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.