/* MIPS extra machine modes. 
   Copyright (C) 2003-2021 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 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/>.  */

FLOAT_MODE (TF, 16, ieee_quad_format);

/* Vector modes.  */
VECTOR_MODES (INT, 4);        /* V4QI  V2HI      */
VECTOR_MODES (INT, 8);        /* V8QI  V4HI V2SI */
VECTOR_MODES (FLOAT, 8);      /*       V4HF V2SF */

/* For MIPS MSA 128 bits.  */
VECTOR_MODES (INT, 16);       /* V16QI V8HI V4SI V2DI */
VECTOR_MODES (FLOAT, 16);     /*            V4SF V2DF */

/* Double-sized vector modes for vec_concat.  */
VECTOR_MODE (INT, QI, 32);    /* V32QI                */
VECTOR_MODE (INT, HI, 16);    /*       V16HI          */
VECTOR_MODE (INT, SI, 8);     /*            V8SI      */
VECTOR_MODE (INT, DI, 4);     /*                 V4DI */
VECTOR_MODE (FLOAT, SF, 8);   /*            V8SF      */
VECTOR_MODE (FLOAT, DF, 4);   /*                 V4DF */

VECTOR_MODES (FRACT, 4);	/* V4QQ  V2HQ */
VECTOR_MODES (UFRACT, 4);	/* V4UQQ V2UHQ */
VECTOR_MODES (ACCUM, 4);	/*       V2HA */
VECTOR_MODES (UACCUM, 4);	/*       V2UHA */

/* Paired single comparison instructions use 2 or 4 CC.  */
CC_MODE (CCV2);
ADJUST_BYTESIZE (CCV2, 8);
ADJUST_ALIGNMENT (CCV2, 8);

CC_MODE (CCV4);
ADJUST_BYTESIZE (CCV4, 16);
ADJUST_ALIGNMENT (CCV4, 16);

/* For MIPS DSP control registers.  */
CC_MODE (CCDSP);

/* For floating point conditions in FP registers.  */
CC_MODE (CCF);
