]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/machmode.def
[arm] Fix testsuite nit when compiling for thumb2
[thirdparty/gcc.git] / gcc / machmode.def
index 0b762497d0092bd2973baf2e4d724db26aceb061..5f0b370227ee80b2fcba87e84d393d2f4dad98a5 100644 (file)
@@ -1,13 +1,12 @@
 /* This file contains the definitions and documentation for the
    machine modes used in the GNU compiler.
-   Copyright (C) 1987, 1992, 1994, 1997, 1998, 2000, 2003
-   Free Software Foundation, Inc.
+   Copyright (C) 1987-2019 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 2, or (at your option) any later
+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
@@ -16,9 +15,8 @@ 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, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 
 /* This file defines all the MACHINE MODES used by GCC.
@@ -41,13 +39,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
    A CLASS argument must be one of the constants defined in
    mode-classes.def, less the leading MODE_ prefix; some statements
-   that take CLASS arguments have restructions on which classes are
+   that take CLASS arguments have restrictions on which classes are
    acceptable.  For instance, INT.
 
    A MODE argument must be the printable name of a machine mode,
    without quotation marks or trailing "mode".  For instance, SI.
 
-   A BITSIZE, BYTESIZE, or COUNT argument must be a positive integer
+   A PRECISION, BYTESIZE, or COUNT argument must be a positive integer
    constant.
 
    A FORMAT argument must be one of the real_mode_format structures
@@ -78,30 +76,56 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
         declares MODE to be of class INT and BYTESIZE bytes wide.
        All of the bits of its representation are significant.
 
-     FRACTIONAL_INT_MODE (MODE, BITSIZE, BYTESIZE);
+     FRACTIONAL_INT_MODE (MODE, PRECISION, BYTESIZE);
         declares MODE to be of class INT, BYTESIZE bytes wide in
-       storage, but with only BITSIZE significant bits.
+       storage, but with only PRECISION significant bits.
 
      FLOAT_MODE (MODE, BYTESIZE, FORMAT);
         declares MODE to be of class FLOAT and BYTESIZE bytes wide,
        using floating point format FORMAT.
        All of the bits of its representation are significant.
 
-     FRACTIONAL_FLOAT_MODE (MODE, BITSIZE, BYTESIZE, FORMAT);
+     FRACTIONAL_FLOAT_MODE (MODE, PRECISION, BYTESIZE, FORMAT);
         declares MODE to be of class FLOAT, BYTESIZE bytes wide in
-       storage, but with only BITSIZE significant bits, using
+       storage, but with only PRECISION significant bits, using
        floating point format FORMAT.
 
+     DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT);
+       declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes
+       wide.  All of the bits of its representation are significant.
+
+     FRACTIONAL_DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT);
+       declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes
+       wide.  All of the bits of its representation are significant.
+
+     FRACT_MODE (MODE, BYTESIZE, FBIT);
+       declares MODE to be of class FRACT and BYTESIZE bytes wide
+       with FBIT fractional bits.  There may be padding bits.
+
+     UFRACT_MODE (MODE, BYTESIZE, FBIT);
+       declares MODE to be of class UFRACT and BYTESIZE bytes wide
+       with FBIT fractional bits.  There may be padding bits.
+
+     ACCUM_MODE (MODE, BYTESIZE, IBIT, FBIT);
+       declares MODE to be of class ACCUM and BYTESIZE bytes wide
+       with IBIT integral bits and FBIT fractional bits.
+       There may be padding bits.
+
+     UACCUM_MODE (MODE, BYTESIZE, IBIT, FBIT);
+       declares MODE to be of class UACCUM and BYTESIZE bytes wide
+       with IBIT integral bits and FBIT fractional bits.
+       There may be padding bits.
+
      RESET_FLOAT_FORMAT (MODE, FORMAT);
        changes the format of MODE, which must be class FLOAT,
        to FORMAT.  Use in an ARCH-modes.def to reset the format
        of one of the float modes defined in this file.
 
-     PARTIAL_INT_MODE (MODE);
+     PARTIAL_INT_MODE (MODE, PRECISION, NAME);
         declares a mode of class PARTIAL_INT with the same size as
-       MODE (which must be an INT mode).  The name of the new mode
-       is made by prefixing a P to the name MODE.  This statement
-       may grow a BITSIZE argument in the future.
+       MODE (which must be an INT mode) and precision PREC.
+       Optionally, NAME is the new name of the mode.  NAME is the
+       name of the mode.
 
      VECTOR_MODE (CLASS, MODE, COUNT);
         Declare a vector mode whose component mode is MODE (of class
@@ -118,6 +142,17 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
        than two bytes (if CLASS is FLOAT).  CLASS must be INT or
        FLOAT.  The names follow the same rule as VECTOR_MODE uses.
 
+     VECTOR_MODES_WITH_PREFIX (PREFIX, CLASS, WIDTH);
+       Like VECTOR_MODES, but start the mode names with PREFIX instead
+       of the usual "V".
+
+     VECTOR_BOOL_MODE (NAME, COUNT, BYTESIZE)
+        Create a vector mode called NAME that contains COUNT boolean
+        elements and occupies BYTESIZE bytes in total.  Each boolean
+        element occupies (COUNT * BITS_PER_UNIT) / BYTESIZE bits, with
+        the element at index 0 occupying the lsb of the first byte in
+        memory.  Only the lowest bit of each element is significant.
+
      COMPLEX_MODES (CLASS);
         For all modes presently declared in class CLASS, construct
        corresponding complex modes.  Modes smaller than one byte
@@ -129,14 +164,22 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
      ADJUST_BYTESIZE (MODE, EXPR);
      ADJUST_ALIGNMENT (MODE, EXPR);
      ADJUST_FLOAT_FORMAT (MODE, EXPR);
-        Arrange for the byte size, alignment, or floating point format
-       of MODE to be adjustable at run time.  EXPR will be executed
+     ADJUST_IBIT (MODE, EXPR);
+     ADJUST_FBIT (MODE, EXPR);
+       Arrange for the byte size, alignment, floating point format, ibit,
+       or fbit of MODE to be adjustable at run time.  EXPR will be executed
        once after processing all command line options, and should
-       evaluate to the desired byte size, alignment, or format.
+       evaluate to the desired byte size, alignment, format, ibit or fbit.
 
        Unlike a FORMAT argument, if you are adjusting a float format
        you must put an & in front of the name of each format structure.
 
+     ADJUST_NUNITS (MODE, EXPR);
+       Like the above, but set the number of nunits of MODE to EXPR.
+       This changes the size and precision of the mode in proportion
+       to the change in the number of units; for example, doubling
+       the number of units doubles the size and precision as well.
+
    Note: If a mode is ever made which is more than 255 bytes wide,
    machmode.h and genmodes.c will have to be changed to allocate
    more space for the mode_size and mode_alignment arrays.  */
@@ -153,8 +196,11 @@ RANDOM_MODE (BLK);
 FRACTIONAL_INT_MODE (BI, 1, 1);
 
 /* Basic integer modes.  We go up to TI in generic code (128 bits).
-   The name OI is reserved for a 256-bit type (needed by some back ends).
-   FIXME TI shouldn't be generically available either.  */
+   TImode is needed here because the some front ends now genericly
+   support __int128.  If the front ends decide to generically support
+   larger types, then corresponding modes must be added here.  The
+   name OI is reserved for a 256-bit type (needed by some back ends).
+    */
 INT_MODE (QI, 1);
 INT_MODE (HI, 2);
 INT_MODE (SI, 4);
@@ -163,12 +209,19 @@ INT_MODE (TI, 16);
 
 /* No partial integer modes are defined by default.  */
 
+/* The target normally defines any target-specific __intN types and
+   their modes, but __int128 for TImode is fairly common so define it
+   here.  The type will not be created unless the target supports
+   TImode.  */
+
+INT_N (TI, 128);
+
 /* Basic floating point modes.  SF and DF are the only modes provided
    by default.  The names QF, HF, XF, and TF are reserved for targets
    that need 1-word, 2-word, 80-bit, or 128-bit float types respectively.
 
    These are the IEEE mappings.  They can be overridden with
-   RESET_FLOAT_FORMAT or at runtime (in OVERRIDE_OPTIONS).  */
+   RESET_FLOAT_FORMAT or at runtime (in TARGET_OPTION_OVERRIDE).  */
 
 FLOAT_MODE (SF, 4, ieee_single_format);
 FLOAT_MODE (DF, 8, ieee_double_format);
