gimple va_arg for fr30

Richard Henderson rth@redhat.com
Fri Jul 9 00:20:00 GMT 2004


Tested as with c4x.


r~


        * config/fr30/fr30-protos.h (fr30_va_arg): Remove.
        * config/fr30/fr30.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New.
        (fr30_gimplify_va_arg_expr): New.
        (fr30_pass_by_reference, fr30_pass_by_value, fr30_va_arg): Remove.
        * config/fr30/fr30.h (EXPAND_BUILTIN_VA_ARG): Remove.

Index: config/fr30/fr30-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/fr30/fr30-protos.h,v
retrieving revision 1.9
diff -c -p -d -r1.9 fr30-protos.h
*** config/fr30/fr30-protos.h	15 Mar 2004 18:20:47 -0000	1.9
--- config/fr30/fr30-protos.h	8 Jul 2004 22:35:59 -0000
*************** extern void  fr30_print_operand (FILE *,
*** 28,34 ****
  extern void  fr30_print_operand_address (FILE *, rtx);
  extern rtx   fr30_move_double (rtx *);
  #ifdef TREE_CODE
- extern rtx   fr30_va_arg (tree, tree);
  extern int   fr30_num_arg_regs (enum machine_mode, tree);
  extern int   fr30_function_arg_partial_nregs (CUMULATIVE_ARGS,
  					      enum machine_mode, tree, int);
--- 28,33 ----
Index: config/fr30/fr30.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/fr30/fr30.c,v
retrieving revision 1.41
diff -c -p -d -r1.41 fr30.c
*** config/fr30/fr30.c	7 Jul 2004 09:27:55 -0000	1.41
--- config/fr30/fr30.c	8 Jul 2004 22:35:59 -0000
*************** static struct fr30_frame_info 	zero_fram
*** 123,130 ****
  
  static void fr30_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
  					 tree, int *, int);
! static rtx fr30_pass_by_reference (tree, tree);
! static rtx fr30_pass_by_value (tree, tree);
  
  #define FRAME_POINTER_MASK 	(1 << (FRAME_POINTER_REGNUM))
  #define RETURN_POINTER_MASK 	(1 << (RETURN_POINTER_REGNUM))
--- 123,129 ----
  
  static void fr30_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
  					 tree, int *, int);
! static tree fr30_gimplify_va_arg_expr (tree, tree, tree *, tree *);
  
  #define FRAME_POINTER_MASK 	(1 << (FRAME_POINTER_REGNUM))
  #define RETURN_POINTER_MASK 	(1 << (RETURN_POINTER_REGNUM))
*************** static rtx fr30_pass_by_value (tree, tre
*** 156,161 ****
--- 155,162 ----
  
  #undef  TARGET_SETUP_INCOMING_VARARGS
  #define TARGET_SETUP_INCOMING_VARARGS fr30_setup_incoming_varargs
+ #undef  TARGET_GIMPLIFY_VA_ARG_EXPR
+ #define TARGET_GIMPLIFY_VA_ARG_EXPR fr30_gimplify_va_arg_expr
  
  struct gcc_target targetm = TARGET_INITIALIZER;
  
*************** fr30_function_arg_partial_nregs (CUMULAT
*** 712,785 ****
    return FR30_NUM_ARG_REGS - cum;
  }
  
- static rtx
- fr30_pass_by_reference (tree valist, tree type)
- {
-   tree type_ptr;
-   tree type_ptr_ptr;
-   tree t;
-   
-   type_ptr     = build_pointer_type (type);
-   type_ptr_ptr = build_pointer_type (type_ptr);
-   
-   t = build (POSTINCREMENT_EXPR, va_list_type_node, valist, build_int_2 (UNITS_PER_WORD, 0));
-   TREE_SIDE_EFFECTS (t) = 1;
-   t = build1 (NOP_EXPR, type_ptr_ptr, t);
-   TREE_SIDE_EFFECTS (t) = 1;
-   t = build1 (INDIRECT_REF, type_ptr, t);
-   
-   return expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL);
- }
- 
- static rtx
- fr30_pass_by_value (tree valist, tree type)
- {
-   HOST_WIDE_INT size = int_size_in_bytes (type);
-   HOST_WIDE_INT rsize;
-   rtx addr_rtx;
-   tree t;
- 
-   if ((size % UNITS_PER_WORD) == 0)
-     {
-       t = build (POSTINCREMENT_EXPR, va_list_type_node, valist, build_int_2 (size, 0));
-       TREE_SIDE_EFFECTS (t) = 1;
-       
-       return expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL);
-     }
- 
-   rsize = (size + UNITS_PER_WORD - 1) & - UNITS_PER_WORD;
-       
-   /* Care for bigendian correction on the aligned address.  */
-   t = build (PLUS_EXPR, ptr_type_node, valist, build_int_2 (rsize - size, 0));
-   addr_rtx = expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL);
-   addr_rtx = copy_to_reg (addr_rtx);
-       
-   /* Increment AP.  */
-   t = build (PLUS_EXPR, va_list_type_node, valist, build_int_2 (rsize, 0));
-   t = build (MODIFY_EXPR, va_list_type_node, valist, t);
-   TREE_SIDE_EFFECTS (t) = 1;
-   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-   
-   return addr_rtx;
- }
- 
  /* Implement `va_arg'.  */
  
! rtx
! fr30_va_arg (tree valist, tree type)
  {
!   HOST_WIDE_INT size;
!   
!   if (AGGREGATE_TYPE_P (type))
!     return fr30_pass_by_reference (valist, type);
!   
!   size = int_size_in_bytes (type);
! 
!   if ((size % sizeof (int)) == 0
!       || size < 4)
!     return fr30_pass_by_value (valist, type);
! 
!   return fr30_pass_by_reference (valist, type);
  }
  
  /*}}}*/
--- 713,727 ----
    return FR30_NUM_ARG_REGS - cum;
  }
  
  /* Implement `va_arg'.  */
  
! static tree
! fr30_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
  {
!   if (FUNCTION_ARG_PASS_BY_REFERENCE (dummy, TYPE_MODE (type), type, dummy))
!     return ind_gimplify_va_arg_expr (valist, type, pre_p, post_p);
!   else
!     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
  }
  
  /*}}}*/
Index: config/fr30/fr30.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/fr30/fr30.h,v
retrieving revision 1.55
diff -c -p -d -r1.55 fr30.h
*** config/fr30/fr30.h	30 Apr 2004 16:27:23 -0000	1.55
--- config/fr30/fr30.h	8 Jul 2004 22:35:59 -0000
*************** enum reg_class
*** 648,657 ****
     takes a fixed number of arguments.  */
  #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
  
- /* Implement `va_arg'.  */
- #define EXPAND_BUILTIN_VA_ARG(valist, type) \
-   fr30_va_arg (valist, type)
- 
  /*}}}*/ 
  /*{{{  Function Arguments in Registers.  */ 
  
--- 648,653 ----



More information about the Gcc-patches mailing list