[Openmcl-devel] Wow, this is so not what I expected
Shannon Spires
svs at bearlanding.com
Wed Apr 12 19:19:41 PDT 2017
What's unexpected about it?
On Apr 12, 2017, at 7:26 PM, Ron Garret wrote:
> 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
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> https://lists.clozure.com/mailman/listinfo/openmcl-devel
More information about the Openmcl-devel
mailing list