s390.c (s390_frame_info): Added alignment statement for floating point register area...
authorAndreas Krebbel <krebbel1@de.ibm.com>
Mon, 20 Sep 2004 17:25:39 +0000 (17:25 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Mon, 20 Sep 2004 17:25:39 +0000 (17:25 +0000)
2004-09-20  Andreas Krebbel  <krebbel1@de.ibm.com>

* config/s390/s390.c (s390_frame_info): Added alignment statement for
floating point register area on stack.

From-SVN: r87765

gcc/ChangeLog
gcc/config/s390/s390.c

index ec5ed7993aa66881bb01756a45596ef1f3f8f0af..39dc5aabc7028a2a3437dc467ae3d7d344621a5b 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-20  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+       * config/s390/s390.c (s390_frame_info): Added alignment statement for
+       floating point register area on stack.
+
 2004-09-20  Jakub Jelinek  <jakub@redhat.com>
 
        * predict.c (expr_expected_value): Use *_CLASS_P macros.
index f59317a68037d6b2db26b56a97d94252111bf904..2dd515b95cb007c89d7573639f55b33758aa8540 100644 (file)
@@ -5958,8 +5958,11 @@ s390_frame_info (int base_used, int return_addr_used)
        }
       else
        {
+         /* On 31 bit we have to care about alignment of the
+            floating point regs to provide fastest access.  */
          cfun_frame_layout.f0_offset 
-           = (cfun_frame_layout.gprs_offset
+           = ((cfun_frame_layout.gprs_offset 
+               & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1))
               - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
          
          cfun_frame_layout.f4_offset 
@@ -5996,7 +5999,9 @@ s390_frame_info (int base_used, int return_addr_used)
     {
       cfun_frame_layout.frame_size += (cfun_frame_layout.save_backchain_p
                                       * UNITS_PER_WORD);
-      
+
+      /* No alignment trouble here because f8-f15 are only saved under 
+        64 bit.  */
       cfun_frame_layout.f8_offset = (MIN (MIN (cfun_frame_layout.f0_offset,
                                               cfun_frame_layout.f4_offset),
                                          cfun_frame_layout.gprs_offset)
@@ -6009,6 +6014,9 @@ s390_frame_info (int base_used, int return_addr_used)
          cfun_frame_layout.frame_size += 8;
       
       cfun_frame_layout.frame_size += cfun_gprs_save_area_size;
+      
+      /* If under 31 bit an odd number of gprs has to be saved we have to adjust
+        the frame size to sustain 8 byte alignment of stack frames.  */
       cfun_frame_layout.frame_size = ((cfun_frame_layout.frame_size +
                                       STACK_BOUNDARY / BITS_PER_UNIT - 1)
                                      & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1));
@@ -7150,6 +7158,10 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
       indirect_p = 1;
       reg = gpr;
       n_reg = 1;
+
+      /* 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);
       sav_scale = UNITS_PER_WORD;
@@ -7185,6 +7197,10 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
       indirect_p = 0;
       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;