On 07/13/2017 02:38 AM, Richard Sandiford wrote:
> This patch makes various changes that allow modes like SImode to be
> classes rather than enums.
> 
> Firstly, it adds inline functions for all mode size properties,
> with the macros being simple wrappers around them.  This is necessary
> for the __builtin_constant_p trick to continue working effectively when
> the mode arguments are slightly more complex (but still foldable at
> compile time).
> 
> These inline functions are trivial and heavily used.  There's not much
> point keeping them out-of-line at -O0: if anything it would make
> debugging harder rather than easier, and it would also slow things down.
> The patch therefore marks them as "always_inline", if that's available.
> Later patches use this approach too.
> 
> Using inline functions means that it's no longer possible to pass
> an int to GET_MODE_PRECISION etc.  The Fortran and powerpcspe-c.c
> parts are needed to avoid instances of that.
> 
> The patch continues to use enums for gencondmd.c, so that more
> mode comparisons are integer constant expressions when checking
> for always-true or always-false conditions.  This is the only
> intended use of USE_ENUM_MODES.
> 
> The patch also enforces the previous replacement of case statements
> by defining modes as:
> 
>   #define FOOmode ((void) 0, E_FOOmode)
> 
> This adds no overhead but makes sure that new uses of "case FOOmode:"
> don't accidentally creep in when FOOmode has no specific class associated
> with it.
> 
> 2017-07-13  Richard Sandiford  <richard.sandif...@linaro.org>
>           Alan Hayward  <alan.hayw...@arm.com>
>           David Sherwood  <david.sherw...@arm.com>
> 
> gcc/
>       * genconditions.c (write_header): Add a "#define USE_ENUM_MODES".
>       * genmodes.c (emit_insn_modes_h): Define FOOmode to E_FOOmode if
>       USE_ENUM_MODES is defined and to ((void) 0, E_FOOmode) otherwise.
>       * machmode.h (mode_size): Move earlier in file.
>       (mode_precision): Likewise.
>       (mode_inner): Likewise.
>       (mode_nunits): Likewise.
>       (mode_unit_size): Likewise.
>       (unit_unit_precision): Likewise.
>       (mode_wider): Likewise.
>       (mode_2xwider): Likewise.
>       (machine_mode): New class.
>       (mode_to_bytes): New function.
>       (mode_to_bits): Likewise.
>       (mode_to_precision): Likewise.
>       (mode_to_inner): Likewise.
>       (mode_to_unit_size): Likewise.
>       (mode_to_unit_precision): Likewise.
>       (mode_to_nunits): Likewise.
>       (GET_MODE_SIZE): Use mode_to_bytes.
>       (GET_MODE_BITSIZE): Use mode_to_bits.
>       (GET_MODE_PRECISION): Use mode_to_precision.
>       (GET_MODE_INNER): Use mode_to_inner.
>       (GET_MODE_UNIT_SIZE): Use mode_to_unit_size.
>       (GET_MODE_UNIT_PRECISION): Use mode_to_unit_precision.
>       (GET_MODE_NUNITS): Use mode_to_nunits.
>       * system.h (ALWAYS_INLINE): New macro.
>       * config/powerpcspe/powerpcspe-c.c
>       (altivec_resolve_overloaded_builtin): Use machine_mode instead of
>       int for arg1_mode and arg2_mode.
> 
> gcc/fortran/
>       * trans-types.c (gfc_init_kinds): Use machine_mode instead of int
>       for "mode".
OK.
Jeff

Reply via email to