s390.c (s390_backchain_string): Removed.
authorAndreas Krebbel <krebbel1@de.ibm.com>
Tue, 23 Nov 2004 17:39:59 +0000 (17:39 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Tue, 23 Nov 2004 17:39:59 +0000 (17:39 +0000)
2004-11-23  Andreas Krebbel  <krebbel1@de.ibm.com>

* config/s390/s390.c (s390_backchain_string): Removed.
(s390_return_addr_rtx, s390_back_chain_rtx, s390_frame_info)
(s390_emit_prologue, s390_va_start, s390_gimplify_va_arg):
Changed users of TARGET_BACKCHAIN, TARGET_NO_BACKCHAIN and
TARGET_KERNEL_BACKCHAIN to reflect the new options.
* config/s390/s390.h (MASK_BACKCHAIN, MASK_PACKED_STACK): New macros.
(TARGET_KERNEL_BACKCHAIN): Removed.
(TARGET_BACKCHAIN): Former triple state option change to a target flag.
(TARGET_PACKED_STACK): New macro.
(TARGET_SWITCHES): New switches added.
(TARGET_OPTIONS): "backchain", "no-backchain" and "kernel-backchain"
removed.
(DYNAMIC_CHAIN_ADDRESS): Use TARGET_PACKED_STACK.
* config/s390/s390.md ("allocate_stack", "restore_stack_block")
("save_stack_nonlocal", "restore_stack_nonlocal"): Modified to reflect
the change in target switch semantics.
* config/s390/tpf.h (TARGET_DEFAULT_BACKCHAIN): Removed.
(TARGET_DEFAULT): MASK_BACKCHAIN added.
* doc/invoke.texi: Added documentation for the new/changed options.

From-SVN: r91096

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/config/s390/s390.h
gcc/config/s390/s390.md
gcc/config/s390/tpf.h
gcc/doc/invoke.texi

index 3342ad1018d61b8b458f3c287289fb24031820ae..01ecb442b8d68a8730ceee48a8a60a302b05e0f5 100644 (file)
@@ -1,3 +1,25 @@
+2004-11-23  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+       * config/s390/s390.c (s390_backchain_string): Removed.
+       (s390_return_addr_rtx, s390_back_chain_rtx, s390_frame_info)
+       (s390_emit_prologue, s390_va_start, s390_gimplify_va_arg):
+       Changed users of TARGET_BACKCHAIN, TARGET_NO_BACKCHAIN and
+       TARGET_KERNEL_BACKCHAIN to reflect the new options.
+       * config/s390/s390.h (MASK_BACKCHAIN, MASK_PACKED_STACK): New macros.
+       (TARGET_KERNEL_BACKCHAIN): Removed.
+       (TARGET_BACKCHAIN): Former triple state option change to a target flag.
+       (TARGET_PACKED_STACK): New macro.
+       (TARGET_SWITCHES): New switches added.
+       (TARGET_OPTIONS): "backchain", "no-backchain" and "kernel-backchain"
+       removed.
+       (DYNAMIC_CHAIN_ADDRESS): Use TARGET_PACKED_STACK.
+       * config/s390/s390.md ("allocate_stack", "restore_stack_block")
+       ("save_stack_nonlocal", "restore_stack_nonlocal"): Modified to reflect 
+       the change in target switch semantics.
+       * config/s390/tpf.h (TARGET_DEFAULT_BACKCHAIN): Removed.
+       (TARGET_DEFAULT): MASK_BACKCHAIN added.
+       * doc/invoke.texi: Added documentation for the new/changed options.
+
 2004-11-23  Uros Bizjak  <uros@kss-loka.si>
 
         PR rtl-optimization/18614
index 91ee90d282d0ee14ea737e63fa42686ec505d5ae..54d2b1edb108df869eb39a8b7bb9e894015b7d11 100644 (file)
@@ -205,10 +205,6 @@ enum processor_flags s390_arch_flags;
 const char *s390_tune_string;          /* for -mtune=<xxx> */
 const char *s390_arch_string;          /* for -march=<xxx> */
 
-/* String to specify backchain mode: 
-   "" no-backchain, "1" backchain, "2" kernel-backchain.  */
-const char *s390_backchain_string = TARGET_DEFAULT_BACKCHAIN;
-
 const char *s390_warn_framesize_string;
 const char *s390_warn_dynamicstack_string;
 const char *s390_stack_size_string;
@@ -6083,7 +6079,7 @@ s390_return_addr_rtx (int count, rtx frame ATTRIBUTE_UNUSED)
 
   /* Without backchain, we fail for all but the current frame.  */
 
-  if (!TARGET_BACKCHAIN && !TARGET_KERNEL_BACKCHAIN && count > 0)
+  if (!TARGET_BACKCHAIN && count > 0)
     return NULL_RTX;
 
   /* For the current frame, we need to make sure the initial
@@ -6095,10 +6091,10 @@ s390_return_addr_rtx (int count, rtx frame ATTRIBUTE_UNUSED)
       return gen_rtx_MEM (Pmode, return_address_pointer_rtx);
     }
 
-  if (TARGET_BACKCHAIN)
-    offset = RETURN_REGNUM * UNITS_PER_WORD;
-  else
+  if (TARGET_PACKED_STACK)
     offset = -2 * UNITS_PER_WORD;
+  else
+    offset = RETURN_REGNUM * UNITS_PER_WORD;
 
   addr = plus_constant (frame, offset);
   addr = memory_address (Pmode, addr);
@@ -6113,13 +6109,13 @@ s390_back_chain_rtx (void)
 {
   rtx chain;
 
-  gcc_assert (TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN);
+  gcc_assert (TARGET_BACKCHAIN);
 
-  if (TARGET_BACKCHAIN)
-    chain = stack_pointer_rtx;
-  else
+  if (TARGET_PACKED_STACK)
     chain = plus_constant (stack_pointer_rtx,
                           STACK_POINTER_OFFSET - UNITS_PER_WORD);
+  else
+    chain = stack_pointer_rtx;
 
   chain = gen_rtx_MEM (Pmode, chain);
   return chain;
@@ -6287,10 +6283,9 @@ s390_frame_info (void)
   if (!TARGET_64BIT && cfun_frame_layout.frame_size > 0x7fff0000)
     fatal_error ("Total size of local variables exceeds architecture limit.");
   
-  cfun_frame_layout.save_backchain_p = (TARGET_BACKCHAIN 
-                                       || TARGET_KERNEL_BACKCHAIN);
+  cfun_frame_layout.save_backchain_p = TARGET_BACKCHAIN;
 
-  if (TARGET_BACKCHAIN)
+  if (!TARGET_PACKED_STACK)
     {
       cfun_frame_layout.backchain_offset = 0;
       cfun_frame_layout.f0_offset = 16 * UNITS_PER_WORD;
@@ -6299,7 +6294,7 @@ s390_frame_info (void)
       cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr
                                       * UNITS_PER_WORD);
     }
-  else if (TARGET_KERNEL_BACKCHAIN)
+  else if (TARGET_BACKCHAIN) /* kernel stack layout */
     {
       cfun_frame_layout.backchain_offset = (STACK_POINTER_OFFSET
                                            - UNITS_PER_WORD);
@@ -6354,7 +6349,7 @@ s390_frame_info (void)
       && !current_function_stdarg)
     return;
 
-  if (TARGET_BACKCHAIN)
+  if (!TARGET_PACKED_STACK)
     cfun_frame_layout.frame_size += (STARTING_FRAME_OFFSET
                                     + cfun_frame_layout.high_fprs * 8);
   else
@@ -6753,7 +6748,7 @@ s390_emit_prologue (void)
          save_fpr (stack_pointer_rtx, offset, i + 16);
          offset += 8;
        }
