Skip to content

Instantly share code, notes, and snippets.

@death
Created December 27, 2017 23:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save death/665262a6585d68356095adc28c094f26 to your computer and use it in GitHub Desktop.
Save death/665262a6585d68356095adc28c094f26 to your computer and use it in GitHub Desktop.
CL-USER> (defun bool-case (x) (case x ((nil) nil) (t t)))
BOOL-CASE
CL-USER> (defun bool-if (x) (if x t nil))
BOOL-IF
CL-USER> (constantia:sxs ()
(disassemble #'bool-case)
(disassemble #'bool-if))
1: ; disassembly for BOOL-CASE | ; disassembly for BOOL-IF
2: ; Size: 36 bytes. Origin: #x1005421120 | ; Size: 33 bytes. Origin: #x10054211B0
3: ; 20: 498B4C2460 MOV RCX, [R12+96] ; no-arg-parsing entry point | ; B0: 498B542460 MOV RDX, [R12+96] ; no-arg-parsing entry point
4: ; thread.binding-stack-pointer | ; thread.binding-stack-pointer
5: ; 25: 48894DF8 MOV [RBP-8], RCX | ; B5: 488955F8 MOV [RBP-8], RDX
6: ; 29: 488BDE MOV RBX, RSI | ; B9: 4881F917001020 CMP RCX, #x20100017 ; NIL
7: ; 2C: 4881FB17001020 CMP RBX, #x20100017 ; NIL | ; C0: BA4F001020 MOV EDX, #x2010004F ; T
8: ; 33: BA4F001020 MOV EDX, #x2010004F ; T | ; C5: 480F44D1 CMOVEQ RDX, RCX
9: ; 38: 480F44D3 CMOVEQ RDX, RBX | ; C9: 488BE5 MOV RSP, RBP
10: ; 3C: 488BE5 MOV RSP, RBP | ; CC: F8 CLC
11: ; 3F: F8 CLC | ; CD: 5D POP RBP
12: ; 40: 5D POP RBP | ; CE: C3 RET
13: ; 41: C3 RET | ; CF: CC10 BREAK 16 ; Invalid argument count trap
14: ; 42: CC10 BREAK 16 ; Invalid argument count trap |
NIL
@jasom
Copy link

jasom commented Dec 27, 2017

(disassemble (lambda (x) (declare (optimize (speed 3)))(when x t)))
; disassembly for (LAMBDA (X))
; Size: 26 bytes. Origin: #x1004CDC3DF
; DF:       483D17001020     CMP RAX, #x20100017              ; no-arg-parsing entry point
                                                              ; NIL
; E5:       BB4F001020       MOV EBX, #x2010004F              ; T
; EA:       480F44D8         CMOVEQ RBX, RAX
; EE:       488BD3           MOV RDX, RBX
; F1:       488BE5           MOV RSP, RBP
; F4:       F8               CLC
; F5:       5D               POP RBP
; F6:       C3               RET
; F7:       CC10             BREAK 16                         ; Invalid argument count trap
NIL

@death
Copy link
Author

death commented Dec 28, 2017

(defun same-code-p (fn1 fn2)
  (equal (chunks fn1) (chunks fn2)))

(defun chunks (fn)
  (setf fn (coerce fn 'function))
  (let ((dstate (sb-disassem:make-dstate))
        (segments (sb-disassem:get-fun-segments fn))
        (chunks '()))
    (dolist (s segments)
      (sb-disassem:map-segment-instructions
       (lambda (chunk inst)
         (declare (ignore inst))
         (push chunk chunks))
       s dstate))
    (nreverse chunks)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment