http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57949
--- Comment #3 from Bill Schmidt <wschmidt at gcc dot gnu.org> ---
The problem is target-specific, in config/rs6000/rs6000.c:
rs6000_function_arg_boundary().
static unsigned int
rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
{
if (DEFAULT_ABI == ABI_V4
&& (GET_MODE_SIZE (mode) == 8
|| (TARGET_HARD_FLOAT
&& TARGET_FPRS
&& (mode == TFmode || mode == TDmode))))
return 64;
else if (SPE_VECTOR_MODE (mode)
|| (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) >= 8
&& int_size_in_bytes (type) < 16))
return 64;
else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
|| (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) >= 16))
return 128;
else if (TARGET_MACHO
&& rs6000_darwin64_abi
&& mode == BLKmode
&& type && TYPE_ALIGN (type) > 64)
return 128;
else
return PARM_BOUNDARY;
}
Note that the TARGET_MACHO + Darwin ABI case does what the 64-bit PowerPC ELF
ABI implies should be done. It's not clear to me why that ABI is excluded.