machmode.h revision 90075
118334Speter/* Machine mode definitions for GNU C-Compiler; included by rtl.h and tree.h.
290075Sobrien   Copyright (C) 1991, 1993, 1994, 1996, 1998, 1999, 2000, 2001
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.  */
2618334Speter
2790075Sobrien#define DEF_MACHMODE(SYM, NAME, TYPE, BITSIZE, SIZE, UNIT, WIDER)  SYM,
2818334Speter
2918334Speterenum machine_mode {
3018334Speter#include "machmode.def"
3118334SpeterMAX_MACHINE_MODE };
3218334Speter
3318334Speter#undef DEF_MACHMODE
3418334Speter
3518334Speter#ifndef NUM_MACHINE_MODES
3618334Speter#define NUM_MACHINE_MODES (int) MAX_MACHINE_MODE
3718334Speter#endif
3818334Speter
3918334Speter/* Get the name of mode MODE as a string.  */
4018334Speter
4190075Sobrienextern const char * const mode_name[NUM_MACHINE_MODES];
4250397Sobrien#define GET_MODE_NAME(MODE)		(mode_name[(int) (MODE)])
4318334Speter
4418334Speterenum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
4590075Sobrien		  MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT,
4690075Sobrien		  MODE_VECTOR_INT, MODE_VECTOR_FLOAT,
4790075Sobrien		  MAX_MODE_CLASS};
4818334Speter
4918334Speter/* Get the general kind of object that mode MODE represents
5018334Speter   (integer, floating, complex, etc.)  */
5118334Speter
5290075Sobrienextern const enum mode_class mode_class[NUM_MACHINE_MODES];
5350397Sobrien#define GET_MODE_CLASS(MODE)		(mode_class[(int) (MODE)])
5418334Speter
5518334Speter/* Nonzero if MODE is an integral mode.  */
5618334Speter#define INTEGRAL_MODE_P(MODE)			\
5718334Speter  (GET_MODE_CLASS (MODE) == MODE_INT		\
5818334Speter   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \
5990075Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \
6090075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT)
6118334Speter
6218334Speter/* Nonzero if MODE is a floating-point mode.  */
6318334Speter#define FLOAT_MODE_P(MODE)		\
6418334Speter  (GET_MODE_CLASS (MODE) == MODE_FLOAT	\
6590075Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \
6690075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
6718334Speter
6850397Sobrien/* Nonzero if MODE is a complex mode.  */
6950397Sobrien#define COMPLEX_MODE_P(MODE)			\
7050397Sobrien  (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT	\
7150397Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
7250397Sobrien
7390075Sobrien/* Nonzero if MODE is a vector mode.  */
7490075Sobrien#define VECTOR_MODE_P(MODE)			\
7590075Sobrien  (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT	\
7690075Sobrien   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
7790075Sobrien
7818334Speter/* Get the size in bytes of an object of mode MODE.  */
7918334Speter
8090075Sobrienextern const unsigned char mode_size[NUM_MACHINE_MODES];
8150397Sobrien#define GET_MODE_SIZE(MODE)		(mode_size[(int) (MODE)])
8218334Speter
8318334Speter/* Get the size in bytes of the basic parts of an object of mode MODE.  */
8418334Speter
8590075Sobrienextern const unsigned char mode_unit_size[NUM_MACHINE_MODES];
8650397Sobrien#define GET_MODE_UNIT_SIZE(MODE)	(mode_unit_size[(int) (MODE)])
8718334Speter
8818334Speter/* Get the number of units in the object.  */
8918334Speter
9018334Speter#define GET_MODE_NUNITS(MODE)  \
9118334Speter  ((GET_MODE_UNIT_SIZE ((MODE)) == 0) ? 0 \
9218334Speter   : (GET_MODE_SIZE ((MODE)) / GET_MODE_UNIT_SIZE ((MODE))))
9318334Speter
9418334Speter/* Get the size in bits of an object of mode MODE.  */
9518334Speter
9690075Sobrienextern const unsigned short mode_bitsize[NUM_MACHINE_MODES];
9790075Sobrien#define GET_MODE_BITSIZE(MODE)  (mode_bitsize[(int) (MODE)])
9818334Speter
9990075Sobrien#endif /* not HAVE_MACHINE_MODES */
10052284Sobrien
10190075Sobrien#if defined HOST_WIDE_INT && ! defined GET_MODE_MASK
10290075Sobrien
10318334Speter/* Get a bitmask containing 1 for all bits in a word
10418334Speter   that fit within mode MODE.  */
10518334Speter
10690075Sobrienextern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
10718334Speter
10852284Sobrien#define GET_MODE_MASK(MODE) mode_mask_array[(int) (MODE)]
10952284Sobrien
11090075Sobrien#endif /* defined (HOST_WIDE_INT) && ! defined GET_MODE_MASK */
11152284Sobrien
11290075Sobrien#if ! defined GET_MODE_WIDER_MODE || ! defined GET_MODE_ALIGNMENT \
11390075Sobrien    || ! defined GET_CLASS_NARROWEST_MODE
11490075Sobrien
11518334Speter/* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
11618334Speter
11790075Sobrienextern const unsigned char mode_wider_mode[NUM_MACHINE_MODES];
11852284Sobrien#define GET_MODE_WIDER_MODE(MODE)	((enum machine_mode)mode_wider_mode[(int) (MODE)])
11918334Speter
12018334Speter/* Return the mode for data of a given size SIZE and mode class CLASS.
12118334Speter   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
12218334Speter   The value is BLKmode if no other mode is found.  */
12318334Speter
12490075Sobrienextern enum machine_mode mode_for_size PARAMS ((unsigned int,
12590075Sobrien						enum mode_class, int));
12618334Speter
12752284Sobrien/* Similar, but find the smallest mode for a given width.  */
12852284Sobrien
12990075Sobrienextern enum machine_mode smallest_mode_for_size
13090075Sobrien				PARAMS ((unsigned int, enum mode_class));
13152284Sobrien
13252284Sobrien
13352284Sobrien/* Return an integer mode of the exact same size as the input mode,
13452284Sobrien   or BLKmode on failure.  */
13552284Sobrien
13690075Sobrienextern enum machine_mode int_mode_for_mode PARAMS ((enum machine_mode));
13752284Sobrien
13818334Speter/* Find the best mode to use to access a bit field.  */
13918334Speter
14090075Sobrienextern enum machine_mode get_best_mode PARAMS ((int, int, unsigned int,
14190075Sobrien						enum machine_mode, int));
14218334Speter
14318334Speter/* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT.  */
14418334Speter
14590075Sobrienextern unsigned get_mode_alignment PARAMS ((enum machine_mode));
14618334Speter
14790075Sobrien#define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE)
14890075Sobrien
14918334Speter/* For each class, get the narrowest mode in that class.  */
15018334Speter
15190075Sobrienextern const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS];
15250397Sobrien#define GET_CLASS_NARROWEST_MODE(CLASS) class_narrowest_mode[(int) (CLASS)]
15318334Speter
15418334Speter/* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
15518334Speter   and the mode whose class is Pmode and whose size is POINTER_SIZE.  */
15618334Speter
15718334Speterextern enum machine_mode byte_mode;
15818334Speterextern enum machine_mode word_mode;
15918334Speterextern enum machine_mode ptr_mode;
16018334Speter
16190075Sobrien#endif /* ! defined GET_MODE_WIDER_MODE || ! defined GET_MODE_ALIGNMENT
16290075Sobrien	  || ! defined GET_CLASS_NARROWEST_MODE */
163