diff options
author | Richard Stallman <rms@gnu.org> | 1993-02-03 23:26:51 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1993-02-03 23:26:51 +0000 |
commit | 4e7c9a2248fbefdffb35dabbbb2c7c5c26d97f70 (patch) | |
tree | f52e60f70a2e31979f897319ef95b087d604ac56 | |
parent | f79322f009eae6df119616d01293e878b5d1418e (diff) | |
download | gcc-4e7c9a2248fbefdffb35dabbbb2c7c5c26d97f70.zip gcc-4e7c9a2248fbefdffb35dabbbb2c7c5c26d97f70.tar.gz gcc-4e7c9a2248fbefdffb35dabbbb2c7c5c26d97f70.tar.bz2 |
(emit_library_call, emit_library_call_value):
Handle STACK_BOUNDARY when using push insns.
From-SVN: r3420
-rw-r--r-- | gcc/expr.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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); @@ -2220,6 +2224,16 @@ emit_library_call (va_alist) #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; #else @@ -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); @@ -2462,6 +2490,16 @@ emit_library_call_value (va_alist) #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; #else @@ -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 |