https://gcc.gnu.org/g:6c00f166014d0b80d00bec877d6e9bd70160505d
commit 6c00f166014d0b80d00bec877d6e9bd70160505d Author: Jeevitha Palanisamy <[email protected]> Date: Thu Jul 2 01:31:36 2026 -0500 rs6000: Add TDOmode support Introduce the new opaque mode `TDOmode` for the `__dmr1024` type and treat it similarly to existing MMA opaque types when diagnosing invalid function arguments and return values. Update the diagnostics to distinguish between Dense Math and MMA types in error messages. 2026-07-02 Jeevitha Palanisamy <[email protected]> gcc/ * config/rs6000/rs6000-call.cc (rs6000_return_in_memory): Handle TDOmode and emit "Dense Math" diagnostics. (rs6000_function_arg): Reject TDOmode function parameters and emit "Dense Math" diagnostics. * config/rs6000/rs6000-modes.def: Add TDOmode. Diff: --- gcc/config/rs6000/rs6000-call.cc | 22 +++++++++++++++------- gcc/config/rs6000/rs6000-modes.def | 3 ++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/gcc/config/rs6000/rs6000-call.cc b/gcc/config/rs6000/rs6000-call.cc index b9b791bfe8ae..0da2c1f60718 100644 --- a/gcc/config/rs6000/rs6000-call.cc +++ b/gcc/config/rs6000/rs6000-call.cc @@ -432,19 +432,24 @@ rs6000_discover_homogeneous_aggregate (machine_mode mode, const_tree type, bool rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED) { - /* We do not allow MMA types being used as return values. Only report - the invalid return value usage the first time we encounter it. */ + /* We do not allow Dense Math/MMA types being used as return values. Only + report the invalid return value usage the first time we encounter it. */ if (cfun && !cfun->machine->mma_return_type_error && TREE_TYPE (cfun->decl) == fntype - && (TYPE_MODE (type) == OOmode || TYPE_MODE (type) == XOmode)) + && (TYPE_MODE (type) == OOmode + || TYPE_MODE (type) == XOmode + || TYPE_MODE (type) == TDOmode)) { /* Record we have now handled function CFUN, so the next time we are called, we do not re-report the same error. */ cfun->machine->mma_return_type_error = true; if (TYPE_CANONICAL (type) != NULL_TREE) type = TYPE_CANONICAL (type); - error ("invalid use of MMA type %qs as a function return value", + const char *type_class = + (TYPE_MODE (type) == TDOmode) ? "Dense Math" : "MMA"; + error ("invalid use of %s type %qs as a function return value", + type_class, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))); } @@ -1631,12 +1636,15 @@ rs6000_function_arg (cumulative_args_t cum_v, const function_arg_info &arg) machine_mode elt_mode; int n_elts; - /* We do not allow MMA types being used as function arguments. */ - if (mode == OOmode || mode == XOmode) + /* We do not allow Dense Math/MMA types being used as function arguments. */ + if (mode == OOmode || mode == XOmode || mode == TDOmode) { if (TYPE_CANONICAL (type) != NULL_TREE) type = TYPE_CANONICAL (type); - error ("invalid use of MMA operand of type %qs as a function parameter", + const char *type_class = + (mode == TDOmode) ? "Dense Math" : "MMA"; + error ("invalid use of %s operand of type %qs as a function parameter", + type_class, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))); return NULL_RTX; } diff --git a/gcc/config/rs6000/rs6000-modes.def b/gcc/config/rs6000/rs6000-modes.def index 7140b634c414..0ad326751c4a 100644 --- a/gcc/config/rs6000/rs6000-modes.def +++ b/gcc/config/rs6000/rs6000-modes.def @@ -76,6 +76,7 @@ VECTOR_MODE (INT, SI, 2); /* V2SI */ combination. */ PARTIAL_INT_MODE (TI, 128, PTI); -/* Modes used by __vector_pair and __vector_quad. */ +/* Modes used by __vector_pair, __vector_quad and __dmr1024. */ OPAQUE_MODE (OO, 32); OPAQUE_MODE (XO, 64); +OPAQUE_MODE (TDO, 128);
