On Thu, Oct 26, 2017 at 2:18 PM, Richard Sandiford <richard.sandif...@linaro.org> wrote: > Richard Biener <richard.guent...@gmail.com> writes: >> 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). > > That'd be great :-) It would avoid all the poly_int_pod stuff too, > and allow some clean-up of wide-int.h.
Can you figure what oldest GCC release supports the C++11/14 POD handling that would be required? Richard. > Thanks for the reviews, > Richard > > >> >> 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; >>>