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