OSDN Git Service

* config/bfin/bfin.h (LOCAL_ALIGNMENT): Define.
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2007 11:57:49 +0000 (11:57 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2007 11:57:49 +0000 (11:57 +0000)
* config/bfin/bfin.c (bfin_local_alignment): New function.
* config/bfin/bfin-protos.h (bfin_local_alignment): Declare it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124570 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/bfin/bfin-protos.h
gcc/config/bfin/bfin.c
gcc/config/bfin/bfin.h

index 4c7ba63..a5b1469 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-08  Bernd Schmidt  <bernd.schmidt@analog.com>
+
+       * config/bfin/bfin.h (LOCAL_ALIGNMENT): Define.
+       * config/bfin/bfin.c (bfin_local_alignment): New function.
+       * config/bfin/bfin-protos.h (bfin_local_alignment): Declare it.
+
 2007-05-08  Chao-ying Fu  <fu@mips.com>
 
        * doc/md.texi (msub@var{m}@var{n}4, usub@var{m}@var{n}4): Document.
index 9495530..525ecd3 100644 (file)
@@ -86,6 +86,7 @@ extern void override_options (void);
 extern void asm_conditional_branch (rtx, rtx *, int, int);
 extern rtx bfin_gen_compare (rtx, Mmode);
 
+extern int bfin_local_alignment (tree, int);
 extern int bfin_return_in_memory (tree);
 extern void initialize_trampoline (rtx, rtx, rtx);
 extern bool bfin_legitimate_address_p (Mmode, rtx, int);
index a91e488..94849ce 100644 (file)
@@ -3045,6 +3045,24 @@ bfin_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp)
   return false;
 }
 \f
+/* Compute the alignment for a local 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.  */
+
+int
+bfin_local_alignment (tree type, int align)
+{
+  /* Increasing alignment for (relatively) big types allows the builtin
+     memcpy can use 32 bit loads/stores.  */
+  if (TYPE_SIZE (type)
+      && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+      && (TREE_INT_CST_LOW (TYPE_SIZE (type)) > 8
+         || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 32)
+    return 32;
+  return align;
+}
+\f
 /* Implement TARGET_SCHED_ISSUE_RATE.  */
 
 static int
index c2e75b2..5a779da 100644 (file)
@@ -227,6 +227,18 @@ extern const char *bfin_library_id_string;
 
 /*#define DATA_ALIGNMENT(TYPE, BASIC-ALIGN) for arrays.. */
 
+/* If defined, a C expression to compute the alignment for a local
+   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.  */
+
+#define LOCAL_ALIGNMENT(TYPE, ALIGN) bfin_local_alignment ((TYPE), (ALIGN))
+
 /* Make strings word-aligned so strcpy from constants will be faster.  */
 #define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
   (TREE_CODE (EXP) == STRING_CST        \