target/riscv: Add support for Zvfh/zvfhmin extensions
Zvfh supports vector float point instructions with SEW = 16 and supports conversions between 8-bit integers and binary16 values. Zvfhmin supports vfwcvt.f.f.v and vfncvt.f.f.w instructions. Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Message-ID: <20230215020539.4788-12-liweiwei@iscas.ac.cn> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
2bc2853f15
commit
e80865e5f3
@ -40,6 +40,7 @@ static bool require_rvf(DisasContext *s)
|
||||
|
||||
switch (s->sew) {
|
||||
case MO_16:
|
||||
return s->cfg_ptr->ext_zvfh;
|
||||
case MO_32:
|
||||
return s->cfg_ptr->ext_zve32f;
|
||||
case MO_64:
|
||||
@ -57,6 +58,25 @@ static bool require_scale_rvf(DisasContext *s)
|
||||
|
||||
switch (s->sew) {
|
||||
case MO_8:
|
||||
return s->cfg_ptr->ext_zvfh;
|
||||
case MO_16:
|
||||
return s->cfg_ptr->ext_zve32f;
|
||||
case MO_32:
|
||||
return s->cfg_ptr->ext_zve64d;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool require_scale_rvfmin(DisasContext *s)
|
||||
{
|
||||
if (s->mstatus_fs == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (s->sew) {
|
||||
case MO_8:
|
||||
return s->cfg_ptr->ext_zvfhmin;
|
||||
case MO_16:
|
||||
return s->cfg_ptr->ext_zve32f;
|
||||
case MO_32:
|
||||
@ -2798,7 +2818,7 @@ static bool opxfv_widen_check(DisasContext *s, arg_rmr *a)
|
||||
static bool opffv_widen_check(DisasContext *s, arg_rmr *a)
|
||||
{
|
||||
return opfv_widen_check(s, a) &&
|
||||
require_scale_rvf(s) &&
|
||||
require_scale_rvfmin(s) &&
|
||||
(s->sew != MO_8);
|
||||
}
|
||||
|
||||
@ -2909,6 +2929,13 @@ static bool opfxv_narrow_check(DisasContext *s, arg_rmr *a)
|
||||
}
|
||||
|
||||
static bool opffv_narrow_check(DisasContext *s, arg_rmr *a)
|
||||
{
|
||||
return opfv_narrow_check(s, a) &&
|
||||
require_scale_rvfmin(s) &&
|
||||
(s->sew != MO_8);
|
||||
}
|
||||
|
||||
static bool opffv_rod_narrow_check(DisasContext *s, arg_rmr *a)
|
||||
{
|
||||
return opfv_narrow_check(s, a) &&
|
||||
require_scale_rvf(s) &&
|
||||
@ -2952,7 +2979,7 @@ GEN_OPFV_NARROW_TRANS(vfncvt_f_x_w, opfxv_narrow_check, vfncvt_f_x_w,
|
||||
GEN_OPFV_NARROW_TRANS(vfncvt_f_f_w, opffv_narrow_check, vfncvt_f_f_w,
|
||||
RISCV_FRM_DYN)
|
||||
/* Reuse the helper function from vfncvt.f.f.w */
|
||||
GEN_OPFV_NARROW_TRANS(vfncvt_rod_f_f_w, opffv_narrow_check, vfncvt_f_f_w,
|
||||
GEN_OPFV_NARROW_TRANS(vfncvt_rod_f_f_w, opffv_rod_narrow_check, vfncvt_f_f_w,
|
||||
RISCV_FRM_ROD)
|
||||
|
||||
static bool opxfv_narrow_check(DisasContext *s, arg_rmr *a)
|
||||
|
Loading…
Reference in New Issue
Block a user