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