/* This file contains the definitions and documentation for the
   machine modes used in the GNU compiler.
   Copyright (C) 1987, 1992, 1994, 1997, 1998 Free Software Foundation, Inc.

This file is part of GNU CC.

GNU CC 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 version.

GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or 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
along with GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */


/* This file defines all the MACHINE MODES used by GNU CC.

   A machine mode specifies a size and format of data
   at the machine level.

   Each RTL expression has a machine mode.

   At the syntax tree level, each ..._TYPE and each ..._DECL node
   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_RANDOM - anything else

   Fourth 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. 


   Fifth arg is the relative size of subunits of the object.
   It is same as the fourth argument except for complexes,
   since they are really made of two equal size subunits.

   Sixth arg is next wider natural mode of the same class.
   0 if there is none.  */

/* 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, VOIDmode)

DEF_MACHMODE (PQImode, "PQI", MODE_PARTIAL_INT, 1, 1, PHImode)
DEF_MACHMODE (QImode, "QI", MODE_INT, 1, 1, HImode)		/* int types */
DEF_MACHMODE (PHImode, "PHI", MODE_PARTIAL_INT, 2, 2, PSImode)
DEF_MACHMODE (HImode, "HI", MODE_INT, 2, 2, SImode)
/* Pointers on some machines use this type 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 (PSImode, "PSI", MODE_PARTIAL_INT, 4, 4, PDImode)
DEF_MACHMODE (SImode, "SI", MODE_INT, 4, 4, DImode)
DEF_MACHMODE (PDImode, "PDI", MODE_PARTIAL_INT, 8, 8, VOIDmode)
DEF_MACHMODE (DImode, "DI", MODE_INT, 8, 8, TImode)
DEF_MACHMODE (TImode, "TI", MODE_INT, 16, 16, OImode)
DEF_MACHMODE (OImode, "OI", MODE_INT, 32, 32, VOIDmode)

DEF_MACHMODE (QFmode, "QF", MODE_FLOAT, 1, 1, HFmode)
DEF_MACHMODE (HFmode, "HF", MODE_FLOAT, 2, 2, TQFmode)
DEF_MACHMODE (TQFmode, "TQF", MODE_FLOAT, 3, 3, SFmode)  /* MIL-STD-1750A */
DEF_MACHMODE (SFmode, "SF", MODE_FLOAT, 4, 4, DFmode)
DEF_MACHMODE (DFmode, "DF", MODE_FLOAT, 8, 8, XFmode)
DEF_MACHMODE (XFmode, "XF", MODE_FLOAT, 12, 12, TFmode)   /* IEEE extended */
DEF_MACHMODE (TFmode, "TF", MODE_FLOAT, 16, 16, VOIDmode)

/* Complex modes.  */
DEF_MACHMODE (QCmode, "QC", MODE_COMPLEX_FLOAT, 2, 1, HCmode)
DEF_MACHMODE (HCmode, "HC", MODE_COMPLEX_FLOAT, 4, 2, SCmode)
DEF_MACHMODE (SCmode, "SC", MODE_COMPLEX_FLOAT, 8, 4, DCmode)
DEF_MACHMODE (DCmode, "DC", MODE_COMPLEX_FLOAT, 16, 8, XCmode)
DEF_MACHMODE (XCmode, "XC", MODE_COMPLEX_FLOAT, 24, 12, TCmode)
DEF_MACHMODE (TCmode, "TC", MODE_COMPLEX_FLOAT, 32, 16, VOIDmode)

DEF_MACHMODE (CQImode, "CQI", MODE_COMPLEX_INT, 2, 1, CHImode)
DEF_MACHMODE (CHImode, "CHI", MODE_COMPLEX_INT, 4, 2, CSImode)
DEF_MACHMODE (CSImode, "CSI", MODE_COMPLEX_INT, 8, 4, CDImode)
DEF_MACHMODE (CDImode, "CDI", MODE_COMPLEX_INT, 16, 8, CTImode)
DEF_MACHMODE (CTImode, "CTI", MODE_COMPLEX_INT, 32, 16, COImode)
DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, 64, 32, VOIDmode)

/* BLKmode is used for structures, arrays, etc.
   that fit no more specific mode.  */
DEF_MACHMODE (BLKmode, "BLK", MODE_RANDOM, 0, 0, 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 macro.  Everything but the names of the modes
   are copied from CCmode.  For these modes, GET_MODE_WIDER_MODE points
   to the next defined CC mode, if any.  */

DEF_MACHMODE (CCmode, "CC", MODE_CC, 4, 4, VOIDmode)

/* 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.  */

/*
Local variables:
mode:c
version-control: t
End:
*/
