Skip to content

Commit 2e83352

Browse files
Fix bug in fp.round_to_integral (#7060)
1 parent e90a844 commit 2e83352

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

src/ast/fpa/fpa2bv_converter.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -2189,7 +2189,13 @@ void fpa2bv_converter::mk_round_to_integral(sort * s, expr_ref & rm, expr_ref &
21892189
renorm_delta = m.mk_ite(m_bv_util.mk_ule(zero_e2, sig_lz_capped), sig_lz_capped, zero_e2);
21902190
SASSERT(m_bv_util.get_bv_size(renorm_delta) == ebits + 2);
21912191
res_exp = m_bv_util.mk_bv_sub(res_exp, renorm_delta);
2192-
res_sig = m_bv_util.mk_bv_shl(res_sig, m_bv_util.mk_zero_extend(sbits-ebits-2, renorm_delta));
2192+
if (sbits >= ebits+2)
2193+
res_sig = m_bv_util.mk_bv_shl(res_sig, m_bv_util.mk_zero_extend(sbits-ebits-2, renorm_delta));
2194+
else {
2195+
// should not overflow because renorm_delta is logarithmic to the size of the leading zero bits
2196+
res_sig = m_bv_util.mk_bv_shl(m_bv_util.mk_zero_extend(ebits+2-sbits, res_sig), renorm_delta);
2197+
res_sig = m_bv_util.mk_extract(sbits-1, 0, res_sig);
2198+
}
21932199
dbg_decouple("fpa2bv_r2i_renorm_delta", renorm_delta);
21942200
dbg_decouple("fpa2bv_r2i_sig_lz", sig_lz);
21952201
dbg_decouple("fpa2bv_r2i_sig_lz_capped", sig_lz_capped);

0 commit comments

Comments
 (0)