/* Definitions of target machine for GCC, for Sun SPARC.
   Copyright (C) 2002-2021 Free Software Foundation, Inc.
   Contributed by Michael Tiemann (tiemann@cygnus.com).
   64-bit SPARC V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
   at Cygnus Support.

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 3, 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 COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

/* 128-bit floating point */
FLOAT_MODE (TF, 16, ieee_quad_format);

/* We need a 32-byte mode to return structures in the 64-bit ABI.  */
INT_MODE (OI, 32);

/* Add any extra modes needed to represent the condition code.

   We have a CCNZ mode which is used for implicit comparisons with zero when
   arithmetic instructions set the condition code.  Only the N and Z flags
   are valid in this mode, which means that only the =,!= and <,>= operators
   can be used in conjunction with it.

   We also have a CCCmode which is used by the arithmetic instructions when
   they explicitly set the C flag (unsigned overflow).  Only the unsigned
   <,>= operators can be used in conjunction with it.

   We also have a CCVmode which is used by the arithmetic instructions when
   they explicitly set the V flag (signed overflow).  Only the =,!= operators
   can be used in conjunction with it.

   We also have two modes to indicate that the relevant condition code is
   in the floating-point condition code register.  One for comparisons which
   will generate an exception if the result is unordered (CCFPEmode) and
   one for comparisons which will never trap (CCFPmode).

   CC modes are used for the 32-bit ICC, CCX modes for the 64-bit XCC.  */

CC_MODE (CCX);
CC_MODE (CCNZ);
CC_MODE (CCXNZ);
CC_MODE (CCC);
CC_MODE (CCXC);
CC_MODE (CCV);
CC_MODE (CCXV);
CC_MODE (CCFP);
CC_MODE (CCFPE);

/* Vector modes.  */
VECTOR_MODES (INT, 16);       /* V16QI V8HI V4SI V2DI      */
VECTOR_MODES (INT, 8);        /*       V8QI V4HI V2SI      */
VECTOR_MODES (INT, 4);        /*            V4QI V2HI      */
VECTOR_MODE (INT, DI, 1);     /*                      V1DI */
VECTOR_MODE (INT, SI, 1);     /*                      V1SI */
