Comparing lowtags: slightly inefficient assembly code
David Scherfgen via Sbcl-help <[email protected]> Wed, 30 Apr 2025 21:47:28 +0200
| Newsgroups | gmane.lisp.steel-bank.general |
|---|---|
| Message-ID | <CAMTHLKj90H4rFgwRxRE8-mCT+eAfMJ9fBXTdRmP-Usm_D8Wp7A@mail.gmail.com> |
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