This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

i386 initialized data alignment patch


Hello,

This change implements the alignment of initialized data following
the recommendations of the "Intel Architecture Optimization Manual".

ChangeLog:

Sun Mar  1 20:27:32 EST 1998  John Wehle  (john@feith.com)

	* i386.h (DATA_ALIGNMENT): Define.

Notes:

  1) Some assemblers silencely enforce a maximum limit on the alignment
     which prevents some objects from actually receiving the recommended
     alignment.  For example, Intel recommends the 32 byte or greater
     objects be aligned on 32 byte boundaries, however gas 2.8.1 doesn't
     allow this (it truncates the alignment).

Enjoy!

-- John Wehle
------------------8<------------------------8<------------------------
*** gcc/config/i386/i386.h.ORIGINAL	Fri Feb 13 20:13:58 1998
--- gcc/config/i386/i386.h	Sun Mar  1 00:24:59 1998
***************
*** 427,432 ****
--- 427,480 ----
  /* align DFmode constants and nonaggregates */
  #define ALIGN_DFmode (!TARGET_386)
  
+ /* If defined, a C expression to compute the alignment for a static
+    variable.  TYPE is the data type, and ALIGN is the alignment that
+    the object would ordinarily have.  The value of this macro is used
+    instead of that alignment to align the object.
+ 
+    If this macro is not defined, then ALIGN is used.
+ 
+    One use of this macro is to increase alignment of medium-size
+    data to make it all fit in fewer cache lines.  Another is to
+    cause character arrays to be word-aligned so that `strcpy' calls
+    that copy constants to character arrays can be done inline.  */
+ 
+ #define DATA_ALIGNMENT(TYPE, ALIGN)					\
+   ((AGGREGATE_TYPE_P (TYPE)						\
+     && TYPE_SIZE (TYPE)							\
+     && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST			\
+     && (TREE_INT_CST_LOW (TYPE_SIZE (TYPE)) >= 256			\
+ 	|| TREE_INT_CST_HIGH (TYPE_SIZE (TYPE))) && (ALIGN) < 256)	\
+     ? 256								\
+     : TREE_CODE (TYPE) == ARRAY_TYPE					\
+     ? ((TYPE_MODE (TREE_TYPE (TYPE)) == DFmode && (ALIGN) < 64)	\
+ 	? 64								\
+    	: (TYPE_MODE (TREE_TYPE (TYPE)) == XFmode && (ALIGN) < 128)	\
+ 	? 128								\
+ 	: (ALIGN))							\
+     : TREE_CODE (TYPE) == COMPLEX_TYPE					\
+     ? ((TYPE_MODE (TYPE) == DCmode && (ALIGN) < 64)			\
+ 	? 64								\
+    	: (TYPE_MODE (TYPE) == XCmode && (ALIGN) < 128)			\
+ 	? 128								\
+ 	: (ALIGN))							\
+     : ((TREE_CODE (TYPE) == RECORD_TYPE					\
+ 	|| TREE_CODE (TYPE) == UNION_TYPE				\
+ 	|| TREE_CODE (TYPE) == QUAL_UNION_TYPE)				\
+ 	&& TYPE_FIELDS (TYPE))						\
+     ? ((DECL_MODE (TYPE_FIELDS (TYPE)) == DFmode && (ALIGN) < 64)	\
+ 	? 64								\
+ 	: (DECL_MODE (TYPE_FIELDS (TYPE)) == XFmode && (ALIGN) < 128)	\
+ 	? 128								\
+ 	: (ALIGN))							\
+     : TREE_CODE (TYPE) == REAL_TYPE					\
+     ? ((TYPE_MODE (TYPE) == DFmode && (ALIGN) < 64)			\
+ 	? 64								\
+    	: (TYPE_MODE (TYPE) == XFmode && (ALIGN) < 128)			\
+ 	? 128								\
+ 	: (ALIGN))							\
+     : (ALIGN))
+ 
  /* Set this non-zero if move instructions will actually fail to work
     when given unaligned data.  */
  #define STRICT_ALIGNMENT 0
-------------------------------------------------------------------------
|   Feith Systems  |   Voice: 1-215-646-8000  |  Email: john@feith.com  |
|    John Wehle    |     Fax: 1-215-540-5495  |                         |
-------------------------------------------------------------------------



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]