aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-08-02 16:08:49 -0700
committerRichard Henderson <rth@gcc.gnu.org>1999-08-02 16:08:49 -0700
commit40cae311f5c7317fcc247e334517fb8c431e973f (patch)
tree5aea2a7b14abd6c02f35f847b9bc8e502152e9f9 /gcc
parent247cfc5c36023e832c05102695b1c4b020294eb1 (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/config/m32r/m32r.c63
-rw-r--r--gcc/config/m32r/m32r.h42
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));