🔨 small refactoring to improve branch coverage

The branch coverage reported by lcov is weird. The code before and after has the same Godbolt assembler, but the code with the lambda has a better branch coverage.
parent c8bfdfd9
...@@ -408,22 +408,24 @@ class binary_reader ...@@ -408,22 +408,24 @@ class binary_reader
// half-precision floating-point numbers in the C language // half-precision floating-point numbers in the C language
// is shown in Fig. 3. // is shown in Fig. 3.
const int half = (byte1 << 8) + byte2; const int half = (byte1 << 8) + byte2;
const int exp = (half >> 10) & 0x1F; const double val = [&half]
const int mant = half & 0x3FF;
double val;
if (exp == 0)
{ {
val = std::ldexp(mant, -24); const int exp = (half >> 10) & 0x1F;
} const int mant = half & 0x3FF;
else if (exp != 31) assert(0 <= exp and exp <= 32);
{ assert(0 <= mant and mant <= 1024);
val = std::ldexp(mant + 1024, exp - 25); switch (exp)
} {
else case 0:
{ return std::ldexp(mant, -24);
val = (mant == 0) ? std::numeric_limits<double>::infinity() case 31:
: std::numeric_limits<double>::quiet_NaN(); return (mant == 0)
} ? std::numeric_limits<double>::infinity()
: std::numeric_limits<double>::quiet_NaN();
default:
return std::ldexp(mant + 1024, exp - 25);
}
}();
return sax->number_float((half & 0x8000) != 0 return sax->number_float((half & 0x8000) != 0
? static_cast<number_float_t>(-val) ? static_cast<number_float_t>(-val)
: static_cast<number_float_t>(val), ""); : static_cast<number_float_t>(val), "");
......
...@@ -6041,22 +6041,24 @@ class binary_reader ...@@ -6041,22 +6041,24 @@ class binary_reader
// half-precision floating-point numbers in the C language // half-precision floating-point numbers in the C language
// is shown in Fig. 3. // is shown in Fig. 3.
const int half = (byte1 << 8) + byte2; const int half = (byte1 << 8) + byte2;
const int exp = (half >> 10) & 0x1F; const double val = [&half]
const int mant = half & 0x3FF;
double val;
if (exp == 0)
{ {
val = std::ldexp(mant, -24); const int exp = (half >> 10) & 0x1F;
} assert(0 <= exp and exp <= 32);
else if (exp != 31) const int mant = half & 0x3FF;
{ assert(0 <= mant and mant <= 1024);
val = std::ldexp(mant + 1024, exp - 25); switch (exp)
} {
else case 0:
{ return std::ldexp(mant, -24);
val = (mant == 0) ? std::numeric_limits<double>::infinity() case 31:
: std::numeric_limits<double>::quiet_NaN(); return (mant == 0)
} ? std::numeric_limits<double>::infinity()
: std::numeric_limits<double>::quiet_NaN();
default:
return std::ldexp(mant + 1024, exp - 25);
}
}();
return sax->number_float((half & 0x8000) != 0 return sax->number_float((half & 0x8000) != 0
? static_cast<number_float_t>(-val) ? static_cast<number_float_t>(-val)
: static_cast<number_float_t>(val), ""); : static_cast<number_float_t>(val), "");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment