On Mon, Oct 23, 2017 at 1:22 PM, Richard Sandiford <richard.sandif...@linaro.org> wrote: > This patch adds a POD version of fixed_size_mode. The only current use > is for storing the __builtin_apply and __builtin_result register modes, > which were made fixed_size_modes by the previous patch.
Bah - can we update our host compiler to C++11/14 please ...? (maybe requiring that build with GCC 4.8 as host compiler works, GCC 4.3 has -std=c++0x, but I'm quite sure that's not enough). Ok. Thanks, Richard. > > 2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> > Alan Hayward <alan.hayw...@arm.com> > David Sherwood <david.sherw...@arm.com> > > gcc/ > * coretypes.h (fixed_size_mode): Declare. > (fixed_size_mode_pod): New typedef. > * builtins.h (target_builtins::x_apply_args_mode) > (target_builtins::x_apply_result_mode): Change type to > fixed_size_mode_pod. > * builtins.c (apply_args_size, apply_result_size, result_vector) > (expand_builtin_apply_args_1, expand_builtin_apply) > (expand_builtin_return): Update accordingly. > > Index: gcc/coretypes.h > =================================================================== > --- gcc/coretypes.h 2017-09-11 17:10:58.656085547 +0100 > +++ gcc/coretypes.h 2017-10-23 11:42:57.592545063 +0100 > @@ -59,6 +59,7 @@ typedef const struct rtx_def *const_rtx; > class scalar_int_mode; > class scalar_float_mode; > class complex_mode; > +class fixed_size_mode; > template<typename> class opt_mode; > typedef opt_mode<scalar_mode> opt_scalar_mode; > typedef opt_mode<scalar_int_mode> opt_scalar_int_mode; > @@ -66,6 +67,7 @@ typedef opt_mode<scalar_float_mode> opt_ > template<typename> class pod_mode; > typedef pod_mode<scalar_mode> scalar_mode_pod; > typedef pod_mode<scalar_int_mode> scalar_int_mode_pod; > +typedef pod_mode<fixed_size_mode> fixed_size_mode_pod; > > /* Subclasses of rtx_def, using indentation to show the class > hierarchy, along with the relevant invariant. > Index: gcc/builtins.h > =================================================================== > --- gcc/builtins.h 2017-08-30 12:18:46.602740973 +0100 > +++ gcc/builtins.h 2017-10-23 11:42:57.592545063 +0100 > @@ -29,14 +29,14 @@ struct target_builtins { > the register is not used for calling a function. If the machine > has register windows, this gives only the outbound registers. > INCOMING_REGNO gives the corresponding inbound register. */ > - machine_mode x_apply_args_mode[FIRST_PSEUDO_REGISTER]; > + fixed_size_mode_pod x_apply_args_mode[FIRST_PSEUDO_REGISTER]; > > /* For each register that may be used for returning values, this gives > a mode used to copy the register's value. VOIDmode indicates the > register is not used for returning values. If the machine has > register windows, this gives only the outbound registers. > INCOMING_REGNO gives the corresponding inbound register. */ > - machine_mode x_apply_result_mode[FIRST_PSEUDO_REGISTER]; > + fixed_size_mode_pod x_apply_result_mode[FIRST_PSEUDO_REGISTER]; > }; > > extern struct target_builtins default_target_builtins; > Index: gcc/builtins.c > =================================================================== > --- gcc/builtins.c 2017-10-23 11:41:23.140260335 +0100 > +++ gcc/builtins.c 2017-10-23 11:42:57.592545063 +0100 > @@ -1358,7 +1358,6 @@ apply_args_size (void) > static int size = -1; > int align; > unsigned int regno; > - machine_mode mode; > > /* The values computed by this function never change. */ > if (size < 0) > @@ -1374,7 +1373,7 @@ apply_args_size (void) > for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) > if (FUNCTION_ARG_REGNO_P (regno)) > { > - mode = targetm.calls.get_raw_arg_mode (regno); > + fixed_size_mode mode = targetm.calls.get_raw_arg_mode (regno); > > gcc_assert (mode != VOIDmode); > > @@ -1386,7 +1385,7 @@ apply_args_size (void) > } > else > { > - apply_args_mode[regno] = VOIDmode; > + apply_args_mode[regno] = as_a <fixed_size_mode> (VOIDmode); > } > } > return size; > @@ -1400,7 +1399,6 @@ apply_result_size (void) > { > static int size = -1; > int align, regno; > - machine_mode mode; > > /* The values computed by this function never change. */ > if (size < 0) > @@ -1410,7 +1408,7 @@ apply_result_size (void) > for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) > if (targetm.calls.function_value_regno_p (regno)) > { > - mode = targetm.calls.get_raw_result_mode (regno); > + fixed_size_mode mode = targetm.calls.get_raw_result_mode (regno); > > gcc_assert (mode != VOIDmode); > > @@ -1421,7 +1419,7 @@ apply_result_size (void) > apply_result_mode[regno] = mode; > } > else > - apply_result_mode[regno] = VOIDmode; > + apply_result_mode[regno] = as_a <fixed_size_mode> (VOIDmode); > > /* Allow targets that use untyped_call and untyped_return to override > the size so that machine-specific information can be stored here. */ > @@ -1440,7 +1438,7 @@ apply_result_size (void) > result_vector (int savep, rtx result) > { > int regno, size, align, nelts; > - machine_mode mode; > + fixed_size_mode mode; > rtx reg, mem; > rtx *savevec = XALLOCAVEC (rtx, FIRST_PSEUDO_REGISTER); > > @@ -1469,7 +1467,7 @@ expand_builtin_apply_args_1 (void) > { > rtx registers, tem; > int size, align, regno; > - machine_mode mode; > + fixed_size_mode mode; > rtx struct_incoming_value = targetm.calls.struct_value_rtx (cfun ? > TREE_TYPE (cfun->decl) : 0, 1); > > /* Create a block where the arg-pointer, structure value address, > @@ -1573,7 +1571,7 @@ expand_builtin_apply_args (void) > expand_builtin_apply (rtx function, rtx arguments, rtx argsize) > { > int size, align, regno; > - machine_mode mode; > + fixed_size_mode mode; > rtx incoming_args, result, reg, dest, src; > rtx_call_insn *call_insn; > rtx old_stack_level = 0; > @@ -1734,7 +1732,7 @@ expand_builtin_apply (rtx function, rtx > expand_builtin_return (rtx result) > { > int size, align, regno; > - machine_mode mode; > + fixed_size_mode mode; > rtx reg; > rtx_insn *call_fusage = 0; >