Re: Comparing lowtags: slightly inefficient assembly code
David Scherfgen via Sbcl-help <[email protected]> Wed, 30 Apr 2025 22:01:37 +0200
| Newsgroups | gmane.lisp.steel-bank.general |
|---|---|
| Message-ID | <CAMTHLKhpLK7iLiM-OJrJAiqn5tpfK-kc3_U3c_LR0tHy6iTmnQ@mail.gmail.com> |
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