Name: Anonymous 2012-10-03 11:22
Let us discuss SBCL's failure to optimize switch statements
CL-USER> (defun tswitch (x)
(declare (optimize (speed 3)))
(declare (fixnum x))
(case x
(1 (princ 4))
(2 (princ 3))
(3 (princ 2))
(4 (princ 1))
(t (princ x))))
STYLE-WARNING: redefining COMMON-LISP-USER::TSWITCH in DEFUN
TSWITCH
CL-USER> (disassemble #'tswitch )
; disassembly for TSWITCH
; 252C172C: 83FA04 CMP EDX, 4 ; no-arg-parsing entry point
; 2F: 7462 JEQ L3
; 31: 83FA08 CMP EDX, 8
; 34: 7447 JEQ L2
; 36: 83FA0C CMP EDX, 12
; 39: 742C JEQ L1
; 3B: 83FA10 CMP EDX, 16
; 3E: 7411 JEQ L0
; 40: 8B05F0162C25 MOV EAX, [#x252C16F0] ; #<FDEFINITION object for PRINC>
; 46: B904000000 MOV ECX, 4
; 4B: FF7504 PUSH DWORD PTR [EBP+4]
; 4E: FF6005 JMP DWORD PTR [EAX+5]
; 51: L0: BA04000000 MOV EDX, 4
; 56: 8B05F0162C25 MOV EAX, [#x252C16F0] ; #<FDEFINITION object for PRINC>
; 5C: B904000000 MOV ECX, 4
; 61: FF7504 PUSH DWORD PTR [EBP+4]
; 64: FF6005 JMP DWORD PTR [EAX+5]
; 67: L1: BA08000000 MOV EDX, 8
; 6C: 8B05F0162C25 MOV EAX, [#x252C16F0] ; #<FDEFINITION object for PRINC>
; 72: B904000000 MOV ECX, 4
; 77: FF7504 PUSH DWORD PTR [EBP+4]
; 7A: FF6005 JMP DWORD PTR [EAX+5]
; 7D: L2: BA0C000000 MOV EDX, 12
; 82: 8B05F0162C25 MOV EAX, [#x252C16F0] ; #<FDEFINITION object for PRINC>
; 88: B904000000 MOV ECX, 4
; 8D: FF7504 PUSH DWORD PTR [EBP+4]
; 90: FF6005 JMP DWORD PTR [EAX+5]
; 93: L3: BA10000000 MOV EDX, 16
; 98: 8B05F0162C25 MOV EAX, [#x252C16F0] ; #<FDEFINITION object for PRINC>
; 9E: B904000000 MOV ECX, 4
; A3: FF7504 PUSH DWORD PTR [EBP+4]
; A6: FF6005 JMP DWORD PTR [EAX+5]
; A9: CC0A BREAK 10 ; error trap
; AB: 02 BYTE #X02
; AC: 18 BYTE #X18 ; INVALID-ARG-COUNT-ERROR
; AD: 4F BYTE #X4F ; ECX
; AE: CC0A BREAK 10 ; error trap
; B0: 02 BYTE #X02
; B1: 08 BYTE #X08 ; OBJECT-NOT-FIXNUM-ERROR
; B2: 90 BYTE #X90 ; EDX