diff mbox series

[12/16] aarch64: Tweaks to function_resolver::resolve_to

Message ID mpt8rkfnpdx.fsf@arm.com
State New
Headers show
Series aarch64: Add support for SME | expand

Commit Message

Richard Sandiford Nov. 13, 2022, 10:02 a.m. UTC
This patch adds a new interface to function_resolver::resolve_to
in which the mode suffix stays the same (which is the common case).
It then moves the handling of explicit first type suffixes from
function_resolver::resolve_unary to this new function.

This makes things slightly simpler for existing code.  However, the
main reason for doing it is that it helps require_derived_vector_type
handle explicit type suffixes correctly, which in turn improves the
error messages generated by the manual C overloading code in a
follow-up SME patch.

gcc/
	* config/aarch64/aarch64-sve-builtins.h
	(function_resolver::resolve_to): Add an overload that takes
	only the type suffixes.
	* config/aarch64/aarch64-sve-builtins.cc
	(function_resolver::resolve_to): Likewise.  Handle explicit type
	suffixes here rather than...
	(function_resolver::resolve_unary): ...here.
	(function_resolver::require_derived_vector_type): Simplify accordingly.
	(function_resolver::finish_opt_n_resolution): Likewise.
	(function_resolver::resolve_uniform): Likewise.
	* config/aarch64/aarch64-sve-builtins-shapes.cc
	(binary_imm_narrowt_base::resolve): Likewise.
	(load_contiguous_base::resolve): Likewise.
	(mmla_def::resolve): Likewise.
	(ternary_resize2_base::resolve): Likewise.
	(ternary_resize2_lane_base::resolve): Likewise.
	(unary_narrowt_base::resolve): Likewise.
	(binary_n_def::resolve): Likewise.
	(binary_uint_def::resolve): Likewise.
	(binary_uint_n_def::resolve): Likewise.
	(binary_uint64_n_def::resolve): Likewise.
	(binary_wide_def::resolve): Likewise.
	(compare_ptr_def::resolve): Likewise.
	(compare_scalar_def::resolve): Likewise.
	(fold_left_def::resolve): Likewise.
	(get_def::resolve): Likewise.
	(inc_dec_pred_def::resolve): Likewise.
	(inc_dec_pred_scalar_def::resolve): Likewise.
	(set_def::resolve): Likewise.
	(store_def::resolve): Likewise.
	(tbl_tuple_def::resolve): Likewise.
	(ternary_qq_lane_rotate_def::resolve): Likewise.
	(ternary_qq_rotate_def::resolve): Likewise.
	(ternary_uint_def::resolve): Likewise.
	(unary_def::resolve): Likewise.
	(unary_widen_def::resolve): Likewise.
---
 .../aarch64/aarch64-sve-builtins-shapes.cc    | 48 +++++++++----------
 gcc/config/aarch64/aarch64-sve-builtins.cc    | 34 +++++++++----
 gcc/config/aarch64/aarch64-sve-builtins.h     |  1 +
 3 files changed, 49 insertions(+), 34 deletions(-)
diff mbox series

Patch

diff --git a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
index 5b47dff0b41..df2d5414c07 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
@@ -550,7 +550,7 @@  struct binary_imm_narrowt_base : public overloaded_base<0>
 	|| !r.require_integer_immediate (i + 2))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 
@@ -649,7 +649,7 @@  struct load_contiguous_base : public overloaded_base<0>
 	|| (vnum_p && !r.require_scalar_type (i + 1, "int64_t")))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 
@@ -739,7 +739,7 @@  struct mmla_def : public overloaded_base<0>
 
     /* Make sure that the function exists now, since not all forms
        follow a set pattern after this point.  */
-    tree res = r.resolve_to (r.mode_suffix_id, type);
+    tree res = r.resolve_to (type);
     if (res == error_mark_node)
       return res;
 
@@ -896,7 +896,7 @@  struct ternary_resize2_base : public overloaded_base<0>
 					   MODIFIER))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 
@@ -921,7 +921,7 @@  struct ternary_resize2_lane_base : public overloaded_base<0>
 	|| !r.require_integer_immediate (i + 3))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 
