diff options
author | Richard Henderson <rth@cygnus.com> | 1999-09-06 15:05:26 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-09-06 15:05:26 -0700 |
commit | bc092c4a3c9f4ef9a79f5444a4963f1d1fb1ba0a (patch) | |
tree | f7f18d92cf141348b379d975221173dfc80b35ec /gcc/config/v850 | |
parent | 63de6c74a5e67690a20c3d7124dc383239556cdb (diff) | |
download | gcc-bc092c4a3c9f4ef9a79f5444a4963f1d1fb1ba0a.tar.gz |
v850.h (EXPAND_BUILTIN_VA_ARG): New.
* v850.h (EXPAND_BUILTIN_VA_ARG): New.
* v850.c (v850_va_arg): New.
From-SVN: r29146
Diffstat (limited to 'gcc/config/v850')
-rw-r--r-- | gcc/config/v850/v850.c | 42 | ||||
-rw-r--r-- | gcc/config/v850/v850.h | 5 |
2 files changed, 47 insertions, 0 deletions
diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c index 44148b0dbb7..2b9b5981315 100644 --- a/gcc/config/v850/v850.c +++ b/gcc/config/v850/v850.c @@ -3150,3 +3150,45 @@ v850_set_default_decl_attr (decl) } } } + +/* Implement `va_arg'. */ + +rtx +v850_va_arg (valist, type) + tree valist, type; +{ + HOST_WIDE_INT size, rsize, align; + tree addr, incr; + rtx addr_rtx; + int indirect; + + /* Round up sizeof(type) to a word. */ + size = int_size_in_bytes (type); + rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD; + indirect = 0; + + if (size > 8) + { + size = rsize = UNITS_PER_WORD; + indirect = 1; + } + + addr = save_expr (valist); + incr = fold (build (PLUS_EXPR, ptr_type_node, valist, + build_int_2 (rsize, 0))); + + incr = build (MODIFY_EXPR, ptr_type_node, valist, incr); + TREE_SIDE_EFFECTS (incr) = 1; + expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL); + + addr_rtx = expand_expr (addr, NULL, Pmode, EXPAND_NORMAL); + + if (indirect) + { + addr_rtx = force_reg (Pmode, addr_rtx); + addr_rtx = gen_rtx_MEM (Pmode, addr_rtx); + MEM_ALIAS_SET (addr_rtx) = get_varargs_alias_set (); + } + + return addr_rtx; +} diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index 92483cc80cd..b045f830d39 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -735,6 +735,10 @@ extern int current_function_anonymous_args; #define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PAS, SECOND) \ current_function_anonymous_args = (!TARGET_GHS ? 1 : 0); +/* Implement `va_arg'. */ +#define EXPAND_BUILTIN_VA_ARG(valist, type) \ + v850_va_arg (valist, type) + #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \ ((TYPE) && int_size_in_bytes (TYPE) > 8) @@ -1663,3 +1667,4 @@ extern int v850_handle_pragma PROTO ((int (*)(void), void (*)(int) extern void v850_encode_data_area (); extern void v850_set_default_decl_attr (); extern v850_data_area v850_get_data_area (); +extern struct rtx_def *v850_va_arg (); |