Index: config/xtensa/xtensa.c =================================================================== --- config/xtensa/xtensa.c (revision 116401) +++ config/xtensa/xtensa.c (working copy) @@ -1,5 +1,5 @@ /* Subroutines for insn-output.c for Tensilica's Xtensa architecture. - Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica. This file is part of GCC. @@ -1470,7 +1470,7 @@ if (type && (TYPE_ALIGN (type) > BITS_PER_WORD)) { - int align = TYPE_ALIGN (type) / BITS_PER_WORD; + int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_WORD; *arg_words = (*arg_words + align - 1) & -align; } @@ -1486,6 +1486,20 @@ } +int +function_arg_boundary (enum machine_mode mode, tree type) +{ + unsigned int alignment; + + alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode); + if (alignment < PARM_BOUNDARY) + alignment = PARM_BOUNDARY; + if (alignment > STACK_BOUNDARY) + alignment = STACK_BOUNDARY; + return alignment; +} + + static bool xtensa_return_in_msb (tree valtype) { @@ -2185,7 +2199,7 @@ if (TYPE_ALIGN (type) > BITS_PER_WORD) { - int align = TYPE_ALIGN (type) / BITS_PER_UNIT; + int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_UNIT; t = build2 (PLUS_EXPR, integer_type_node, orig_ndx, build_int_cst (NULL_TREE, align - 1)); Index: config/xtensa/xtensa.h =================================================================== --- config/xtensa/xtensa.h (revision 116403) +++ config/xtensa/xtensa.h (working copy) @@ -1,5 +1,5 @@ /* Definitions of Tensilica's Xtensa target machine for GNU compiler. - Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica. This file is part of GCC. @@ -728,15 +728,7 @@ #define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \ function_arg (&CUM, MODE, TYPE, TRUE) -/* Specify function argument alignment. */ -#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \ - ((TYPE) != 0 \ - ? (TYPE_ALIGN (TYPE) <= PARM_BOUNDARY \ - ? PARM_BOUNDARY \ - : TYPE_ALIGN (TYPE)) \ - : (GET_MODE_ALIGNMENT (MODE) <= PARM_BOUNDARY \ - ? PARM_BOUNDARY \ - : GET_MODE_ALIGNMENT (MODE))) +#define FUNCTION_ARG_BOUNDARY function_arg_boundary /* Profiling Xtensa code is typically done with the built-in profiling feature of Tensilica's instruction set simulator, which does not