This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch: promoting complex modes (plus splitting complex args)


Here's the background for the problem:

       In the AIX-64 abi, complex floats (SCmode) must be promoted to
       two 64-bit quantities and passed in f1/f2.  Currently, GCC
       incorrectly packs the real and imaginary parts of an SCmode
       into a single 64-bit FPR.

Richard came up with the brilliant idea of just adding code to
PROMOTE_MODE to promote SCmode to DCmode, thus doing the trick.  And
as usually happens, a one-liner turned into 500 lines of "oh crap, GCC
should've handled that...mmm, let's add support".

Now before anybody balks, the previous in-house solution to this
problem was 1500 lines (a macro for splitting complex units, and
appropriate hackery in function.c and calls.c).  But worry not, half
of this patch is PPC specific, and the other half is straightforward
code to handle CONCATs where we didn't, and convert a few modes here
and there when we synthesize complex operations (think optabs.c and
expand_expr).

Without further ado... Preliminary tests on AIX 3.4 with -maix64.
Bootstrap and regtesting currently under way on x86 linux, ppc linux,
and aix 3.4.  Yes, my machines are pathetically slow.

OK pending tests?

Aldy

2003-01-21  Aldy Hernandez  <aldyh@redhat.com>

	* optabs.c (expand_binop): Handle promoted complex modes.

	* rtl.h: Add prototypes for gen_convert_realpart and
	gen_convert_imagpart.

	* emit-rtl.c (gen_convert_realpart): New.
	(gen_convert_imagpart): New.

	* expr.c (convert_move): Handle COMPLEX conversion.
	(expand_assignment): When expanding a rhs function call, instead
	of aborting later on, convert the move.
	(expand_expr): Fix up mode incompatabilities when expanding
	REALPART_EXPR and IMAGPART_EXPR.

	* rtlanal.c (reg_overlap_mentioned_p): Add case for CONCAT.

	* explow.c (promote_mode): Handle COMPLEX_TYPE.

	* config/rs6000/rs6000.h (PROMOTE_MODE): Promote SCmode to DCmode
	for AIX 64.
	(USE_FP_FOR_ARG_P): Complex floats can go in FPRs for AIX 64.
	(FUNCTION_VALUE): Call function.
	(MODES_TIEABLE_P): Add MODE_COMPLEX_FLOAT.

	* config/rs6000/rs6000.c (function_arg_advance): Advance FPRs for
	complex floats on aix64.
	(function_value): New.

	* config/rs6000/rs6000-protos.h: Add prototype for function_value.

Index: optabs.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/optabs.c,v
retrieving revision 1.154
diff -c -p -r1.154 optabs.c
*** optabs.c	16 Dec 2002 18:19:44 -0000	1.154
--- optabs.c	21 Jan 2003 19:10:16 -0000
*************** expand_binop (mode, binoptab, op0, op1, 
*** 1543,1563 ****
  
        start_sequence ();
  
!       realr = gen_realpart (submode, target);
!       imagr = gen_imagpart (submode, target);
  
        if (GET_MODE (op0) == mode)
  	{
! 	  real0 = gen_realpart (submode, op0);
! 	  imag0 = gen_imagpart (submode, op0);
  	}
        else
  	real0 = op0;
  
        if (GET_MODE (op1) == mode)
  	{
! 	  real1 = gen_realpart (submode, op1);
! 	  imag1 = gen_imagpart (submode, op1);
  	}
        else
  	real1 = op1;
--- 1543,1575 ----
  
        start_sequence ();
  
!       /* Promotion might have taken place.  */
!       if (GET_MODE (op0) == GET_MODE (op1) && mode != GET_MODE (op0))
! 	{
! 	  op0 = convert_modes (mode, GET_MODE (op0), op0, unsignedp);
! 	  op1 = convert_modes (mode, GET_MODE (op1), op1, unsignedp);
! 	}
! 
!       realr = gen_convert_realpart (submode, target, unsignedp);
!       imagr = gen_convert_imagpart (submode, target, unsignedp);
! 
!       /* Promotion at play.  */
!       if (GET_CODE (target) == CONCAT
! 	  && GET_MODE_INNER (GET_MODE (target)) != submode)
! 	target = gen_rtx_CONCAT (SCmode, realr, imagr);
  
        if (GET_MODE (op0) == mode)
  	{
! 	  real0 = gen_convert_realpart (submode, op0, unsignedp);
! 	  imag0 = gen_convert_imagpart (submode, op0, unsignedp);
  	}
        else
  	real0 = op0;
  
        if (GET_MODE (op1) == mode)
  	{
! 	  real1 = gen_convert_realpart (submode, op1, unsignedp);
! 	  imag1 = gen_convert_imagpart (submode, op1, unsignedp);
  	}
        else
  	real1 = op1;
Index: rtl.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtl.h,v
retrieving revision 1.378
diff -c -p -r1.378 rtl.h
*** rtl.h	26 Dec 2002 18:15:56 -0000	1.378
--- rtl.h	21 Jan 2003 19:10:18 -0000
*************** extern rtx gen_highpart			PARAMS ((enum 
*** 1394,1400 ****
--- 1394,1404 ----
  extern rtx gen_highpart_mode		PARAMS ((enum machine_mode,
  						 enum machine_mode, rtx));
  extern rtx gen_realpart			PARAMS ((enum machine_mode, rtx));
+ extern rtx gen_convert_realpart		PARAMS ((enum machine_mode, rtx,
+ 						 int));
  extern rtx gen_imagpart			PARAMS ((enum machine_mode, rtx));
+ extern rtx gen_convert_imagpart		PARAMS ((enum machine_mode, rtx,
+ 						 int));
  extern rtx operand_subword		PARAMS ((rtx, unsigned int, int,
  						 enum machine_mode));
  extern rtx constant_subword		PARAMS ((rtx, int,
Index: emit-rtl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/emit-rtl.c,v
retrieving revision 1.305
diff -c -p -r1.305 emit-rtl.c
*** emit-rtl.c	10 Jan 2003 02:22:00 -0000	1.305
--- emit-rtl.c	21 Jan 2003 19:10:21 -0000
*************** gen_imagpart (mode, x)
*** 1177,1182 ****
--- 1177,1216 ----
      return gen_highpart (mode, x);
  }
  
+ /* Like gen_realpart, but handle mode inconsistencies.  */
+ rtx
+ gen_convert_realpart (mode, x, unsignedp)
+      enum machine_mode mode;
+      rtx x;
+      int unsignedp;
+ {
+   /* If this was a promoted mode, we may have the wrong mode.  */
+   if (GET_MODE_INNER (GET_MODE (x)) != mode)
+     {
+       x = gen_realpart (GET_MODE_INNER (GET_MODE (x)), x);
+       return convert_modes (mode, GET_MODE (x), x, unsignedp);      
+     }
+ 
+   return gen_realpart (mode, x);
+ }
+ 
+ /* Like gen_imagpart, but handle mode inconsistencies.  */
+ rtx
+ gen_convert_imagpart (mode, x, unsignedp)
+      enum machine_mode mode;
+      rtx x;
+      int unsignedp;
+ {
+   /* If this was a promoted mode, we may have the wrong mode.  */
+   if (GET_MODE_INNER (GET_MODE (x)) != mode)
+     {
+       x = gen_imagpart (GET_MODE_INNER (GET_MODE (x)), x);
+       return convert_modes (mode, GET_MODE (x), x, unsignedp);      
+     }
+ 
+   return gen_imagpart (mode, x);
+ }
+ 
  /* Return 1 iff X, assumed to be a SUBREG,
     refers to the real part of the complex value in its containing reg.
     Complex values are always stored with the real part in the first word,
Index: expr.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/expr.c,v
retrieving revision 1.500
diff -c -p -r1.500 expr.c
*** expr.c	23 Dec 2002 15:26:13 -0000	1.500
--- expr.c	21 Jan 2003 19:10:29 -0000
*************** convert_move (to, from, unsignedp)
*** 606,611 ****
--- 606,629 ----
        return;
      }
  
+   if (COMPLEX_MODE_P (to_mode) && COMPLEX_MODE_P (from_mode))
+     {
+       rtx f1, f2, t1, t2;
+ 
+       f1 = simplify_gen_subreg (GET_MODE_INNER (from_mode), from, from_mode,
+ 				0);
+       f2 = simplify_gen_subreg (GET_MODE_INNER (from_mode), from, from_mode,
+ 				GET_MODE_UNIT_SIZE (from_mode));
+ 
+       t1 = simplify_gen_subreg (GET_MODE_INNER (to_mode), to, to_mode, 0);
+       t2 = simplify_gen_subreg (GET_MODE_INNER (to_mode), to, to_mode,
+ 				GET_MODE_UNIT_SIZE (to_mode));
+ 
+       convert_move (t1, f1, unsignedp);
+       convert_move (t2, f2, unsignedp);
+       return;
+     }
+ 
    if (to_real != from_real)
      abort ();
  
*************** expand_assignment (to, from, want_value,
*** 4173,4179 ****
  	      && GET_MODE (to_rtx) != GET_MODE (value))
  	    value = convert_memory_address (GET_MODE (to_rtx), value);
  #endif
! 	  emit_move_insn (to_rtx, value);
  	}
        preserve_temp_slots (to_rtx);
        free_temp_slots ();
--- 4191,4202 ----
  	      && GET_MODE (to_rtx) != GET_MODE (value))
  	    value = convert_memory_address (GET_MODE (to_rtx), value);
  #endif
! 	  /* A promoted complex may have the wrong mode.  Convert it's
! 	     mode rather than aborting in emit_move_insn.  */
! 	  if (GET_MODE (to_rtx) != GET_MODE (value))
! 	    convert_move (to_rtx, value, TREE_UNSIGNED (TREE_TYPE (to)));
! 	  else
! 	    emit_move_insn (to_rtx, value);
  	}
        preserve_temp_slots (to_rtx);
        free_temp_slots ();
*************** expand_expr (exp, target, tmode, modifie
*** 9136,9152 ****
  
      case REALPART_EXPR:
        op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
!       return gen_realpart (mode, op0);
  
      case IMAGPART_EXPR:
        op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
!       return gen_imagpart (mode, op0);
  
      case CONJ_EXPR:
        {
  	enum machine_mode partmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
! 	rtx imag_t;
  	rtx insns;
  
  	op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
  
--- 9159,9181 ----
  
      case REALPART_EXPR:
        op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
! 
!       return gen_convert_realpart (mode, op0, TREE_UNSIGNED (TREE_TYPE (exp)));
  
      case IMAGPART_EXPR:
        op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
! 
!       return gen_convert_imagpart (mode, op0, TREE_UNSIGNED (TREE_TYPE (exp)));
  
      case CONJ_EXPR:
        {
  	enum machine_mode partmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
! 	rtx imag_t, imag_t2;
  	rtx insns;
+ 	rtx real_target, real_op0;
+ 	int unsignedp;
+ 
+ 	unsignedp = TREE_UNSIGNED (TREE_TYPE (exp));
  
  	op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
  
*************** expand_expr (exp, target, tmode, modifie
*** 9156,9170 ****
  	start_sequence ();
  
  	/* Store the realpart and the negated imagpart to target.  */
! 	emit_move_insn (gen_realpart (partmode, target),
! 			gen_realpart (partmode, op0));
  
  	imag_t = gen_imagpart (partmode, target);
  	temp = expand_unop (partmode,
  			    ! unsignedp && flag_trapv
  			    && (GET_MODE_CLASS(partmode) == MODE_INT)
  			    ? negv_optab : neg_optab,
! 			    gen_imagpart (partmode, op0), imag_t, 0);
  	if (temp != imag_t)
  	  emit_move_insn (imag_t, temp);
  
--- 9185,9202 ----
  	start_sequence ();
  
  	/* Store the realpart and the negated imagpart to target.  */
! 	real_target = gen_convert_realpart (partmode, target, unsignedp);
! 	real_op0 = gen_convert_realpart (partmode, op0, unsignedp);
! 	emit_move_insn (real_target, real_op0);
! 
! 	imag_t2 = gen_convert_imagpart (partmode, op0, unsignedp);
  
  	imag_t = gen_imagpart (partmode, target);
  	temp = expand_unop (partmode,
  			    ! unsignedp && flag_trapv
  			    && (GET_MODE_CLASS(partmode) == MODE_INT)
  			    ? negv_optab : neg_optab,
! 			    imag_t2, imag_t, 0);
  	if (temp != imag_t)
  	  emit_move_insn (imag_t, temp);
  
Index: rtlanal.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtlanal.c,v
retrieving revision 1.142
diff -c -p -r1.142 rtlanal.c
*** rtlanal.c	24 Dec 2002 08:30:30 -0000	1.142
--- rtlanal.c	21 Jan 2003 19:10:30 -0000
*************** reg_overlap_mentioned_p (x, in)
*** 1612,1617 ****
--- 1612,1621 ----
      case CC0:
        return reg_mentioned_p (x, in);
  
+     case CONCAT:
+       return (reg_overlap_mentioned_p (XEXP (x, 0), in)
+ 	      || reg_overlap_mentioned_p (XEXP (x, 1), in));
+ 
      case PARALLEL:
        {
  	int i;
Index: explow.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/explow.c,v
retrieving revision 1.105
diff -c -p -r1.105 explow.c
*** explow.c	16 Dec 2002 18:19:25 -0000	1.105
--- explow.c	21 Jan 2003 19:10:31 -0000
*************** promote_mode (type, mode, punsignedp, fo
*** 844,849 ****
--- 844,850 ----
  #ifdef PROMOTE_MODE
      case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE:
      case CHAR_TYPE:      case REAL_TYPE:       case OFFSET_TYPE:
+     case COMPLEX_TYPE:
        PROMOTE_MODE (mode, unsignedp, type);
        break;
  #endif
Index: config/rs6000/rs6000.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.h,v
retrieving revision 1.243
diff -c -p -r1.243 rs6000.h
*** config/rs6000/rs6000.h	7 Jan 2003 05:14:34 -0000	1.243
--- config/rs6000/rs6000.h	21 Jan 2003 19:10:34 -0000
*************** extern int rs6000_default_long_calls;
*** 497,505 ****
     extension may differ from that of the type.  */
  
  #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)	\
!   if (GET_MODE_CLASS (MODE) == MODE_INT		\
        && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
!     (MODE) = word_mode;
  
  /* Define this if function arguments should also be promoted using the above
     procedure.  */
--- 497,511 ----
     extension may differ from that of the type.  */
  
  #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)	\
!  {  if (GET_MODE_CLASS (MODE) == MODE_INT	\
        && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
!       (MODE) = word_mode;			\
!     else if ((MODE) == SCmode			\
!              && TARGET_64BIT			\
! 	     && TARGET_HARD_FLOAT		\
! 	     && DEFAULT_ABI == ABI_AIX)		\
! 	   (MODE) = DCmode;			\
!  }
  
  /* Define this if function arguments should also be promoted using the above
     procedure.  */
*************** extern int rs6000_default_long_calls;
*** 926,931 ****
--- 932,941 ----
     ? GET_MODE_CLASS (MODE2) == MODE_FLOAT	\
     : GET_MODE_CLASS (MODE2) == MODE_FLOAT	\
     ? GET_MODE_CLASS (MODE1) == MODE_FLOAT	\
+    : GET_MODE_CLASS (MODE1) == MODE_COMPLEX_FLOAT	\
+    ? GET_MODE_CLASS (MODE2) == MODE_COMPLEX_FLOAT	\
+    : GET_MODE_CLASS (MODE2) == MODE_COMPLEX_FLOAT	\
+    ? GET_MODE_CLASS (MODE1) == MODE_COMPLEX_FLOAT	\
     : GET_MODE_CLASS (MODE1) == MODE_CC		\
     ? GET_MODE_CLASS (MODE2) == MODE_CC		\
     : GET_MODE_CLASS (MODE2) == MODE_CC		\
*************** typedef struct rs6000_stack {
*** 1501,1526 ****
  /* Define how to find the value returned by a function.
     VALTYPE is the data type of the value (as a tree).
     If the precise function being called is known, FUNC is its FUNCTION_DECL;
!    otherwise, FUNC is 0.
  
!    On the SPE, both FPs and vectors are returned in r3.
! 
!    On RS/6000 an integer value is in r3 and a floating-point value is in
!    fp1, unless -msoft-float.  */
! 
! #define FUNCTION_VALUE(VALTYPE, FUNC)				\
!   gen_rtx_REG ((INTEGRAL_TYPE_P (VALTYPE)			\
! 		&& TYPE_PRECISION (VALTYPE) < BITS_PER_WORD)	\
! 	       || POINTER_TYPE_P (VALTYPE)			\
! 	       ? word_mode : TYPE_MODE (VALTYPE),		\
! 	       TREE_CODE (VALTYPE) == VECTOR_TYPE		\
! 	       && TARGET_ALTIVEC ? ALTIVEC_ARG_RETURN		\
! 	       : TREE_CODE (VALTYPE) == REAL_TYPE		\
! 	         && TARGET_SPE_ABI && !TARGET_FPRS		\
! 	       ? GP_ARG_RETURN					\
! 	       : TREE_CODE (VALTYPE) == REAL_TYPE		\
! 		 && TARGET_HARD_FLOAT && TARGET_FPRS	        \
!                ? FP_ARG_RETURN : GP_ARG_RETURN)
  
  /* Define how to find the value returned by a library function
     assuming the value has mode MODE.  */
--- 1511,1519 ----
  /* Define how to find the value returned by a function.
     VALTYPE is the data type of the value (as a tree).
     If the precise function being called is known, FUNC is its FUNCTION_DECL;
!    otherwise, FUNC is 0.  */
  
! #define FUNCTION_VALUE(VALTYPE, FUNC) function_value (VALTYPE, FUNC)
  
  /* Define how to find the value returned by a library function
     assuming the value has mode MODE.  */
*************** typedef struct rs6000_args
*** 1687,1695 ****
    function_arg_advance (&CUM, MODE, TYPE, NAMED)
  
  /* Nonzero if we can use a floating-point register to pass this arg.  */
! #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
!   (GET_MODE_CLASS (MODE) == MODE_FLOAT  \
!    && (CUM).fregno <= FP_ARG_MAX_REG    \
     && TARGET_HARD_FLOAT && TARGET_FPRS)
  
  /* Nonzero if we can use an AltiVec register to pass this arg.  */
--- 1680,1691 ----
    function_arg_advance (&CUM, MODE, TYPE, NAMED)
  
  /* Nonzero if we can use a floating-point register to pass this arg.  */
! #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)			\
!   ((GET_MODE_CLASS (MODE) == MODE_FLOAT			\
!     || (GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT	\
! 	&& TARGET_64BIT					\
! 	&& DEFAULT_ABI == ABI_AIX))			\
!    && (CUM).fregno <= FP_ARG_MAX_REG			\
     && TARGET_HARD_FLOAT && TARGET_FPRS)
  
  /* Nonzero if we can use an AltiVec register to pass this arg.  */
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.414
diff -c -p -r1.414 rs6000.c
*** config/rs6000/rs6000.c	15 Jan 2003 16:08:49 -0000	1.414
--- config/rs6000/rs6000.c	21 Jan 2003 19:10:41 -0000
*************** function_arg_advance (cum, mode, type, n
*** 3075,3080 ****
--- 3075,3084 ----
        if (GET_MODE_CLASS (mode) == MODE_FLOAT
  	  && TARGET_HARD_FLOAT && TARGET_FPRS)
  	cum->fregno += (mode == TFmode ? 2 : 1);
+       else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
+ 	       && DEFAULT_ABI == ABI_AIX && TARGET_64BIT
+ 	       && TARGET_HARD_FLOAT && TARGET_FPRS)
+ 	cum->fregno += 2;
  
        if (TARGET_DEBUG_ARG)
  	{
*************** rs6000_memory_move_cost (mode, class, in
*** 13270,13275 ****
--- 13274,13326 ----
      return 4 * HARD_REGNO_NREGS (FIRST_ALTIVEC_REGNO, mode);
    else
      return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
+ }
+ 
+ /* Define how to find the value returned by a function.
+    VALTYPE is the data type of the value (as a tree).
+    If the precise function being called is known, FUNC is its FUNCTION_DECL;
+    otherwise, FUNC is 0.
+ 
+    On the SPE, both FPs and vectors are returned in r3.
+ 
+    On RS/6000 an integer value is in r3 and a floating-point value is in
+    fp1, unless -msoft-float.  */
+ 
+ rtx
+ function_value (valtype, func)
+      tree valtype;
+      tree func ATTRIBUTE_UNUSED;
+ {
+   enum machine_mode mode;
+   int regno;
+ 
+   regno = GP_ARG_RETURN;
+ 
+   if ((INTEGRAL_TYPE_P (valtype)
+        && TYPE_PRECISION (valtype) < BITS_PER_WORD)
+       || POINTER_TYPE_P (valtype))
+     mode = word_mode;
+   else
+     mode = TYPE_MODE (valtype);
+ 
+   if (TARGET_ALTIVEC && TREE_CODE (valtype) == VECTOR_TYPE)
+     regno = ALTIVEC_ARG_RETURN;
+ 
+   if (TREE_CODE (valtype) == REAL_TYPE
+       && TARGET_SPE_ABI && !TARGET_FPRS)
+     regno = GP_ARG_RETURN;
+ 
+   if (TREE_CODE (valtype) == REAL_TYPE
+       && TARGET_HARD_FLOAT && TARGET_FPRS)
+     regno = FP_ARG_RETURN;
+ 
+   if (TARGET_64BIT && DEFAULT_ABI == ABI_AIX
+       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
+       && TARGET_HARD_FLOAT)
+     /* Promote all complex floats to DCmode.  */
+     return gen_rtx_REG (DCmode, FP_ARG_RETURN);
+ 
+   return gen_rtx_REG (mode, regno);
  }
  
  #include "gt-rs6000.h"
Index: config/rs6000/rs6000-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000-protos.h,v
retrieving revision 1.48
diff -c -p -r1.48 rs6000-protos.h
*** config/rs6000/rs6000-protos.h	16 Nov 2002 18:01:50 -0000	1.48
--- config/rs6000/rs6000-protos.h	21 Jan 2003 19:10:42 -0000
*************** extern int function_arg_partial_nregs PA
*** 147,152 ****
--- 147,153 ----
  extern int function_arg_pass_by_reference PARAMS ((CUMULATIVE_ARGS *,
  						   enum machine_mode,
  						   tree, int));
+ extern rtx function_value PARAMS ((tree, tree));
  extern void setup_incoming_varargs PARAMS ((CUMULATIVE_ARGS *,
  					    enum machine_mode, tree,
  					    int *, int));


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]