/* This file contains the definitions and documentation for the
   machine modes used in the the GNU compiler.
   Copyright (C) 1987, 1992, 1994 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 - 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 (QImode, "QI", MODE_INT, 1, 1, HImode)		/* int types */
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 (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:
*/
