https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100757
--- Comment #10 from Christophe Lyon <clyon at gcc dot gnu.org> ---
The problem is in vec-common.md:
(define_expand "vcond_mask_<mode><v_cmp_result>"
[(set (match_operand:VDQWH 0 "s_register_operand")
(if_then_else:VDQWH
(match_operand:<V_cmp_result> 3 "s_register_operand")
(match_operand:VDQWH 1 "s_register_operand")
(match_operand:VDQWH 2 "s_register_operand")))]
"ARM_HAVE_<MODE>_ARITH
&& !TARGET_REALLY_IWMMXT
&& (!<Is_float_mode> || flag_unsafe_math_optimizations)"
{
if (TARGET_NEON)
{
emit_insn (gen_neon_vbsl (<MODE>mode, operands[0], operands[3],
operands[1], operands[2]));
}
else if (TARGET_HAVE_MVE)
{
emit_insn (gen_mve_vpselq (VPSELQ_S, <MODE>mode, operands[0],
operands[1], operands[2], operands[3]));
}
else
gcc_unreachable ();
DONE;
})
For MVE, we pass operands[3] to mve_vpselq, but it has the same vector mode as
the other operands while vpselq expects a 16-bit mask (HI mode) suitable for
VPR.P0