From: Richard Stallman Date: Wed, 3 Feb 1993 23:26:51 +0000 (+0000) Subject: (emit_library_call, emit_library_call_value): X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4e7c9a2248fbefdffb35dabbbb2c7c5c26d97f70;p=gcc.git (emit_library_call, emit_library_call_value): Handle STACK_BOUNDARY when using push insns. From-SVN: r3420 --- diff --git a/gcc/expr.c b/gcc/expr.c index b1ce3ca66fb..b407896e3ea 100644 --- a/gcc/expr.c +++ b/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