Created
May 23, 2010 14:23
-
-
Save Mozk0/410971 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(PROCLAIM '(OPTIMIZE (SPEED 3) (SAFETY 0) (DEBUG 0))) | |
(DEFUN FACT1 (X) | |
"factorial, using DO" | |
(DECLARE (FIXNUM X)) | |
(DO ((FACT-N 1 (THE FIXNUM (* FACT-N N))) | |
(N 1 (1+ N))) | |
((> N X) FACT-N) | |
(DECLARE (FIXNUM FACT-N N)))) | |
; disassembly for FACT1 | |
; 0B2DB0CA: B904000000 MOV ECX, 4 ; no-arg-parsing entry point | |
; CF: B804000000 MOV EAX, 4 | |
; D4: EB0D JMP L1 | |
; D6: L0: C1F902 SAR ECX, 2 | |
; D9: 0FAFC8 IMUL ECX, EAX | |
; DC: C1F802 SAR EAX, 2 | |
; DF: 40 INC EAX | |
; E0: C1E002 SHL EAX, 2 | |
; E3: L1: 39D0 CMP EAX, EDX | |
; E5: 7EEF JLE L0 | |
; E7: 8BD1 MOV EDX, ECX | |
; E9: 8D65F8 LEA ESP, [EBP-8] | |
; EC: F8 CLC | |
; ED: 8B6DFC MOV EBP, [EBP-4] | |
; F0: C20400 RET 4 | |
(DEFUN FACT2 (X) | |
"factorial, using LOOP" | |
(DECLARE (FIXNUM X)) | |
(LOOP | |
:FOR N :OF-TYPE FIXNUM :FROM 1 :TO X | |
:AND FACT-N :OF-TYPE FIXNUM := 1 :THEN (* FACT-N N) | |
:FINALLY (RETURN FACT-N))) | |
; disassembly for FACT2 | |
; 0B6A658A: B804000000 MOV EAX, 4 ; no-arg-parsing entry point | |
; 8F: 31C9 XOR ECX, ECX | |
; 91: B904000000 MOV ECX, 4 | |
; 96: EB13 JMP L1 | |
; 98: L0: 8BD8 MOV EBX, EAX | |
; 9A: C1FB02 SAR EBX, 2 | |
; 9D: 43 INC EBX | |
; 9E: C1F902 SAR ECX, 2 | |
; A1: 0FAFC8 IMUL ECX, EAX | |
; A4: 8D049D00000000 LEA EAX, [EBX*4] | |
; AB: L1: 39D0 CMP EAX, EDX | |
; AD: 7EE9 JLE L0 | |
; AF: 8BD1 MOV EDX, ECX | |
; B1: 8D65F8 LEA ESP, [EBP-8] | |
; B4: F8 CLC | |
; B5: 8B6DFC MOV EBP, [EBP-4] | |
; B8: C20400 RET 4 | |
(DEFUN FACT3 (X) | |
(DECLARE (FIXNUM X)) | |
(THE FIXNUM | |
(IF (= X 1) | |
1 | |
(* X (FACT3 (- X 1)))))) | |
; disassembly for FACT3 | |
; 0B0FAD55: L0: 83F904 CMP ECX, 4 ; no-arg-parsing entry point | |
; 58: 750E JNE L2 | |
; 5A: B804000000 MOV EAX, 4 | |
; 5F: L1: 8D65F8 LEA ESP, [EBP-8] | |
; 62: 8B6DFC MOV EBP, [EBP-4] | |
; 65: C20400 RET 4 | |
; 68: L2: 894DF4 MOV [EBP-12], ECX | |
; 6B: 8BC1 MOV EAX, ECX | |
; 6D: 83E804 SUB EAX, 4 | |
; 70: 8BD0 MOV EDX, EAX | |
; 72: 8BDD MOV EBX, EBP | |
; 74: 8BC4 MOV EAX, ESP | |
; 76: 83EC20 SUB ESP, 32 | |
; 79: 8BCA MOV ECX, EDX | |
; 7B: 8958FC MOV [EAX-4], EBX | |
; 7E: 8BE8 MOV EBP, EAX | |
; 80: C745F889AD0F0B MOV DWORD PTR [EBP-8], 185576841 | |
; 87: EBCC JMP L0 | |
; 89: 8B4DF4 MOV ECX, [EBP-12] | |
; 8C: C1F902 SAR ECX, 2 | |
; 8F: 0FAFC8 IMUL ECX, EAX | |
; 92: 8BC1 MOV EAX, ECX | |
; 94: EBC9 JMP L1 | |
(DEFUN FACT4 (X) | |
(DECLARE (FIXNUM X)) | |
(LABELS ((FACT4-SUB (N FACT-N) | |
(DECLARE (FIXNUM N FACT-N)) | |
(IF (= N 1) | |
FACT-N | |
(FACT4-SUB (1- N) (THE FIXNUM (* FACT-N N)))))) | |
(FACT4-SUB X 1))) | |
; disassembly for FACT4 | |
; 0B472274: B904000000 MOV ECX, 4 ; no-arg-parsing entry point | |
; 79: EB24 JMP L2 | |
; 7B: L0: 83F804 CMP EAX, 4 | |
; 7E: 750C JNE L1 | |
; 80: 8BD1 MOV EDX, ECX | |
; 82: 8D65F8 LEA ESP, [EBP-8] | |
; 85: F8 CLC | |
; 86: 8B6DFC MOV EBP, [EBP-4] | |
; 89: C20400 RET 4 | |
; 8C: L1: 8BD0 MOV EDX, EAX | |
; 8E: C1FA02 SAR EDX, 2 | |
; 91: 83EA01 SUB EDX, 1 | |
; 94: C1F902 SAR ECX, 2 | |
; 97: 0FAFC8 IMUL ECX, EAX | |
; 9A: 8BC2 MOV EAX, EDX | |
; 9C: C1E002 SHL EAX, 2 | |
; 9F: L2: EBDA JMP L0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment