Re: Comparing lowtags: slightly inefficient assembly code
Vasily Postnicov <[email protected]> Wed, 30 Apr 2025 23:48:20 +0300
| Newsgroups | gmane.lisp.steel-bank.general |
|---|---|
| Message-ID | <CADnZ6BnUy0P9-h6Un-QAi7W1v0yEYV+QB9O4DvLUDiAdB4nHwg@mail.gmail.com> |
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