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