+2018-01-16 Richard Sandiford <richard.sandiford@linaro.org>
+
+ PR target/83858
+ * config/pa/pa.h (FUNCTION_ARG_SIZE): Delete.
+ * config/pa/pa-protos.h (pa_function_arg_size): Declare.
+ * config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Use
+ pa_function_arg_size instead of FUNCTION_ARG_SIZE.
+ * config/pa/pa.c (pa_function_arg_advance): Likewise.
+ (pa_function_arg, pa_arg_partial_bytes): Likewise.
+ (pa_function_arg_size): New function.
+
2018-01-16 Richard Sandiford <richard.sandiford@linaro.org>
* fold-const.c (fold_ternary_loc): Construct the vec_perm_indices
unsigned int);
extern void pa_hpux_asm_output_external (FILE *, tree, const char *);
extern HOST_WIDE_INT pa_initial_elimination_offset (int, int);
+extern HOST_WIDE_INT pa_function_arg_size (machine_mode, const_tree);
extern const int pa_magic_milli[];
const_tree type, bool named ATTRIBUTE_UNUSED)
{
CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
- int arg_size = FUNCTION_ARG_SIZE (mode, type);
+ int arg_size = pa_function_arg_size (mode, type);
cum->nargs_prototype--;
cum->words += (arg_size
if (mode == VOIDmode)
return NULL_RTX;
- arg_size = FUNCTION_ARG_SIZE (mode, type);
+ arg_size = pa_function_arg_size (mode, type);
/* If this arg would be passed partially or totally on the stack, then
this routine should return zero. pa_arg_partial_bytes will
if (!TARGET_64BIT)
return 0;
- if (FUNCTION_ARG_SIZE (mode, type) > 1 && (cum->words & 1))
+ if (pa_function_arg_size (mode, type) > 1 && (cum->words & 1))
offset = 1;
- if (cum->words + offset + FUNCTION_ARG_SIZE (mode, type) <= max_arg_words)
+ if (cum->words + offset + pa_function_arg_size (mode, type) <= max_arg_words)
/* Arg fits fully into registers. */
return 0;
else if (cum->words + offset >= max_arg_words)
return 8;
}
+/* Figure out the size in words of the function argument. The size
+ returned by this function should always be greater than zero because
+ we pass variable and zero sized objects by reference. */
+
+HOST_WIDE_INT
+pa_function_arg_size (machine_mode mode, const_tree type)
+{
+ if (mode != BLKmode)
+ return GET_MODE_SIZE (mode);
+ return CEIL (int_size_in_bytes (type), UNITS_PER_WORD);
+}
+
#include "gt-pa.h"
(CUM).indirect = 0, \
(CUM).nargs_prototype = 1000
-/* Figure out the size in words of the function argument. The size
- returned by this macro should always be greater than zero because
- we pass variable and zero sized objects by reference. */
-
-#define FUNCTION_ARG_SIZE(MODE, TYPE) \
- ((((MODE) != BLKmode \
- ? (HOST_WIDE_INT) GET_MODE_SIZE (MODE) \
- : int_size_in_bytes (TYPE)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
-
/* Determine where to put an argument to a function.
Value is zero to push the argument on the stack,
or a hard register in which to store the argument.
else \
{ \
int arg_size = \
- FUNCTION_ARG_SIZE (TYPE_MODE (DECL_ARG_TYPE (parm)),\
- DECL_ARG_TYPE (parm)); \
+ pa_function_arg_size (TYPE_MODE (DECL_ARG_TYPE (parm)),\
+ DECL_ARG_TYPE (parm)); \
/* Passing structs by invisible reference uses \
one general register. */ \
if (arg_size > 2 \