diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2020-04-17 12:10:00 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2020-04-17 15:24:07 +0200 |
commit | 870ab3b8492fa7d42c56ca09884811fef1695d28 (patch) | |
tree | 6d5bc07f7e443709eeb36652141b733f848794ce /sal | |
parent | 0a0c10c0502906bebf9ea8c732d63809d5080dd6 (diff) |
Just use __builtin_ffs on GCC and Clang
GCC appears to support it at least since <https://gcc.gnu.org/git/
?p=gcc.git;a=commit;h=51e2940139d5e3e86590f6e6802ffc3f3010be5b> "Initial
revision" in 1992, and Clang appears to support it since <https://github.com/
llvm/llvm-project/commit/d93abc3bb0acdd430839abdd67bd3920fee87bbc> "Implement
ffs, parity, and popcount builtins" in Clang 2.4. (And if a build used a
compiler that does not support it, there would be no guarantee that it would
support strings.h function ffs from X/Open System Interfaces, either.)
Introducing HAVE_GCC_BUILTIN_FFS in 334a9f16cd1d1f9694f885c759903a41aa3d4833
"tdf#113211: fix calculations with big integers" appears to be due to a
misguided recommendation at <https://gerrit.libreoffice.org/c/core/+/43477/4#
message-899806c724fbdcece0ea9438514a6a5db6a2e645>.
Change-Id: Ib6ee6de548172b3aae25483d03efb86620133933
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92421
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'sal')
-rw-r--r-- | sal/rtl/math.cxx | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/sal/rtl/math.cxx b/sal/rtl/math.cxx index 099cd3d60578..981009aa036c 100644 --- a/sal/rtl/math.cxx +++ b/sal/rtl/math.cxx @@ -19,7 +19,6 @@ #include <rtl/math.h> -#include <config_global.h> #include <o3tl/safeint.hxx> #include <osl/diagnose.h> #include <rtl/alloc.h> @@ -43,10 +42,6 @@ #include <dtoa.h> -#if !HAVE_GCC_BUILTIN_FFS && !defined _WIN32 - #include <strings.h> -#endif - static int const n10Count = 16; static double const n10s[2][n10Count] = { { 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, @@ -183,14 +178,12 @@ bool isRepresentableInteger(double fAbsValue) // Returns 1-based index of least significant bit in a number, or zero if number is zero int findFirstSetBit(unsigned n) { -#if HAVE_GCC_BUILTIN_FFS - return __builtin_ffs(n); -#elif defined _WIN32 +#if defined _WIN32 unsigned long pos; unsigned char bNonZero = _BitScanForward(&pos, n); return (bNonZero == 0) ? 0 : pos + 1; #else - return ffs(n); + return __builtin_ffs(n); #endif } |