diff options
author | Richard Henderson <rth@cygnus.com> | 1999-08-02 16:08:49 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-08-02 16:08:49 -0700 |
commit | 40cae311f5c7317fcc247e334517fb8c431e973f (patch) | |
tree | 5aea2a7b14abd6c02f35f847b9bc8e502152e9f9 /gcc | |
parent | 247cfc5c36023e832c05102695b1c4b020294eb1 (diff) | |
download | gcc-40cae311f5c7317fcc247e334517fb8c431e973f.zip gcc-40cae311f5c7317fcc247e334517fb8c431e973f.tar.gz gcc-40cae311f5c7317fcc247e334517fb8c431e973f.tar.bz2 |
m32r.c (m32r_setup_incoming_varargs): Use get_varargs_alias_set for the register spill block.
* m32r.c (m32r_setup_incoming_varargs): Use get_varargs_alias_set
for the register spill block.
(m32r_va_arg): New.
* m32r.h (EXPAND_BUILTIN_VA_ARG): New.
(EXPAND_BUILTIN_SAVEREGS): Delete #if 0 code.
* m32r.h (INT8_P): Don't short-cut test with (unsigned).
(INT16_P, CMP_INT16_P, UINT16_P): Likewise.
(UPPER16_P, UINT24_P, INT32_P, UINT5_P): Likewise.
From-SVN: r28417
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/m32r/m32r.c | 63 | ||||
-rw-r--r-- | gcc/config/m32r/m32r.h | 42 |
3 files changed, 92 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d557d25..840602b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +1999-08-02 Richard Henderson <rth@cygnus.com> + + * m32r.c (m32r_setup_incoming_varargs): Use get_varargs_alias_set + for the register spill block. + (m32r_va_arg): New. + * m32r.h (EXPAND_BUILTIN_VA_ARG): New. + (EXPAND_BUILTIN_SAVEREGS): Delete #if 0 code. + + * m32r.h (INT8_P): Don't short-cut test with (unsigned). + (INT16_P, CMP_INT16_P, UINT16_P): Likewise. + (UPPER16_P, UINT24_P, INT32_P, UINT5_P): Likewise. + 1999-08-02 Jakub Jelinek <jj@ultra.linux.cz> * config/sparc/linux.h: Define WCHAR_TYPE as "int" and undef diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c index ddc052b..6dc5ff4 100644 --- a/gcc/config/m32r/m32r.c +++ b/gcc/config/m32r/m32r.c @@ -1338,12 +1338,75 @@ m32r_setup_incoming_varargs (cum, int_mode, type, pretend_size, no_rtl) regblock = gen_rtx (MEM, BLKmode, plus_constant (arg_pointer_rtx, FIRST_PARM_OFFSET (0))); + MEM_ALIAS_SET (regblock) = get_varargs_alias_set (); move_block_from_reg (first_reg_offset, regblock, size, size * UNITS_PER_WORD); *pretend_size = (size * UNITS_PER_WORD); } } + +/* Implement `va_arg'. */ + +rtx +m32r_va_arg (valist, type) + tree valist, type; +{ + HOST_WIDE_INT size, rsize; + tree t; + rtx addr_rtx; + + size = int_size_in_bytes (type); + rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD; + + if (size > 8) + { + tree type_ptr, type_ptr_ptr; + + /* Pass by reference. */ + + 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); + + addr_rtx = expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL); + } + else + { + /* Pass by value. */ + + if (size < 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); + } + else + { + t = build (POSTINCREMENT_EXPR, va_list_type_node, valist, + build_int_2 (rsize, 0)); + TREE_SIDE_EFFECTS (t) = 1; + addr_rtx = expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL); + } + } + + return addr_rtx; +} /* Cost functions. */ diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index b9de985..d57e50b 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -597,15 +597,18 @@ extern enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER]; (values in the range -32767 to +32768). */ /* local to this file */ -#define INT8_P(X) ((unsigned) ((X) + 0x80) < 0x100) -#define INT16_P(X) ((unsigned) ((X) + 0x8000) < 0x10000) -#define CMP_INT16_P(X) ((unsigned) ((X) - 1 + 0x8000) < 0x10000) -#define UINT16_P(X) ((unsigned) (X) < 0x10000) -#define UPPER16_P(X) (((X) & ~0xffff0000) == 0) -#define UINT24_P(X) ((unsigned) (X) < 0x1000000) -#define INT32_P(X) ((X) >= (-(HOST_WIDE_INT) 0x7fffffff - 1) \ - && (X) <= (unsigned HOST_WIDE_INT) 0xffffffff) -#define UINT5_P(X) ((unsigned) (X) < 32) +#define INT8_P(X) ((X) >= -0x80 && (X) <= 0x7f) +#define INT16_P(X) ((X) >= -0x8000 && (X) <= 0x7fff) +#define CMP_INT16_P(X) ((X) >= -0x7fff && (X) <= 0x8000) +#define UINT16_P(X) ((X) >= 0 && (X) <= 0xffff) +#define UPPER16_P(X) (((X) & 0xffff) == 0 \ + && ((X) >> 16) >= -0x8000 \ + && ((X) >> 16) <= 0x7fff) +#define UINT24_P(X) ((X) >= 0 && (X) < 0x1000000) +#define INT32_P(X) (((X) >= -(HOST_WIDE_INT) 0x80000000 \ + && (X) <= (HOST_WIDE_INT) 0x7fffffff) \ + || (unsigned HOST_WIDE_INT) (X) <= 0xffffffff) +#define UINT5_P(X) ((X) >= 0 && (X) < 32) #define INVERTED_SIGNED_8BIT(VAL) ((VAL) >= -127 && (VAL) <= 128) #define CONST_OK_FOR_LETTER_P(VALUE, C) \ @@ -968,22 +971,6 @@ M32R_STACK_ALIGN (current_function_outgoing_args_size) : 2 * PARM_BOUNDARY) #endif -#if 0 -/* If defined, is a C expression that produces the machine-specific - code for a call to `__builtin_saveregs'. This code will be moved - to the very beginning of the function, before any parameter access - are made. The return value of this function should be an RTX that - contains the value to use as the return of `__builtin_saveregs'. - - The argument ARGS is a `tree_list' containing the arguments that - were passed to `__builtin_saveregs'. - - If this macro is not defined, the compiler will output an ordinary - call to the library function `__builtin_saveregs'. */ -extern struct rtx *m32r_expand_builtin_savergs (); -#define EXPAND_BUILTIN_SAVEREGS() m32r_expand_builtin_saveregs () -#endif - /* This macro offers an alternative to using `__builtin_saveregs' and defining the macro `EXPAND_BUILTIN_SAVEREGS'. Use it to store the anonymous register @@ -1013,6 +1000,10 @@ extern struct rtx *m32r_expand_builtin_savergs (); #define SETUP_INCOMING_VARARGS(ARGS_SO_FAR, MODE, TYPE, PRETEND_SIZE, NO_RTL) \ m32r_setup_incoming_varargs (&ARGS_SO_FAR, MODE, TYPE, &PRETEND_SIZE, NO_RTL) + +/* Implement `va_arg'. */ +#define EXPAND_BUILTIN_VA_ARG(valist, type) \ + m32r_va_arg (valist, type) /* Function results. */ @@ -2059,6 +2050,7 @@ extern int function_arg_partial_nregs PROTO((CUMULATIVE_ARGS *, extern void m32r_setup_incoming_varargs PROTO((CUMULATIVE_ARGS *, int, Tree, int *, int)); +extern struct rtx_def *m32r_va_arg PROTO((Tree, Tree)); extern int m32r_address_code PROTO((Rtx)); extern enum m32r_function_type m32r_compute_function_type PROTO((Tree)); |