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:33

>>9

; disassembly for TSWITCH
; 045E3F12:       B8A9000000       MOV EAX, 169               ; no-arg-parsing entry point
;     3F17:       B908000000       MOV ECX, 8
;     3F1C:       BE08000000       MOV ESI, 8
;     3F21:       488D14B51F000000 LEA RDX, [RSI*4+31]
;     3F29:       4883E2F0         AND RDX, -16
;     3F2D:       48892C2528081020 MOV [#x20100828], RBP
;     3F35:       4C8B1C25A02B1200 MOV R11, [#x122BA0]        ; boxed_region
;     3F3D:       4C01DA           ADD RDX, R11
;     3F40:       48391425A82B1200 CMP [#x122BA8], RDX        ; boxed_region
;     3F48:       0F86B2000000     JBE L3
;     3F4E:       48891425A02B1200 MOV [#x122BA0], RDX        ; boxed_region
;     3F56:       498BD3           MOV RDX, R11
;     3F59: L0:   488D520F         LEA RDX, [RDX+15]
;     3F5D:       488942F1         MOV [RDX-15], RAX
;     3F61:       48894AF9         MOV [RDX-7], RCX
;     3F65:       48312C2528081020 XOR [#x20100828], RBP
;     3F6D:       7403             JEQ L1
;     3F6F:       0F0B09           BREAK 9                    ; pending interrupt trap
;     3F72: L1:   488B0D27FFFFFF   MOV RCX, [RIP-217]         ; #<FUNCTION (LAMBDA
                                                              ;                # ..)>
;     3F79:       31C0             XOR EAX, EAX
;     3F7B:       48894C8201       MOV [RDX+RAX*4+1], RCX
;     3F80:       488B0D21FFFFFF   MOV RCX, [RIP-223]         ; #<FUNCTION (LAMBDA
                                                              ;                # ..)>
;     3F87:       B802000000       MOV EAX, 2
;     3F8C:       48894C8201       MOV [RDX+RAX*4+1], RCX
;     3F91:       488B0D18FFFFFF   MOV RCX, [RIP-232]         ; #<FUNCTION (LAMBDA
                                                              ;                # ..)>
;     3F98:       B804000000       MOV EAX, 4
;     3F9D:       48894C8201       MOV [RDX+RAX*4+1], RCX
;     3FA2:       488B0D0FFFFFFF   MOV RCX, [RIP-241]         ; #<FUNCTION (LAMBDA
                                                              ;                # ..)>
;     3FA9:       B806000000       MOV EAX, 6
;     3FAE:       48894C8201       MOV [RDX+RAX*4+1], RCX
;     3FB3:       4883FB0A         CMP RBX, 10
;     3FB7:       7D32             JNL L2
;     3FB9:       4883EB02         SUB RBX, 2
;     3FBD:       488B549A01       MOV RDX, [RDX+RBX*4+1]
;     3FC2:       488D5C24F0       LEA RBX, [RSP-16]
;     3FC7:       4883EC18         SUB RSP, 24
;     3FCB:       488B05EEFEFFFF   MOV RAX, [RIP-274]         ; #<FDEFINITION object for SB-KERNEL:%COERCE-CALLABLE-TO-FUN>
;     3FD2:       B902000000       MOV ECX, 2
;     3FD7:       48892B           MOV [RBX], RBP
;     3FDA:       488BEB           MOV RBP, RBX
;     3FDD:       FF5009           CALL QWORD PTR [RAX+9]
;     3FE0:       488BC2           MOV RAX, RDX
;     3FE3:       31C9             XOR ECX, ECX
;     3FE5:       FF7508           PUSH QWORD PTR [RBP+8]
;     3FE8:       FF60FD           JMP QWORD PTR [RAX-3]
;     3FEB: L2:   488BD3           MOV RDX, RBX
;     3FEE:       488B05D3FEFFFF   MOV RAX, [RIP-301]         ; #<FDEFINITION object for PRINC>
;     3FF5:       B902000000       MOV ECX, 2
;     3FFA:       FF7508           PUSH QWORD PTR [RBP+8]
;     3FFD:       FF6009           JMP QWORD PTR [RAX+9]
;     4000: L3:   482B1425A02B1200 SUB RDX, [#x122BA0]        ; boxed_region
;     4008:       52               PUSH RDX
;     4009:       4C8D1C2510481100 LEA R11, [#x114810]        ; alloc_tramp
;     4011:       41FFD3           CALL R11
;     4014:       5A               POP RDX
;     4015:       E93FFFFFFF       JMP L0

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