-      else if (TARGET_BACKCHAIN)
+      else if (!TARGET_PACKED_STACK)
          offset += 8;
     }
 
@@ -6771,11 +6766,11 @@ s390_emit_prologue (void)
          if (!call_really_used_regs[i + 16])
            RTX_FRAME_RELATED_P (insn) = 1;
        }
-      else if (TARGET_BACKCHAIN)
+      else if (!TARGET_PACKED_STACK)
        offset += 8;
     }
 
-  if (!TARGET_BACKCHAIN 
+  if (TARGET_PACKED_STACK
       && cfun_save_high_fprs_p
       && cfun_frame_layout.f8_offset + cfun_frame_layout.high_fprs * 8 > 0)
     {
@@ -6794,7 +6789,7 @@ s390_emit_prologue (void)
        next_fpr = i + 16;
     }
   
-  if (TARGET_BACKCHAIN)
+  if (!TARGET_PACKED_STACK)
     next_fpr = cfun_save_high_fprs_p ? 31 : 0;
 
   /* Decrement stack pointer.  */
@@ -7050,7 +7045,7 @@ s390_emit_epilogue (bool sibcall)
                           offset + next_offset, i);
              next_offset += 8;
            }
-         else if (TARGET_BACKCHAIN)
+         else if (!TARGET_PACKED_STACK)
            next_offset += 8;
        }
       
