| 1279 | } |
| 1280 | |
| 1281 | std::pair<expr, expr> expr::frexp() const { |
| 1282 | C(); |
| 1283 | unsigned bits_exponent = Z3_fpa_get_ebits(ctx(), sort()); |
| 1284 | unsigned bits_mantissa = Z3_fpa_get_sbits(ctx(), sort()) - 1; |
| 1285 | unsigned total_bits = bits_exponent + bits_mantissa + 1; |
| 1286 | |
| 1287 | expr rm = expr::rne(); |
| 1288 | expr bv = float2BV(); |
| 1289 | unsigned bias = (1 << (bits_exponent - 1)) - 1; |
| 1290 | expr sign = bv.sign(); |
| 1291 | expr exponent = bv.extract(total_bits-2, bits_mantissa); |
| 1292 | expr mantissa = bv.extract(bits_mantissa-1, 0).zext(1); |
| 1293 | |
| 1294 | expr subnormal = exponent == 0; |
| 1295 | expr shift = mantissa.ctlz(); |
| 1296 | |
| 1297 | exponent = exponent.zextOrTrunc(32); |
| 1298 | exponent = expr::mkIf(isFPZero(), |
| 1299 | mkUInt(0, exponent), |
| 1300 | expr::mkIf(subnormal, |
| 1301 | expr::mkInt(1 - bias, 32) - shift.sextOrTrunc(32), |
| 1302 | exponent + expr::mkInt(-bias, exponent) |
| 1303 | ) + expr::mkUInt(1, exponent)); |
| 1304 | |
| 1305 | expr restore_bit = expr::mkUInt(1, 1).concat_zeros(bits_mantissa); |
| 1306 | mantissa = expr::mkIf(subnormal, mantissa << shift, mantissa | restore_bit); |
| 1307 | expr shift2 = expr::mkUInt(1, 1).concat_zeros(bits_mantissa + 1); |
| 1308 | mantissa = mantissa.uint2fp(*this, rm).fdiv(shift2.uint2fp(*this, rm), rm); |
| 1309 | mantissa = expr::mkIf(isFPZero(), *this, |
| 1310 | expr::mkIf(sign == 0, mantissa, mantissa.fneg())); |
| 1311 | |
| 1312 | return { std::move(mantissa), std::move(exponent) }; |
| 1313 | } |
| 1314 | |
| 1315 | expr expr::fma(const expr &a, const expr &b, const expr &c, const expr &rm) { |
| 1316 | C2(a, b, c, rm); |
no test coverage detected