machmode.h revision 50397
118334Speter/* Machine mode definitions for GNU C-Compiler; included by rtl.h and tree.h.
250397Sobrien   Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
318334Speter
418334SpeterThis file is part of GNU CC.
518334Speter
618334SpeterGNU CC is free software; you can redistribute it and/or modify
718334Speterit under the terms of the GNU General Public License as published by
818334Speterthe Free Software Foundation; either version 2, or (at your option)
918334Speterany later version.
1018334Speter
1118334SpeterGNU CC is distributed in the hope that it will be useful,
1218334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1318334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1418334SpeterGNU General Public License for more details.
1518334Speter
1618334SpeterYou should have received a copy of the GNU General Public License
1718334Speteralong with GNU CC; see the file COPYING.  If not, write to
1818334Speterthe Free Software Foundation, 59 Temple Place - Suite 330,
1918334SpeterBoston, MA 02111-1307, USA.  */
2018334Speter
2150397Sobrien#ifndef HAVE_MACHINE_MODES
2250397Sobrien#define HAVE_MACHINE_MODES
2318334Speter
2450397Sobrien#include "gansidecl.h"
2518334Speter
2618334Speter/* Strictly speaking, this isn't the proper place to include these definitions,
2718334Speter   but this file is included by every GCC file.
2818334Speter
2918334Speter   Some systems define these in, e.g., param.h.  We undefine these names
3018334Speter   here to avoid the warnings.  We prefer to use our definitions since we
3118334Speter   know they are correct.  */
3218334Speter
3318334Speter#undef MIN
3418334Speter#undef MAX
3518334Speter
3618334Speter#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
3718334Speter#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
3818334Speter
3918334Speter/* Find the largest host integer type and set its size and type.  */
4018334Speter
4118334Speter#ifndef HOST_BITS_PER_WIDE_INT
4218334Speter
4318334Speter#if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
4418334Speter#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
4518334Speter#define HOST_WIDE_INT long
4618334Speter#else
4718334Speter#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
4818334Speter#define HOST_WIDE_INT int
4918334Speter#endif
5018334Speter
5118334Speter#endif
5218334Speter
5318334Speter/* Provide a default way to print an address in hex via printf.  */
5418334Speter
5518334Speter#ifndef HOST_PTR_PRINTF
5650397Sobrien# ifdef HAVE_PRINTF_PTR
5750397Sobrien#  define HOST_PTR_PRINTF "%p"
5850397Sobrien# else
5950397Sobrien#  define HOST_PTR_PRINTF \
6050397Sobrien    (sizeof (int) == sizeof (char *) ? "%x" \
6150397Sobrien     : sizeof (long) == sizeof (char *) ? "%lx" : "%llx")
6250397Sobrien# endif
6350397Sobrien#endif /* ! HOST_PTR_PRINTF */
6450397Sobrien
6550397Sobrien/* Provide defaults for the way to print a HOST_WIDE_INT
6650397Sobrien   in various manners.  */
6750397Sobrien
6850397Sobrien#ifndef HOST_WIDE_INT_PRINT_DEC
6950397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
7050397Sobrien#define HOST_WIDE_INT_PRINT_DEC "%d"
7150397Sobrien#else
7250397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
7350397Sobrien#define HOST_WIDE_INT_PRINT_DEC "%ld"
7450397Sobrien#else
7550397Sobrien#define HOST_WIDE_INT_PRINT_DEC "%lld"
7618334Speter#endif
7750397Sobrien#endif
7850397Sobrien#endif
7918334Speter
8050397Sobrien#ifndef HOST_WIDE_INT_PRINT_UNSIGNED
8150397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
8250397Sobrien#define HOST_WIDE_INT_PRINT_UNSIGNED "%u"
8350397Sobrien#else
8450397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
8550397Sobrien#define HOST_WIDE_INT_PRINT_UNSIGNED "%lu"
8650397Sobrien#else
8750397Sobrien#define HOST_WIDE_INT_PRINT_UNSIGNED "%llu"
8850397Sobrien#endif
8950397Sobrien#endif
9050397Sobrien#endif
9150397Sobrien
9250397Sobrien#ifndef HOST_WIDE_INT_PRINT_HEX
9350397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
9450397Sobrien#define HOST_WIDE_INT_PRINT_HEX "0x%x"
9550397Sobrien#else
9650397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
9750397Sobrien#define HOST_WIDE_INT_PRINT_HEX "0x%lx"
9850397Sobrien#else
9950397Sobrien#define HOST_WIDE_INT_PRINT_HEX "0x%llx"
10050397Sobrien#endif
10150397Sobrien#endif
10250397Sobrien#endif
10350397Sobrien
10450397Sobrien#ifndef HOST_WIDE_INT_PRINT_DOUBLE_HEX
10550397Sobrien#if HOST_BITS_PER_WIDE_INT == 64
10650397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
10750397Sobrien#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%x%016x"
10850397Sobrien#else
10950397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
11050397Sobrien#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%lx%016lx"
11150397Sobrien#else
11250397Sobrien#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%llx%016llx"
11350397Sobrien#endif
11450397Sobrien#endif
11550397Sobrien#else
11650397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
11750397Sobrien#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%x%08x"
11850397Sobrien#else
11950397Sobrien#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
12050397Sobrien#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%lx%08lx"
12150397Sobrien#else
12250397Sobrien#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%llx%08llx"
12350397Sobrien#endif
12450397Sobrien#endif
12550397Sobrien#endif
12650397Sobrien#endif
12750397Sobrien
12818334Speter/* Make an enum class that gives all the machine modes.  */
12918334Speter
13018334Speter#define DEF_MACHMODE(SYM, NAME, TYPE, SIZE, UNIT, WIDER)  SYM,
13118334Speter
13218334Speterenum machine_mode {
13318334Speter#include "machmode.def"
13418334Speter
13518334Speter#ifdef EXTRA_CC_MODES
13618334Speter  EXTRA_CC_MODES,
13718334Speter#endif
13818334SpeterMAX_MACHINE_MODE };
13918334Speter
14018334Speter#undef DEF_MACHMODE
14118334Speter
14218334Speter#ifndef NUM_MACHINE_MODES
14318334Speter#define NUM_MACHINE_MODES (int) MAX_MACHINE_MODE
14418334Speter#endif
14518334Speter
14618334Speter/* Get the name of mode MODE as a string.  */
14718334Speter
14818334Speterextern char *mode_name[];
14950397Sobrien#define GET_MODE_NAME(MODE)		(mode_name[(int) (MODE)])
15018334Speter
15118334Speterenum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
15218334Speter		  MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MAX_MODE_CLASS};
15318334Speter
15418334Speter/* Get the general kind of object that mode MODE represents
15518334Speter   (integer, floating, complex, etc.)  */
15618334Speter
15718334Speterextern enum mode_class mode_class[];
15850397Sobrien#define GET_MODE_CLASS(MODE)		(mode_class[(int) (MODE)])
15918334Speter
16018334Speter/* Nonzero if MODE is an integral mode.  */
16118334Speter#define INTEGRAL_MODE_P(MODE)			\
16218334Speter  (GET_MODE_CLASS (MODE) == MODE_INT		\
16318334Speter   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \
16418334Speter   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT)
16518334Speter
16618334Speter/* Nonzero if MODE is a floating-point mode.  */
16718334Speter#define FLOAT_MODE_P(MODE)		\
16818334Speter  (GET_MODE_CLASS (MODE) == MODE_FLOAT	\
16918334Speter   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
17018334Speter
17150397Sobrien/* Nonzero if MODE is a complex mode.  */
17250397Sobrien#define COMPLEX_MODE_P(MODE)			\
17350397Sobrien  (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT	\
17450397Sobrien   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
17550397Sobrien
17618334Speter/* Get the size in bytes of an object of mode MODE.  */
17718334Speter
17818334Speterextern int mode_size[];
17950397Sobrien#define GET_MODE_SIZE(MODE)		(mode_size[(int) (MODE)])
18018334Speter
18118334Speter/* Get the size in bytes of the basic parts of an object of mode MODE.  */
18218334Speter
18318334Speterextern int mode_unit_size[];
18450397Sobrien#define GET_MODE_UNIT_SIZE(MODE)	(mode_unit_size[(int) (MODE)])
18518334Speter
18618334Speter/* Get the number of units in the object.  */
18718334Speter
18818334Speter#define GET_MODE_NUNITS(MODE)  \
18918334Speter  ((GET_MODE_UNIT_SIZE ((MODE)) == 0) ? 0 \
19018334Speter   : (GET_MODE_SIZE ((MODE)) / GET_MODE_UNIT_SIZE ((MODE))))
19118334Speter
19218334Speter/* Get the size in bits of an object of mode MODE.  */
19318334Speter
19450397Sobrien#define GET_MODE_BITSIZE(MODE)  (BITS_PER_UNIT * mode_size[(int) (MODE)])
19518334Speter
19618334Speter/* Get a bitmask containing 1 for all bits in a word
19718334Speter   that fit within mode MODE.  */
19818334Speter
19918334Speter#define GET_MODE_MASK(MODE)  \
20018334Speter   ((GET_MODE_BITSIZE (MODE) >= HOST_BITS_PER_WIDE_INT)  \
20118334Speter    ?(HOST_WIDE_INT) ~0 : (((HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (MODE)) - 1))
20218334Speter
20318334Speter/* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
20418334Speter
20518334Speterextern enum machine_mode mode_wider_mode[];
20650397Sobrien#define GET_MODE_WIDER_MODE(MODE)	(mode_wider_mode[(int) (MODE)])
20718334Speter
20818334Speter/* Return the mode for data of a given size SIZE and mode class CLASS.
20918334Speter   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
21018334Speter   The value is BLKmode if no other mode is found.  */
21118334Speter
21218334Speterextern enum machine_mode mode_for_size PROTO((unsigned int, enum mode_class, int));
21318334Speter
21418334Speter/* Find the best mode to use to access a bit field.  */
21518334Speter
21618334Speterextern enum machine_mode get_best_mode PROTO((int, int, int, enum machine_mode, int));
21718334Speter
21818334Speter/* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT.  */
21918334Speter
22018334Speter#define GET_MODE_ALIGNMENT(MODE)   \
22118334Speter  MIN (BIGGEST_ALIGNMENT, 	   \
22218334Speter       MAX (1, (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT)))
22318334Speter
22418334Speter/* For each class, get the narrowest mode in that class.  */
22518334Speter
22618334Speterextern enum machine_mode class_narrowest_mode[];
22750397Sobrien#define GET_CLASS_NARROWEST_MODE(CLASS) class_narrowest_mode[(int) (CLASS)]
22818334Speter
22918334Speter/* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
23018334Speter   and the mode whose class is Pmode and whose size is POINTER_SIZE.  */
23118334Speter
23218334Speterextern enum machine_mode byte_mode;
23318334Speterextern enum machine_mode word_mode;
23418334Speterextern enum machine_mode ptr_mode;
23518334Speter
23618334Speter#endif /* not HAVE_MACHINE_MODES */
237