@@ -7516,7 +7511,7 @@ s390_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
 
   /* Find the register save area.  */
   t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
-  if (TARGET_KERNEL_BACKCHAIN)
+  if (TARGET_BACKCHAIN && TARGET_PACKED_STACK) /* kernel stack layout */
     t = build (PLUS_EXPR, TREE_TYPE (sav), t,
               build_int_cst (NULL_TREE,
                              -(RETURN_REGNUM - 2) * UNITS_PER_WORD
@@ -7589,11 +7584,11 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
       reg = gpr;
       n_reg = 1;
 
-      /* TARGET_KERNEL_BACKCHAIN on 31 bit: It is assumed here that no padding
+      /* kernel stack layout on 31 bit: It is assumed here that no padding
         will be added by s390_frame_info because for va_args always an even
         number of gprs has to be saved r15-r2 = 14 regs.  */
-      sav_ofs = (TARGET_KERNEL_BACKCHAIN
-                (TARGET_64BIT ? 4 : 2) * 8 : 2 * UNITS_PER_WORD);
+      sav_ofs = ((TARGET_BACKCHAIN && TARGET_PACKED_STACK) ?
+                (TARGET_64BIT ? 4 : 2) * 8 : 2 * UNITS_PER_WORD);
       sav_scale = UNITS_PER_WORD;
       size = UNITS_PER_WORD;
       max_reg = 4;
@@ -7610,7 +7605,8 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
       indirect_p = 0;
       reg = fpr;
       n_reg = 1;
-      sav_ofs = TARGET_KERNEL_BACKCHAIN ? 0 : 16 * UNITS_PER_WORD;
+      sav_ofs = ((TARGET_BACKCHAIN && TARGET_PACKED_STACK) ?
+                0 : 16 * UNITS_PER_WORD);
       sav_scale = 8;
       /* TARGET_64BIT has up to 4 parameter in fprs */
       max_reg = TARGET_64BIT ? 3 : 1;
@@ -7628,11 +7624,11 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
       reg = gpr;
       n_reg = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
 
-      /* TARGET_KERNEL_BACKCHAIN on 31 bit: It is assumed here that no padding
-       will be added by s390_frame_info because for va_args always an even
-       number of gprs has to be saved r15-r2 = 14 regs.  */
-      sav_ofs = TARGET_KERNEL_BACKCHAIN ? 
-       (TARGET_64BIT ? 4 : 2) * 8 : 2*UNITS_PER_WORD;
+      /* kernel stack layout on 31 bit: It is assumed here that no padding
+        will be added by s390_frame_info because for va_args always an even
+        number of gprs has to be saved r15-r2 = 14 regs.  */
+      sav_ofs = ((TARGET_BACKCHAIN && TARGET_PACKED_STACK) ? 
+                (TARGET_64BIT ? 4 : 2) * 8 : 2 * UNITS_PER_WORD);
 
       if (size < UNITS_PER_WORD)
        sav_ofs += UNITS_PER_WORD - size;
index 694dcb81717a64da1de4cbbedb947a5acd3cd839..a3e021cb7885ca33bc6537704e1fc48d7ae54300 100644 (file)
@@ -60,8 +60,6 @@ extern enum processor_type s390_arch;
 extern enum processor_flags s390_arch_flags;
 extern const char *s390_arch_string;
 
-extern const char *s390_backchain_string;
-
 extern const char *s390_warn_framesize_string;
 extern const char *s390_warn_dynamicstack_string;
 extern const char *s390_stack_size_string;
@@ -106,6 +104,8 @@ extern int target_flags;
 #define MASK_MVCLE                 0x40
 #define MASK_TPF_PROFILING         0x80
 #define MASK_NO_FUSED_MADD         0x100
+#define MASK_BACKCHAIN             0x200
+#define MASK_PACKED_STACK          0x400
 
 #define TARGET_HARD_FLOAT          (target_flags & MASK_HARD_FLOAT)
 #define TARGET_SOFT_FLOAT          (!(target_flags & MASK_HARD_FLOAT))
@@ -117,9 +117,8 @@ extern int target_flags;
 #define TARGET_TPF_PROFILING       (target_flags & MASK_TPF_PROFILING)
 #define TARGET_NO_FUSED_MADD       (target_flags & MASK_NO_FUSED_MADD)
 #define TARGET_FUSED_MADD         (! TARGET_NO_FUSED_MADD)
-
-#define TARGET_BACKCHAIN           (s390_backchain_string[0] == '1')
-#define TARGET_KERNEL_BACKCHAIN    (s390_backchain_string[0] == '2')
+#define TARGET_BACKCHAIN           (target_flags & MASK_BACKCHAIN)
+#define TARGET_PACKED_STACK        (target_flags & MASK_PACKED_STACK)
 
 /* ??? Once this actually works, it could be made a runtime option.  */
 #define TARGET_IBM_FLOAT           0
@@ -131,25 +130,27 @@ extern int target_flags;
 #define TARGET_DEFAULT             MASK_HARD_FLOAT
 #endif
 
-#define TARGET_DEFAULT_BACKCHAIN ""
-
-#define TARGET_SWITCHES                                                  \
-{ { "hard-float",      1, N_("Use hardware fp")},                        \
-  { "soft-float",     -1, N_("Don't use hardware fp")},                  \
-  { "small-exec",      4, N_("Use bras for executable < 64k")},          \
-  { "no-small-exec",  -4, N_("Don't use bras")},                         \
-  { "debug",           8, N_("Additional debug prints")},                \
-  { "no-debug",       -8, N_("Don't print additional debug prints")},    \
-  { "64",             16, N_("64 bit ABI")},                             \
-  { "31",            -16, N_("31 bit ABI")},                             \
-  { "zarch",          32, N_("z/Architecture")},                         \
-  { "esa",           -32, N_("ESA/390 architecture")},                   \
-  { "mvcle",          64, N_("mvcle use")},                              \
-  { "no-mvcle",      -64, N_("mvc&ex")},                                 \
-  { "tpf-trace",     128, N_("enable tpf OS tracing code")},             \
-  { "no-tpf-trace", -128, N_("disable tpf OS tracing code")},            \
-  { "no-fused-madd", 256, N_("disable fused multiply/add instructions")},\
-  { "fused-madd",   -256, N_("enable fused multiply/add instructions")}, \
+#define TARGET_SWITCHES                                                      \
+{ { "hard-float",          1, N_("Use hardware fp")},                        \
+  { "soft-float",         -1, N_("Don't use hardware fp")},                  \
+  { "small-exec",          4, N_("Use bras for executable < 64k")},          \
+  { "no-small-exec",      -4, N_("Don't use bras")},                         \
+  { "debug",               8, N_("Additional debug prints")},                \
+  { "no-debug",           -8, N_("Don't print additional debug prints")},    \
+  { "64",                 16, N_("64 bit ABI")},                             \
+  { "31",                -16, N_("31 bit ABI")},                             \
+  { "zarch",              32, N_("z/Architecture")},                         \
+  { "esa",               -32, N_("ESA/390 architecture")},                   \
+  { "mvcle",              64, N_("mvcle use")},                              \
+  { "no-mvcle",          -64, N_("mvc&ex")},                                 \
+  { "tpf-trace",         128, N_("Enable tpf OS tracing code")},             \
+  { "no-tpf-trace",     -128, N_("Disable tpf OS tracing code")},            \
+  { "no-fused-madd",     256, N_("Disable fused multiply/add instructions")},\
+  { "fused-madd",       -256, N_("Enable fused multiply/add instructions")}, \
+  { "backchain",         512, N_("Maintain backchain pointer")},             \
+  { "no-backchain",     -512, N_("Don't maintain backchain pointer")},       \
+  { "packed-stack",     1024, N_("Use packed stack layout")},                \
+  { "no-packed-stack", -1024, N_("Don't use packed stack layout")},          \
   { "", TARGET_DEFAULT, 0 } }
 
 #define TARGET_OPTIONS                                                         \
@@ -157,12 +158,6 @@ extern int target_flags;
     N_("Schedule code for given CPU"), 0},                                     \
   { "arch=",            &s390_arch_string,                                     \
     N_("Generate code for given CPU"), 0},                                     \
-  { "backchain",        &s390_backchain_string,                                \
-    N_("Set backchain"), "1"},                                                 \
-  { "no-backchain",     &s390_backchain_string,                                \
-    N_("Do not set backchain"), ""},                                           \
-  { "kernel-backchain", &s390_backchain_string,                                \
-    N_("Set backchain appropriate for the linux kernel"), "2"},                \
   { "warn-framesize=",   &s390_warn_framesize_string,                          \
     N_("Warn if a single function's framesize exceeds the given framesize"),   \
        0},                                                                     \
@@ -623,12 +618,12 @@ extern int current_function_outgoing_args_size;
    the corresponding RETURN_REGNUM register was saved.  */
 
 #define DYNAMIC_CHAIN_ADDRESS(FRAME)                                            \
-  (TARGET_BACKCHAIN ?                                                           \
-   ((FRAME) != hard_frame_pointer_rtx ? (FRAME) :                              \
-    plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET)) :                   \
+  (TARGET_PACKED_STACK ?                                                        \
     ((FRAME) != hard_frame_pointer_rtx ?                                        \
      plus_constant ((FRAME), STACK_POINTER_OFFSET - UNITS_PER_WORD) :           \
-     plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)))
+     plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)) :                        \
+     ((FRAME) != hard_frame_pointer_rtx ? (FRAME) :                            \
+      plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET)))
 
 #define RETURN_ADDR_RTX(COUNT, FRAME)                                          \
   s390_return_addr_rtx ((COUNT), DYNAMIC_CHAIN_ADDRESS ((FRAME)))
