After discussion with Richard Sandiford on IRC, he suggested adding a new mode class MODE_OPAQUE to deal with the problems (PR 96791) we had been having with POImode/PXImode in powerpc target. This patch is the accumulation of changes I needed to make to add this and make it useable for the purposes of what power10 MMA needed. MODE_OPAQUE modes allow you to have modes for which you can just define loads and stores. By design, optimization does not expect to know how to do arithmetic or subregs on these modes. This allows us to have modes for multi-register vector operations where we don't want to open Pandora's Box and define general arithmetic operations. This patch will be followed by a target specific patch to change the powerpc power10 MMA builtins to use opaque modes, and will also let use use the vector pair loads/stores defined with that in the inline expansion of memcpy/memmove, allowing me to fix PR 96791. gcc/ChangeLog PR target/96791 * mode-classes.def: Add MODE_OPAQUE. * machmode.def: Add OPAQUE_MODE. * tree.def: Add OPAQUE_TYPE for types that will use MODE_OPAQUE. * doc/generic.texi: Document OPAQUE_TYPE. * doc/rtl.texi: Document MODE_OPAQUE. * machmode.h: Add OPAQUE_MODE_P(). * genmodes.c (complete_mode): Add MODE_OPAQUE. (opaque_mode): New function. * tree.c (tree_code_size): Add OPAQUE_TYPE. * tree.h: Add OPAQUE_TYPE_P(). * stor-layout.c (int_mode_for_mode): Treat MODE_OPAQUE modes like BLKmode. * ira.c (find_moveable_pseudos): Treat MODE_OPAQUE modes more like integer/float modes here. * dbxout.c (dbxout_type): Treat OPAQUE_TYPE like VOID_TYPE. * tree-pretty-print.c (dump_generic_node): Treat OPAQUE_TYPE like like other types.
41 lines
2.0 KiB
Modula-2
41 lines
2.0 KiB
Modula-2
/* Machine mode class definitions for GCC.
|
|
Copyright (C) 2003-2020 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/>. */
|
|
|
|
#define MODE_CLASSES \
|
|
DEF_MODE_CLASS (MODE_RANDOM), /* other */ \
|
|
DEF_MODE_CLASS (MODE_CC), /* condition code in a register */ \
|
|
DEF_MODE_CLASS (MODE_INT), /* integer */ \
|
|
DEF_MODE_CLASS (MODE_PARTIAL_INT), /* integer with padding bits */ \
|
|
DEF_MODE_CLASS (MODE_FRACT), /* signed fractional number */ \
|
|
DEF_MODE_CLASS (MODE_UFRACT), /* unsigned fractional number */ \
|
|
DEF_MODE_CLASS (MODE_ACCUM), /* signed accumulator */ \
|
|
DEF_MODE_CLASS (MODE_UACCUM), /* unsigned accumulator */ \
|
|
DEF_MODE_CLASS (MODE_FLOAT), /* floating point */ \
|
|
DEF_MODE_CLASS (MODE_DECIMAL_FLOAT), /* decimal floating point */ \
|
|
DEF_MODE_CLASS (MODE_COMPLEX_INT), /* complex numbers */ \
|
|
DEF_MODE_CLASS (MODE_COMPLEX_FLOAT), \
|
|
DEF_MODE_CLASS (MODE_VECTOR_BOOL), /* vectors of single bits */ \
|
|
DEF_MODE_CLASS (MODE_VECTOR_INT), /* SIMD vectors */ \
|
|
DEF_MODE_CLASS (MODE_VECTOR_FRACT), /* SIMD vectors */ \
|
|
DEF_MODE_CLASS (MODE_VECTOR_UFRACT), /* SIMD vectors */ \
|
|
DEF_MODE_CLASS (MODE_VECTOR_ACCUM), /* SIMD vectors */ \
|
|
DEF_MODE_CLASS (MODE_VECTOR_UACCUM), /* SIMD vectors */ \
|
|
DEF_MODE_CLASS (MODE_VECTOR_FLOAT), \
|
|
DEF_MODE_CLASS (MODE_OPAQUE) /* opaque modes */
|