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
19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20169689Skan02110-1301, 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	\
57169689Skan   || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT \
5890075Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \
5990075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
6018334Speter
6150397Sobrien/* Nonzero if MODE is a complex mode.  */
6250397Sobrien#define COMPLEX_MODE_P(MODE)			\
6350397Sobrien  (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT	\
6450397Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
6550397Sobrien
6690075Sobrien/* Nonzero if MODE is a vector mode.  */
6790075Sobrien#define VECTOR_MODE_P(MODE)			\
6890075Sobrien  (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT	\
6990075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
7090075Sobrien
71117395Skan/* Nonzero if MODE is a scalar integral mode.  */
72117395Skan#define SCALAR_INT_MODE_P(MODE)			\
73117395Skan  (GET_MODE_CLASS (MODE) == MODE_INT		\
74117395Skan   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
75117395Skan
76117395Skan/* Nonzero if MODE is a scalar floating point mode.  */
77117395Skan#define SCALAR_FLOAT_MODE_P(MODE)		\
78169689Skan  (GET_MODE_CLASS (MODE) == MODE_FLOAT		\
79169689Skan   || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
80117395Skan
81169689Skan/* Nonzero if MODE is a decimal floating point mode.  */
82169689Skan#define DECIMAL_FLOAT_MODE_P(MODE)		\
83169689Skan  (GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
84169689Skan
85169689Skan/* Nonzero if CLASS modes can be widened.  */
86169689Skan#define CLASS_HAS_WIDER_MODES_P(CLASS)         \
87169689Skan  (CLASS == MODE_INT                           \
88169689Skan   || CLASS == MODE_FLOAT                      \
89169689Skan   || CLASS == MODE_DECIMAL_FLOAT              \
90169689Skan   || CLASS == MODE_COMPLEX_FLOAT)
91169689Skan
92132718Skan/* Get the size in bytes and bits of an object of mode MODE.  */
9318334Speter
94132718Skanextern CONST_MODE_SIZE unsigned char mode_size[NUM_MACHINE_MODES];
95132718Skan#define GET_MODE_SIZE(MODE)    ((unsigned short) mode_size[MODE])
96132718Skan#define GET_MODE_BITSIZE(MODE) ((unsigned short) (GET_MODE_SIZE (MODE) * BITS_PER_UNIT))
9718334Speter
98132718Skan/* Get the number of value bits of an object of mode MODE.  */
99132718Skanextern const unsigned short mode_precision[NUM_MACHINE_MODES];
100132718Skan#define GET_MODE_PRECISION(MODE)  mode_precision[MODE]
10118334Speter
10218334Speter/* Get a bitmask containing 1 for all bits in a word
10318334Speter   that fit within mode MODE.  */
10418334Speter
10590075Sobrienextern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
10618334Speter
107132718Skan#define GET_MODE_MASK(MODE) mode_mask_array[MODE]
10852284Sobrien
10996263Sobrien/* Return the mode of the inner elements in a vector.  */
11096263Sobrien
111132718Skanextern const unsigned char mode_inner[NUM_MACHINE_MODES];
112132718Skan#define GET_MODE_INNER(MODE) mode_inner[MODE]
11396263Sobrien
114132718Skan/* Get the size in bytes of the basic parts of an object of mode MODE.  */
11552284Sobrien
116132718Skan#define GET_MODE_UNIT_SIZE(MODE)		\
117132718Skan  (GET_MODE_INNER (MODE) == VOIDmode		\
118132718Skan   ? GET_MODE_SIZE (MODE)			\
119132718Skan   : GET_MODE_SIZE (GET_MODE_INNER (MODE)))
12090075Sobrien
121132718Skan/* Get the number of units in the object.  */
122132718Skan
123132718Skanextern const unsigned char mode_nunits[NUM_MACHINE_MODES];
124132718Skan#define GET_MODE_NUNITS(MODE)  mode_nunits[MODE]
125132718Skan
12618334Speter/* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
12718334Speter
128132718Skanextern const unsigned char mode_wider[NUM_MACHINE_MODES];
129132718Skan#define GET_MODE_WIDER_MODE(MODE) mode_wider[MODE]
13018334Speter
131169689Skanextern const unsigned char mode_2xwider[NUM_MACHINE_MODES];
132169689Skan#define GET_MODE_2XWIDER_MODE(MODE) mode_2xwider[MODE]
133169689Skan
13418334Speter/* Return the mode for data of a given size SIZE and mode class CLASS.
13518334Speter   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
13618334Speter   The value is BLKmode if no other mode is found.  */
13718334Speter
138132718Skanextern enum machine_mode mode_for_size (unsigned int, enum mode_class, int);
13918334Speter
14052284Sobrien/* Similar, but find the smallest mode for a given width.  */
14152284Sobrien
142132718Skanextern enum machine_mode smallest_mode_for_size (unsigned int,
143132718Skan						 enum mode_class);
14452284Sobrien
14552284Sobrien
14652284Sobrien/* Return an integer mode of the exact same size as the input mode,
14752284Sobrien   or BLKmode on failure.  */
14852284Sobrien
149132718Skanextern enum machine_mode int_mode_for_mode (enum machine_mode);
15052284Sobrien
15118334Speter/* Find the best mode to use to access a bit field.  */
15218334Speter
153132718Skanextern enum machine_mode get_best_mode (int, int, unsigned int,
154132718Skan					enum machine_mode, int);
15518334Speter
15618334Speter/* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT.  */
15718334Speter
158132718Skanextern CONST_MODE_BASE_ALIGN unsigned char mode_base_align[NUM_MACHINE_MODES];
15918334Speter
160132718Skanextern unsigned get_mode_alignment (enum machine_mode);
161132718Skan
16290075Sobrien#define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE)
16390075Sobrien
16418334Speter/* For each class, get the narrowest mode in that class.  */
16518334Speter
166132718Skanextern const unsigned char class_narrowest_mode[MAX_MODE_CLASS];
167132718Skan#define GET_CLASS_NARROWEST_MODE(CLASS) class_narrowest_mode[CLASS]
16818334Speter
16918334Speter/* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
17018334Speter   and the mode whose class is Pmode and whose size is POINTER_SIZE.  */
17118334Speter
17218334Speterextern enum machine_mode byte_mode;
17318334Speterextern enum machine_mode word_mode;
17418334Speterextern enum machine_mode ptr_mode;
17518334Speter
176132718Skan/* Target-dependent machine mode initialization - in insn-modes.c.  */
177132718Skanextern void init_adjust_machine_modes (void);
178132718Skan
179132718Skan#endif /* not HAVE_MACHINE_MODES */
180