From: Richard Sandiford Date: Wed, 3 Jan 2018 21:39:45 +0000 (+0000) Subject: Add a fixed_size_mode_pod class X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b660eccf9b32ee3b962a77cf5565fa2771792c35;p=gcc.git Add a fixed_size_mode_pod class 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. 2018-01-03 Richard Sandiford Alan Hayward David Sherwood 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. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r256193 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0ce136fc7a1..4e5a8fa76b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2018-01-03 Richard Sandiford + Alan Hayward + David Sherwood + + * 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. + 2018-01-03 Richard Sandiford * cse.c (hash_rtx_cb): Hash only the encoded elements. diff --git a/gcc/builtins.c b/gcc/builtins.c index da975479fd9..27ca135eeaf 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1364,7 +1364,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) @@ -1380,7 +1379,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); @@ -1392,7 +1391,7 @@ apply_args_size (void) } else { - apply_args_mode[regno] = VOIDmode; + apply_args_mode[regno] = as_a (VOIDmode); } } return size; @@ -1406,7 +1405,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) @@ -1416,7 +1414,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); @@ -1427,7 +1425,7 @@ apply_result_size (void) apply_result_mode[regno] = mode; } else - apply_result_mode[regno] = VOIDmode; + apply_result_mode[regno] = as_a (VOIDmode); /* Allow targets that use untyped_call and untyped_return to override the size so that machine-specific information can be stored here. */ @@ -1446,7 +1444,7 @@ static rtx 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); @@ -1475,7 +1473,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, @@ -1579,7 +1577,7 @@ static rtx 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; @@ -1740,7 +1738,7 @@ static void expand_builtin_return (rtx result) { int size, align, regno; - machine_mode mode; + fixed_size_mode mode; rtx reg; rtx_insn *call_fusage = 0; diff --git a/gcc/builtins.h b/gcc/builtins.h index 8cc868f06ce..c9229049e21 100644 --- a/gcc/builtins.h +++ b/gcc/builtins.h @@ -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; diff --git a/gcc/coretypes.h b/gcc/coretypes.h index f5c2c5da589..283b4eb33fe 100644 --- a/gcc/coretypes.h +++ b/gcc/coretypes.h @@ -59,6 +59,7 @@ class scalar_mode; class scalar_int_mode; class scalar_float_mode; class complex_mode; +class fixed_size_mode; template class opt_mode; typedef opt_mode opt_scalar_mode; typedef opt_mode opt_scalar_int_mode; @@ -66,6 +67,7 @@ typedef opt_mode opt_scalar_float_mode; template class pod_mode; typedef pod_mode scalar_mode_pod; typedef pod_mode scalar_int_mode_pod; +typedef pod_mode fixed_size_mode_pod; /* Subclasses of rtx_def, using indentation to show the class hierarchy, along with the relevant invariant.