+2006-04-07 DJ Delorie <dj@redhat.com>
+
+ * 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.
+
2006-04-07 Sebastian Pop <pop@cri.ensmp.fr>
* tree-ssa-loop-niter.c (inverse, number_of_iterations_ne,
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]))
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:
/* 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;
}
{
if (ca->force_mem)
ca->force_mem = 0;
- ca->parm_num++;
+ else
+ ca->parm_num++;
}
/* Implements FUNCTION_ARG_REGNO_P. */