(emit_library_call, emit_library_call_value):
Handle STACK_BOUNDARY when using push insns. From-SVN: r3420
This commit is contained in:
parent
f79322f009
commit
4e7c9a2248
48
gcc/expr.c
48
gcc/expr.c
|
@ -2074,7 +2074,10 @@ emit_library_call (va_alist)
|
|||
va_dcl
|
||||
{
|
||||
va_list p;
|
||||
/* Total size in bytes of all the stack-parms scanned so far. */
|
||||
struct args_size args_size;
|
||||
/* Size of arguments before any adjustments (such as rounding). */
|
||||
struct args_size original_args_size;
|
||||
register int argnum;
|
||||
enum machine_mode outmode;
|
||||
int nargs;
|
||||
|
@ -2196,6 +2199,7 @@ emit_library_call (va_alist)
|
|||
functions, write one out. */
|
||||
assemble_external_libcall (fun);
|
||||
|
||||
original_args_size = args_size;
|
||||
#ifdef STACK_BOUNDARY
|
||||
args_size.constant = (((args_size.constant + (STACK_BYTES - 1))
|
||||
/ STACK_BYTES) * STACK_BYTES);
|
||||
|
@ -2219,6 +2223,16 @@ emit_library_call (va_alist)
|
|||
argblock = push_block (GEN_INT (args_size.constant), 0, 0);
|
||||
#endif
|
||||
|
||||
#ifdef PUSH_ARGS_REVERSED
|
||||
#ifdef STACK_BOUNDARY
|
||||
/* If we push args individually in reverse order, perform stack alignment
|
||||
before the first push (the last arg). */
|
||||
if (argblock == 0)
|
||||
anti_adjust_stack (GEN_INT (args_size.constant
|
||||
- original_args_size.constant));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PUSH_ARGS_REVERSED
|
||||
inc = -1;
|
||||
argnum = nargs - 1;
|
||||
|
@ -2242,6 +2256,16 @@ emit_library_call (va_alist)
|
|||
NO_DEFER_POP;
|
||||
}
|
||||
|
||||
#ifndef PUSH_ARGS_REVERSED
|
||||
#ifdef STACK_BOUNDARY
|
||||
/* If we pushed args in forward order, perform stack alignment
|
||||
after pushing the last arg. */
|
||||
if (argblock == 0)
|
||||
anti_adjust_stack (GEN_INT (args_size.constant
|
||||
- original_args_size.constant));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PUSH_ARGS_REVERSED
|
||||
argnum = nargs - 1;
|
||||
#else
|
||||
|
@ -2301,7 +2325,10 @@ emit_library_call_value (va_alist)
|
|||
va_dcl
|
||||
{
|
||||
va_list p;
|
||||
/* Total size in bytes of all the stack-parms scanned so far. */
|
||||
struct args_size args_size;
|
||||
/* Size of arguments before any adjustments (such as rounding). */
|
||||
struct args_size original_args_size;
|
||||
register int argnum;
|
||||
enum machine_mode outmode;
|
||||
int nargs;
|
||||
|
@ -2438,6 +2465,7 @@ emit_library_call_value (va_alist)
|
|||
functions, write one out. */
|
||||
assemble_external_libcall (fun);
|
||||
|
||||
original_args_size = args_size;
|
||||
#ifdef STACK_BOUNDARY
|
||||
args_size.constant = (((args_size.constant + (STACK_BYTES - 1))
|
||||
/ STACK_BYTES) * STACK_BYTES);
|
||||
|
@ -2461,6 +2489,16 @@ emit_library_call_value (va_alist)
|
|||
argblock = push_block (GEN_INT (args_size.constant), 0, 0);
|
||||
#endif
|
||||
|
||||
#ifdef PUSH_ARGS_REVERSED
|
||||
#ifdef STACK_BOUNDARY
|
||||
/* If we push args individually in reverse order, perform stack alignment
|
||||
before the first push (the last arg). */
|
||||
if (argblock == 0)
|
||||
anti_adjust_stack (GEN_INT (args_size.constant
|
||||
- original_args_size.constant));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PUSH_ARGS_REVERSED
|
||||
inc = -1;
|
||||
argnum = nargs - 1;
|
||||
|
@ -2484,6 +2522,16 @@ emit_library_call_value (va_alist)
|
|||
NO_DEFER_POP;
|
||||
}
|
||||
|
||||
#ifndef PUSH_ARGS_REVERSED
|
||||
#ifdef STACK_BOUNDARY
|
||||
/* If we pushed args in forward order, perform stack alignment
|
||||
after pushing the last arg. */
|
||||
if (argblock == 0)
|
||||
anti_adjust_stack (GEN_INT (args_size.constant
|
||||
- original_args_size.constant));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PUSH_ARGS_REVERSED
|
||||
argnum = nargs - 1;
|
||||
#else
|
||||
|
|
Loading…
Reference in New Issue