aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/m32c
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2006-04-07 17:50:47 -0400
committerDJ Delorie <dj@gcc.gnu.org>2006-04-07 17:50:47 -0400
commit9d746d5e11d4ab6d9449815d7489ac7917361ddc (patch)
treecb57f09e55c4dc564adddb8556e8a35fbaf5fa77 /gcc/config/m32c
parentff5e9a942cba0770cd0ccdd44d38cf03c3c5cbfb (diff)
downloadgcc-9d746d5e11d4ab6d9449815d7489ac7917361ddc.zip
gcc-9d746d5e11d4ab6d9449815d7489ac7917361ddc.tar.gz
gcc-9d746d5e11d4ab6d9449815d7489ac7917361ddc.tar.bz2
m32c.c (m32c_function_arg): Structures are always passed on the stack.
* config/m32c/m32c.c (m32c_function_arg): Structures are always passed on the stack. (m32c_init_cumulative_args): When a function returns a structure, always pass the pointer to that return area on the stack. (m32c_function_arg_advance): Don't increment the parameter number if we're processing the returned structure pointer. (pushm_info): Reverse order of registers. From-SVN: r112765
Diffstat (limited to 'gcc/config/m32c')
-rw-r--r--gcc/config/m32c/m32c.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c
index 3625640..186f666 100644
--- a/gcc/config/m32c/m32c.c
+++ b/gcc/config/m32c/m32c.c
@@ -1204,15 +1204,15 @@ static struct
int a24_bytes;
} pushm_info[] =
{
- /* These are in push order. */
- { FB_REGNO, 0x01, 2, 4 },
- { SB_REGNO, 0x02, 2, 4 },
- { A1_REGNO, 0x04, 2, 4 },
- { A0_REGNO, 0x08, 2, 4 },
- { R3_REGNO, 0x10, 2, 2 },
- { R2_REGNO, 0x20, 2, 2 },
+ /* These are in reverse push (nearest-to-sp) order. */
+ { R0_REGNO, 0x80, 2, 2 },
{ R1_REGNO, 0x40, 2, 2 },
- { R0_REGNO, 0x80, 2, 2 }
+ { R2_REGNO, 0x20, 2, 2 },
+ { R3_REGNO, 0x10, 2, 2 },
+ { A0_REGNO, 0x08, 2, 4 },
+ { A1_REGNO, 0x04, 2, 4 },
+ { SB_REGNO, 0x02, 2, 4 },
+ { FB_REGNO, 0x01, 2, 4 }
};
#define PUSHM_N (sizeof(pushm_info)/sizeof(pushm_info[0]))
@@ -1475,6 +1475,9 @@ m32c_function_arg (CUMULATIVE_ARGS * ca,
if (type && INTEGRAL_TYPE_P (type) && POINTER_TYPE_P (type))
return NULL_RTX;
+ if (type && AGGREGATE_TYPE_P (type))
+ return NULL_RTX;
+
switch (ca->parm_num)
{
case 1:
@@ -1508,12 +1511,15 @@ m32c_pass_by_reference (CUMULATIVE_ARGS * ca ATTRIBUTE_UNUSED,
/* Implements INIT_CUMULATIVE_ARGS. */
void
m32c_init_cumulative_args (CUMULATIVE_ARGS * ca,
- tree fntype ATTRIBUTE_UNUSED,
+ tree fntype,
rtx libname ATTRIBUTE_UNUSED,
- tree fndecl ATTRIBUTE_UNUSED,
+ tree fndecl,
int n_named_args ATTRIBUTE_UNUSED)
{
- ca->force_mem = 0;
+ if (fntype && aggregate_value_p (TREE_TYPE (fntype), fndecl))
+ ca->force_mem = 1;
+ else
+ ca->force_mem = 0;
ca->parm_num = 1;
}
@@ -1529,7 +1535,8 @@ m32c_function_arg_advance (CUMULATIVE_ARGS * ca,
{
if (ca->force_mem)
ca->force_mem = 0;
- ca->parm_num++;
+ else
+ ca->parm_num++;
}
/* Implements FUNCTION_ARG_REGNO_P. */