2002-06-06 Michael Snyder <msnyder@redhat.com>

* d10v-tdep.c (d10v_push_arguments): Handle struct_return.
        Delete extra braces and re-indent.
This commit is contained in:
Michael Snyder 2002-06-06 18:57:08 +00:00
parent 3d79a47c75
commit 7bd91a28eb
2 changed files with 36 additions and 26 deletions

View File

@ -1,6 +1,8 @@
2002-06-06 Michael Snyder <msnyder@redhat.com> 2002-06-06 Michael Snyder <msnyder@redhat.com>
* d10v-tdep.c (d10v_store_return_value): Char return values * d10v-tdep.c (d10v_push_arguments): Handle struct_return.
Delete extra braces and re-indent.
(d10v_store_return_value): Char return values
must be shifted over by one byte in R0. must be shifted over by one byte in R0.
(d10v_extract_return_value): Delete extra braces, re-indent. (d10v_extract_return_value): Delete extra braces, re-indent.

View File

@ -1086,6 +1086,15 @@ d10v_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
int i; int i;
int regnum = ARG1_REGNUM; int regnum = ARG1_REGNUM;
struct stack_item *si = NULL; struct stack_item *si = NULL;
long val;
/* If struct_return is true, then the struct return address will
consume one argument-passing register. No need to actually
write the value to the register -- that's done by
d10v_store_struct_return(). */
if (struct_return)
regnum++;
/* Fill in registers and arg lists */ /* Fill in registers and arg lists */
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
@ -1094,39 +1103,38 @@ d10v_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
struct type *type = check_typedef (VALUE_TYPE (arg)); struct type *type = check_typedef (VALUE_TYPE (arg));
char *contents = VALUE_CONTENTS (arg); char *contents = VALUE_CONTENTS (arg);
int len = TYPE_LENGTH (type); int len = TYPE_LENGTH (type);
int aligned_regnum = (regnum + 1) & ~1;
/* printf ("push: type=%d len=%d\n", TYPE_CODE (type), len); */ /* printf ("push: type=%d len=%d\n", TYPE_CODE (type), len); */
if (len <= 2 && regnum <= ARGN_REGNUM)
/* fits in a single register, do not align */
{ {
int aligned_regnum = (regnum + 1) & ~1; val = extract_unsigned_integer (contents, len);
if (len <= 2 && regnum <= ARGN_REGNUM) write_register (regnum++, val);
/* fits in a single register, do not align */ }
else if (len <= (ARGN_REGNUM - aligned_regnum + 1) * 2)
/* value fits in remaining registers, store keeping left
aligned */
{
int b;
regnum = aligned_regnum;
for (b = 0; b < (len & ~1); b += 2)
{ {
long val = extract_unsigned_integer (contents, len); val = extract_unsigned_integer (&contents[b], 2);
write_register (regnum++, val); write_register (regnum++, val);
} }
else if (len <= (ARGN_REGNUM - aligned_regnum + 1) * 2) if (b < len)
/* value fits in remaining registers, store keeping left
aligned */
{ {
int b; val = extract_unsigned_integer (&contents[b], 1);
regnum = aligned_regnum; write_register (regnum++, (val << 8));
for (b = 0; b < (len & ~1); b += 2)
{
long val = extract_unsigned_integer (&contents[b], 2);
write_register (regnum++, val);
}
if (b < len)
{
long val = extract_unsigned_integer (&contents[b], 1);
write_register (regnum++, (val << 8));
}
}
else
{
/* arg will go onto stack */
regnum = ARGN_REGNUM + 1;
si = push_stack_item (si, contents, len);
} }
} }
else
{
/* arg will go onto stack */
regnum = ARGN_REGNUM + 1;
si = push_stack_item (si, contents, len);
}
} }
while (si) while (si)