aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-02-03 23:26:51 +0000
committerRichard Stallman <rms@gnu.org>1993-02-03 23:26:51 +0000
commit4e7c9a2248fbefdffb35dabbbb2c7c5c26d97f70 (patch)
treef52e60f70a2e31979f897319ef95b087d604ac56
parentf79322f009eae6df119616d01293e878b5d1418e (diff)
downloadgcc-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.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index b1ce3ca..b407896 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);
@@ -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