3 ms·
+screen-width+ is 64, which means SBCL can convert the multiply to a left shift if we care about speed and declare types: (defun foo (chip y) (declar
by stevelosh 9y ago
+screen-width+ is 64, which means SBCL can convert the multiply to a left shift if we care about speed and declare types:
(defun foo (chip y)
(declare (optimize speed)
(type chip chip)
(type int16 y))
(vref chip 0 y))
(disassemble 'foo)
; disassembly for FOO
; Size: 48 bytes. Origin: #x100EF5E39D
; 9D: 488B423D MOV RAX, [RDX+61] ; no-arg-parsing entry point
;; ---------------------- Look ma, no multiplication!
;; vvvvvvvvvvv
; A1: 48C1E706 SHL RDI, 6
; A5: B900100000 MOV ECX, 4096
; AA: 40F6C701 TEST DIL, 1
; AE: 7513 JNE L0
; B0: 4839F9 CMP RCX, RDI
; B3: 760E JBE L0
; B5: 488B54B801 MOV RDX, [RAX+RDI*4+1]
; BA: 488BE5 MOV RSP, RBP
; BD: F8 CLC
; BE: 5D POP RBP
; BF: C3 RET
; C0: 0F0B10 BREAK 16 ; Invalid argument count trap
; C3: L0: 0F0B0A BREAK 10 ; error trap
; C6: 06 BYTE #X06
; C7: 0C BYTE #X0C ; INVALID-ARRAY-INDEX-ERROR
; C8: 1B BYTE #X1B ; RAX
; C9: 9A BYTE #X9A ; RCX
; CA: FE9A03 BYTE #XFE, #X9A, #X03 ; RDI