Commit 5d47df87 by Richard Henderson Committed by Richard Henderson

stormy16-protos.h (xstormy16_expand_builtin_va_arg): Remove.

        * config/stormy16/stormy16-protos.h (xstormy16_expand_builtin_va_arg):
        Remove.
        * config/stormy16/stormy16.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New.
        (xstormy16_gimplify_va_arg_expr): Rewrite from
        xstormy16_expand_builtin_va_arg.
        * config/stormy16/stormy16.h (EXPAND_BUILTIN_VA_ARG): Remove.

From-SVN: r84358
parent f372c932
...@@ -6,6 +6,13 @@ ...@@ -6,6 +6,13 @@
2004-07-09 Richard Henderson <rth@redhat.com> 2004-07-09 Richard Henderson <rth@redhat.com>
* config/stormy16/stormy16-protos.h (xstormy16_expand_builtin_va_arg):
Remove.
* config/stormy16/stormy16.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New.
(xstormy16_gimplify_va_arg_expr): Rewrite from
xstormy16_expand_builtin_va_arg.
* config/stormy16/stormy16.h (EXPAND_BUILTIN_VA_ARG): Remove.
* config/sparc/sparc-protos.h (sparc_va_arg): Remove. * config/sparc/sparc-protos.h (sparc_va_arg): Remove.
* config/sparc/sparc.c (sparc_gimplify_va_arg): Mark static. * config/sparc/sparc.c (sparc_gimplify_va_arg): Mark static.
......
...@@ -39,7 +39,6 @@ extern rtx xstormy16_function_arg ...@@ -39,7 +39,6 @@ extern rtx xstormy16_function_arg
#if defined (TREE_CODE) && defined (RTX_CODE) #if defined (TREE_CODE) && defined (RTX_CODE)
extern void xstormy16_expand_builtin_va_start (tree, rtx); extern void xstormy16_expand_builtin_va_start (tree, rtx);
extern rtx xstormy16_expand_builtin_va_arg (tree, tree);
extern void xstormy16_initialize_trampoline (rtx, rtx, rtx); extern void xstormy16_initialize_trampoline (rtx, rtx, rtx);
extern rtx xstormy16_function_value (tree, tree); extern rtx xstormy16_function_value (tree, tree);
#endif #endif
......
...@@ -46,6 +46,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -46,6 +46,7 @@ Boston, MA 02111-1307, USA. */
#include "target-def.h" #include "target-def.h"
#include "tm_p.h" #include "tm_p.h"
#include "langhooks.h" #include "langhooks.h"
#include "tree-gimple.h"
static rtx emit_addhi3_postreload (rtx, rtx, rtx); static rtx emit_addhi3_postreload (rtx, rtx, rtx);
static void xstormy16_asm_out_constructor (rtx, int); static void xstormy16_asm_out_constructor (rtx, int);
...@@ -1306,18 +1307,17 @@ xstormy16_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) ...@@ -1306,18 +1307,17 @@ xstormy16_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
of type va_list as a tree, TYPE is the type passed to va_arg. of type va_list as a tree, TYPE is the type passed to va_arg.
Note: This algorithm is documented in stormy-abi. */ Note: This algorithm is documented in stormy-abi. */
rtx static tree
xstormy16_expand_builtin_va_arg (tree valist, tree type) xstormy16_expand_builtin_va_arg (tree valist, tree type, tree *pre_p,
tree *post_p ATTRIBUTE_UNUSED)
{ {
tree f_base, f_count; tree f_base, f_count;
tree base, count; tree base, count;
rtx count_rtx, addr_rtx, r; tree count_tmp, addr, t;
rtx lab_gotaddr, lab_fromstack; tree lab_gotaddr, lab_fromstack;
tree t;
int size, size_of_reg_args, must_stack; int size, size_of_reg_args, must_stack;
tree size_tree, count_plus_size; tree size_tree;
rtx count_plus_size_rtx;
f_base = TYPE_FIELDS (va_list_type_node); f_base = TYPE_FIELDS (va_list_type_node);
f_count = TREE_CHAIN (f_base); f_count = TREE_CHAIN (f_base);
...@@ -1327,29 +1327,38 @@ xstormy16_expand_builtin_va_arg (tree valist, tree type) ...@@ -1327,29 +1327,38 @@ xstormy16_expand_builtin_va_arg (tree valist, tree type)
must_stack = MUST_PASS_IN_STACK (TYPE_MODE (type), type); must_stack = MUST_PASS_IN_STACK (TYPE_MODE (type), type);
size_tree = round_up (size_in_bytes (type), UNITS_PER_WORD); size_tree = round_up (size_in_bytes (type), UNITS_PER_WORD);
gimplify_expr (&size_tree, pre_p, NULL, is_gimple_val, fb_rvalue);
size_of_reg_args = NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD; size_of_reg_args = NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD;
count_rtx = expand_expr (count, NULL_RTX, HImode, EXPAND_NORMAL); count_tmp = get_initialized_tmp_var (count, pre_p, NULL);
lab_gotaddr = gen_label_rtx (); lab_gotaddr = create_artificial_label ();
lab_fromstack = gen_label_rtx (); lab_fromstack = create_artificial_label ();
addr_rtx = gen_reg_rtx (Pmode); addr = create_tmp_var (ptr_type_node, NULL);
if (!must_stack) if (!must_stack)
{ {
count_plus_size = build (PLUS_EXPR, TREE_TYPE (count), count, size_tree); tree r;
count_plus_size_rtx = expand_expr (count_plus_size, NULL_RTX, HImode, EXPAND_NORMAL);
emit_cmp_and_jump_insns (count_plus_size_rtx, GEN_INT (size_of_reg_args), t = fold_convert (TREE_TYPE (count), size_tree);
GTU, const1_rtx, HImode, 1, lab_fromstack); t = build (PLUS_EXPR, TREE_TYPE (count), count_tmp, t);
r = fold_convert (TREE_TYPE (count), size_int (size_of_reg_args));
t = build (GT_EXPR, boolean_type_node, t, r);
t = build (COND_EXPR, void_type_node, t,
build (GOTO_EXPR, void_type_node, lab_fromstack),
NULL);
gimplify_and_add (t, pre_p);
t = build (PLUS_EXPR, ptr_type_node, base, count); t = fold_convert (ptr_type_node, count_tmp);
r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL); t = build (PLUS_EXPR, ptr_type_node, base, t);
if (r != addr_rtx) t = build (MODIFY_EXPR, void_type_node, addr, t);
emit_move_insn (addr_rtx, r); gimplify_and_add (t, pre_p);
emit_jump_insn (gen_jump (lab_gotaddr)); t = build (GOTO_EXPR, void_type_node, lab_gotaddr);
emit_barrier (); gimplify_and_add (t, pre_p);
emit_label (lab_fromstack);
t = build (LABEL_EXPR, void_type_node, lab_fromstack);
gimplify_and_add (t, pre_p);
} }
/* Arguments larger than a word might need to skip over some /* Arguments larger than a word might need to skip over some
...@@ -1358,37 +1367,38 @@ xstormy16_expand_builtin_va_arg (tree valist, tree type) ...@@ -1358,37 +1367,38 @@ xstormy16_expand_builtin_va_arg (tree valist, tree type)
size = PUSH_ROUNDING (int_size_in_bytes (type)); size = PUSH_ROUNDING (int_size_in_bytes (type));
if (size > 2 || size < 0 || must_stack) if (size > 2 || size < 0 || must_stack)
{ {
rtx lab_notransition = gen_label_rtx (); tree r, u;
emit_cmp_and_jump_insns (count_rtx, GEN_INT (NUM_ARGUMENT_REGISTERS
* UNITS_PER_WORD), r = size_int (NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD);
GEU, const1_rtx, HImode, 1, lab_notransition); u = build (MODIFY_EXPR, void_type_node, count_tmp, r);
t = build (MODIFY_EXPR, TREE_TYPE (count), count, t = fold_convert (TREE_TYPE (count), r);
build_int_2 (NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD, 0)); t = build (GE_EXPR, boolean_type_node, count_tmp, t);
TREE_SIDE_EFFECTS (t) = 1; t = build (COND_EXPR, void_type_node, t, NULL, u);
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); gimplify_and_add (t, pre_p);
emit_label (lab_notransition);
} }
t = build (PLUS_EXPR, sizetype, size_tree, t = size_int (NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD
build_int_2 ((- NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD - INCOMING_FRAME_SP_OFFSET);
+ INCOMING_FRAME_SP_OFFSET), t = fold_convert (TREE_TYPE (count), t);
-1)); t = build (MINUS_EXPR, TREE_TYPE (count), count_tmp, t);
t = build (PLUS_EXPR, TREE_TYPE (count), count, fold (t)); t = build (PLUS_EXPR, TREE_TYPE (count), t,
fold_convert (TREE_TYPE (count), size_tree));
t = fold_convert (TREE_TYPE (base), fold (t));
t = build (MINUS_EXPR, TREE_TYPE (base), base, t); t = build (MINUS_EXPR, TREE_TYPE (base), base, t);
r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL); t = build (MODIFY_EXPR, void_type_node, addr, t);
if (r != addr_rtx) gimplify_and_add (t, pre_p);
emit_move_insn (addr_rtx, r);
t = build (LABEL_EXPR, void_type_node, lab_gotaddr);
emit_label (lab_gotaddr); gimplify_and_add (t, pre_p);
count_plus_size = build (PLUS_EXPR, TREE_TYPE (count), count, size_tree);
t = build (MODIFY_EXPR, TREE_TYPE (count), count, count_plus_size);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
return addr_rtx; t = fold_convert (TREE_TYPE (count), size_tree);
t = build (PLUS_EXPR, TREE_TYPE (count), count_tmp, t);
t = build (MODIFY_EXPR, TREE_TYPE (count), count, t);
gimplify_and_add (t, pre_p);
addr = fold_convert (build_pointer_type (type), addr);
return build_fold_indirect_ref (addr);
} }
/* Initialize the variable parts of a trampoline. ADDR is an RTX for /* Initialize the variable parts of a trampoline. ADDR is an RTX for
...@@ -2198,6 +2208,8 @@ xstormy16_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED) ...@@ -2198,6 +2208,8 @@ xstormy16_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
#undef TARGET_BUILD_BUILTIN_VA_LIST #undef TARGET_BUILD_BUILTIN_VA_LIST
#define TARGET_BUILD_BUILTIN_VA_LIST xstormy16_build_builtin_va_list #define TARGET_BUILD_BUILTIN_VA_LIST xstormy16_build_builtin_va_list
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
#define TARGET_GIMPLIFY_VA_ARG_EXPR xstormy16_expand_builtin_va_arg
#undef TARGET_PROMOTE_FUNCTION_ARGS #undef TARGET_PROMOTE_FUNCTION_ARGS
#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
......
...@@ -481,11 +481,6 @@ enum reg_class ...@@ -481,11 +481,6 @@ enum reg_class
implementation will be defined that works for arguments passed on the stack. */ implementation will be defined that works for arguments passed on the stack. */
#define EXPAND_BUILTIN_VA_START(VALIST, NEXTARG) \ #define EXPAND_BUILTIN_VA_START(VALIST, NEXTARG) \
xstormy16_expand_builtin_va_start (VALIST, NEXTARG) xstormy16_expand_builtin_va_start (VALIST, NEXTARG)
/* Implement the stdarg/varargs va_arg macro. VALIST is the variable of type
va_list as a tree, TYPE is the type passed to va_arg. */
#define EXPAND_BUILTIN_VA_ARG(VALIST, TYPE) \
xstormy16_expand_builtin_va_arg (VALIST, TYPE)
/* Trampolines for Nested Functions. */ /* Trampolines for Nested Functions. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment