i386.c (i386_preferred_stack_boundary_string): New global variable.
authorJan Hubicka <hubicka@freesoft.cz>
Sat, 17 Apr 1999 21:13:53 +0000 (23:13 +0200)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 17 Apr 1999 21:13:53 +0000 (14:13 -0700)
        * i386.c (i386_preferred_stack_boundary_string): New global variable.
        (i386_preferred_stack_boundary): New global variable.
        (override_functions): Set it.  Tidy option setting code.
        * i386.h (TARGET_OPTIONS): New command line option.
        (i386_preferred_stack_boundary_string): Declare it.
        (i386_preferred_stack_boundary): Likewise.
        (PREFERRED_STACK_BOUNDARY): Use i386_preferred_stack_boundary.

From-SVN: r26527

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

index 0201f21d1223e81099e996e64183683a1f6865b4..ae4dd94ee9035c2ad9ac29fd2844edb4fef2860c 100644 (file)
@@ -1,3 +1,13 @@
+Sat Apr 17 21:10:10 1999  Jan Hubicka <hubicka@freesoft.cz>
+
+        * i386.c (i386_preferred_stack_boundary_string): New global variable.
+        (i386_preferred_stack_boundary): New global variable.
+        (override_functions): Set it.  Tidy option setting code.
+        * i386.h (TARGET_OPTIONS): New command line option.
+        (i386_preferred_stack_boundary_string): Declare it.
+        (i386_preferred_stack_boundary): Likewise.
+        (PREFERRED_STACK_BOUNDARY): Use i386_preferred_stack_boundary.
+
 Sat Apr 17 19:22:38 1999  Jan Hubicka <hubicka@freesoft.cz>
 
        * i386.c (k6_cost): Take into account the decoding time.
index b5173d6a2cbb08a37b15dc1080d3c9369779c3d8..dab03008ac23241b6481a41687618eeeed55f737 100644 (file)
@@ -203,6 +203,12 @@ char *i386_align_loops_string;
 /* Power of two alignment for non-loop jumps. */
 char *i386_align_jumps_string;
 
+/* Power of two alignment for stack boundary in bytes.  */
+char *i386_preferred_stack_boundary_string;
+
+/* Preferred alignment for stack boundary in bits.  */
+int i386_preferred_stack_boundary;
+
 /* Values 1-5: see jump.c */
 int i386_branch_cost;
 char *i386_branch_cost_string;
@@ -239,16 +245,16 @@ override_options ()
       struct processor_costs *cost; /* Processor costs */
       int target_enable;       /* Target flags to enable.  */
       int target_disable;      /* Target flags to disable.  */
-    } processor_target_table[]
-      = {{PROCESSOR_I386_STRING, PROCESSOR_I386, &i386_cost, 0, 0},
-          {PROCESSOR_I486_STRING, PROCESSOR_I486, &i486_cost, 0, 0},
-          {PROCESSOR_I586_STRING, PROCESSOR_PENTIUM, &pentium_cost, 0, 0},
-          {PROCESSOR_PENTIUM_STRING, PROCESSOR_PENTIUM, &pentium_cost, 0, 0},
-          {PROCESSOR_I686_STRING, PROCESSOR_PENTIUMPRO, &pentiumpro_cost,
-             0, 0},
-          {PROCESSOR_PENTIUMPRO_STRING, PROCESSOR_PENTIUMPRO,
-             &pentiumpro_cost, 0, 0},
-          {PROCESSOR_K6_STRING, PROCESSOR_K6, &k6_cost, 0, 0}};
+    } processor_target_table[] = {
+      {PROCESSOR_I386_STRING, PROCESSOR_I386, &i386_cost, 0, 0},
+      {PROCESSOR_I486_STRING, PROCESSOR_I486, &i486_cost, 0, 0},
+      {PROCESSOR_I586_STRING, PROCESSOR_PENTIUM, &pentium_cost, 0, 0},
+      {PROCESSOR_PENTIUM_STRING, PROCESSOR_PENTIUM, &pentium_cost, 0, 0},
+      {PROCESSOR_I686_STRING, PROCESSOR_PENTIUMPRO, &pentiumpro_cost, 0, 0},
+      {PROCESSOR_PENTIUMPRO_STRING, PROCESSOR_PENTIUMPRO,
+       &pentiumpro_cost, 0, 0},
+      {PROCESSOR_K6_STRING, PROCESSOR_K6, &k6_cost, 0, 0}
+    };
 
   int ptt_size = sizeof (processor_target_table) / sizeof (struct ptt);
 
