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