Home | History | Annotate | Line # | Download | only in gcc
machmode.h revision 1.3
      1  1.1  mrg /* Machine mode definitions for GCC; included by rtl.h and tree.h.
      2  1.3  mrg    Copyright (C) 1991-2013 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      7  1.1  mrg the terms of the GNU General Public License as published by the Free
      8  1.1  mrg Software Foundation; either version 3, or (at your option) any later
      9  1.1  mrg version.
     10  1.1  mrg 
     11  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     12  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  1.1  mrg for more details.
     15  1.1  mrg 
     16  1.1  mrg You should have received a copy of the GNU General Public License
     17  1.1  mrg along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg <http://www.gnu.org/licenses/>.  */
     19  1.1  mrg 
     20  1.1  mrg #ifndef HAVE_MACHINE_MODES
     21  1.1  mrg #define HAVE_MACHINE_MODES
     22  1.1  mrg 
     23  1.1  mrg /* Make an enum class that gives all the machine modes.  */
     24  1.1  mrg #include "insn-modes.h"
     25  1.1  mrg 
     26  1.1  mrg /* Get the name of mode MODE as a string.  */
     27  1.1  mrg 
     28  1.1  mrg extern const char * const mode_name[NUM_MACHINE_MODES];
     29  1.1  mrg #define GET_MODE_NAME(MODE)  mode_name[MODE]
     30  1.1  mrg 
     31  1.1  mrg /* Mode classes.  */
     32  1.1  mrg 
     33  1.1  mrg #include "mode-classes.def"
     34  1.1  mrg #define DEF_MODE_CLASS(M) M
     35  1.1  mrg enum mode_class { MODE_CLASSES, MAX_MODE_CLASS };
     36  1.1  mrg #undef DEF_MODE_CLASS
     37  1.1  mrg #undef MODE_CLASSES
     38  1.1  mrg 
     39  1.1  mrg /* Get the general kind of object that mode MODE represents
     40  1.1  mrg    (integer, floating, complex, etc.)  */
     41  1.1  mrg 
     42  1.1  mrg extern const unsigned char mode_class[NUM_MACHINE_MODES];
     43  1.1  mrg #define GET_MODE_CLASS(MODE)  ((enum mode_class) mode_class[MODE])
     44  1.1  mrg 
     45  1.1  mrg /* Nonzero if MODE is an integral mode.  */
     46  1.1  mrg #define INTEGRAL_MODE_P(MODE)			\
     47  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_INT		\
     48  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \
     49  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \
     50  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT)
     51  1.1  mrg 
     52  1.1  mrg /* Nonzero if MODE is a floating-point mode.  */
     53  1.1  mrg #define FLOAT_MODE_P(MODE)		\
     54  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_FLOAT	\
     55  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT \
     56  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \
     57  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
     58  1.1  mrg 
     59  1.1  mrg /* Nonzero if MODE is a complex mode.  */
     60  1.1  mrg #define COMPLEX_MODE_P(MODE)			\
     61  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT	\
     62  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
     63  1.1  mrg 
     64  1.1  mrg /* Nonzero if MODE is a vector mode.  */
     65  1.1  mrg #define VECTOR_MODE_P(MODE)			\
     66  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT	\
     67  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT	\
     68  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_FRACT	\
     69  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_UFRACT	\
     70  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_ACCUM	\
     71  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_UACCUM)
     72  1.1  mrg 
     73  1.1  mrg /* Nonzero if MODE is a scalar integral mode.  */
     74  1.1  mrg #define SCALAR_INT_MODE_P(MODE)			\
     75  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_INT		\
     76  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
     77  1.1  mrg 
     78  1.1  mrg /* Nonzero if MODE is a scalar floating point mode.  */
     79  1.1  mrg #define SCALAR_FLOAT_MODE_P(MODE)		\
     80  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_FLOAT		\
     81  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
     82  1.1  mrg 
     83  1.1  mrg /* Nonzero if MODE is a decimal floating point mode.  */
     84  1.1  mrg #define DECIMAL_FLOAT_MODE_P(MODE)		\
     85  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
     86  1.1  mrg 
     87  1.1  mrg /* Nonzero if MODE is a scalar fract mode.  */
     88  1.1  mrg #define SCALAR_FRACT_MODE_P(MODE)	\
     89  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_FRACT)
     90  1.1  mrg 
     91  1.1  mrg /* Nonzero if MODE is a scalar ufract mode.  */
     92  1.1  mrg #define SCALAR_UFRACT_MODE_P(MODE)	\
     93  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_UFRACT)
     94  1.1  mrg 
     95  1.1  mrg /* Nonzero if MODE is a scalar fract or ufract mode.  */
     96  1.1  mrg #define ALL_SCALAR_FRACT_MODE_P(MODE)	\
     97  1.1  mrg   (SCALAR_FRACT_MODE_P (MODE) || SCALAR_UFRACT_MODE_P (MODE))
     98  1.1  mrg 
     99  1.1  mrg /* Nonzero if MODE is a scalar accum mode.  */
    100  1.1  mrg #define SCALAR_ACCUM_MODE_P(MODE)	\
    101  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_ACCUM)
    102  1.1  mrg 
    103  1.1  mrg /* Nonzero if MODE is a scalar uaccum mode.  */
    104  1.1  mrg #define SCALAR_UACCUM_MODE_P(MODE)	\
    105  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_UACCUM)
    106  1.1  mrg 
    107  1.1  mrg /* Nonzero if MODE is a scalar accum or uaccum mode.  */
    108  1.1  mrg #define ALL_SCALAR_ACCUM_MODE_P(MODE)	\
    109  1.1  mrg   (SCALAR_ACCUM_MODE_P (MODE) || SCALAR_UACCUM_MODE_P (MODE))
    110  1.1  mrg 
    111  1.1  mrg /* Nonzero if MODE is a scalar fract or accum mode.  */
    112  1.1  mrg #define SIGNED_SCALAR_FIXED_POINT_MODE_P(MODE)	\
    113  1.1  mrg   (SCALAR_FRACT_MODE_P (MODE) || SCALAR_ACCUM_MODE_P (MODE))
    114  1.1  mrg 
    115  1.1  mrg /* Nonzero if MODE is a scalar ufract or uaccum mode.  */
    116  1.1  mrg #define UNSIGNED_SCALAR_FIXED_POINT_MODE_P(MODE)	\
    117  1.1  mrg   (SCALAR_UFRACT_MODE_P (MODE) || SCALAR_UACCUM_MODE_P (MODE))
    118  1.1  mrg 
    119  1.1  mrg /* Nonzero if MODE is a scalar fract, ufract, accum or uaccum mode.  */
    120  1.1  mrg #define ALL_SCALAR_FIXED_POINT_MODE_P(MODE)	\
    121  1.1  mrg   (SIGNED_SCALAR_FIXED_POINT_MODE_P (MODE)	\
    122  1.1  mrg    || UNSIGNED_SCALAR_FIXED_POINT_MODE_P (MODE))
    123  1.1  mrg 
    124  1.1  mrg /* Nonzero if MODE is a scalar/vector fract mode.  */
    125  1.1  mrg #define FRACT_MODE_P(MODE)		\
    126  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_FRACT	\
    127  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_FRACT)
    128  1.1  mrg 
    129  1.1  mrg /* Nonzero if MODE is a scalar/vector ufract mode.  */
    130  1.1  mrg #define UFRACT_MODE_P(MODE)		\
    131  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_UFRACT	\
    132  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_UFRACT)
    133  1.1  mrg 
    134  1.1  mrg /* Nonzero if MODE is a scalar/vector fract or ufract mode.  */
    135  1.1  mrg #define ALL_FRACT_MODE_P(MODE)		\
    136  1.1  mrg   (FRACT_MODE_P (MODE) || UFRACT_MODE_P (MODE))
    137  1.1  mrg 
    138  1.1  mrg /* Nonzero if MODE is a scalar/vector accum mode.  */
    139  1.1  mrg #define ACCUM_MODE_P(MODE)		\
    140  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_ACCUM	\
    141  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_ACCUM)
    142  1.1  mrg 
    143  1.1  mrg /* Nonzero if MODE is a scalar/vector uaccum mode.  */
    144  1.1  mrg #define UACCUM_MODE_P(MODE)		\
    145  1.1  mrg   (GET_MODE_CLASS (MODE) == MODE_UACCUM	\
    146  1.1  mrg    || GET_MODE_CLASS (MODE) == MODE_VECTOR_UACCUM)
    147  1.1  mrg 
    148  1.1  mrg /* Nonzero if MODE is a scalar/vector accum or uaccum mode.  */
    149  1.1  mrg #define ALL_ACCUM_MODE_P(MODE)		\
    150  1.1  mrg   (ACCUM_MODE_P (MODE) || UACCUM_MODE_P (MODE))
    151  1.1  mrg 
    152  1.1  mrg /* Nonzero if MODE is a scalar/vector fract or accum mode.  */
    153  1.1  mrg #define SIGNED_FIXED_POINT_MODE_P(MODE)		\
    154  1.1  mrg   (FRACT_MODE_P (MODE) || ACCUM_MODE_P (MODE))
    155  1.1  mrg 
    156  1.1  mrg /* Nonzero if MODE is a scalar/vector ufract or uaccum mode.  */
    157  1.1  mrg #define UNSIGNED_FIXED_POINT_MODE_P(MODE)	\
    158  1.1  mrg   (UFRACT_MODE_P (MODE) || UACCUM_MODE_P (MODE))
    159  1.1  mrg 
    160  1.1  mrg /* Nonzero if MODE is a scalar/vector fract, ufract, accum or uaccum mode.  */
    161  1.1  mrg #define ALL_FIXED_POINT_MODE_P(MODE)		\
    162  1.1  mrg   (SIGNED_FIXED_POINT_MODE_P (MODE)		\
    163  1.1  mrg    || UNSIGNED_FIXED_POINT_MODE_P (MODE))
    164  1.1  mrg 
    165  1.1  mrg /* Nonzero if CLASS modes can be widened.  */
    166  1.1  mrg #define CLASS_HAS_WIDER_MODES_P(CLASS)         \
    167  1.1  mrg   (CLASS == MODE_INT                           \
    168  1.3  mrg    || CLASS == MODE_PARTIAL_INT                \
    169  1.1  mrg    || CLASS == MODE_FLOAT                      \
    170  1.1  mrg    || CLASS == MODE_DECIMAL_FLOAT              \
    171  1.1  mrg    || CLASS == MODE_COMPLEX_FLOAT              \
    172  1.1  mrg    || CLASS == MODE_FRACT                      \
    173  1.1  mrg    || CLASS == MODE_UFRACT                     \
    174  1.1  mrg    || CLASS == MODE_ACCUM                      \
    175  1.1  mrg    || CLASS == MODE_UACCUM)
    176  1.1  mrg 
    177  1.1  mrg /* Get the size in bytes and bits of an object of mode MODE.  */
    178  1.1  mrg 
    179  1.1  mrg extern CONST_MODE_SIZE unsigned char mode_size[NUM_MACHINE_MODES];
    180  1.1  mrg #define GET_MODE_SIZE(MODE)    ((unsigned short) mode_size[MODE])
    181  1.3  mrg #define GET_MODE_BITSIZE(MODE) \
    182  1.3  mrg   ((unsigned short) (GET_MODE_SIZE (MODE) * BITS_PER_UNIT))
    183  1.1  mrg 
    184  1.1  mrg /* Get the number of value bits of an object of mode MODE.  */
    185  1.1  mrg extern const unsigned short mode_precision[NUM_MACHINE_MODES];
    186  1.1  mrg #define GET_MODE_PRECISION(MODE)  mode_precision[MODE]
    187  1.1  mrg 
    188  1.1  mrg /* Get the number of integral bits of an object of mode MODE.  */
    189  1.1  mrg extern CONST_MODE_IBIT unsigned char mode_ibit[NUM_MACHINE_MODES];
    190  1.1  mrg #define GET_MODE_IBIT(MODE) mode_ibit[MODE]
    191  1.1  mrg 
    192  1.1  mrg /* Get the number of fractional bits of an object of mode MODE.  */
    193  1.1  mrg extern CONST_MODE_FBIT unsigned char mode_fbit[NUM_MACHINE_MODES];
    194  1.1  mrg #define GET_MODE_FBIT(MODE) mode_fbit[MODE]
    195  1.1  mrg 
    196  1.1  mrg /* Get a bitmask containing 1 for all bits in a word
    197  1.1  mrg    that fit within mode MODE.  */
    198  1.1  mrg 
    199  1.1  mrg extern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
    200  1.1  mrg 
    201  1.1  mrg #define GET_MODE_MASK(MODE) mode_mask_array[MODE]
    202  1.1  mrg 
    203  1.1  mrg /* Return the mode of the inner elements in a vector.  */
    204  1.1  mrg 
    205  1.1  mrg extern const unsigned char mode_inner[NUM_MACHINE_MODES];
    206  1.1  mrg #define GET_MODE_INNER(MODE) ((enum machine_mode) mode_inner[MODE])
    207  1.1  mrg 
    208  1.3  mrg /* Get the size in bytes or bites of the basic parts of an
    209  1.3  mrg    object of mode MODE.  */
    210  1.1  mrg 
    211  1.1  mrg #define GET_MODE_UNIT_SIZE(MODE)		\
    212  1.1  mrg   (GET_MODE_INNER (MODE) == VOIDmode		\
    213  1.1  mrg    ? GET_MODE_SIZE (MODE)			\
    214  1.1  mrg    : GET_MODE_SIZE (GET_MODE_INNER (MODE)))
    215  1.1  mrg 
    216  1.3  mrg #define GET_MODE_UNIT_BITSIZE(MODE) \
    217  1.3  mrg   ((unsigned short) (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT))
    218  1.3  mrg 
    219  1.3  mrg #define GET_MODE_UNIT_PRECISION(MODE)		\
    220  1.3  mrg   (GET_MODE_INNER (MODE) == VOIDmode		\
    221  1.3  mrg    ? GET_MODE_PRECISION (MODE)			\
    222  1.3  mrg    : GET_MODE_PRECISION (GET_MODE_INNER (MODE)))
    223  1.3  mrg 
    224  1.1  mrg /* Get the number of units in the object.  */
    225  1.1  mrg 
    226  1.1  mrg extern const unsigned char mode_nunits[NUM_MACHINE_MODES];
    227  1.1  mrg #define GET_MODE_NUNITS(MODE)  mode_nunits[MODE]
    228  1.1  mrg 
    229  1.1  mrg /* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
    230  1.1  mrg 
    231  1.1  mrg extern const unsigned char mode_wider[NUM_MACHINE_MODES];
    232  1.1  mrg #define GET_MODE_WIDER_MODE(MODE) ((enum machine_mode) mode_wider[MODE])
    233  1.1  mrg 
    234  1.3  mrg /* For scalars, this is a mode with twice the precision.  For vectors,
    235  1.3  mrg    this is a mode with the same inner mode but with twice the elements.  */
    236  1.1  mrg extern const unsigned char mode_2xwider[NUM_MACHINE_MODES];
    237  1.1  mrg #define GET_MODE_2XWIDER_MODE(MODE) ((enum machine_mode) mode_2xwider[MODE])
    238  1.1  mrg 
    239  1.1  mrg /* Return the mode for data of a given size SIZE and mode class CLASS.
    240  1.1  mrg    If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
    241  1.1  mrg    The value is BLKmode if no other mode is found.  */
    242  1.1  mrg 
    243  1.1  mrg extern enum machine_mode mode_for_size (unsigned int, enum mode_class, int);
    244  1.1  mrg 
    245  1.1  mrg /* Similar, but find the smallest mode for a given width.  */
    246  1.1  mrg 
    247  1.1  mrg extern enum machine_mode smallest_mode_for_size (unsigned int,
    248  1.1  mrg 						 enum mode_class);
    249  1.1  mrg 
    250  1.1  mrg 
    251  1.1  mrg /* Return an integer mode of the exact same size as the input mode,
    252  1.1  mrg    or BLKmode on failure.  */
    253  1.1  mrg 
    254  1.1  mrg extern enum machine_mode int_mode_for_mode (enum machine_mode);
    255  1.1  mrg 
    256  1.3  mrg /* Return a mode that is suitable for representing a vector,
    257  1.3  mrg    or BLKmode on failure.  */
    258  1.3  mrg 
    259  1.3  mrg extern enum machine_mode mode_for_vector (enum machine_mode, unsigned);
    260  1.3  mrg 
    261  1.3  mrg /* A class for iterating through possible bitfield modes.  */
    262  1.3  mrg class bit_field_mode_iterator
    263  1.3  mrg {
    264  1.3  mrg public:
    265  1.3  mrg   bit_field_mode_iterator (HOST_WIDE_INT, HOST_WIDE_INT,
    266  1.3  mrg 			   HOST_WIDE_INT, HOST_WIDE_INT,
    267  1.3  mrg 			   unsigned int, bool);
    268  1.3  mrg   bool next_mode (enum machine_mode *);
    269  1.3  mrg   bool prefer_smaller_modes ();
    270  1.3  mrg 
    271  1.3  mrg private:
    272  1.3  mrg   enum machine_mode mode_;
    273  1.3  mrg   /* We use signed values here because the bit position can be negative
    274  1.3  mrg      for invalid input such as gcc.dg/pr48335-8.c.  */
    275  1.3  mrg   HOST_WIDE_INT bitsize_;
    276  1.3  mrg   HOST_WIDE_INT bitpos_;
    277  1.3  mrg   HOST_WIDE_INT bitregion_start_;
    278  1.3  mrg   HOST_WIDE_INT bitregion_end_;
    279  1.3  mrg   unsigned int align_;
    280  1.3  mrg   bool volatilep_;
    281  1.3  mrg   int count_;
    282  1.3  mrg };
    283  1.3  mrg 
    284  1.1  mrg /* Find the best mode to use to access a bit field.  */
    285  1.1  mrg 
    286  1.3  mrg extern enum machine_mode get_best_mode (int, int,
    287  1.3  mrg 					unsigned HOST_WIDE_INT,
    288  1.3  mrg 					unsigned HOST_WIDE_INT,
    289  1.3  mrg 					unsigned int,
    290  1.3  mrg 					enum machine_mode, bool);
    291  1.1  mrg 
    292  1.1  mrg /* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT.  */
    293  1.1  mrg 
    294  1.1  mrg extern CONST_MODE_BASE_ALIGN unsigned char mode_base_align[NUM_MACHINE_MODES];
    295  1.1  mrg 
    296  1.1  mrg extern unsigned get_mode_alignment (enum machine_mode);
    297  1.1  mrg 
    298  1.1  mrg #define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE)
    299  1.1  mrg 
    300  1.1  mrg /* For each class, get the narrowest mode in that class.  */
    301  1.1  mrg 
    302  1.1  mrg extern const unsigned char class_narrowest_mode[MAX_MODE_CLASS];
    303  1.1  mrg #define GET_CLASS_NARROWEST_MODE(CLASS) \
    304  1.1  mrg   ((enum machine_mode) class_narrowest_mode[CLASS])
    305  1.1  mrg 
    306  1.1  mrg /* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
    307  1.1  mrg    and the mode whose class is Pmode and whose size is POINTER_SIZE.  */
    308  1.1  mrg 
    309  1.1  mrg extern enum machine_mode byte_mode;
    310  1.1  mrg extern enum machine_mode word_mode;
    311  1.1  mrg extern enum machine_mode ptr_mode;
    312  1.1  mrg 
    313  1.1  mrg /* Target-dependent machine mode initialization - in insn-modes.c.  */
    314  1.1  mrg extern void init_adjust_machine_modes (void);
    315  1.1  mrg 
    316  1.3  mrg #define TRULY_NOOP_TRUNCATION_MODES_P(MODE1, MODE2) \
    317  1.3  mrg   TRULY_NOOP_TRUNCATION (GET_MODE_PRECISION (MODE1), \
    318  1.3  mrg 			 GET_MODE_PRECISION (MODE2))
    319  1.3  mrg 
    320  1.3  mrg #define HWI_COMPUTABLE_MODE_P(MODE) \
    321  1.3  mrg   (SCALAR_INT_MODE_P (MODE) \
    322  1.3  mrg    && GET_MODE_PRECISION (MODE) <= HOST_BITS_PER_WIDE_INT)
    323  1.3  mrg 
    324  1.1  mrg #endif /* not HAVE_MACHINE_MODES */
    325