Re: Comparing lowtags: slightly inefficient assembly code
David Scherfgen via Sbcl-help <[email protected]> Wed, 30 Apr 2025 23:18:01 +0200
| Newsgroups | gmane.lisp.steel-bank.general |
|---|---|
| Message-ID | <CAMTHLKgCq20iLGA-=NpV9WYJYLL45Zx7g4xSX6RZyaMNkz_OfQ@mail.gmail.com> |
Thanks for the hint! Can I define VOPs in my application's source code, or do I have to modify SBCL itself? The article you linked mentions it's possible to do it at "runtime", but then says it's a bit "hairy". Regarding EQ/EQL/...: The comparison that's being done, unfortunately, cannot rely on any of these. The comparison logic is a bit intricate. Am Mi., 30. Apr. 2025 um 22:48 Uhr schrieb Vasily Postnicov < [email protected]>: > It's adding the fixnum's tag by shifting left. > > My guess would be to write a function which translates directly to a VOP. > You can write any assembly code you wish there. See here for an example: > https://pvk.ca/Blog/2014/08/16/how-to-define-new-intrinsics-in-sbcl/ > > On the other hand, I'd recommend EQ/EQL/EQUAL/EQUALP for comparing objects > whose types aren't known to be anything more narrow than T. > > ср, 30 апр. 2025 г., 23:03 David Scherfgen via Sbcl-help < > [email protected]>: > >> The purpose of this code is to provide an "early exit" in a function that >> compares two objects X and Y - it's the #1 function in terms of number of >> calls and execution time in the application (determined by deterministic >> and statistical profiling). If X and Y have different lowtags, then the >> function can abort immediately. I can't tell whether the extra bit shifts >> cause significant performance issues, I'd have to compare it to the >> "optimal" code, but that's a bit difficult in practice. >> >> Am Mi., 30. Apr. 2025 um 21:51 Uhr schrieb Stas Boukarev < >> [email protected]>: >> >>> Is that causing you some unexpected performance issues? >>> >>> On Wed, Apr 30, 2025 at 10:50 PM David Scherfgen via Sbcl-help >>> <[email protected]> wrote: >>> > >>> > Hello, >>> > >>> > I have this SBCL-specific code to determine whether two objects X and >>> Y have the same lowtag: >>> > >>> > (defun same-lowtag-p (x y) >>> > (= (sb-kernel:lowtag-of x) (sb-kernel:lowtag-of y))) >>> > >>> > The relevant part of the disassembly: >>> > >>> > MOV RDX, R8 >>> > SHL RDX, 1 >>> > AND EDX, 30 >>> > MOV RDI, RSI >>> > SHL RDI, 1 >>> > AND EDI, 30 >>> > CMP RDI, RDX >>> > >>> > It shifts the address of X and Y to the left by 1 bit, then masks with >>> 30 (= 15 << 1), then compares. >>> > The bit shift is unnecessary. It could mask X and Y with 15 and >>> directly compare without shifting. >>> > >>> > Is there any (hacky, using internals) way to modify the Lisp function >>> so that it results in optimal assembly without bit shifts? >>> > >>> > Thank you. >>> > >>> > Best regards >>> > David Scherfgen >>> > _______________________________________________ >>> > Sbcl-help mailing list >>> > [email protected] >>> > https://lists.sourceforge.net/lists/listinfo/sbcl-help >>> >> _______________________________________________ >> Sbcl-help mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/sbcl-help >> > _______________________________________________ Sbcl-help mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/sbcl-help