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.

Reply via email to