Add IntLog2 and use it

Replace uses of floating point log2 when we want an integer result from
an integer operand.  This avoids concerns about accuracy of floating
point library functions.
This commit is contained in:
David Neto 2021-02-03 13:56:06 -05:00 committed by Jeremy Hayes
parent 5c4f421121
commit fa6e3c2737
4 changed files with 179 additions and 8 deletions

View file

@ -5469,14 +5469,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
if (! IsPow2(value))
error(loc, "must be a power of 2", "buffer_reference_align", "");
else
#ifdef __ANDROID__
// Android NDK r15c tageting ABI 15 doesn't have full support for C++11
// (no std::exp2/log2). ::exp2 is available from C99 but ::log2 isn't
// available up until ABI 18 so we use the mathematical equivalent form
publicType.qualifier.layoutBufferReferenceAlign = (unsigned int)(std::log(value) / std::log(2.0));
#else
publicType.qualifier.layoutBufferReferenceAlign = (unsigned int)std::log2(value);
#endif
publicType.qualifier.layoutBufferReferenceAlign = IntLog2(value);
if (nonLiteral)
error(loc, "needs a literal integer", "buffer_reference_align", "");
return;