Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

SBCL switch optimization

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

Name: Anonymous 2012-10-03 15:21

What would be the OMG optimized asm?

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List