OSDN Git Service

* config/m32r/m32r-protos.h (m32r_pass_by_reference): Declare.
authordevans <devans@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Jun 2003 16:57:26 +0000 (16:57 +0000)
committerdevans <devans@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Jun 2003 16:57:26 +0000 (16:57 +0000)
* config/m32r/m32r.c (m32r_pass_by_reference): New fn.
(m32r_va_arg): Use it.
* config/m32r/m32r.h (FUNCTION_ARG_PASS_BY_REFERENCE): Ditto.
(RETURN_IN_MEMORY): Ditto.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@67906 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/m32r/m32r-protos.h
gcc/config/m32r/m32r.c
gcc/config/m32r/m32r.h

index 8327e0f..484152d 100644 (file)
@@ -1,3 +1,12 @@
+2003-06-13  Doug Evans  <dje@sebabeach.org>
+           Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+       * config/m32r/m32r-protos.h (m32r_pass_by_reference): Declare.
+       * config/m32r/m32r.c (m32r_pass_by_reference): New fn.
+       (m32r_va_arg): Use it.
+       * config/m32r/m32r.h (FUNCTION_ARG_PASS_BY_REFERENCE): Ditto.
+       (RETURN_IN_MEMORY): Ditto.
+
 2003-06-13  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        * c-typeck.c: Remove #if 0 clauses.
index ec549ba..103bff7 100644 (file)
@@ -93,6 +93,7 @@ extern int    reg_or_zero_operand               PARAMS ((rtx, Mmode));
 
 #ifdef TREE_CODE
 extern struct rtx_def * m32r_va_arg            PARAMS ((tree, tree));
+extern int m32r_pass_by_reference              PARAMS ((tree));
 #endif /* TREE_CODE */
 #endif /* RTX_CODE */
 
index 4ea130f..8d42306 100644 (file)
@@ -1002,6 +1002,21 @@ large_insn_p (op, mode)
   return get_attr_length (op) != 2;
 }
 
+/* Return non-zero if TYPE must be passed or returned in memory.
+   The m32r treats both directions the same so we handle both directions
+   in this function.  */
+
+int
+m32r_pass_by_reference (type)
+     tree type;
+{
+  int size = int_size_in_bytes (type);
+
+  if (size < 0 || size > 8)
+    return 1;
+
+  return 0;
+}
 \f
 /* Comparisons.  */
 
@@ -1425,7 +1440,7 @@ m32r_va_arg (valist, type)
   size = int_size_in_bytes (type);
   rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
 
-  if (size > 8)
+  if (m32r_pass_by_reference (type))
     {
       tree type_ptr, type_ptr_ptr;
 
index 36bd206..13205ae 100644 (file)
@@ -1134,7 +1134,7 @@ M32R_STACK_ALIGN (current_function_outgoing_args_size)
    appropriate for passing a pointer to that type.  */
 /* All arguments greater than 8 bytes are passed this way.  */
 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
-  ((TYPE) && int_size_in_bytes (TYPE) > 8)
+  ((TYPE) && m32r_pass_by_reference (TYPE))
 
 /* Update the data in CUM to advance over an argument
    of mode MODE and data type TYPE.
@@ -1210,8 +1210,7 @@ M32R_STACK_ALIGN (current_function_outgoing_args_size)
    to return the function value in memory, just as large structures are
    always returned.  Here TYPE will be a C expression of type `tree',
    representing the data type of the value.  */
-#define RETURN_IN_MEMORY(TYPE) \
-(int_size_in_bytes (TYPE) > 8)
+#define RETURN_IN_MEMORY(TYPE) m32r_pass_by_reference (TYPE)
 
 /* Tell GCC to use RETURN_IN_MEMORY.  */
 #define DEFAULT_PCC_STRUCT_RETURN 0