Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Mozk0/410970 to your computer and use it in GitHub Desktop.
Save Mozk0/410970 to your computer and use it in GitHub Desktop.
(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