Commit 905c20c1 by Walter Lee Committed by Walter Lee

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
parent 8e90a625
2014-01-25 Walter Lee <walt@tilera.com> 2014-01-25 Walter Lee <walt@tilera.com>
* config/tilegx/tilegx.c (tilegx_function_arg): Start 16-byte
arguments on even registers.
(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.
2014-01-25 Walter Lee <walt@tilera.com>
* config/tilegx/tilegx.c (tilegx_gen_bundles): Delete barrier * config/tilegx/tilegx.c (tilegx_gen_bundles): Delete barrier
insns before bundling. insns before bundling.
* config/tilegx/tilegx.md (tile_network_barrier): Update * config/tilegx/tilegx.md (tile_network_barrier): Update
......
...@@ -220,10 +220,18 @@ tilegx_function_arg (cumulative_args_t cum_v, ...@@ -220,10 +220,18 @@ tilegx_function_arg (cumulative_args_t cum_v,
CUMULATIVE_ARGS cum = *get_cumulative_args (cum_v); CUMULATIVE_ARGS cum = *get_cumulative_args (cum_v);
int byte_size = ((mode == BLKmode) int byte_size = ((mode == BLKmode)
? int_size_in_bytes (type) : GET_MODE_SIZE (mode)); ? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
bool doubleword_aligned_p;
if (cum >= TILEGX_NUM_ARG_REGS) if (cum >= TILEGX_NUM_ARG_REGS)
return NULL_RTX; 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 /* The ABI does not allow parameters to be passed partially in reg
and partially in stack. */ and partially in stack. */
if ((cum + (byte_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD) if ((cum + (byte_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
...@@ -245,6 +253,14 @@ tilegx_function_arg_advance (cumulative_args_t cum_v, ...@@ -245,6 +253,14 @@ tilegx_function_arg_advance (cumulative_args_t cum_v,
int byte_size = ((mode == BLKmode) int byte_size = ((mode == BLKmode)
? int_size_in_bytes (type) : GET_MODE_SIZE (mode)); ? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
int word_size = (byte_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; 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, /* If the current argument does not fit in the pretend_args space,
skip over it. */ skip over it. */
...@@ -417,7 +433,7 @@ tilegx_setup_incoming_varargs (cumulative_args_t cum, ...@@ -417,7 +433,7 @@ tilegx_setup_incoming_varargs (cumulative_args_t cum,
generates code equivalent to: generates code equivalent to:
paddedsize = (sizeof(TYPE) + 3) & -4; paddedsize = (sizeof(TYPE) + 7) & -8;
if ( (VALIST.__args + paddedsize > VALIST.__skip) if ( (VALIST.__args + paddedsize > VALIST.__skip)
& (VALIST.__args <= VALIST.__skip)) & (VALIST.__args <= VALIST.__skip))
addr = VALIST.__skip + STACK_POINTER_OFFSET; addr = VALIST.__skip + STACK_POINTER_OFFSET;
...@@ -457,9 +473,23 @@ tilegx_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, ...@@ -457,9 +473,23 @@ tilegx_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
size = int_size_in_bytes (type); size = int_size_in_bytes (type);
rsize = ((size + UNITS_PER_WORD - 1) / UNITS_PER_WORD) * UNITS_PER_WORD; rsize = ((size + UNITS_PER_WORD - 1) / UNITS_PER_WORD) * UNITS_PER_WORD;
/* Assert alignment assumption. */ /* If the alignment of the type is greater than the default for a
gcc_assert (STACK_BOUNDARY == PARM_BOUNDARY); 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 /* Build conditional expression to calculate addr. The expression
will be gimplified later. */ will be gimplified later. */
tmp = fold_build_pointer_plus_hwi (unshare_expr (args), rsize); tmp = fold_build_pointer_plus_hwi (unshare_expr (args), rsize);
......
...@@ -59,9 +59,9 @@ ...@@ -59,9 +59,9 @@
#define UNITS_PER_WORD 8 #define UNITS_PER_WORD 8
#define PARM_BOUNDARY BITS_PER_WORD #define PARM_BOUNDARY BITS_PER_WORD
#define STACK_BOUNDARY 64 #define STACK_BOUNDARY 128
#define FUNCTION_BOUNDARY 64 #define FUNCTION_BOUNDARY 64
#define BIGGEST_ALIGNMENT 64 #define BIGGEST_ALIGNMENT 128
#define STRICT_ALIGNMENT 1 #define STRICT_ALIGNMENT 1
#define INT_TYPE_SIZE 32 #define INT_TYPE_SIZE 32
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
#define PCC_BITFIELD_TYPE_MATTERS 1 #define PCC_BITFIELD_TYPE_MATTERS 1
#define FASTEST_ALIGNMENT 64 #define FASTEST_ALIGNMENT 64
#define BIGGEST_FIELD_ALIGNMENT 64 #define BIGGEST_FIELD_ALIGNMENT 128
#define WIDEST_HARDWARE_FP_SIZE 64 #define WIDEST_HARDWARE_FP_SIZE 64
/* Unaligned moves trap and are very slow. */ /* Unaligned moves trap and are very slow. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment