target/riscv: Refactor translation of vector-widening instruction
Zvbb (implemented in later commit) has a widening instruction, which requires an extra check on the enabled extensions. Refactor GEN_OPIVX_WIDEN_TRANS() to take a check function to avoid reimplementing it. Signed-off-by: Dickon Hood <dickon.hood@codethink.co.uk> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Signed-off-by: Max Chou <max.chou@sifive.com> Message-ID: <20230711165917.2629866-7-max.chou@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
1ac7a501f0
commit
62cb3e8e88
@ -1526,30 +1526,24 @@ static bool opivx_widen_check(DisasContext *s, arg_rmrr *a)
|
|||||||
vext_check_ds(s, a->rd, a->rs2, a->vm);
|
vext_check_ds(s, a->rd, a->rs2, a->vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool do_opivx_widen(DisasContext *s, arg_rmrr *a,
|
#define GEN_OPIVX_WIDEN_TRANS(NAME, CHECK) \
|
||||||
gen_helper_opivx *fn)
|
static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
|
||||||
{
|
{ \
|
||||||
if (opivx_widen_check(s, a)) {
|
if (CHECK(s, a)) { \
|
||||||
return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s);
|
static gen_helper_opivx * const fns[3] = { \
|
||||||
}
|
gen_helper_##NAME##_b, \
|
||||||
return false;
|
gen_helper_##NAME##_h, \
|
||||||
|
gen_helper_##NAME##_w \
|
||||||
|
}; \
|
||||||
|
return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s); \
|
||||||
|
} \
|
||||||
|
return false; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GEN_OPIVX_WIDEN_TRANS(NAME) \
|
GEN_OPIVX_WIDEN_TRANS(vwaddu_vx, opivx_widen_check)
|
||||||
static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
|
GEN_OPIVX_WIDEN_TRANS(vwadd_vx, opivx_widen_check)
|
||||||
{ \
|
GEN_OPIVX_WIDEN_TRANS(vwsubu_vx, opivx_widen_check)
|
||||||
static gen_helper_opivx * const fns[3] = { \
|
GEN_OPIVX_WIDEN_TRANS(vwsub_vx, opivx_widen_check)
|
||||||
gen_helper_##NAME##_b, \
|
|
||||||
gen_helper_##NAME##_h, \
|
|
||||||
gen_helper_##NAME##_w \
|
|
||||||
}; \
|
|
||||||
return do_opivx_widen(s, a, fns[s->sew]); \
|
|
||||||
}
|
|
||||||
|
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwaddu_vx)
|
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwadd_vx)
|
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwsubu_vx)
|
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwsub_vx)
|
|
||||||
|
|
||||||
/* WIDEN OPIVV with WIDEN */
|
/* WIDEN OPIVV with WIDEN */
|
||||||
static bool opiwv_widen_check(DisasContext *s, arg_rmrr *a)
|
static bool opiwv_widen_check(DisasContext *s, arg_rmrr *a)
|
||||||
@ -1997,9 +1991,9 @@ GEN_OPIVX_TRANS(vrem_vx, opivx_check)
|
|||||||
GEN_OPIVV_WIDEN_TRANS(vwmul_vv, opivv_widen_check)
|
GEN_OPIVV_WIDEN_TRANS(vwmul_vv, opivv_widen_check)
|
||||||
GEN_OPIVV_WIDEN_TRANS(vwmulu_vv, opivv_widen_check)
|
GEN_OPIVV_WIDEN_TRANS(vwmulu_vv, opivv_widen_check)
|
||||||
GEN_OPIVV_WIDEN_TRANS(vwmulsu_vv, opivv_widen_check)
|
GEN_OPIVV_WIDEN_TRANS(vwmulsu_vv, opivv_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmul_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmul_vx, opivx_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmulu_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmulu_vx, opivx_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmulsu_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmulsu_vx, opivx_widen_check)
|
||||||
|
|
||||||
/* Vector Single-Width Integer Multiply-Add Instructions */
|
/* Vector Single-Width Integer Multiply-Add Instructions */
|
||||||
GEN_OPIVV_TRANS(vmacc_vv, opivv_check)
|
GEN_OPIVV_TRANS(vmacc_vv, opivv_check)
|
||||||
@ -2015,10 +2009,10 @@ GEN_OPIVX_TRANS(vnmsub_vx, opivx_check)
|
|||||||
GEN_OPIVV_WIDEN_TRANS(vwmaccu_vv, opivv_widen_check)
|
GEN_OPIVV_WIDEN_TRANS(vwmaccu_vv, opivv_widen_check)
|
||||||
GEN_OPIVV_WIDEN_TRANS(vwmacc_vv, opivv_widen_check)
|
GEN_OPIVV_WIDEN_TRANS(vwmacc_vv, opivv_widen_check)
|
||||||
GEN_OPIVV_WIDEN_TRANS(vwmaccsu_vv, opivv_widen_check)
|
GEN_OPIVV_WIDEN_TRANS(vwmaccsu_vv, opivv_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmaccu_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmaccu_vx, opivx_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmacc_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmacc_vx, opivx_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmaccsu_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmaccsu_vx, opivx_widen_check)
|
||||||
GEN_OPIVX_WIDEN_TRANS(vwmaccus_vx)
|
GEN_OPIVX_WIDEN_TRANS(vwmaccus_vx, opivx_widen_check)
|
||||||
|
|
||||||
/* Vector Integer Merge and Move Instructions */
|
/* Vector Integer Merge and Move Instructions */
|
||||||
static bool trans_vmv_v_v(DisasContext *s, arg_vmv_v_v *a)
|
static bool trans_vmv_v_v(DisasContext *s, arg_vmv_v_v *a)
|
||||||
|
Loading…
Reference in New Issue
Block a user