OSDN Git Service

ChangeLog:
[pf3gnuchains/gcc-fork.git] / gcc / machmode.def
index 6cb912c..fbaea10 100644 (file)
@@ -1,12 +1,13 @@
 /* This file contains the definitions and documentation for the
    machine modes used in the GNU compiler.
 /* This file contains the definitions and documentation for the
    machine modes used in the GNU compiler.
-   Copyright (C) 1987, 1992, 1994, 1997, 1998, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1992, 1994, 1997, 1998, 2000, 2003, 2004, 2005,
+   2007  Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,9 +16,8 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 
 /* This file defines all the MACHINE MODES used by GCC.
 
 
 /* This file defines all the MACHINE MODES used by GCC.
@@ -31,145 +31,214 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    has a machine mode which describes data of that type or the
    data of the variable declared.  */
 
    has a machine mode which describes data of that type or the
    data of the variable declared.  */
 
-/* The first argument is the internal name of the machine mode
-   used in the C source.
-   By convention these are in UPPER_CASE, except for the word  "mode".
-
-   The second argument  is the name of the machine mode in the
-   external ASCII format used for reading and printing RTL and trees.
-   By convention these names in UPPER_CASE.
-
-   Third argument states the kind of representation:
-   MODE_INT - integer
-   MODE_FLOAT - floating
-   MODE_PARTIAL_INT - PQImode, PHImode, PSImode and PDImode
-   MODE_CC - modes used for representing the condition code in a register
-   MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT - complex number
-   MODE_VECTOR_INT, MODE_VECTOR_FLOAT - vector
-   MODE_RANDOM - anything else
-
-   Fourth argument is the relative size of the object, in bits,
-   so we can have modes smaller than 1 byte.
-
-   Fifth argument is the relative size of the object, in bytes.
-   It is zero when the size is meaningless or not determined.
-   A byte's size is determined by BITS_PER_UNIT in tm.h. 
-
-   Sixth arg is the relative size of subunits of the object.
-   It is same as the fifth argument except for complexes and vectors,
-   since they are really made of many equal size subunits.
-
-   Seventh arg is next wider natural mode of the same class.  0 if
-   there is none.  Vector modes use this field to point to the next
-   vector size, so we can iterate through the different vectors modes.
-   The ordering is by increasing byte size, with QI coming before HI,
-   HI before SI, etc.
-
-   Eigth arg is the mode of the internal elements in a vector or
-   complex, and VOIDmode if not applicable.
-*/
+/* This file is included by the genmodes program.  Its text is the
+   body of a function.  Do not rely on this, it will change in the
+   future.
+
+   The following statements can be used in this file -- all have
+   the form of a C macro call.  In their arguments:
+
+   A CLASS argument must be one of the constants defined in
+   mode-classes.def, less the leading MODE_ prefix; some statements
+   that take CLASS arguments have restrictions on which classes are
+   acceptable.  For instance, INT.
+
+   A MODE argument must be the printable name of a machine mode,
+   without quotation marks or trailing "mode".  For instance, SI.
+
+   A PRECISION, BYTESIZE, or COUNT argument must be a positive integer
+   constant.
+
+   A FORMAT argument must be one of the real_mode_format structures
+   declared in real.h, or else a literal 0.  Do not put a leading &
+   on the argument.
+
+   An EXPR argument must be a syntactically valid C expression.
+   If an EXPR contains commas, you may need to write an extra pair of
+   parentheses around it, so it appears to be a single argument to the
+   statement.
+
+   This file defines only those modes which are of use on almost all
+   machines.  Other modes can be defined in the target-specific
+   mode definition file, config/ARCH/ARCH-modes.def.
+
+   Order matters in this file in so far as statements which refer to
+   other modes must appear after the modes they refer to.  However,
+   statements which do not refer to other modes may appear in any
+   order.
+
+     RANDOM_MODE (MODE);
+        declares MODE to be of class RANDOM.
+
+     CC_MODE (MODE);
+        declares MODE to be of class CC.
+
+     INT_MODE (MODE, BYTESIZE);
+        declares MODE to be of class INT and BYTESIZE bytes wide.
+       All of the bits of its representation are significant.
+
+     FRACTIONAL_INT_MODE (MODE, PRECISION, BYTESIZE);
+        declares MODE to be of class INT, BYTESIZE bytes wide in
+       storage, but with only PRECISION significant bits.
+
+     FLOAT_MODE (MODE, BYTESIZE, FORMAT);
+        declares MODE to be of class FLOAT and BYTESIZE bytes wide,
+       using floating point format FORMAT.
+       All of the bits of its representation are significant.
+
+     DECIMAL FLOAT_MODE (MODE, BYTESIZE);
+       declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes
+       wide.  All of the bits of its representation are significant.
+
+     FRACTIONAL_FLOAT_MODE (MODE, PRECISION, BYTESIZE, FORMAT);
+        declares MODE to be of class FLOAT, BYTESIZE bytes wide in
+       storage, but with only PRECISION significant bits, using
+       floating point format FORMAT.
+
+     FRACT_MODE (MODE, BYTESIZE, FBIT);
+       declares MODE to be of class FRACT and BYTESIZE bytes wide
+       with FBIT fractional bits.  There may be padding bits.
+
+     UFRACT_MODE (MODE, BYTESIZE, FBIT);
+       declares MODE to be of class UFRACT and BYTESIZE bytes wide
+       with FBIT fractional bits.  There may be padding bits.
+
+     ACCUM_MODE (MODE, BYTESIZE, IBIT, FBIT);
+       declares MODE to be of class ACCUM and BYTESIZE bytes wide
+       with IBIT integral bits and FBIT fractional bits.
+       There may be padding bits.
+
+     UACCUM_MODE (MODE, BYTESIZE, FBIT);
+       declares MODE to be of class UACCUM and BYTESIZE bytes wide
+       with IBIT integral bits and FBIT fractional bits.
+       There may be padding bits.
+
+     RESET_FLOAT_FORMAT (MODE, FORMAT);
+       changes the format of MODE, which must be class FLOAT,
+       to FORMAT.  Use in an ARCH-modes.def to reset the format
+       of one of the float modes defined in this file.
+
+     PARTIAL_INT_MODE (MODE);
+        declares a mode of class PARTIAL_INT with the same size as
+       MODE (which must be an INT mode).  The name of the new mode
+       is made by prefixing a P to the name MODE.  This statement
+       may grow a PRECISION argument in the future.
+
+     VECTOR_MODE (CLASS, MODE, COUNT);
+        Declare a vector mode whose component mode is MODE (of class
+       CLASS) with COUNT components.  CLASS must be INT or FLOAT.
+       The name of the vector mode takes the form VnX where n is
+       COUNT in decimal and X is MODE.
+
+     VECTOR_MODES (CLASS, WIDTH);
+        For all modes presently declared in class CLASS, construct
+       corresponding vector modes having width WIDTH.  Modes whose
+       byte sizes do not evenly divide WIDTH are ignored, as are
+       modes that would produce vector modes with only one component,
+       and modes smaller than one byte (if CLASS is INT) or smaller
+       than two bytes (if CLASS is FLOAT).  CLASS must be INT or
+       FLOAT.  The names follow the same rule as VECTOR_MODE uses.
+
+     COMPLEX_MODES (CLASS);
+        For all modes presently declared in class CLASS, construct
+       corresponding complex modes.  Modes smaller than one byte
+       are ignored.  For FLOAT modes, the names are derived by
+       replacing the 'F' in the mode name with a 'C'.  (It is an
+       error if there is no 'F'.  For INT modes, the names are
+       derived by prefixing a C to the name.
+
+     ADJUST_BYTESIZE (MODE, EXPR);
+     ADJUST_ALIGNMENT (MODE, EXPR);
+     ADJUST_FLOAT_FORMAT (MODE, EXPR);
+     ADJUST_IBIT (MODE, EXPR);
+     ADJUST_FBIT (MODE, EXPR);
+       Arrange for the byte size, alignment, floating point format, ibit,
+       or fbit of MODE to be adjustable at run time.  EXPR will be executed
+       once after processing all command line options, and should
+       evaluate to the desired byte size, alignment, format, ibit or fbit.
+
+       Unlike a FORMAT argument, if you are adjusting a float format
+       you must put an & in front of the name of each format structure.
+
+   Note: If a mode is ever made which is more than 255 bytes wide,
+   machmode.h and genmodes.c will have to be changed to allocate
+   more space for the mode_size and mode_alignment arrays.  */
 
 /* VOIDmode is used when no mode needs to be specified,
    as for example on CONST_INT RTL expressions.  */
 
 /* VOIDmode is used when no mode needs to be specified,
    as for example on CONST_INT RTL expressions.  */
