https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96428
--- Comment #1 from Tom de Vries <vries at gcc dot gnu.org> ---
Tentative patch:
...
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index d8a8fb2d55b..cf53a921e5b 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -1796,6 +1796,44 @@ nvptx_gen_shuffle (rtx dst, rtx src, rtx idx,
nvptx_shuffle_kind kind)
end_sequence ();
}
break;
+ case E_V2SImode:
+ {
+ rtx src0 = gen_rtx_SUBREG (SImode, src, 0);
+ rtx src1 = gen_rtx_SUBREG (SImode, src, 4);
+ rtx dst0 = gen_rtx_SUBREG (SImode, dst, 0);
+ rtx dst1 = gen_rtx_SUBREG (SImode, dst, 4);
+ rtx tmp0 = gen_reg_rtx (SImode);
+ rtx tmp1 = gen_reg_rtx (SImode);
+ start_sequence ();
+ emit_insn (gen_movsi (tmp0, src0));
+ emit_insn (gen_movsi (tmp1, src1));
+ emit_insn (nvptx_gen_shuffle (tmp0, tmp0, idx, kind));
+ emit_insn (nvptx_gen_shuffle (tmp1, tmp1, idx, kind));
+ emit_insn (gen_movsi (dst0, tmp0));
+ emit_insn (gen_movsi (dst1, tmp1));
+ res = get_insns ();
+ end_sequence ();
+ }
+ break;
+ case E_V2DImode:
+ {
+ rtx src0 = gen_rtx_SUBREG (DImode, src, 0);
+ rtx src1 = gen_rtx_SUBREG (DImode, src, 8);
+ rtx dst0 = gen_rtx_SUBREG (DImode, dst, 0);
+ rtx dst1 = gen_rtx_SUBREG (DImode, dst, 8);
+ rtx tmp0 = gen_reg_rtx (DImode);
+ rtx tmp1 = gen_reg_rtx (DImode);
+ start_sequence ();
+ emit_insn (gen_movdi (tmp0, src0));
+ emit_insn (gen_movdi (tmp1, src1));
+ emit_insn (nvptx_gen_shuffle (tmp0, tmp0, idx, kind));
+ emit_insn (nvptx_gen_shuffle (tmp1, tmp1, idx, kind));
+ emit_insn (gen_movdi (dst0, tmp0));
+ emit_insn (gen_movdi (dst1, tmp1));
+ res = get_insns ();
+ end_sequence ();
+ }
+ break;
case E_BImode:
{
rtx tmp = gen_reg_rtx (SImode);
...