sh.c (sh_expand_prologue, [...]): If TARGET_DOUBLE_ALIGN, preserve 64 bit stack align...
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Mon, 27 Apr 1998 10:26:39 +0000 (10:26 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Mon, 27 Apr 1998 10:26:39 +0000 (11:26 +0100)
        * sh.c (sh_expand_prologue, sh_expand_epilogue):
        If TARGET_DOUBLE_ALIGN, preserve 64 bit stack alignment.
        * sh.h (STACK_BOUNDARY): Likewise.

From-SVN: r19430

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/invoke.texi

index b71f1ad6196797588ec69f13cd36dfd1a4c78a63..0390e7a58b88f11bd81afa1d77b5ed054302a72a 100644 (file)
@@ -1,3 +1,9 @@
+Mon Apr 27 18:23:51 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+        * sh.c (sh_expand_prologue, sh_expand_epilogue):
+        If TARGET_DOUBLE_ALIGN, preserve 64 bit stack alignment.
+        * sh.h (STACK_BOUNDARY): Likewise.
+
 Mon Apr 27 17:22:48 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
 
        * sh.h (LEGITIMIZE_RELOAD_ADDRESS): Define.
index 437164c924a13ddcf4e4fa90f0279585aa7f57ec..03f6b8a5f5a6a985eac4adbf00e4f81fa2bcc1c4 100644 (file)
@@ -3467,6 +3467,7 @@ sh_expand_prologue ()
   int live_regs_mask;
   int d, i;
   int live_regs_mask2;
+  int double_align = 0;
 
   /* We have pretend args if we had an object sent partially in registers
      and partially on the stack, e.g. a large structure.  */
@@ -3505,7 +3506,11 @@ sh_expand_prologue ()
   live_regs_mask = calc_live_regs (&d, &live_regs_mask2);
   push_regs (live_regs_mask, live_regs_mask2);
 
-  output_stack_adjust (-get_frame_size (), stack_pointer_rtx, 3);
+  if (TARGET_ALIGN_DOUBLE && d & 1)
+    double_align = 4;
+
+  output_stack_adjust (-get_frame_size () - double_align,
+                      stack_pointer_rtx, 3);
 
   if (frame_pointer_needed)
     emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
@@ -3518,10 +3523,16 @@ sh_expand_epilogue ()
   int d, i;
 
   int live_regs_mask2;
+  int frame_size = get_frame_size ();
+
+  live_regs_mask = calc_live_regs (&d, &live_regs_mask2);
+
+  if (TARGET_ALIGN_DOUBLE && d & 1)
+    frame_size += 4;
 
   if (frame_pointer_needed)
     {
-      output_stack_adjust (get_frame_size (), frame_pointer_rtx, 7);
+      output_stack_adjust (frame_size, frame_pointer_rtx, 7);
 
       /* We must avoid moving the stack pointer adjustment past code
         which reads from the local frame, else an interrupt could
@@ -3530,14 +3541,14 @@ sh_expand_epilogue ()
       emit_insn (gen_blockage ());
       emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
     }
-  else if (get_frame_size ())
+  else if (frame_size)
     {
       /* We must avoid moving the stack pointer adjustment past code
         which reads from the local frame, else an interrupt could
         occur after the SP adjustment and clobber data in the local
         frame.  */
       emit_insn (gen_blockage ());
-      output_stack_adjust (get_frame_size (), stack_pointer_rtx, 7);
+      output_stack_adjust (frame_size, stack_pointer_rtx, 7);
     }
 
   /* Pop all the registers.  */
index b4e921c1c0bf0b7174a487f332db11ba53971ee9..dce9acb1acdbe24eb600abd762a7eb382ce71638 100644 (file)
@@ -231,7 +231,7 @@ do {                                                                \
 #define PARM_BOUNDARY          32
 
 /* Boundary (in *bits*) on which stack pointer should be aligned.  */
-#define STACK_BOUNDARY  32
+#define STACK_BOUNDARY  BIGGEST_ALIGNMENT
 
 /* The log (base 2) of the cache line size, in bytes.  Processors prior to
    SH3 have no actual cache, but they fetch code in chunks of 4 bytes.  */
index 52e2f8de332d97f8f92b20457611e3e811e8eafa..a7c9c2ea48bec13b0ecb73d2ebc45d48de95f4b3 100644 (file)
@@ -371,7 +371,7 @@ in the following sections.
 -mrelax  -mh -ms -mint32  -malign-300
 
 @emph{SH Options}
--m1  -m2  -m3  -m3e  -mb  -ml  -mrelax
+-m1  -m2  -m3  -m3e  -mb  -ml  -mdalign -mrelax
 
 @emph{System V Options}
 -Qy  -Qn  -YP,@var{paths}  -Ym,@var{dir}
@@ -5373,6 +5373,11 @@ Compile code for the processor in big endian mode.
 @item -ml
 Compile code for the processor in little endian mode.
 
+@item -mdalign
+Align doubles at 64 bit boundaries.  Note that this changes the calling
+conventions, and thus some functions from the standard C library will
+not work unless you recompile it first with -mdalign.
+
 @item -mrelax
 Shorten some address references at link time, when possible; uses the
 linker option @samp{-relax}.