@@ -1012,7 +1012,7 @@  struct unary_narrowt_base : public overloaded_base<0>
 	|| !r.require_derived_vector_type (i, i + 1, type, CLASS, r.HALF_SIZE))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 
@@ -1218,7 +1218,7 @@  struct binary_n_def : public overloaded_base<0>
 	|| !r.require_derived_scalar_type (i + 1, r.SAME_TYPE_CLASS))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (binary_n)
@@ -1399,7 +1399,7 @@  struct binary_uint_def : public overloaded_base<0>
 	|| !r.require_derived_vector_type (i + 1, i, type, TYPE_unsigned))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (binary_uint)
@@ -1427,7 +1427,7 @@  struct binary_uint_n_def : public overloaded_base<0>
 	|| !r.require_derived_scalar_type (i + 1, TYPE_unsigned))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (binary_uint_n)
@@ -1484,7 +1484,7 @@  struct binary_uint64_n_def : public overloaded_base<0>
 	|| !r.require_scalar_type (i + 1, "uint64_t"))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (binary_uint64_n)
@@ -1539,7 +1539,7 @@  struct binary_wide_def : public overloaded_base<0>
 					   r.HALF_SIZE))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (binary_wide)
@@ -1671,7 +1671,7 @@  struct compare_ptr_def : public overloaded_base<0>
 	|| !r.require_matching_pointer_type (i + 1, i, type))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (compare_ptr)
@@ -1700,7 +1700,7 @@  struct compare_scalar_def : public overloaded_base<1>
 	|| !r.require_matching_integer_scalar_type (i + 1, i, type))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, r.type_suffix_ids[0], type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (compare_scalar)
@@ -1877,7 +1877,7 @@  struct fold_left_def : public overloaded_base<0>
 	|| (type = r.infer_vector_type (i + 1)) == NUM_TYPE_SUFFIXES)
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (fold_left)
@@ -1905,7 +1905,7 @@  struct get_def : public overloaded_base<0>
 	|| !r.require_integer_immediate (i + 1))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 
   bool
@@ -1987,7 +1987,7 @@  struct inc_dec_pred_def : public overloaded_base<0>
 	|| !r.require_vector_type (i + 1, VECTOR_TYPE_svbool_t))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (inc_dec_pred)
@@ -2014,7 +2014,7 @@  struct inc_dec_pred_scalar_def : public overloaded_base<2>
 	|| !r.require_vector_type (i + 1, VECTOR_TYPE_svbool_t))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type, r.type_suffix_ids[1]);
+    return r.resolve_to (type, r.type_suffix_ids[1]);
   }
 };
 SHAPE (inc_dec_pred_scalar)
@@ -2419,7 +2419,7 @@  struct set_def : public overloaded_base<0>
 	|| !r.require_derived_vector_type (i + 2, i, type))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 
   bool
@@ -2594,7 +2594,7 @@  struct store_def : public overloaded_base<0>
 	|| ((type = r.infer_tuple_type (nargs - 1)) == NUM_TYPE_SUFFIXES))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (store)
@@ -2714,7 +2714,7 @@  struct tbl_tuple_def : public overloaded_base<0>
 	|| !r.require_derived_vector_type (i + 1, i, type, TYPE_unsigned))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (tbl_tuple)
@@ -2959,7 +2959,7 @@  struct ternary_qq_lane_rotate_def : public overloaded_base<0>
 	|| !r.require_integer_immediate (i + 4))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 
   bool
@@ -3018,7 +3018,7 @@  struct ternary_qq_rotate_def : public overloaded_base<0>
 	|| !r.require_integer_immediate (i + 3))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 
   bool
@@ -3107,7 +3107,7 @@  struct ternary_uint_def : public overloaded_base<0>
 	|| !r.require_derived_vector_type (i + 2, i, type, TYPE_unsigned))
       return error_mark_node;
 
-    return r.resolve_to (r.mode_suffix_id, type);
+    return r.resolve_to (type);
   }
 };
 SHAPE (ternary_uint)
@@ -3437,7 +3437,7 @@  struct unary_widen_def : public overloaded_base<0>
 
     /* There is only a single form for predicates.  */
     if (type == TYPE_SUFFIX_b)
