Re: Comparing lowtags: slightly inefficient assembly code
Vasily Postnicov <[email protected]> Thu, 1 May 2025 05:41:03 +0300
| Newsgroups | gmane.lisp.steel-bank.general |
|---|---|
| Message-ID | <CADnZ6Bkp2MxgkiMvpO+Ra2PmgQ8=Hi7yNF+UJxPD3dRCjDPTRw@mail.gmail.com> |
Yes, you can. Check nibbles for an example. чт, 1 мая 2025 г., 00:18 David Scherfgen <[email protected]>: > 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