index dbeaea4678b0a6448a682b6ecf28512e6d256a39..ccf70c7e0b114cf700cd9dfebc5ea50d9a14e4ed 100644 (file)
 (define_expand "allocate_stack"
   [(match_operand 0 "general_operand" "")
    (match_operand 1 "general_operand" "")]
- "TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN"
+ "TARGET_BACKCHAIN"
 {
   rtx temp = gen_reg_rtx (Pmode);
 
 (define_expand "restore_stack_block"
   [(match_operand 0 "register_operand" "")
    (match_operand 1 "register_operand" "")]
-  "TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN"
+  "TARGET_BACKCHAIN"
 {
   rtx temp = gen_reg_rtx (Pmode);
 
   /* Copy the backchain to the first word, sp to the second and the
      literal pool base to the third.  */
 
-  if (TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN)
+  if (TARGET_BACKCHAIN)
     {
       rtx temp = force_reg (Pmode, s390_back_chain_rtx ());
       emit_move_insn (operand_subword (operands[0], 0, 0, mode), temp);
   /* Restore the backchain from the first word, sp from the second and the
      literal pool base from the third.  */
 
-  if (TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN)
+  if (TARGET_BACKCHAIN)
     temp = force_reg (Pmode, operand_subword (operands[1], 0, 0, mode));
     
   emit_move_insn (base, operand_subword (operands[1], 2, 0, mode));
index e6a016a7771a4bf4ece3e2f3fa4c9cf2e6a316bb..33a50b47498a5f20aa08153299f0a3676b3aabb9 100644 (file)
@@ -58,10 +58,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    Also, enable TPF profiling support and the standard backchain by default.  */
 #undef TARGET_DEFAULT
 #define TARGET_DEFAULT         (MASK_64BIT | MASK_ZARCH | MASK_HARD_FLOAT \
-                                | MASK_TPF_PROFILING)
-#undef TARGET_DEFAULT_BACKCHAIN
-#define TARGET_DEFAULT_BACKCHAIN "1"
-
+                                | MASK_TPF_PROFILING | MASK_BACKCHAIN)
 /* Exception handling.  */
 
 /* Select a format to encode pointers in exception handling data.  */
index d6391dda24dddfc7ffde3dc255021dfd152b8572..5796474594a78f417ec800e9af81377fa3e04525 100644 (file)
@@ -623,7 +623,8 @@ See RS/6000 and PowerPC Options.
 
 @emph{S/390 and zSeries Options}
 @gccoptlist{-mtune=@var{cpu-type}  -march=@var{cpu-type} @gol
--mhard-float  -msoft-float  -mbackchain  -mno-backchain -mkernel-backchain @gol
+-mhard-float  -msoft-float  -mbackchain  -mno-backchain @gol
+-mpacked-stack  -mno-packed-stack @gol
 -msmall-exec  -mno-small-exec  -mmvcle -mno-mvcle @gol
 -m64  -m31  -mdebug  -mno-debug  -mesa  -mzarch @gol
 -mtpf-trace -mno-tpf-trace  -mfused-madd  -mno-fused-madd @gol
@@ -10827,27 +10828,49 @@ generates IEEE floating-point instructions.  This is the default.
 
 @item -mbackchain
 @itemx -mno-backchain
-@itemx -mkernel-backchain
 @opindex mbackchain
 @opindex mno-backchain
-@opindex mkernel-backchain
-In order to provide a backchain the address of the caller's frame
-is stored within the callee's stack frame.
+Store (do not store) the address of the caller's frame as backchain pointer
+into the callee's stack frame.
 A backchain may be needed to allow debugging using tools that do not understand
 DWARF-2 call frame information.
-For @option{-mno-backchain} no backchain is maintained at all which is the
-default.
-If one of the other options is present the backchain pointer is placed either
-on top of the stack frame  (@option{-mkernel-backchain}) or on
-the bottom (@option{-mbackchain}).
-Beside the different backchain location @option{-mkernel-backchain}
-also changes stack frame layout breaking the ABI@.  This option
-is intended to be used for code which internally needs a backchain but has
-to get by with a limited stack size e.g.@: the linux kernel.
-Internal unwinding code not using DWARF-2 info has to be able to locate the
-return address of a function.  That will be eased be the fact that
-the return address of a function is placed two words below the backchain
-pointer.
+When @option{-mno-packed-stack} is in effect, the backchain pointer is stored
+at the bottom of the stack frame; when @option{-mpacked-stack} is in effect,
+the backchain is placed into the topmost word of the 96/160 byte register
+save area.
+
+In general, code compiled with @option{-mbackchain} is call-compatible with
+code compiled with @option{-mmo-backchain}; however, use of the backchain
+for debugging purposes usually requires that the whole binary is built with
+@option{-mbackchain}.  Note that the combination of @option{-mbackchain} and
+@option{-mpacked-stack} generates code that is not ABI-compatible.
+
+The default is to not maintain the backchain.
+
+@item -mpacked-stack
+@item -mno-packed-stack
+@opindex mpacked-stack
+@opindex mno-packed-stack
+Use (do not use) the packed stack layout.  When @option{-mno-packed-stack} is
+specified, the compiler uses the all fields of the 96/160 byte register save
+area only for their default purpose; unused fields still take up stack space.
+When @option{-mpacked-stack} is specified, register save slots are densely
+packed at the top of the register save area; unused space is reused for other
+purposes, allowing for more efficient use of the available stack space.
+However, when @option{-mbackchain} is also in effect, the topmost word of
+the save area is always used to store the backchain, and the return address
+register is always saved two words below the backchain.
+
+As long as the stack frame backchain is not used, code generated with 
+@option{-mpacked-stack} is call-compatible with code generated with
+@option{-mno-packed-stack}.  Note that some non-FSF releases of GCC 2.95 for
+S/390 or zSeries generated code that uses the stack frame backchain at run
+time, not just for debugging purposes.  Such code is not call-compatible
+with code compiled with @option{-mpacked-stack}.  Also, note that the
+combination of @option{-mbackchain} and @option{-mpacked-stack} generates code
+that is not ABI-compatible.
+
+The default is to not use the packed stack layout.
 
 @item -msmall-exec
 @itemx -mno-small-exec