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