-DEF_MACHMODE (VOIDmode, "VOID", MODE_RANDOM, 0, 0, 0, VOIDmode, VOIDmode)
-
-DEF_MACHMODE (BImode, "BI", MODE_INT, 1, 1, 1, QImode, VOIDmode)
-DEF_MACHMODE (QImode, "QI", MODE_INT, BITS_PER_UNIT, 1, 1, HImode, VOIDmode)
-DEF_MACHMODE (HImode, "HI", MODE_INT, BITS_PER_UNIT*2, 2, 2, SImode, VOIDmode)
-DEF_MACHMODE (SImode, "SI", MODE_INT, BITS_PER_UNIT*4, 4, 4, DImode, VOIDmode)
-DEF_MACHMODE (DImode, "DI", MODE_INT, BITS_PER_UNIT*8, 8, 8, TImode, VOIDmode)
-DEF_MACHMODE (TImode, "TI", MODE_INT, BITS_PER_UNIT*16, 16, 16, OImode, VOIDmode)
-DEF_MACHMODE (OImode, "OI", MODE_INT, BITS_PER_UNIT*32, 32, 32, VOIDmode, VOIDmode)
-
-/* Pointers on some machines use these types to distinguish them from
-   ints.  Useful if a pointer is 4 bytes but has some bits that are
-   not significant, so it is really not quite as wide as an integer.  */
-DEF_MACHMODE (PQImode, "PQI", MODE_PARTIAL_INT, BITS_PER_UNIT, 1, 1, PHImode, VOIDmode)
-DEF_MACHMODE (PHImode, "PHI", MODE_PARTIAL_INT, BITS_PER_UNIT*2, 2, 2, PSImode, VOIDmode)
-DEF_MACHMODE (PSImode, "PSI", MODE_PARTIAL_INT, BITS_PER_UNIT*4, 4, 4, PDImode, VOIDmode)
-DEF_MACHMODE (PDImode, "PDI", MODE_PARTIAL_INT, BITS_PER_UNIT*8, 8, 8, VOIDmode, VOIDmode)
-
-DEF_MACHMODE (QFmode, "QF", MODE_FLOAT, BITS_PER_UNIT, 1, 1, HFmode, VOIDmode)
-DEF_MACHMODE (HFmode, "HF", MODE_FLOAT, BITS_PER_UNIT*2, 2, 2, TQFmode, VOIDmode)
-DEF_MACHMODE (TQFmode, "TQF", MODE_FLOAT, BITS_PER_UNIT*3, 3, 3, SFmode, VOIDmode) /* MIL-STD-1750A */
-DEF_MACHMODE (SFmode, "SF", MODE_FLOAT, BITS_PER_UNIT*4, 4, 4, DFmode, VOIDmode)
-DEF_MACHMODE (DFmode, "DF", MODE_FLOAT, BITS_PER_UNIT*8, 8, 8, XFmode, VOIDmode)
-DEF_MACHMODE (XFmode, "XF", MODE_FLOAT, BITS_PER_UNIT*12, 12, 12, TFmode, VOIDmode) /* IEEE extended */
-DEF_MACHMODE (TFmode, "TF", MODE_FLOAT, BITS_PER_UNIT*16, 16, 16, VOIDmode, VOIDmode)
-
-/* Complex modes.  */
-DEF_MACHMODE (QCmode, "QC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*2, 2, 1, HCmode, QFmode)
-DEF_MACHMODE (HCmode, "HC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*4, 4, 2, SCmode, HFmode)
-DEF_MACHMODE (SCmode, "SC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*8, 8, 4, DCmode, SFmode)
-DEF_MACHMODE (DCmode, "DC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*16, 16, 8, XCmode, DFmode)
-DEF_MACHMODE (XCmode, "XC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*24, 24, 12, TCmode, XFmode)
-DEF_MACHMODE (TCmode, "TC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*32, 32, 16, VOIDmode, TFmode)
-
-DEF_MACHMODE (CQImode, "CQI", MODE_COMPLEX_INT, BITS_PER_UNIT*2, 2, 1, CHImode, QImode)
-DEF_MACHMODE (CHImode, "CHI", MODE_COMPLEX_INT, BITS_PER_UNIT*4, 4, 2, CSImode, HImode)
-DEF_MACHMODE (CSImode, "CSI", MODE_COMPLEX_INT, BITS_PER_UNIT*8, 8, 4, CDImode, SImode)
-DEF_MACHMODE (CDImode, "CDI", MODE_COMPLEX_INT, BITS_PER_UNIT*16, 16, 8, CTImode, DImode)
-DEF_MACHMODE (CTImode, "CTI", MODE_COMPLEX_INT, BITS_PER_UNIT*32, 32, 16, COImode, TImode)
-DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, BITS_PER_UNIT*64, 64, 32, VOIDmode, OImode)
-
-/* Vector modes.  */
-/* The wider mode field for vectors follows in order of increasing bit
-   size with QI coming before HI, HI before SI, and SI before DI
-   within same bit sizes.  */
-DEF_MACHMODE (V1DImode, "V1DI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 8, V2QImode, DImode)
-DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, V4QImode, QImode)
-DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, V8QImode, HImode)
-DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, V16QImode, SImode)
-DEF_MACHMODE (V2DImode, "V2DI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 8, V8SImode, DImode)
-
-DEF_MACHMODE (V4QImode, "V4QI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 1, V2HImode, QImode)
-DEF_MACHMODE (V4HImode, "V4HI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 2, V2SImode, HImode)
-DEF_MACHMODE (V4SImode, "V4SI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 4, V2DImode, SImode)
-DEF_MACHMODE (V4DImode, "V4DI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 8, V8DImode, DImode)
-
-DEF_MACHMODE (V8QImode, "V8QI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 1, V4HImode, QImode)
-DEF_MACHMODE (V8HImode, "V8HI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 2, V4SImode, HImode)
-DEF_MACHMODE (V8SImode, "V8SI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 4, V4DImode, SImode)
-DEF_MACHMODE (V8DImode, "V8DI", MODE_VECTOR_INT, BITS_PER_UNIT*64, 64, 8, VOIDmode, DImode)
-
-DEF_MACHMODE (V16QImode, "V16QI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 1, V8HImode, QImode)
-
-DEF_MACHMODE (V2HFmode, "V2HF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*4, 4, 2, V4HFmode, HFmode)
-DEF_MACHMODE (V2SFmode, "V2SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8, 8, 4, V4SFmode, SFmode)
-DEF_MACHMODE (V2DFmode, "V2DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 8, V8SFmode, DFmode)
-
-DEF_MACHMODE (V4HFmode, "V4HF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8,  8,  2, V2SFmode, HFmode)
-DEF_MACHMODE (V4SFmode, "V4SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 4, V2DFmode, SFmode)
-DEF_MACHMODE (V4DFmode, "V4DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 8, V8DFmode, DFmode)
-
-DEF_MACHMODE (V8HFmode, "V8HF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 2, V4SFmode, HFmode)
-DEF_MACHMODE (V8SFmode, "V8SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 4, V4DFmode, SFmode)
-DEF_MACHMODE (V8DFmode, "V8DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*64, 64, 8, VOIDmode, DFmode)
-DEF_MACHMODE (V16SFmode, "V16SF", MODE_VECTOR_FLOAT, 512, 64, 4, VOIDmode, SFmode)
+RANDOM_MODE (VOID);
 
 /* BLKmode is used for structures, arrays, etc.
    that fit no more specific mode.  */
 
 /* BLKmode is used for structures, arrays, etc.
    that fit no more specific mode.  */
-DEF_MACHMODE (BLKmode, "BLK", MODE_RANDOM, 0, 0, 0, VOIDmode, VOIDmode)
-
-/* The modes for representing the condition codes come last.  CCmode
-   is always defined.  Additional modes for the condition code can be
-   specified in the EXTRA_CC_MODES header.  All MODE_CC modes are the
-   same width as SImode and have VOIDmode as their next wider mode.  */
-
-/* We do not use CC() for CCmode to avoid a warning about use of
-   function-like macros with no arguments.  */
-DEF_MACHMODE (CCmode, "CC", MODE_CC, BITS_PER_UNIT*4, 4, 4, VOIDmode, VOIDmode)
-
-#ifdef EXTRA_MODES_FILE
-#define CC(N)  \
-  DEF_MACHMODE (CONCAT2 (N,mode), STRINGX (N), \
-                MODE_CC, BITS_PER_UNIT*4, 4, 4, VOIDmode, VOIDmode)
-#include EXTRA_MODES_FILE
-#undef CC
+RANDOM_MODE (BLK);
+
+/* Single bit mode used for booleans.  */
+FRACTIONAL_INT_MODE (BI, 1, 1);
+
+/* Basic integer modes.  We go up to TI in generic code (128 bits).
+   The name OI is reserved for a 256-bit type (needed by some back ends).
+   FIXME TI shouldn't be generically available either.  */
+INT_MODE (QI, 1);
+INT_MODE (HI, 2);
+INT_MODE (SI, 4);
+INT_MODE (DI, 8);
+INT_MODE (TI, 16);
+
+/* No partial integer modes are defined by default.  */
+
+/* Basic floating point modes.  SF and DF are the only modes provided
+   by default.  The names QF, HF, XF, and TF are reserved for targets
+   that need 1-word, 2-word, 80-bit, or 128-bit float types respectively.
+
+   These are the IEEE mappings.  They can be overridden with
+   RESET_FLOAT_FORMAT or at runtime (in OVERRIDE_OPTIONS).  */
+
+FLOAT_MODE (SF, 4, ieee_single_format);
+FLOAT_MODE (DF, 8, ieee_double_format);
+
+/* Basic CC modes.
+   FIXME define this only for targets that need it.  */
+CC_MODE (CC);
+
+/* Fixed-point modes.  */
+FRACT_MODE (QQ, 1, 7); /* s.7 */
+FRACT_MODE (HQ, 2, 15); /* s.15 */
+FRACT_MODE (SQ, 4, 31); /* s.31 */
+FRACT_MODE (DQ, 8, 63); /* s.63 */
+FRACT_MODE (TQ, 16, 127); /* s.127 */
+
+UFRACT_MODE (UQQ, 1, 8); /* .8 */
+UFRACT_MODE (UHQ, 2, 16); /* .16 */
+UFRACT_MODE (USQ, 4, 32); /* .32 */
+UFRACT_MODE (UDQ, 8, 64); /* .64 */
+UFRACT_MODE (UTQ, 16, 128); /* .128 */
+
+ACCUM_MODE (HA, 2, 8, 7); /* s8.7 */
+ACCUM_MODE (SA, 4, 16, 15); /* s16.15 */
+ACCUM_MODE (DA, 8, 32, 31); /* s32.31 */
+ACCUM_MODE (TA, 16, 64, 63); /* s64.63 */
+
+UACCUM_MODE (UHA, 2, 8, 8); /* 8.8 */
+UACCUM_MODE (USA, 4, 16, 16); /* 16.16 */
+UACCUM_MODE (UDA, 8, 32, 32); /* 32.32 */
+UACCUM_MODE (UTA, 16, 64, 64); /* 64.64 */
+
+/* Allow the target to specify additional modes of various kinds.  */
+#if HAVE_EXTRA_MODES
+# include EXTRA_MODES_FILE
 #endif
 
 #endif
 
+/* Complex modes.  */
+COMPLEX_MODES (INT);
+COMPLEX_MODES (FLOAT);
+
+/* Decimal floating point modes.  */
+DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);
+DECIMAL_FLOAT_MODE (DD, 8, decimal_double_format);
+DECIMAL_FLOAT_MODE (TD, 16, decimal_quad_format);
+
 /* The symbol Pmode stands for one of the above machine modes (usually SImode).
 /* The symbol Pmode stands for one of the above machine modes (usually SImode).
-   The tm file specifies which one.  It is not a distinct mode.  */
+   The tm.h file specifies which one.  It is not a distinct mode.  */
 
 /*
 Local variables:
 
 /*
 Local variables: