8sa1-gcc/gcc/mode-classes.def
Aaron Sawdey 6b91b3e9df Add MODE_OPAQUE
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.
2020-11-17 11:10:11 -05:00

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 */