MCPcopy Create free account
hub / github.com/AliveToolkit/alive2 / frexp

Method frexp

smt/expr.cpp:1281–1313  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1279}
1280
1281std::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
1315expr expr::fma(const expr &a, const expr &b, const expr &c, const expr &rm) {
1316 C2(a, b, c, rm);

Callers 1

toSMTMethod · 0.80

Calls 10

signMethod · 0.80
ctlzMethod · 0.80
sextOrTruncMethod · 0.80
concat_zerosMethod · 0.80
fdivMethod · 0.80
uint2fpMethod · 0.80
fnegMethod · 0.80
extractMethod · 0.45
zextMethod · 0.45
zextOrTruncMethod · 0.45

Tested by

no test coverage detected