On 09/07/2016 10:37 PM, Eike Rathke wrote:
You could do us a favour, are you willing to invest some machine time and try if passing either -msse or -msse2 as compiler flags would solve the failing function tests problem? For this you'd need to do make clean make ENVCFLAGS=-msse ENVCFLAGSCXX=-msse && make sc.check and if that still fails try make clean make ENVCFLAGS=-msse2 ENVCFLAGSCXX=-msse2 && make sc.check
Turns out, the relevant GCC switches are -mfpmath=sse -msse2-mfpmath=sse (instead of the x86-32 default of -mfpmath=387) prevents usage of the extended 80-bit precision for temporary results. (Which caused e.g. the subtraction in ScChiDistFunction::GetValue, sc/source/core/tool/interpr3.cxx, to produce results different from IEEE double, causing the computation of CHIINV(0.999999999999999, 1.00000000000000E+001) in sc/qa/unit/data/functions/fods/chiinv.fods to produce unexpected results.) <https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/x86-Options.html#x86-Options> also claims: "The resulting code should be considerably faster [compared to -mfpmath=387] in the majority of cases and avoid the numerical instability problems of 387 code [...]"
But -mfpmath=sse only takes effect when compiling for an architecture that actually supports the relevant SSE instructions (otherwise silently falling back to the "387" instructions, it appears). So we need an additional -msse2 to enable the instructions relevant for 64-bit double (-msse would only enable instructions relevant for 32-bit float).
SSE2 support reportedly got added with Pentium 4, around 2001. Any thoughts on whether we'd want to enforce that for 32-bit x86 Linux builds (or already effectively enforce anyway)? In which case we could add the relevant flags to solenv/gbuild/platform/LINUX_INTEL_GCC.mk and revert <https://cgit.freedesktop.org/libreoffice/core/commit/?id=b9a27d5856f60688456762bfcc29c38670009254> "sc: disable function test documents for 32-bit PLATFORMID=linux_x86" again.
(Notwithstanding the fact that tests that rely on Calc doing computations in a specific way, when Calc doesn't give any guarantees of how those computations should be carried out exactly AFAIK, are dubious and a pain at best.)