diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc index 6d25477841a..7f1dcd0937b 100644 --- a/gcc/config/i386/i386-expand.cc +++ b/gcc/config/i386/i386-expand.cc @@ -23884,7 +23884,7 @@ expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d) if (d->testing_p) return true; - rtx (*gen_interleave) (machine_mode, int, rtx, rtx, rtx); + rtx (*gen_interleave) (machine_mode, rtx, rtx, rtx); if (elt >= nelt2) { gen_interleave = gen_vec_interleave_high; @@ -23895,7 +23895,7 @@ expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d) nelt2 /= 2; dest = gen_reg_rtx (vmode); - emit_insn (gen_interleave (vmode, 1, dest, op0, op0)); + emit_insn (gen_interleave (vmode, dest, op0, op0)); vmode = V4SImode; op0 = gen_lowpart (vmode, dest); diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 0457bb56dcd..82054b226ba 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -12405,4 +12405,9 @@ output and three inputs). This combination would produce separate each operand count, but it would still produce a single @samp{maybe_code_for_@var{name}} and a single @samp{code_for_@var{name}}. +Currently, these @code{@@} patterns only take into account patterns for +which no @code{define_subst} has been applied (@pxref{Define Subst}). +Any @samp{<@dots{}>} placeholders that refer to subst attributes +(@pxref{Subst Iterators}) are ignored. + @end ifset diff --git a/gcc/read-rtl.cc b/gcc/read-rtl.cc index 195f78bd5e1..49a5306254b 100644 --- a/gcc/read-rtl.cc +++ b/gcc/read-rtl.cc @@ -814,9 +814,14 @@ md_reader::handle_overloaded_name (rtx original, vec *iterators) pending_underscore_p = false; } - /* Record an argument for ITERATOR. */ - iterators->safe_push (iterator); - tmp_oname.arg_types.safe_push (iterator->group->type); + /* Skip define_subst iterators, since define_substs are allowed to + add new match_operands in their output templates. */ + if (iterator->group != &substs) + { + /* Record an argument for ITERATOR. */ + iterators->safe_push (iterator); + tmp_oname.arg_types.safe_push (iterator->group->type); + } } if (base == copy) fatal_with_file_and_line ("no iterator attributes in name `%s'", name); @@ -951,6 +956,7 @@ apply_iterators (rtx original, vec *queue) /* We apply subst iterator after RTL-template is copied, as during subst-iterator processing, we could add an attribute to the RTL-template, and we don't want to do it in the original one. */ + bool add_oname = true; FOR_EACH_VEC_ELT (iterator_uses, i, iuse) { v = iuse->iterator->current_value; @@ -961,10 +967,14 @@ apply_iterators (rtx original, vec *queue) current_iterator_name = iuse->iterator->name; iuse->iterator->group->apply_iterator (iuse->x, iuse->index, v->number); + /* Only handle '@' overloading for the default value. + See handle_overloaded_name for details. */ + if (v != iuse->iterator->values) + add_oname = false; } } - if (oname) + if (oname && add_oname) add_overload_instance (oname, iterators, x); /* Add the new rtx to the end of the queue. */