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