From 23a20c05e0bb41d3e6010ce2a990683f9efa3176 Mon Sep 17 00:00:00 2001 From: Tue Ly Date: Fri, 14 Feb 2025 01:23:28 +0000 Subject: [PATCH] [libc][math] Fix sqrtf128 implicit conversions. --- libc/src/math/generic/sqrtf128.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libc/src/math/generic/sqrtf128.cpp b/libc/src/math/generic/sqrtf128.cpp index c844d3afa11c8..3aa7db8362734 100644 --- a/libc/src/math/generic/sqrtf128.cpp +++ b/libc/src/math/generic/sqrtf128.cpp @@ -383,25 +383,26 @@ LLVM_LIBC_FUNCTION(float128, sqrtf128, (float128 x)) { // 1 so just need to add shifted m and 1. Int128 t1 = t0; Int128 sgn = t0 >> 127; // sign of the difference - t1 -= (m << 1) ^ sgn; - t1 += 1 + sgn; + Int128 m_xor_sgn = static_cast(m << 1) ^ sgn; + t1 -= m_xor_sgn; + t1 += Int128(1) + sgn; Int128 sgn1 = t1 >> 127; if (LIBC_UNLIKELY(sgn == sgn1)) { t0 = t1; v -= sgn << 15; - t1 -= (m << 1) ^ sgn; - t1 += 1 + sgn; + t1 -= m_xor_sgn; + t1 += Int128(1) + sgn; } if (t1 == 0) { // 1 ulp offset brings again an exact root - v = (m - (2 * sgn + 1)) << 15; + v = (m - static_cast((sgn << 1) + 1)) << 15; } else { t1 += t0; Int128 side = t1 >> 127; // select what is closer m or m+-1 v &= ~UInt128(0) << 15; // wipe the fractional bits - v -= ((sgn & side) | (~sgn & 1)) << (15 + side); + v -= ((sgn & side) | (~sgn & 1)) << (15 + static_cast(side)); v |= 1; // add sticky bit since we cannot have an exact mid-point // situation }