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