[Openmcl-devel] Wow, this is so not what I expected
Ron Garret
ron at flownet.com
Wed Apr 12 18:26:54 PDT 2017
Welcome to Clozure Common Lisp Version 1.10-r16479M (DarwinX8664)!
? (defun foo1 (n)
(if (<= n 0) 0 (foo1 (1- n))))
FOO1
? (defun foo2 (n)
(labels ((foo (n) (if (<= n 0) 0 (foo (1- n)))))
(foo n)))
FOO2
? (disassemble 'foo1)
;;; (defun foo1 (n) (if (<= n 0) 0 (foo1 (1- n))))
L0
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [0]
(cmpl ($ 8) (% nargs)) ; [7]
(jne L141) ; [10]
(pushq (% rbp)) ; [16]
(movq (% rsp) (% rbp)) ; [17]
(pushq (% save0)) ; [20]
(movq (% arg_z) (% save0)) ; [22]
;;; (<= n 0)
L25
(movq (% save0) (% arg_y)) ; [25]
(testb ($ 7) (% arg_y.b)) ; [28]
(jne L41) ; [32]
(testq (% arg_y) (% arg_y)) ; [34]
(jle L66) ; [37]
(jmp L72) ; [39]
L41
(xorl (% arg_z.l) (% arg_z.l)) ; [41]
(nop) ; [43]
(callq (@ .SPBUILTIN-LE)) ; [46]
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [53]
(cmpb ($ 11) (% arg_z.b)) ; [60]
(je L72) ; [64]
;;; (if (<= n 0) 0 (foo1 (1- n)))
L66
(xorl (% arg_z.l) (% arg_z.l)) ; [66]
(popq (% save0)) ; [68]
(leaveq) ; [70]
(retq) ; [71]
;;; (1- n)
L72
(movq (% save0) (% arg_z)) ; [72]
(testb ($ 7) (% arg_z.b)) ; [75]
(jne L110) ; [79]
(addq ($ -8) (% arg_z)) ; [81]
(jno L132) ; [85]
(nop) ; [87]
(nop) ; [91]
(callq (@ .SPFIX-OVERFLOW)) ; [94]
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [101]
(jmp L132) ; [108]
L110
(movq ($ -8) (% arg_y)) ; [110]
(nop) ; [117]
(callq (@ .SPBUILTIN-PLUS)) ; [118]
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [125]
L132
(movq (% arg_z) (% save0)) ; [132]
;;; (foo1 (1- n))
(jmp L25) ; [135]
;;; #<no source text>
L141
(uuo-error-wrong-number-of-args) ; [141]
NIL
? (disassemble 'foo2)
;;; (defun foo2 (n) (labels ((foo (n) (if (<= n 0) 0 (foo (1- n))))) (foo n)))
L0
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [0]
(cmpl ($ 8) (% nargs)) ; [7]
(jne L45) ; [10]
(pushq (% rbp)) ; [12]
(movq (% rsp) (% rbp)) ; [13]
(pushq (% arg_z)) ; [16]
;;; (foo n)
(movl ($ 8) (% nargs)) ; [17]
(movq (@ '#<Compiled-function (:INTERNAL FOO FOO2) (Non-Global) #x30200110BE6F> (% fn)) (% temp0)) ; [22]
(leaveq) ; [29]
(movq (% fn) (% temp1)) ; [30]
(movq (% temp0) (% fn)) ; [33]
(jmpq (% fn)) ; [36]
;;; #<no source text>
L45
(uuo-error-wrong-number-of-args) ; [45]
NIL
More information about the Openmcl-devel
mailing list