@@ -346,6 +352,11 @@ override_options ()
   def_align = (TARGET_486) ? 4 : 2;
 
   /* Validate -malign-loops= value, or provide default.  */
+#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
+  i386_align_loops = 4;
+#else
+  i386_align_loops = 2;
+#endif
   if (i386_align_loops_string)
     {
       i386_align_loops = atoi (i386_align_loops_string);
@@ -353,14 +364,13 @@ override_options ()
        fatal ("-malign-loops=%d is not between 0 and %d",
               i386_align_loops, MAX_CODE_ALIGN);
     }
-  else
+
+  /* Validate -malign-jumps= value, or provide default.  */
 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
-    i386_align_loops = 4;
+  i386_align_jumps = 4;
 #else
-    i386_align_loops = 2;
+  i386_align_jumps = def_align;
 #endif
-
-  /* Validate -malign-jumps= value, or provide default.  */
   if (i386_align_jumps_string)
     {
       i386_align_jumps = atoi (i386_align_jumps_string);
@@ -368,14 +378,9 @@ override_options ()
        fatal ("-malign-jumps=%d is not between 0 and %d",
               i386_align_jumps, MAX_CODE_ALIGN);
     }
-  else
-#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
-    i386_align_jumps = 4;
-#else
-    i386_align_jumps = def_align;
-#endif
 
   /* Validate -malign-functions= value, or provide default. */
+  i386_align_funcs = def_align;
   if (i386_align_funcs_string)
     {
       i386_align_funcs = atoi (i386_align_funcs_string);
@@ -383,19 +388,26 @@ override_options ()
        fatal ("-malign-functions=%d is not between 0 and %d",
               i386_align_funcs, MAX_CODE_ALIGN);
     }
-  else
-    i386_align_funcs = def_align;
+
+  /* Validate -mpreferred_stack_boundary= value, or provide default.
+     The default of 128 bits is for Pentium III's SSE __m128.  */
+  i386_preferred_stack_boundary = 128;
+  if (i386_preferred_stack_boundary_string)
+    {
+      i = atoi (i386_preferred_stack_boundary_string);
+      if (i < 2 || i > 31)
+       fatal ("-mpreferred_stack_boundary=%d is not between 2 and 31", i);
+      i386_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
+    }
 
   /* Validate -mbranch-cost= value, or provide default. */
+  i386_branch_cost = 1;
   if (i386_branch_cost_string)
     {
       i386_branch_cost = atoi (i386_branch_cost_string);
       if (i386_branch_cost < 0 || i386_branch_cost > 5)
-       fatal ("-mbranch-cost=%d is not between 0 and 5",
-              i386_branch_cost);
+       fatal ("-mbranch-cost=%d is not between 0 and 5", i386_branch_cost);
     }
-  else
-    i386_branch_cost = 1;
 
   /* Keep nonleaf frame pointers.  */
   if (TARGET_OMIT_LEAF_FRAME_POINTER)
index b4854714a484371edc2583a4d492b093f1640c3c..6b0045922efe751c57b160872f5fcf82f5281510 100644 (file)
@@ -182,10 +182,10 @@ extern const int x86_double_with_add;
   { "hard-float",               MASK_80387, "Use hardware fp" },       \
   { "soft-float",              -MASK_80387, "Do not use hardware fp" },\
   { "no-soft-float",            MASK_80387, "Use hardware fp" },       \
-  { "386",                      0, "Optimize for i80386" },            \
-  { "486",                      0, "Optimize for i80486" },            \
-  { "pentium",                  0, "Optimize for Pentium" },           \
-  { "pentiumpro",               0, "Optimize for Pentium Pro, Pentium II" },\
+  { "386",                      0, "Same as -mcpu=i386" },             \
+  { "486",                      0, "Same as -mcpu=i486" },             \
+  { "pentium",                  0, "Same as -mcpu=pentium" },          \
+  { "pentiumpro",               0, "Same as -mcpu=pentiumpro" },       \
   { "rtd",                      MASK_RTD, "Alternate calling convention" },\
   { "no-rtd",                  -MASK_RTD, "Use normal calling convention" },\
   { "align-double",             MASK_ALIGN_DOUBLE, "Align some doubles on dword boundary" },\
@@ -265,6 +265,7 @@ extern int ix86_arch;
   { "align-loops=",    &i386_align_loops_string, "Loop code aligned to this power of 2" }, \
   { "align-jumps=",    &i386_align_jumps_string, "Jump targets are aligned to this power of 2" }, \
   { "align-functions=",        &i386_align_funcs_string, "Function starts are aligned to this power of 2" }, \
