target/arm: Use TRANS_FEAT for do_shr_narrow

Rename from do_sve2_shr_narrow and hoist the sve2
check into the TRANS_FEAT macro.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20220527181907.189259-111-richard.henderson@linaro.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Richard Henderson 2022-05-27 11:19:03 -07:00 committed by Peter Maydell
parent 5a528bb5d8
commit f7f2f0faa2
1 changed files with 211 additions and 259 deletions

View File

@ -6552,10 +6552,10 @@ static const GVecGen2 sqxtunt_ops[3] = {
}; };
TRANS_FEAT(SQXTUNT, aa64_sve2, do_narrow_extract, a, sqxtunt_ops) TRANS_FEAT(SQXTUNT, aa64_sve2, do_narrow_extract, a, sqxtunt_ops)
static bool do_sve2_shr_narrow(DisasContext *s, arg_rri_esz *a, static bool do_shr_narrow(DisasContext *s, arg_rri_esz *a,
const GVecGen2i ops[3]) const GVecGen2i ops[3])
{ {
if (a->esz < 0 || a->esz > MO_32 || !dc_isar_feature(aa64_sve2, s)) { if (a->esz < 0 || a->esz > MO_32) {
return false; return false;
} }
assert(a->imm > 0 && a->imm <= (8 << a->esz)); assert(a->imm > 0 && a->imm <= (8 << a->esz));
@ -6604,28 +6604,25 @@ static void gen_shrnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t shr)
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_SHRNB(DisasContext *s, arg_rri_esz *a) static const TCGOpcode shrnb_vec_list[] = { INDEX_op_shri_vec, 0 };
{ static const GVecGen2i shrnb_ops[3] = {
static const TCGOpcode vec_list[] = { INDEX_op_shri_vec, 0 }; { .fni8 = gen_shrnb16_i64,
static const GVecGen2i ops[3] = { .fniv = gen_shrnb_vec,
{ .fni8 = gen_shrnb16_i64, .opt_opc = shrnb_vec_list,
.fniv = gen_shrnb_vec, .fno = gen_helper_sve2_shrnb_h,
.opt_opc = vec_list, .vece = MO_16 },
.fno = gen_helper_sve2_shrnb_h, { .fni8 = gen_shrnb32_i64,
.vece = MO_16 }, .fniv = gen_shrnb_vec,
{ .fni8 = gen_shrnb32_i64, .opt_opc = shrnb_vec_list,
.fniv = gen_shrnb_vec, .fno = gen_helper_sve2_shrnb_s,
.opt_opc = vec_list, .vece = MO_32 },
.fno = gen_helper_sve2_shrnb_s, { .fni8 = gen_shrnb64_i64,
.vece = MO_32 }, .fniv = gen_shrnb_vec,
{ .fni8 = gen_shrnb64_i64, .opt_opc = shrnb_vec_list,
.fniv = gen_shrnb_vec, .fno = gen_helper_sve2_shrnb_d,
.opt_opc = vec_list, .vece = MO_64 },
.fno = gen_helper_sve2_shrnb_d, };
.vece = MO_64 }, TRANS_FEAT(SHRNB, aa64_sve2, do_shr_narrow, a, shrnb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_shrnt_i64(unsigned vece, TCGv_i64 d, TCGv_i64 n, int shr) static void gen_shrnt_i64(unsigned vece, TCGv_i64 d, TCGv_i64 n, int shr)
{ {
@ -6666,51 +6663,42 @@ static void gen_shrnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t shr)
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_SHRNT(DisasContext *s, arg_rri_esz *a) static const TCGOpcode shrnt_vec_list[] = { INDEX_op_shli_vec, 0 };
{ static const GVecGen2i shrnt_ops[3] = {
static const TCGOpcode vec_list[] = { INDEX_op_shli_vec, 0 }; { .fni8 = gen_shrnt16_i64,
static const GVecGen2i ops[3] = { .fniv = gen_shrnt_vec,
{ .fni8 = gen_shrnt16_i64, .opt_opc = shrnt_vec_list,
.fniv = gen_shrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_shrnt_h,
.load_dest = true, .vece = MO_16 },
.fno = gen_helper_sve2_shrnt_h, { .fni8 = gen_shrnt32_i64,
.vece = MO_16 }, .fniv = gen_shrnt_vec,
{ .fni8 = gen_shrnt32_i64, .opt_opc = shrnt_vec_list,
.fniv = gen_shrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_shrnt_s,
.load_dest = true, .vece = MO_32 },
.fno = gen_helper_sve2_shrnt_s, { .fni8 = gen_shrnt64_i64,
.vece = MO_32 }, .fniv = gen_shrnt_vec,
{ .fni8 = gen_shrnt64_i64, .opt_opc = shrnt_vec_list,
.fniv = gen_shrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_shrnt_d,
.load_dest = true, .vece = MO_64 },
.fno = gen_helper_sve2_shrnt_d, };
.vece = MO_64 }, TRANS_FEAT(SHRNT, aa64_sve2, do_shr_narrow, a, shrnt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_RSHRNB(DisasContext *s, arg_rri_esz *a) static const GVecGen2i rshrnb_ops[3] = {
{ { .fno = gen_helper_sve2_rshrnb_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_rshrnb_s },
{ .fno = gen_helper_sve2_rshrnb_h }, { .fno = gen_helper_sve2_rshrnb_d },
{ .fno = gen_helper_sve2_rshrnb_s }, };
{ .fno = gen_helper_sve2_rshrnb_d }, TRANS_FEAT(RSHRNB, aa64_sve2, do_shr_narrow, a, rshrnb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_RSHRNT(DisasContext *s, arg_rri_esz *a) static const GVecGen2i rshrnt_ops[3] = {
{ { .fno = gen_helper_sve2_rshrnt_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_rshrnt_s },
{ .fno = gen_helper_sve2_rshrnt_h }, { .fno = gen_helper_sve2_rshrnt_d },
{ .fno = gen_helper_sve2_rshrnt_s }, };
{ .fno = gen_helper_sve2_rshrnt_d }, TRANS_FEAT(RSHRNT, aa64_sve2, do_shr_narrow, a, rshrnt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_sqshrunb_vec(unsigned vece, TCGv_vec d, static void gen_sqshrunb_vec(unsigned vece, TCGv_vec d,
TCGv_vec n, int64_t shr) TCGv_vec n, int64_t shr)
@ -6726,27 +6714,24 @@ static void gen_sqshrunb_vec(unsigned vece, TCGv_vec d,
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_SQSHRUNB(DisasContext *s, arg_rri_esz *a) static const TCGOpcode sqshrunb_vec_list[] = {
{ INDEX_op_sari_vec, INDEX_op_smax_vec, INDEX_op_umin_vec, 0
static const TCGOpcode vec_list[] = { };
INDEX_op_sari_vec, INDEX_op_smax_vec, INDEX_op_umin_vec, 0 static const GVecGen2i sqshrunb_ops[3] = {
}; { .fniv = gen_sqshrunb_vec,
static const GVecGen2i ops[3] = { .opt_opc = sqshrunb_vec_list,
{ .fniv = gen_sqshrunb_vec, .fno = gen_helper_sve2_sqshrunb_h,
.opt_opc = vec_list, .vece = MO_16 },
.fno = gen_helper_sve2_sqshrunb_h, { .fniv = gen_sqshrunb_vec,
.vece = MO_16 }, .opt_opc = sqshrunb_vec_list,
{ .fniv = gen_sqshrunb_vec, .fno = gen_helper_sve2_sqshrunb_s,
.opt_opc = vec_list, .vece = MO_32 },
.fno = gen_helper_sve2_sqshrunb_s, { .fniv = gen_sqshrunb_vec,
.vece = MO_32 }, .opt_opc = sqshrunb_vec_list,
{ .fniv = gen_sqshrunb_vec, .fno = gen_helper_sve2_sqshrunb_d,
.opt_opc = vec_list, .vece = MO_64 },
.fno = gen_helper_sve2_sqshrunb_d, };
.vece = MO_64 }, TRANS_FEAT(SQSHRUNB, aa64_sve2, do_shr_narrow, a, sqshrunb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_sqshrunt_vec(unsigned vece, TCGv_vec d, static void gen_sqshrunt_vec(unsigned vece, TCGv_vec d,
TCGv_vec n, int64_t shr) TCGv_vec n, int64_t shr)
@ -6764,51 +6749,42 @@ static void gen_sqshrunt_vec(unsigned vece, TCGv_vec d,
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_SQSHRUNT(DisasContext *s, arg_rri_esz *a) static const TCGOpcode sqshrunt_vec_list[] = {
{ INDEX_op_shli_vec, INDEX_op_sari_vec,
static const TCGOpcode vec_list[] = { INDEX_op_smax_vec, INDEX_op_umin_vec, 0
INDEX_op_shli_vec, INDEX_op_sari_vec, };
INDEX_op_smax_vec, INDEX_op_umin_vec, 0 static const GVecGen2i sqshrunt_ops[3] = {
}; { .fniv = gen_sqshrunt_vec,
static const GVecGen2i ops[3] = { .opt_opc = sqshrunt_vec_list,
{ .fniv = gen_sqshrunt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_sqshrunt_h,
.load_dest = true, .vece = MO_16 },
.fno = gen_helper_sve2_sqshrunt_h, { .fniv = gen_sqshrunt_vec,
.vece = MO_16 }, .opt_opc = sqshrunt_vec_list,
{ .fniv = gen_sqshrunt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_sqshrunt_s,
.load_dest = true, .vece = MO_32 },
.fno = gen_helper_sve2_sqshrunt_s, { .fniv = gen_sqshrunt_vec,
.vece = MO_32 }, .opt_opc = sqshrunt_vec_list,
{ .fniv = gen_sqshrunt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_sqshrunt_d,
.load_dest = true, .vece = MO_64 },
.fno = gen_helper_sve2_sqshrunt_d, };
.vece = MO_64 }, TRANS_FEAT(SQSHRUNT, aa64_sve2, do_shr_narrow, a, sqshrunt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_SQRSHRUNB(DisasContext *s, arg_rri_esz *a) static const GVecGen2i sqrshrunb_ops[3] = {
{ { .fno = gen_helper_sve2_sqrshrunb_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_sqrshrunb_s },
{ .fno = gen_helper_sve2_sqrshrunb_h }, { .fno = gen_helper_sve2_sqrshrunb_d },
{ .fno = gen_helper_sve2_sqrshrunb_s }, };
{ .fno = gen_helper_sve2_sqrshrunb_d }, TRANS_FEAT(SQRSHRUNB, aa64_sve2, do_shr_narrow, a, sqrshrunb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_SQRSHRUNT(DisasContext *s, arg_rri_esz *a) static const GVecGen2i sqrshrunt_ops[3] = {
{ { .fno = gen_helper_sve2_sqrshrunt_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_sqrshrunt_s },
{ .fno = gen_helper_sve2_sqrshrunt_h }, { .fno = gen_helper_sve2_sqrshrunt_d },
{ .fno = gen_helper_sve2_sqrshrunt_s }, };
{ .fno = gen_helper_sve2_sqrshrunt_d }, TRANS_FEAT(SQRSHRUNT, aa64_sve2, do_shr_narrow, a, sqrshrunt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_sqshrnb_vec(unsigned vece, TCGv_vec d, static void gen_sqshrnb_vec(unsigned vece, TCGv_vec d,
TCGv_vec n, int64_t shr) TCGv_vec n, int64_t shr)
@ -6828,27 +6804,24 @@ static void gen_sqshrnb_vec(unsigned vece, TCGv_vec d,
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_SQSHRNB(DisasContext *s, arg_rri_esz *a) static const TCGOpcode sqshrnb_vec_list[] = {
{ INDEX_op_sari_vec, INDEX_op_smax_vec, INDEX_op_smin_vec, 0
static const TCGOpcode vec_list[] = { };
INDEX_op_sari_vec, INDEX_op_smax_vec, INDEX_op_smin_vec, 0 static const GVecGen2i sqshrnb_ops[3] = {
}; { .fniv = gen_sqshrnb_vec,
static const GVecGen2i ops[3] = { .opt_opc = sqshrnb_vec_list,
{ .fniv = gen_sqshrnb_vec, .fno = gen_helper_sve2_sqshrnb_h,
.opt_opc = vec_list, .vece = MO_16 },
.fno = gen_helper_sve2_sqshrnb_h, { .fniv = gen_sqshrnb_vec,
.vece = MO_16 }, .opt_opc = sqshrnb_vec_list,
{ .fniv = gen_sqshrnb_vec, .fno = gen_helper_sve2_sqshrnb_s,
.opt_opc = vec_list, .vece = MO_32 },
.fno = gen_helper_sve2_sqshrnb_s, { .fniv = gen_sqshrnb_vec,
.vece = MO_32 }, .opt_opc = sqshrnb_vec_list,
{ .fniv = gen_sqshrnb_vec, .fno = gen_helper_sve2_sqshrnb_d,
.opt_opc = vec_list, .vece = MO_64 },
.fno = gen_helper_sve2_sqshrnb_d, };
.vece = MO_64 }, TRANS_FEAT(SQSHRNB, aa64_sve2, do_shr_narrow, a, sqshrnb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_sqshrnt_vec(unsigned vece, TCGv_vec d, static void gen_sqshrnt_vec(unsigned vece, TCGv_vec d,
TCGv_vec n, int64_t shr) TCGv_vec n, int64_t shr)
@ -6869,51 +6842,42 @@ static void gen_sqshrnt_vec(unsigned vece, TCGv_vec d,
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_SQSHRNT(DisasContext *s, arg_rri_esz *a) static const TCGOpcode sqshrnt_vec_list[] = {
{ INDEX_op_shli_vec, INDEX_op_sari_vec,
static const TCGOpcode vec_list[] = { INDEX_op_smax_vec, INDEX_op_smin_vec, 0
INDEX_op_shli_vec, INDEX_op_sari_vec, };
INDEX_op_smax_vec, INDEX_op_smin_vec, 0 static const GVecGen2i sqshrnt_ops[3] = {
}; { .fniv = gen_sqshrnt_vec,
static const GVecGen2i ops[3] = { .opt_opc = sqshrnt_vec_list,
{ .fniv = gen_sqshrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_sqshrnt_h,
.load_dest = true, .vece = MO_16 },
.fno = gen_helper_sve2_sqshrnt_h, { .fniv = gen_sqshrnt_vec,
.vece = MO_16 }, .opt_opc = sqshrnt_vec_list,
{ .fniv = gen_sqshrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_sqshrnt_s,
.load_dest = true, .vece = MO_32 },
.fno = gen_helper_sve2_sqshrnt_s, { .fniv = gen_sqshrnt_vec,
.vece = MO_32 }, .opt_opc = sqshrnt_vec_list,
{ .fniv = gen_sqshrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_sqshrnt_d,
.load_dest = true, .vece = MO_64 },
.fno = gen_helper_sve2_sqshrnt_d, };
.vece = MO_64 }, TRANS_FEAT(SQSHRNT, aa64_sve2, do_shr_narrow, a, sqshrnt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_SQRSHRNB(DisasContext *s, arg_rri_esz *a) static const GVecGen2i sqrshrnb_ops[3] = {
{ { .fno = gen_helper_sve2_sqrshrnb_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_sqrshrnb_s },
{ .fno = gen_helper_sve2_sqrshrnb_h }, { .fno = gen_helper_sve2_sqrshrnb_d },
{ .fno = gen_helper_sve2_sqrshrnb_s }, };
{ .fno = gen_helper_sve2_sqrshrnb_d }, TRANS_FEAT(SQRSHRNB, aa64_sve2, do_shr_narrow, a, sqrshrnb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_SQRSHRNT(DisasContext *s, arg_rri_esz *a) static const GVecGen2i sqrshrnt_ops[3] = {
{ { .fno = gen_helper_sve2_sqrshrnt_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_sqrshrnt_s },
{ .fno = gen_helper_sve2_sqrshrnt_h }, { .fno = gen_helper_sve2_sqrshrnt_d },
{ .fno = gen_helper_sve2_sqrshrnt_s }, };
{ .fno = gen_helper_sve2_sqrshrnt_d }, TRANS_FEAT(SQRSHRNT, aa64_sve2, do_shr_narrow, a, sqrshrnt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_uqshrnb_vec(unsigned vece, TCGv_vec d, static void gen_uqshrnb_vec(unsigned vece, TCGv_vec d,
TCGv_vec n, int64_t shr) TCGv_vec n, int64_t shr)
@ -6927,27 +6891,24 @@ static void gen_uqshrnb_vec(unsigned vece, TCGv_vec d,
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_UQSHRNB(DisasContext *s, arg_rri_esz *a) static const TCGOpcode uqshrnb_vec_list[] = {
{ INDEX_op_shri_vec, INDEX_op_umin_vec, 0
static const TCGOpcode vec_list[] = { };
INDEX_op_shri_vec, INDEX_op_umin_vec, 0 static const GVecGen2i uqshrnb_ops[3] = {
}; { .fniv = gen_uqshrnb_vec,
static const GVecGen2i ops[3] = { .opt_opc = uqshrnb_vec_list,
{ .fniv = gen_uqshrnb_vec, .fno = gen_helper_sve2_uqshrnb_h,
.opt_opc = vec_list, .vece = MO_16 },
.fno = gen_helper_sve2_uqshrnb_h, { .fniv = gen_uqshrnb_vec,
.vece = MO_16 }, .opt_opc = uqshrnb_vec_list,
{ .fniv = gen_uqshrnb_vec, .fno = gen_helper_sve2_uqshrnb_s,
.opt_opc = vec_list, .vece = MO_32 },
.fno = gen_helper_sve2_uqshrnb_s, { .fniv = gen_uqshrnb_vec,
.vece = MO_32 }, .opt_opc = uqshrnb_vec_list,
{ .fniv = gen_uqshrnb_vec, .fno = gen_helper_sve2_uqshrnb_d,
.opt_opc = vec_list, .vece = MO_64 },
.fno = gen_helper_sve2_uqshrnb_d, };
.vece = MO_64 }, TRANS_FEAT(UQSHRNB, aa64_sve2, do_shr_narrow, a, uqshrnb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static void gen_uqshrnt_vec(unsigned vece, TCGv_vec d, static void gen_uqshrnt_vec(unsigned vece, TCGv_vec d,
TCGv_vec n, int64_t shr) TCGv_vec n, int64_t shr)
@ -6963,50 +6924,41 @@ static void gen_uqshrnt_vec(unsigned vece, TCGv_vec d,
tcg_temp_free_vec(t); tcg_temp_free_vec(t);
} }
static bool trans_UQSHRNT(DisasContext *s, arg_rri_esz *a) static const TCGOpcode uqshrnt_vec_list[] = {
{ INDEX_op_shli_vec, INDEX_op_shri_vec, INDEX_op_umin_vec, 0
static const TCGOpcode vec_list[] = { };
INDEX_op_shli_vec, INDEX_op_shri_vec, INDEX_op_umin_vec, 0 static const GVecGen2i uqshrnt_ops[3] = {
}; { .fniv = gen_uqshrnt_vec,
static const GVecGen2i ops[3] = { .opt_opc = uqshrnt_vec_list,
{ .fniv = gen_uqshrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_uqshrnt_h,
.load_dest = true, .vece = MO_16 },
.fno = gen_helper_sve2_uqshrnt_h, { .fniv = gen_uqshrnt_vec,
.vece = MO_16 }, .opt_opc = uqshrnt_vec_list,
{ .fniv = gen_uqshrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_uqshrnt_s,
.load_dest = true, .vece = MO_32 },
.fno = gen_helper_sve2_uqshrnt_s, { .fniv = gen_uqshrnt_vec,
.vece = MO_32 }, .opt_opc = uqshrnt_vec_list,
{ .fniv = gen_uqshrnt_vec, .load_dest = true,
.opt_opc = vec_list, .fno = gen_helper_sve2_uqshrnt_d,
.load_dest = true, .vece = MO_64 },
.fno = gen_helper_sve2_uqshrnt_d, };
.vece = MO_64 }, TRANS_FEAT(UQSHRNT, aa64_sve2, do_shr_narrow, a, uqshrnt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_UQRSHRNB(DisasContext *s, arg_rri_esz *a) static const GVecGen2i uqrshrnb_ops[3] = {
{ { .fno = gen_helper_sve2_uqrshrnb_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_uqrshrnb_s },
{ .fno = gen_helper_sve2_uqrshrnb_h }, { .fno = gen_helper_sve2_uqrshrnb_d },
{ .fno = gen_helper_sve2_uqrshrnb_s }, };
{ .fno = gen_helper_sve2_uqrshrnb_d }, TRANS_FEAT(UQRSHRNB, aa64_sve2, do_shr_narrow, a, uqrshrnb_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
static bool trans_UQRSHRNT(DisasContext *s, arg_rri_esz *a) static const GVecGen2i uqrshrnt_ops[3] = {
{ { .fno = gen_helper_sve2_uqrshrnt_h },
static const GVecGen2i ops[3] = { { .fno = gen_helper_sve2_uqrshrnt_s },
{ .fno = gen_helper_sve2_uqrshrnt_h }, { .fno = gen_helper_sve2_uqrshrnt_d },
{ .fno = gen_helper_sve2_uqrshrnt_s }, };
{ .fno = gen_helper_sve2_uqrshrnt_d }, TRANS_FEAT(UQRSHRNT, aa64_sve2, do_shr_narrow, a, uqrshrnt_ops)
};
return do_sve2_shr_narrow(s, a, ops);
}
#define DO_SVE2_ZZZ_NARROW(NAME, name) \ #define DO_SVE2_ZZZ_NARROW(NAME, name) \
static gen_helper_gvec_3 * const name##_fns[4] = { \ static gen_helper_gvec_3 * const name##_fns[4] = { \