@@ -177,6 +230,29 @@ FLOAT_MODE (DF, 8, ieee_double_format);
    FIXME define this only for targets that need it.  */
 CC_MODE (CC);
 
+/* Fixed-point modes.  */
+FRACT_MODE (QQ, 1, 7); /* s.7 */
+FRACT_MODE (HQ, 2, 15); /* s.15 */
+FRACT_MODE (SQ, 4, 31); /* s.31 */
+FRACT_MODE (DQ, 8, 63); /* s.63 */
+FRACT_MODE (TQ, 16, 127); /* s.127 */
+
+UFRACT_MODE (UQQ, 1, 8); /* .8 */
+UFRACT_MODE (UHQ, 2, 16); /* .16 */
+UFRACT_MODE (USQ, 4, 32); /* .32 */
+UFRACT_MODE (UDQ, 8, 64); /* .64 */
+UFRACT_MODE (UTQ, 16, 128); /* .128 */
+
+ACCUM_MODE (HA, 2, 8, 7); /* s8.7 */
+ACCUM_MODE (SA, 4, 16, 15); /* s16.15 */
+ACCUM_MODE (DA, 8, 32, 31); /* s32.31 */
+ACCUM_MODE (TA, 16, 64, 63); /* s64.63 */
+
+UACCUM_MODE (UHA, 2, 8, 8); /* 8.8 */
+UACCUM_MODE (USA, 4, 16, 16); /* 16.16 */
+UACCUM_MODE (UDA, 8, 32, 32); /* 32.32 */
+UACCUM_MODE (UTA, 16, 64, 64); /* 64.64 */
+
 /* Allow the target to specify additional modes of various kinds.  */
 #if HAVE_EXTRA_MODES
 # include EXTRA_MODES_FILE
@@ -184,37 +260,13 @@ CC_MODE (CC);
 
 /* Complex modes.  */
 COMPLEX_MODES (INT);
+COMPLEX_MODES (PARTIAL_INT);
 COMPLEX_MODES (FLOAT);
 
-/* Vector modes.  */
-VECTOR_MODES (INT, 2);        /*                 V2QI */
-VECTOR_MODES (INT, 4);        /*            V4QI V2HI */
-VECTOR_MODES (INT, 8);        /*       V8QI V4HI V2SI */
-VECTOR_MODES (INT, 16);       /* V16QI V8HI V4SI V2DI */
-/* VECTOR_MODES (INT, 32);             V8SI V4DI      */
-/* VECTOR_MODES (INT, 64);             V8DI           */
-
-VECTOR_MODE (INT, SI, 8)
-VECTOR_MODE (INT, DI, 4);
-VECTOR_MODE (INT, DI, 8);
-
-/* PPC uses this to distinguish between DImode passed in
-   float registers and DImode passed in vector registers.
-   It would be in rs6000-modes.def but it's referenced in
-   c-common.c.  FIXME.  */
-
-VECTOR_MODE (INT, DI, 1);
-
-VECTOR_MODES (FLOAT, 4);      /*                 V2HF */
-VECTOR_MODES (FLOAT, 8);      /*            V4HF V2SF */
-VECTOR_MODES (FLOAT, 16);     /*       V8HF V4SF V2DF */
-/* VECTOR_MODES (FLOAT, 32);           V8SF V4DF      */
-/* VECTOR_MODES (FLOAT, 64);     V16SF V8DF           */
-
-VECTOR_MODE (FLOAT, SF, 8);
-VECTOR_MODE (FLOAT, SF, 16);
-VECTOR_MODE (FLOAT, DF, 4);
-VECTOR_MODE (FLOAT, DF, 8);
+/* Decimal floating point modes.  */
+DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);
+DECIMAL_FLOAT_MODE (DD, 8, decimal_double_format);
+DECIMAL_FLOAT_MODE (TD, 16, decimal_quad_format);
 
 /* The symbol Pmode stands for one of the above machine modes (usually SImode).
    The tm.h file specifies which one.  It is not a distinct mode.  */