+  { "preferred-stack-boundary=", &i386_preferred_stack_boundary_string, "Attempt to keep stack aligned to this power of 2" }, \
   { "branch-cost=",    &i386_branch_cost_string, "Branches are this expensive (1-5, arbitrary units)" },                       \
   SUBTARGET_OPTIONS                                                    \
 }
@@ -407,13 +408,12 @@ extern int ix86_arch;
 /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
 #define PARM_BOUNDARY 32
 
-/* Boundary (in *bits*) on which stack pointer should be aligned.  */
+/* Boundary (in *bits*) on which the stack pointer must be aligned.  */
 #define STACK_BOUNDARY 32
 
-/* We want to keep the stack aligned to 128 bits when possible, for the
-   benefit of doubles and SSE __m128.  But the compiler can not rely on
-   the stack having this alignment.*/
-#define PREFERRED_STACK_BOUNDARY 128
+/* Boundary (in *bits*) on which the stack pointer preferrs to be
+   aligned; the compiler cannot rely on having this alignment.  */
+#define PREFERRED_STACK_BOUNDARY i386_preferred_stack_boundary
 
 /* Allocation boundary (in *bits*) for the code of a function.
    For i486, we get better performance by aligning to a cache
@@ -2781,11 +2781,13 @@ extern char *i386_regparm_string;               /* # registers to use to pass args */
 extern char *i386_align_loops_string;          /* power of two alignment for loops */
 extern char *i386_align_jumps_string;          /* power of two alignment for non-loop jumps */
 extern char *i386_align_funcs_string;          /* power of two alignment for functions */
+extern char *i386_preferred_stack_boundary_string;/* power of two alignment for stack boundary */
 extern char *i386_branch_cost_string;          /* values 1-5: see jump.c */
 extern int i386_regparm;                       /* i386_regparm_string as a number */
 extern int i386_align_loops;                   /* power of two alignment for loops */
 extern int i386_align_jumps;                   /* power of two alignment for non-loop jumps */
 extern int i386_align_funcs;                   /* power of two alignment for functions */
+extern int i386_preferred_stack_boundary;      /* preferred stack boundary alignment in bits */
 extern int i386_branch_cost;                   /* values 1-5: see jump.c */
 extern char *hi_reg_name[];                    /* names for 16 bit regs */
 extern char *qi_reg_name[];                    /* names for 8 bit regs (low) */
index a8eb92369dcc4b248a2159f58484fe48729f0a84..9a7ebb1259241d8a86470cd9ea81b14eb0549520 100644 (file)
@@ -342,7 +342,7 @@ in the following sections.
 -mno-wide-multiply  -mrtd  -malign-double
 -mreg-alloc=@var{list}  -mregparm=@var{num}
 -malign-jumps=@var{num}  -malign-loops=@var{num}
--malign-functions=@var{num}
+-malign-functions=@var{num} -mpreferred_stack_boundary=@var{num}
 
 @emph{HPPA Options}
 -mbig-switch  -mdisable-fpregs  -mdisable-indexing  
@@ -5172,6 +5172,32 @@ If @samp{-malign-functions} is not specified, the default is 2 if optimizing
 for a 386, and 4 if optimizing for a 486.
 @end table
 
+@item -mpreferred-stack-boundary=@var{num}
+Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
+byte boundary.  If @samp{-mpreferred-stack-boundary} is not specified,
+the default is 4 (16 bytes or 128 bits).
+
+The stack is required to be aligned on a 4 byte boundary.  On Pentium
+and PentiumPro, @code{double} and @code{long double} values should be
+aligned to an 8 byte boundary (see @samp{-malign-double}) or suffer
+significant run time performance penalties.  On Pentium III, the
+Streaming SIMD Extention (SSE) data type @code{__m128} suffers similar
+penalties if it is not 16 byte aligned.
+
+To ensure proper alignment of this values on the stack, the stack boundary
+must be as aligned as that required by any value stored on the stack. 
+Further, every function must be generated such that it keeps the stack
+aligned.  Thus calling a function compiled with a higher preferred
+stack boundary from a function compiled with a lower preferred stack
+boundary will most likely misalign the stack.  It is recommended that
+libraries that use callbacks always use the default setting.
+
+This extra alignment does consume extra stack space.  Code that is sensitive
+to stack space usage, such as embedded systems and operating system kernels,
+may want to reduce the preferred alignment to
+@samp{-mpreferred-stack-boundary=2}.
+@end table
+
 @node HPPA Options
 @subsection HPPA Options
 @cindex HPPA Options