machmode.h revision 132718
1132718Skan/* Machine mode definitions for GCC; included by rtl.h and tree.h.
2132718Skan   Copyright (C) 1991, 1993, 1994, 1996, 1998, 1999, 2000, 2001, 2003
390075Sobrien   Free Software Foundation, Inc.
418334Speter
590075SobrienThis file is part of GCC.
618334Speter
790075SobrienGCC is free software; you can redistribute it and/or modify it under
890075Sobrienthe terms of the GNU General Public License as published by the Free
990075SobrienSoftware Foundation; either version 2, or (at your option) any later
1090075Sobrienversion.
1118334Speter
1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590075Sobrienfor more details.
1618334Speter
1718334SpeterYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
1990075SobrienSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA
2090075Sobrien02111-1307, USA.  */
2118334Speter
2250397Sobrien#ifndef HAVE_MACHINE_MODES
2350397Sobrien#define HAVE_MACHINE_MODES
2418334Speter
2518334Speter/* Make an enum class that gives all the machine modes.  */
26132718Skan#include "insn-modes.h"
2718334Speter
2818334Speter/* Get the name of mode MODE as a string.  */
2918334Speter
3090075Sobrienextern const char * const mode_name[NUM_MACHINE_MODES];
31132718Skan#define GET_MODE_NAME(MODE)  mode_name[MODE]
3218334Speter
33132718Skan/* Mode classes.  */
3418334Speter
35132718Skan#include "mode-classes.def"
36132718Skan#define DEF_MODE_CLASS(M) M
37132718Skanenum mode_class { MODE_CLASSES, MAX_MODE_CLASS };
38132718Skan#undef DEF_MODE_CLASS
39132718Skan#undef MODE_CLASSES
40132718Skan
4118334Speter/* Get the general kind of object that mode MODE represents
4218334Speter   (integer, floating, complex, etc.)  */
4318334Speter
44132718Skanextern const unsigned char mode_class[NUM_MACHINE_MODES];
45132718Skan#define GET_MODE_CLASS(MODE)  mode_class[MODE]
4618334Speter
4718334Speter/* Nonzero if MODE is an integral mode.  */
4818334Speter#define INTEGRAL_MODE_P(MODE)			\
4918334Speter  (GET_MODE_CLASS (MODE) == MODE_INT		\
5018334Speter   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \
5190075Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \
5290075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT)
5318334Speter
5418334Speter/* Nonzero if MODE is a floating-point mode.  */
5518334Speter#define FLOAT_MODE_P(MODE)		\
5618334Speter  (GET_MODE_CLASS (MODE) == MODE_FLOAT	\
5790075Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \
5890075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
5918334Speter
6050397Sobrien/* Nonzero if MODE is a complex mode.  */
6150397Sobrien#define COMPLEX_MODE_P(MODE)			\
6250397Sobrien  (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT	\
6350397Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
6450397Sobrien
6590075Sobrien/* Nonzero if MODE is a vector mode.  */
6690075Sobrien#define VECTOR_MODE_P(MODE)			\
6790075Sobrien  (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT	\
6890075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
6990075Sobrien
70117395Skan/* Nonzero if MODE is a scalar integral mode.  */
71117395Skan#define SCALAR_INT_MODE_P(MODE)			\
72117395Skan  (GET_MODE_CLASS (MODE) == MODE_INT		\
73117395Skan   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
74117395Skan
75117395Skan/* Nonzero if MODE is a scalar floating point mode.  */
76117395Skan#define SCALAR_FLOAT_MODE_P(MODE)		\
77117395Skan  (GET_MODE_CLASS (MODE) == MODE_FLOAT)
78117395Skan
79132718Skan/* Get the size in bytes and bits of an object of mode MODE.  */
8018334Speter
81132718Skanextern CONST_MODE_SIZE unsigned char mode_size[NUM_MACHINE_MODES];
82132718Skan#define GET_MODE_SIZE(MODE)    ((unsigned short) mode_size[MODE])
83132718Skan#define GET_MODE_BITSIZE(MODE) ((unsigned short) (GET_MODE_SIZE (MODE) * BITS_PER_UNIT))
8418334Speter
85132718Skan/* Get the number of value bits of an object of mode MODE.  */
86132718Skanextern const unsigned short mode_precision[NUM_MACHINE_MODES];
87132718Skan#define GET_MODE_PRECISION(MODE)  mode_precision[MODE]
8818334Speter
8918334Speter/* Get a bitmask containing 1 for all bits in a word
9018334Speter   that fit within mode MODE.  */
9118334Speter
9290075Sobrienextern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
9318334Speter
94132718Skan#define GET_MODE_MASK(MODE) mode_mask_array[MODE]
9552284Sobrien
9696263Sobrien/* Return the mode of the inner elements in a vector.  */
9796263Sobrien
98132718Skanextern const unsigned char mode_inner[NUM_MACHINE_MODES];
99132718Skan#define GET_MODE_INNER(MODE) mode_inner[MODE]
10096263Sobrien
101132718Skan/* Get the size in bytes of the basic parts of an object of mode MODE.  */
10252284Sobrien
103132718Skan#define GET_MODE_UNIT_SIZE(MODE)		\
104132718Skan  (GET_MODE_INNER (MODE) == VOIDmode		\
105132718Skan   ? GET_MODE_SIZE (MODE)			\
106132718Skan   : GET_MODE_SIZE (GET_MODE_INNER (MODE)))
10790075Sobrien
108132718Skan/* Get the number of units in the object.  */
109132718Skan
110132718Skanextern const unsigned char mode_nunits[NUM_MACHINE_MODES];
111132718Skan#define GET_MODE_NUNITS(MODE)  mode_nunits[MODE]
112132718Skan
11318334Speter/* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
11418334Speter
115132718Skanextern const unsigned char mode_wider[NUM_MACHINE_MODES];
116132718Skan#define GET_MODE_WIDER_MODE(MODE) mode_wider[MODE]
11718334Speter
11818334Speter/* Return the mode for data of a given size SIZE and mode class CLASS.
11918334Speter   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
12018334Speter   The value is BLKmode if no other mode is found.  */
12118334Speter
122132718Skanextern enum machine_mode mode_for_size (unsigned int, enum mode_class, int);
12318334Speter
12452284Sobrien/* Similar, but find the smallest mode for a given width.  */
12552284Sobrien
126132718Skanextern enum machine_mode smallest_mode_for_size (unsigned int,
127132718Skan						 enum mode_class);
12852284Sobrien
12952284Sobrien
13052284Sobrien/* Return an integer mode of the exact same size as the input mode,
13152284Sobrien   or BLKmode on failure.  */
13252284Sobrien
133132718Skanextern enum machine_mode int_mode_for_mode (enum machine_mode);
13452284Sobrien
13518334Speter/* Find the best mode to use to access a bit field.  */
13618334Speter
137132718Skanextern enum machine_mode get_best_mode (int, int, unsigned int,
138132718Skan					enum machine_mode, int);
13918334Speter
14018334Speter/* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT.  */
14118334Speter
142132718Skanextern CONST_MODE_BASE_ALIGN unsigned char mode_base_align[NUM_MACHINE_MODES];
14318334Speter
144132718Skanextern unsigned get_mode_alignment (enum machine_mode);
145132718Skan
14690075Sobrien#define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE)
14790075Sobrien
14818334Speter/* For each class, get the narrowest mode in that class.  */
14918334Speter
150132718Skanextern const unsigned char class_narrowest_mode[MAX_MODE_CLASS];
151132718Skan#define GET_CLASS_NARROWEST_MODE(CLASS) class_narrowest_mode[CLASS]
15218334Speter
15318334Speter/* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
15418334Speter   and the mode whose class is Pmode and whose size is POINTER_SIZE.  */
15518334Speter
15618334Speterextern enum machine_mode byte_mode;
15718334Speterextern enum machine_mode word_mode;
15818334Speterextern enum machine_mode ptr_mode;
15918334Speter
160132718Skan/* Target-dependent machine mode initialization - in insn-modes.c.  */
161132718Skanextern void init_adjust_machine_modes (void);
162132718Skan
163132718Skan#endif /* not HAVE_MACHINE_MODES */
164