LISPが吐き出すネイティブコードを見てみよう

comp.lang.lispを読んでいて「LISPが吐き出すネイティブコードを読む方法」が紹介された記事があったので、簡単なコードを見てみました。実行環境はiBook G3/800、Mac OS X 10.4.5。LISPsbcl 0.9.7を使いました。

CL-USER> (defun adder (a b)
	   (+ a b))
ADDER

CL-USER> (compile 'adder)
ADDER
NIL
NIL

CL-USER> (disassemble 'adder)
; 48864F48:       92EF0004         STW $LRA,4($CFP)           ; no-arg-parsing entry point
;       4C:       830F000C         LWZ $A0,12($CFP)
;       50:       832F0010         LWZ $A1,16($CFP)
;       54:       3AF300A0         ADDI $LRA,$CODE,160
;       58:       490001D2         BA #x10001D0               ; #x010001D0: all_threads_lock
;       5C:       WORD #X00000000BYTE #X00, #X00, #X00, #X00
;       60:       WORD #X00002836BYTE #X00, #X00, #X28, #X36  ; possible LRA header
;       64:       7ED0B378         MR $CSP,$OCFP
;       68:       60000000         NOP
;       6C:       3A73FF60         ADDI $CODE,$CODE,-160
;       70:       806F0000         LWZ $NL0,0($CFP)
;       74:       814F0004         LWZ $FDEFN,4($CFP)
;       78:       7DF07B78         MR $CSP,$CFP
;       7C:       7C6F1B78         MR $CFP,$NL0
;       80:       3BEA0005         ADDI $LIP,$FDEFN,5
;       84:       7FE803A6         MTLR $LIP
;       88:       7D535378         MR $CODE,$FDEFN
;       8C:       4E800020         BLR
; 

NIL

こんな感じです。そういえば僕はZ80とi80x86系しかアセンブリは読めないのでした。PowerPCのはよくわかりません。ディスアセンブルしたのに残念ながら読めません。同じことをMacBook ProMac OS X 10.4.5、sbcl 0.9.11でやってみると、

; 116116B9:       8B55F4           MOV EDX, [EBP-12]          ; no-arg-parsing entry point
;       BC:       8B7DF0           MOV EDI, [EBP-16]
;       BF:       E87CEA9EEF       CALL #x1000140             ; unboxed_region
;       C4:       7302             JNB L0
;       C6:       8BE3             MOV ESP, EBX
;       C8: L0:   8D65F8           LEA ESP, [EBP-8]
;       CB:       F8               CLC
;       CC:       8B6DFC           MOV EBP, [EBP-4]
;       CF:       C20400           RET 4
;       D2:       90               NOP
;       D3:       90               NOP
;       D4:       90               NOP
;       D5:       90               NOP
;       D6:       90               NOP
;       D7:       90               NOP
;       D8:       0F0B0A           BREAK 10                   ; error trap
;       DB:       02               BYTE #X02
;       DC:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;       DD:       4D               BYTE #X4D                  ; ECX
;       DE:       0F0B0A           BREAK 10                   ; error trap
;       E1:       02               BYTE #X02
;       E2:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;       E3:       4D               BYTE #X4D                  ; ECX

NIL;

こんな結果になりました。こっちのほうが見なれた雰囲気のコードです。うむ、満足。