/* Definitions of target machine for GNU compiler, for ARM.
   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
   Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl)
   and Martin Simmons (@harleqn.co.uk).
   More major hacks by Richard Earnshaw (rearnsha@arm.com)
   Minor hacks by Nick Clifton (nickc@cygnus.com)

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

   GCC 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 GCC; see the file COPYING.  If not, write to
   the Free Software Foundation, 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.  */

/* Extended precision floating point.
   FIXME What format is this?  */
FLOAT_MODE (XF, 12, 0);
/* LLVM LOCAL begin */
FLOAT_MODE (HF, 2, ieee_half_format);
/* LLVM LOCAL end */

/* CCFPEmode should be used with floating inequalities,
   CCFPmode should be used with floating equalities.
   CC_NOOVmode should be used with SImode integer equalities.
   CC_Zmode should be used if only the Z flag is set correctly
   CC_Nmode should be used if only the N (sign) flag is set correctly
   CCmode should be used otherwise.  */

CC_MODE (CC_NOOV);
CC_MODE (CC_Z);
CC_MODE (CC_SWP);
CC_MODE (CCFP);
CC_MODE (CCFPE);
CC_MODE (CC_DNE);
CC_MODE (CC_DEQ);
CC_MODE (CC_DLE);
CC_MODE (CC_DLT);
CC_MODE (CC_DGE);
CC_MODE (CC_DGT);
CC_MODE (CC_DLEU);
CC_MODE (CC_DLTU);
CC_MODE (CC_DGEU);
CC_MODE (CC_DGTU);
CC_MODE (CC_C);
CC_MODE (CC_N);

/* Vector modes.  */
VECTOR_MODES (INT, 4);        /*            V4QI V2HI */
VECTOR_MODES (INT, 8);        /*       V8QI V4HI V2SI */
VECTOR_MODES (INT, 16);       /* V16QI V8HI V4SI V2DI */
VECTOR_MODES (FLOAT, 8);      /*            V4HF V2SF */
VECTOR_MODES (FLOAT, 16);     /*       V8HF V4SF V2DF */
/* LLVM LOCAL use v1di instead of di mode */
VECTOR_MODE (INT, DI, 1);     /*                 V1DI */

/* APPLE LOCAL begin v7 support. Merge from Codesourcery */
/* Opaque integer modes for 3, 4, 6 or 8 Neon double registers (2 is
   TImode).  */
INT_MODE (EI, 24);
INT_MODE (OI, 32);
INT_MODE (CI, 48);
/* ??? This should actually have 512 bits but the precision only has 9
   bits.  */
FRACTIONAL_INT_MODE (XI, 511, 64);
/* APPLE LOCAL end v7 support. Merge from Codesourcery */
