mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
target/riscv: change the api for RVF/RVD fmin/fmax
The sNaN propagation behavior has been changed since cd20cee7 in https://github.com/riscv/riscv-isa-manual. In Priv spec v1.10, RVF is v2.0. fmin.s and fmax.s are implemented with IEEE 754-2008 minNum and maxNum operations. In Priv spec v1.11, RVF is v2.2. fmin.s and fmax.s are amended to implement IEEE 754-2019 minimumNumber and maximumNumber operations. Therefore, to prevent the risk of having too many version variables. Instead of introducing an extra *fext_ver* variable, we tie RVF version to Priv version. Though it's not completely accurate but is close enough. Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com> Signed-off-by: Frank Chang <frank.chang@sifive.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20211021160847.2748577-3-frank.chang@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
0e9030376e
commit
15161e425e
1 changed files with 12 additions and 4 deletions
|
@ -174,14 +174,18 @@ uint64_t helper_fmin_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
|
|||
{
|
||||
float32 frs1 = check_nanbox_s(rs1);
|
||||
float32 frs2 = check_nanbox_s(rs2);
|
||||
return nanbox_s(float32_minnum(frs1, frs2, &env->fp_status));
|
||||
return nanbox_s(env->priv_ver < PRIV_VERSION_1_11_0 ?
|
||||
float32_minnum(frs1, frs2, &env->fp_status) :
|
||||
float32_minimum_number(frs1, frs2, &env->fp_status));
|
||||
}
|
||||
|
||||
uint64_t helper_fmax_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
|
||||
{
|
||||
float32 frs1 = check_nanbox_s(rs1);
|
||||
float32 frs2 = check_nanbox_s(rs2);
|
||||
return nanbox_s(float32_maxnum(frs1, frs2, &env->fp_status));
|
||||
return nanbox_s(env->priv_ver < PRIV_VERSION_1_11_0 ?
|
||||
float32_maxnum(frs1, frs2, &env->fp_status) :
|
||||
float32_maximum_number(frs1, frs2, &env->fp_status));
|
||||
}
|
||||
|
||||
uint64_t helper_fsqrt_s(CPURISCVState *env, uint64_t rs1)
|
||||
|
@ -283,12 +287,16 @@ uint64_t helper_fdiv_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
|
|||
|
||||
uint64_t helper_fmin_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
|
||||
{
|
||||
return float64_minnum(frs1, frs2, &env->fp_status);
|
||||
return env->priv_ver < PRIV_VERSION_1_11_0 ?
|
||||
float64_minnum(frs1, frs2, &env->fp_status) :
|
||||
float64_minimum_number(frs1, frs2, &env->fp_status);
|
||||
}
|
||||
|
||||
uint64_t helper_fmax_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
|
||||
{
|
||||
return float64_maxnum(frs1, frs2, &env->fp_status);
|
||||
return env->priv_ver < PRIV_VERSION_1_11_0 ?
|
||||
float64_maxnum(frs1, frs2, &env->fp_status) :
|
||||
float64_maximum_number(frs1, frs2, &env->fp_status);
|
||||
}
|
||||
|
||||
uint64_t helper_fcvt_s_d(CPURISCVState *env, uint64_t rs1)
|
||||
|
|
Loading…
Reference in a new issue