From 6e45ec6795aa9f75ecd86d147af9cab1ae0c904c Mon Sep 17 00:00:00 2001 From: Krystine Sherwin <93062060+KrystalDelusion@users.noreply.github.com> Date: Sat, 28 Feb 2026 17:24:31 +1300 Subject: [PATCH] symfpu: Convert with flags --- libs/symfpu | 2 +- passes/cmds/symfpu.cc | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/libs/symfpu b/libs/symfpu index 50cca8075..423911dc2 160000 --- a/libs/symfpu +++ b/libs/symfpu @@ -1 +1 @@ -Subproject commit 50cca80758d16bf72161d4d2eafb7b7c18ab44ba +Subproject commit 423911dc2022418d80a5aadd3ea3a876b352c9fc diff --git a/passes/cmds/symfpu.cc b/passes/cmds/symfpu.cc index e51643aea..33d91cc6a 100644 --- a/passes/cmds/symfpu.cc +++ b/passes/cmds/symfpu.cc @@ -99,6 +99,7 @@ using symfpu::ite; using uf = symfpu::unpackedFloat; using uf_flagged = symfpu::floatWithStatusFlags; using uf_flagged_ite = symfpu::ite; +using ubv_flagged = symfpu::ubvWithStatusFlags; PRIVATE_NAMESPACE_END @@ -756,15 +757,25 @@ struct SymFpuConvertPass : public Pass { auto i_bv = input_ubv(ID(i), i_size); uf i_f = symfpu::unpack(i_format, i_bv); - uf o_ff = symfpu::convertFloatToFloat(i_format, o_format, rounding_mode, i_f); - output_ubv(ID(o_ff), symfpu::pack(o_format, o_ff)); + uf_flagged o_ff = symfpu::convertFloatToFloat_flagged(i_format, o_format, rounding_mode, i_f); + output_ubv(ID(o_ff), symfpu::pack(o_format, o_ff.val)); + prop i_sNaN(i_f.getNaN() && is_sNaN(i_bv, i_size-i_exp)); + output_prop(ID(nv_ff), o_ff.nv || i_sNaN); + output_prop(ID(of_ff), o_ff.of); + output_prop(ID(uf_ff), o_ff.uf); + output_prop(ID(nx_ff), o_ff.nx); ubv o_default = symfpu::ITE(i_f.getSign(), ubv::zero(o_size), ubv::allOnes(o_size)); - ubv o_fi = symfpu::convertFloatToUBV(i_format, rounding_mode, i_f, o_size, o_default); - output_ubv(ID(o_fi), o_fi); + ubv_flagged o_fi = symfpu::convertFloatToUBV_flagged(i_format, rounding_mode, i_f, o_size, o_default); + output_ubv(ID(o_fi), o_fi.val); + output_prop(ID(nv_fi), o_fi.nv); + output_prop(ID(nx_fi), o_fi.nx); - uf o_if = symfpu::convertUBVToFloat(o_format, rounding_mode, i_bv); - output_ubv(ID(o_if), symfpu::pack(o_format, o_if)); + uf_flagged o_if = symfpu::convertUBVToFloat_flagged(o_format, rounding_mode, i_bv); + output_ubv(ID(o_if), symfpu::pack(o_format, o_if.val)); + output_prop(ID(nv_if), o_if.nv); + output_prop(ID(of_if), o_if.of); + output_prop(ID(nx_if), o_if.nx); symfpu_mod->fixup_ports(); }