-      return r.resolve_to (r.mode_suffix_id, type);
+      return r.resolve_to (type);
 
     if (type_suffixes[type].integer_p
 	&& type_suffixes[type].element_bits < 64)
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
index 450a8d958a8..e50a58dcc0a 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
@@ -1255,6 +1255,25 @@  function_resolver::resolve_to (mode_suffix_index mode,
   return res;
 }
 
+/* A cut-down interface to the function above that keeps the mode suffix
+   unchanged.  As a convenience, resolve_to (TYPE0) can be used for functions
+   whose first type suffix is explicit, with TYPE0 then describing the
+   second type suffix rather than the first.  */
+tree
+function_resolver::resolve_to (type_suffix_index type0,
+			       type_suffix_index type1)
+{
+  /* Handle convert-like functions in which the first type suffix is
+     explicit.  */
+  if (type_suffix_ids[0] != NUM_TYPE_SUFFIXES && type1 == NUM_TYPE_SUFFIXES)
+    {
+      type1 = type0;
+      type0 = type_suffix_ids[0];
+    }
+
+  return resolve_to (mode_suffix_id, type0, type1);
+}
+
 /* Require argument ARGNO to be a 32-bit or 64-bit scalar integer type.
    Return the associated type suffix on success, otherwise report an
    error and return NUM_TYPE_SUFFIXES.  */
@@ -1636,7 +1655,7 @@  require_derived_vector_type (unsigned int argno,
 
   /* Make sure that FIRST_TYPE itself is sensible before using it
      as a basis for an error message.  */
-  if (resolve_to (mode_suffix_id, first_type) == error_mark_node)
+  if (resolve_to (first_type) == error_mark_node)
     return false;
 
   /* If the arguments have consistent type classes, but a link between
@@ -2202,7 +2221,7 @@  finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
 
       /* Check the vector form normally.  If that succeeds, raise an
 	 error about having no corresponding _n form.  */
-      tree res = resolve_to (mode_suffix_id, inferred_type);
+      tree res = resolve_to (inferred_type);
       if (res != error_mark_node)
 	error_at (location, "passing %qT to argument %d of %qE, but its"
 		  " %qT form does not accept scalars",
@@ -2222,7 +2241,7 @@  finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
 				    expected_tclass, expected_bits))
     return error_mark_node;
 
-  return resolve_to (mode_suffix_id, inferred_type);
+  return resolve_to (inferred_type);
 }
 
 /* Resolve a (possibly predicated) unary function.  If the function uses
@@ -2279,12 +2298,7 @@  function_resolver::resolve_unary (type_class_index merge_tclass,
 	return error_mark_node;
     }
 
-  /* Handle convert-like functions in which the first type suffix is
-     explicit.  */
-  if (type_suffix_ids[0] != NUM_TYPE_SUFFIXES)
-    return resolve_to (mode_suffix_id, type_suffix_ids[0], type);
-
-  return resolve_to (mode_suffix_id, type);
+  return resolve_to (type);
 }
 
 /* Resolve a (possibly predicated) function that takes NOPS like-typed
@@ -2309,7 +2323,7 @@  function_resolver::resolve_uniform (unsigned int nops, unsigned int nimm)
     if (!require_integer_immediate (i))
       return error_mark_node;
 
-  return resolve_to (mode_suffix_id, type);
+  return resolve_to (type);
 }
 
 /* Resolve a (possibly predicated) function that offers a choice between
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h
index 623b9e3a07b..479b248bef1 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.h
+++ b/gcc/config/aarch64/aarch64-sve-builtins.h
@@ -394,6 +394,7 @@  public:
   tree resolve_to (mode_suffix_index,
 		   type_suffix_index = NUM_TYPE_SUFFIXES,
 		   type_suffix_index = NUM_TYPE_SUFFIXES);
+  tree resolve_to (type_suffix_index, type_suffix_index = NUM_TYPE_SUFFIXES);
 
   type_suffix_index infer_integer_scalar_type (unsigned int);
   type_suffix_index infer_pointer_type (unsigned int, bool = false);