|
Message-ID: <CAKxU2N9qpU9=7qNFavd=UjtLfH0UHrHN95E448oKk7H3w4OOQw@mail.gmail.com> Date: Tue, 10 Dec 2019 17:13:00 -0800 From: Rosen Penev <rosenp@...il.com> To: musl@...ts.openwall.com Cc: Stefan Kanthak <stefan.kanthak@...go.de> Subject: Re: More patches for math subtree On Tue, Dec 10, 2019 at 2:17 PM Rich Felker <dalias@...c.org> wrote: > > On Tue, Dec 10, 2019 at 10:32:26PM +0100, Stefan Kanthak wrote: > > "Rich Felker" <dalias@...c.org> wrote: > > > > > > > On Tue, Dec 10, 2019 at 05:57:55PM +0100, Stefan Kanthak wrote: > > >> Some more optimisations: the current implementations of ceil(), floor() > > >> and trunc() for i386 change the rounding control using fldcw instructions, > > >> which are SLOW; these patches provide faster and smaller branch-free (!) > > >> implementations. > > >> > > >> JFTR: I'm NOT subscribed to your mailing list, so CC: me in replies! > > >> > > >> --- -/src/math/i386/floor.s > > >> +++ +/src/math/i386/floor.s > > >> @@ -1,67 +1,26 @@ > > >> .global floorf > > >> .type floorf,@function > > >> floorf: > > >> flds 4(%esp) > > >> jmp 1f > > >> > > >> .global floorl > > >> .type floorl,@function > > >> floorl: > > >> fldt 4(%esp) > > >> jmp 1f > > >> > > >> .global floor > > >> .type floor,@function > > >> floor: > > >> fldl 4(%esp) > > >> +1: fld %st(0) > > >> + frndint > > >> + fxch %st(1) > > >> + fucomip %st(1),%st(0) > > >> + fld1 > > >> + fldz > > >> + fcmovb %st(1),%st(0) > > > ^^^^^^ > > > > > > fcmovb is not in the baseline ISA. > > > > This is but irrelevant or inconsequent: FCMOV* as well as FCOMI* and > > FUCOMI* were introduced with the PentiumPro. If you allow the use of > > the latter you can safely use the former too. And FCOMI* and FUCOMI* > > are already used in other .S files. > > This is why we're not using them. I think you're looking at x86_64 > where they are in the baseline ISA. > > > > Otherwise, I *think* the idea of this patch looks good, provided I'm > > > not missing anything with respect to how status flags are affected. > > > > FRNDINT takes care of them! > > OK. > > > > As noted in the other email (sorry about not CC'ing you before; I've > > > got you on CC now), I really want to get rid of all these .s files in > > > favor of __asm__ statements with proper constraints in C source files. > > > That makes them inlineable with LTO, and makes it possible for the > > > compiler to select to use an instruction like fcmovb conditionally > > > based on the targeted ISA level rather than having to do a .S file > > > with hard-coded preprocessor conditionals. > > > > While this is generally good idea, there's no guarantee that a compiler > > will emit a branch-free instruction sequence like those shown above. > > I also doubt that a compiler will produce the 5 instruction sequence > > shown in my patch for src/math/i386/remquo.S which collects the FPU > > flags C0, C3 and C1 set by FPREM. > > For that you'd probably put the collection of bits inside the asm. It > still makes just a few instructions of asm, with no need for external > call ABI logic in the asm. > > > I noticed that you provide .S files for "long double" on x86-64, but > > not for "double" and "float". I therefore assume that you use the > > SSE floating-point instructions there, respectively let the compiler > > use them. > > On the x86_64 ABI, float and double arithmetic are performed in SSE > rather than in excess precision with the x87 unit. > > > Does any compiler emit branch-free instruction sequences like the > > following for Intel CPUs without SSE4.1, i.e. without ROUNDSS/ROUNDSD? > > > > .code ; Intel syntax > > ceil proc public > > extern __real@...0000000000000:real8 > > movsd xmm1, __real@...0000000000000 > > extern __real@...0000000000000:real8 > > movsd xmm2, __real@...0000000000000 > > extern __real@...0000000000000:real8 > > movsd xmm3, __real@...0000000000000 > > movsd xmm4, xmm1 > > andnpd xmm1, xmm0 > > andpd xmm4, xmm0 > > cmpltsd xmm1, xmm3 > > andpd xmm1, xmm3 > > orpd xmm1, xmm4 > > movsd xmm3, xmm0 > > addsd xmm0, xmm1 > > subsd xmm0, xmm1 > > movsd xmm1, xmm0 > > cmpltsd xmm0, xmm3 > > andpd xmm0, xmm2 > > addsd xmm0, xmm1 > > orpd xmm0, xmm4 > > ret > > ceil endp > > > > Or instruction sequences like > > > > .code ; Intel syntax > > copysign proc public > > movd rcx, xmm0 > > movd rdx, xmm1 > > shld rcx, rdx, 1 > > ror rcx, 1 > > movd xmm0, rcx > > ret > > copysign endp > > Not quite (but it might be possible to write the C in terms of shifts > instead of masks such that it does), but I also don't think it's clear > which version is better. Yours here is mildly smaller and might > perform better, but when making changes that aren't clearly better > there should be some evidence that it's actually an improvement -- > especially if it's not just improving existing arch optimizations but > adding new ones where the C was formerly used. Generally musl avoids > asm and arch-specific files as much as possible, using them only for > things that aren't representable in C or where the C is a lot larger > or slower or both. > > > .code ; Intel syntax > > fdim proc public > > movsd xmm2, xmm0 > > cmpsd xmm0, xmm1, 6 > > subsd xmm2, xmm1 > > andpd xmm0, xmm2 > > ret > > fdim endp > > Does this handle nans correctly? > > > > It also precludes x87 stack imbalance bugs like CVE-2019-14697, which > > > make me really wary of manual changes to these files. > > > > > > Would you be interested in working on converting over the files you > > > want to optimize (or even others too) to that form at the same time as > > > doing the optimizations? > > > > I don't use musl-libc; I also don't use an OS or a compiler/assembler > > which can be used to build it. > > I just stumbled upon the functions for which I sent in patches while > > searching for code which uses Intel's FPU. > > > > > It would really help with review process and with improving the overall > > > code state. > > > > If I start using musl-libc I'd be interested and rewrite these parts. > > OK. I don't mind looking at these patches further as-is, and I'll try > to continue offering constructive comments now, but it'll be after > this release cycle (hopefully wrapping that up in the next week or so) > before consideration for merging. musl 1.2.0 is already going to be a > release with big changes (time64) and I don't want to risk subtle > breakage with new changes that haven't been reviewed in detail yet or > had time for users to test. Since you guys are discussing math optimizations, here's another one: https://www.openwall.com/lists/musl/2019/11/08/1 > > > Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.