aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/tilegx
diff options
context:
space:
mode:
authorWalter Lee <walt@tilera.com>2014-01-25 20:26:31 +0000
committerWalter Lee <walt@gcc.gnu.org>2014-01-25 20:26:31 +0000
commit905c20c1239ab74388b3c9017356e7509d7cd845 (patch)
tree017057535d21524b879bc55c3a38370afbce581e /gcc/config/tilegx
parent8e90a6255fdf3cb39dbd2e80fc8e7c091834b68b (diff)
downloadgcc-905c20c1239ab74388b3c9017356e7509d7cd845.zip
gcc-905c20c1239ab74388b3c9017356e7509d7cd845.tar.gz
gcc-905c20c1239ab74388b3c9017356e7509d7cd845.tar.bz2
tilegx.c (tilegx_function_arg): Start 16-byte arguments on even registers.
2014-01-25 Walter Lee <walt@tilera.com> * config/tilegx/tilegx.c (tilegx_function_arg): Start 16-byte arguments on even registers. (tilegx_function_arg_advance): Ditto. (tilegx_gimplify_va_arg_expr): Align 16-byte var args to STACK_BOUNDARY. * config/tilegx/tilegx.h (STACK_BOUNDARY): Change to 16 bytes. (BIGGEST_ALIGNMENT): Ditto. (BIGGEST_FIELD_ALIGNMENT): Ditto. From-SVN: r207082
Diffstat (limited to 'gcc/config/tilegx')
-rw-r--r--gcc/config/tilegx/tilegx.c36
-rw-r--r--gcc/config/tilegx/tilegx.h6
2 files changed, 36 insertions, 6 deletions
diff --git a/gcc/config/tilegx/tilegx.c b/gcc/config/tilegx/tilegx.c
index 7694e31..f3c68e3 100644
--- a/gcc/config/tilegx/tilegx.c
+++ b/gcc/config/tilegx/tilegx.c
@@ -220,10 +220,18 @@ tilegx_function_arg (cumulative_args_t cum_v,
CUMULATIVE_ARGS cum = *get_cumulative_args (cum_v);
int byte_size = ((mode == BLKmode)
? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
+ bool doubleword_aligned_p;
if (cum >= TILEGX_NUM_ARG_REGS)
return NULL_RTX;
+ /* See whether the argument has doubleword alignment. */
+ doubleword_aligned_p =
+ tilegx_function_arg_boundary (mode, type) > BITS_PER_WORD;
+
+ if (doubleword_aligned_p)
+ cum += cum & 1;
+
/* The ABI does not allow parameters to be passed partially in reg
and partially in stack. */
if ((cum + (byte_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
@@ -245,6 +253,14 @@ tilegx_function_arg_advance (cumulative_args_t cum_v,
int byte_size = ((mode == BLKmode)
? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
int word_size = (byte_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+ bool doubleword_aligned_p;
+
+ /* See whether the argument has doubleword alignment. */
+ doubleword_aligned_p =
+ tilegx_function_arg_boundary (mode, type) > BITS_PER_WORD;
+
+ if (doubleword_aligned_p)
+ *cum += *cum & 1;
/* If the current argument does not fit in the pretend_args space,
skip over it. */
@@ -417,7 +433,7 @@ tilegx_setup_incoming_varargs (cumulative_args_t cum,
generates code equivalent to:
- paddedsize = (sizeof(TYPE) + 3) & -4;
+ paddedsize = (sizeof(TYPE) + 7) & -8;
if ( (VALIST.__args + paddedsize > VALIST.__skip)
& (VALIST.__args <= VALIST.__skip))
addr = VALIST.__skip + STACK_POINTER_OFFSET;
@@ -457,9 +473,23 @@ tilegx_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
size = int_size_in_bytes (type);
rsize = ((size + UNITS_PER_WORD - 1) / UNITS_PER_WORD) * UNITS_PER_WORD;
- /* Assert alignment assumption. */
- gcc_assert (STACK_BOUNDARY == PARM_BOUNDARY);
+ /* If the alignment of the type is greater than the default for a
+ parameter, align to the STACK_BOUNDARY. */
+ if (TYPE_ALIGN (type) > PARM_BOUNDARY)
+ {
+ /* Assert the only case we generate code for: when
+ stack boundary = 2 * parm boundary. */
+ gcc_assert (STACK_BOUNDARY == PARM_BOUNDARY * 2);
+
+ tmp = build2 (BIT_AND_EXPR, sizetype,
+ fold_convert (sizetype, unshare_expr (args)),
+ size_int (PARM_BOUNDARY / 8));
+ tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
+ unshare_expr (args), tmp);
+ gimplify_assign (unshare_expr (args), tmp, pre_p);
+ }
+
/* Build conditional expression to calculate addr. The expression
will be gimplified later. */
tmp = fold_build_pointer_plus_hwi (unshare_expr (args), rsize);
diff --git a/gcc/config/tilegx/tilegx.h b/gcc/config/tilegx/tilegx.h
index 68f466c..9eab51e 100644
--- a/gcc/config/tilegx/tilegx.h
+++ b/gcc/config/tilegx/tilegx.h
@@ -59,9 +59,9 @@
#define UNITS_PER_WORD 8
#define PARM_BOUNDARY BITS_PER_WORD
-#define STACK_BOUNDARY 64
+#define STACK_BOUNDARY 128
#define FUNCTION_BOUNDARY 64
-#define BIGGEST_ALIGNMENT 64
+#define BIGGEST_ALIGNMENT 128
#define STRICT_ALIGNMENT 1
#define INT_TYPE_SIZE 32
@@ -74,7 +74,7 @@
#define PCC_BITFIELD_TYPE_MATTERS 1
#define FASTEST_ALIGNMENT 64
-#define BIGGEST_FIELD_ALIGNMENT 64
+#define BIGGEST_FIELD_ALIGNMENT 128
#define WIDEST_HARDWARE_FP_SIZE 64
/* Unaligned moves trap and are very slow. */