diff options
Diffstat (limited to 'gcc/machmode.h')
-rw-r--r-- | gcc/machmode.h | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/gcc/machmode.h b/gcc/machmode.h index b97e046..99ffbb7 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -23,7 +23,7 @@ along with GCC; see the file COPYING3. If not see typedef opt_mode<machine_mode> opt_machine_mode; extern CONST_MODE_SIZE unsigned short mode_size[NUM_MACHINE_MODES]; -extern const unsigned short mode_precision[NUM_MACHINE_MODES]; +extern const poly_uint16_pod mode_precision[NUM_MACHINE_MODES]; extern const unsigned char mode_inner[NUM_MACHINE_MODES]; extern const poly_uint16_pod mode_nunits[NUM_MACHINE_MODES]; extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES]; @@ -535,7 +535,7 @@ mode_to_bits (machine_mode mode) /* Return the base GET_MODE_PRECISION value for MODE. */ -ALWAYS_INLINE unsigned short +ALWAYS_INLINE poly_uint16 mode_to_precision (machine_mode mode) { return mode_precision[mode]; @@ -604,7 +604,30 @@ mode_to_nunits (machine_mode mode) /* Get the number of value bits of an object of mode MODE. */ -#define GET_MODE_PRECISION(MODE) (mode_to_precision (MODE)) +#if ONLY_FIXED_SIZE_MODES +#define GET_MODE_PRECISION(MODE) \ + ((unsigned short) mode_to_precision (MODE).coeffs[0]) +#else +ALWAYS_INLINE poly_uint16 +GET_MODE_PRECISION (machine_mode mode) +{ + return mode_to_precision (mode); +} + +template<typename T> +ALWAYS_INLINE typename if_poly<typename T::measurement_type>::type +GET_MODE_PRECISION (const T &mode) +{ + return mode_to_precision (mode); +} + +template<typename T> +ALWAYS_INLINE typename if_nonpoly<typename T::measurement_type>::type +GET_MODE_PRECISION (const T &mode) +{ + return mode_to_precision (mode).coeffs[0]; +} +#endif /* Get the number of integral bits of an object of mode MODE. */ extern CONST_MODE_IBIT unsigned char mode_ibit[NUM_MACHINE_MODES]; @@ -863,9 +886,22 @@ extern void init_adjust_machine_modes (void); (targetm.truly_noop_truncation (GET_MODE_PRECISION (MODE1), \ GET_MODE_PRECISION (MODE2))) -#define HWI_COMPUTABLE_MODE_P(MODE) \ - (SCALAR_INT_MODE_P (MODE) \ - && GET_MODE_PRECISION (MODE) <= HOST_BITS_PER_WIDE_INT) +/* Return true if MODE is a scalar integer mode that fits in a + HOST_WIDE_INT. */ + +inline bool +HWI_COMPUTABLE_MODE_P (machine_mode mode) +{ + machine_mode mme = mode; + return (SCALAR_INT_MODE_P (mme) + && mode_to_precision (mme).coeffs[0] <= HOST_BITS_PER_WIDE_INT); +} + +inline bool +HWI_COMPUTABLE_MODE_P (scalar_int_mode mode) +{ + return GET_MODE_PRECISION (mode) <= HOST_BITS_PER_WIDE_INT; +} struct int_n_data_t { /* These parts are initailized by genmodes output */ |