556 lines
8.2 KiB
Plaintext
556 lines
8.2 KiB
Plaintext
1000
|
|
|
|
(begin
|
|
(declare (standard-bindings) (fixnum) (not safe) (block))
|
|
(define (fib n)
|
|
(if (< n 2)
|
|
n
|
|
(+ (fib (- n 1))
|
|
(fib (- n 2)))))
|
|
|
|
(define (tak x y z)
|
|
(if (not (< y x))
|
|
z
|
|
(tak (tak (- x 1) y z)
|
|
(tak (- y 1) z x)
|
|
(tak (- z 1) x y))))
|
|
|
|
(define (ack m n)
|
|
(cond ((= m 0) (+ n 1))
|
|
((= n 0) (ack (- m 1) 1))
|
|
(else (ack (- m 1) (ack m (- n 1))))))
|
|
|
|
(define (create-x n)
|
|
(define result (make-vector n))
|
|
(do ((i 0 (+ i 1)))
|
|
((>= i n) result)
|
|
(vector-set! result i i)))
|
|
|
|
(define (create-y x)
|
|
(let* ((n (vector-length x))
|
|
(result (make-vector n)))
|
|
(do ((i (- n 1) (- i 1)))
|
|
((< i 0) result)
|
|
(vector-set! result i (vector-ref x i)))))
|
|
|
|
(define (my-try n)
|
|
(vector-length (create-y (create-x n))))
|
|
|
|
(define (go n)
|
|
(let loop ((repeat 100)
|
|
(result 0))
|
|
(if (> repeat 0)
|
|
(loop (- repeat 1) (my-try n))
|
|
result)))
|
|
|
|
(+ (fib 20)
|
|
(tak 18 12 6)
|
|
(ack 3 9)
|
|
(go 200000)))
|
|
|
|
m68000
|
|
|
|
asm
|
|
|
|
|
|
; The expected output:
|
|
|
|
(
|
|
"|------------------------------------------------------"
|
|
"| #[primitive #!program] ="
|
|
"L1:"
|
|
" cmpw #1,d0"
|
|
" beq L1000"
|
|
" TRAP1(9,0)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" MOVE_PROC(1,a1)"
|
|
" movl a1,GLOB(fib)"
|
|
" MOVE_PROC(2,a1)"
|
|
" movl a1,GLOB(tak)"
|
|
" MOVE_PROC(3,a1)"
|
|
" movl a1,GLOB(ack)"
|
|
" MOVE_PROC(4,a1)"
|
|
" movl a1,GLOB(create-x)"
|
|
" MOVE_PROC(5,a1)"
|
|
" movl a1,GLOB(create-y)"
|
|
" MOVE_PROC(6,a1)"
|
|
" movl a1,GLOB(my-try)"
|
|
" MOVE_PROC(7,a1)"
|
|
" movl a1,GLOB(go)"
|
|
" movl a0,sp@-"
|
|
" movl #160,d1"
|
|
" lea L2,a0"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1002:"
|
|
"L1001:"
|
|
" JMP_PROC(1,10)"
|
|
" RETURN(L1,1,1)"
|
|
"L2:"
|
|
" movl d1,sp@-"
|
|
" moveq #48,d3"
|
|
" moveq #96,d2"
|
|
" movl #144,d1"
|
|
" lea L3,a0"
|
|
" JMP_PROC(2,14)"
|
|
" RETURN(L1,2,1)"
|
|
"L3:"
|
|
" movl d1,sp@-"
|
|
" moveq #72,d2"
|
|
" moveq #24,d1"
|
|
" lea L4,a0"
|
|
" JMP_PROC(3,10)"
|
|
" RETURN(L1,3,1)"
|
|
"L4:"
|
|
" movl d1,sp@-"
|
|
" movl #1600000,d1"
|
|
" lea L5,a0"
|
|
" JMP_PROC(7,10)"
|
|
" RETURN(L1,4,1)"
|
|
"L5:"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,4,1)"
|
|
"L1004:"
|
|
"L1003:"
|
|
"L6:"
|
|
" addl sp@(8),d1"
|
|
" addl sp@(4),d1"
|
|
" addl sp@+,d1"
|
|
" addql #8,sp"
|
|
" rts"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive fib] ="
|
|
"L1:"
|
|
" bmi L1000"
|
|
" TRAP1(9,1)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" moveq #16,d0"
|
|
" cmpl d1,d0"
|
|
" ble L3"
|
|
" bra L4"
|
|
" RETURN(L1,2,1)"
|
|
"L2:"
|
|
" movl d1,sp@-"
|
|
" movl sp@(4),d1"
|
|
" moveq #-16,d0"
|
|
" addl d0,d1"
|
|
" lea L5,a0"
|
|
" moveq #16,d0"
|
|
" cmpl d1,d0"
|
|
" bgt L4"
|
|
"L3:"
|
|
" movl a0,sp@-"
|
|
" movl d1,sp@-"
|
|
" subql #8,d1"
|
|
" lea L2,a0"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,2,1)"
|
|
"L1002:"
|
|
"L1001:"
|
|
" moveq #16,d0"
|
|
" cmpl d1,d0"
|
|
" ble L3"
|
|
"L4:"
|
|
" jmp a0@"
|
|
" RETURN(L1,3,1)"
|
|
"L5:"
|
|
" addl sp@+,d1"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,2,1)"
|
|
"L1004:"
|
|
"L1003:"
|
|
" addql #4,sp"
|
|
" rts"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive tak] ="
|
|
"L1:"
|
|
" cmpw #4,d0"
|
|
" beq L1000"
|
|
" TRAP1(9,3)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" cmpl d1,d2"
|
|
" bge L4"
|
|
" bra L3"
|
|
" RETURN(L1,6,1)"
|
|
"L2:"
|
|
" movl d1,d3"
|
|
" movl sp@(20),a0"
|
|
" movl sp@+,d2"
|
|
" movl sp@+,d1"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" movl a0,sp@(12)"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,4,1)"
|
|
"L1002:"
|
|
" movl sp@(12),a0"
|
|
"L1001:"
|
|
" cmpl d1,d2"
|
|
" lea sp@(16),sp"
|
|
" bge L4"
|
|
"L3:"
|
|
" movl a0,sp@-"
|
|
" movl d1,sp@-"
|
|
" movl d2,sp@-"
|
|
" movl d3,sp@-"
|
|
" subql #8,d1"
|
|
" lea L5,a0"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,4,1)"
|
|
"L1004:"
|
|
"L1003:"
|
|
" cmpl d1,d2"
|
|
" blt L3"
|
|
"L4:"
|
|
" movl d3,d1"
|
|
" jmp a0@"
|
|
" RETURN(L1,4,1)"
|
|
"L5:"
|
|
" movl d1,sp@-"
|
|
" movl sp@(12),d3"
|
|
" movl sp@(4),d2"
|
|
" movl sp@(8),d1"
|
|
" subql #8,d1"
|
|
" lea L6,a0"
|
|
" cmpl d1,d2"
|
|
" bge L4"
|
|
" bra L3"
|
|
" RETURN(L1,5,1)"
|
|
"L6:"
|
|
" movl d1,sp@-"
|
|
" movl sp@(12),d3"
|
|
" movl sp@(16),d2"
|
|
" movl sp@(8),d1"
|
|
" subql #8,d1"
|
|
" lea L2,a0"
|
|
" cmpl d1,d2"
|
|
" bge L4"
|
|
" bra L3"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive ack] ="
|
|
"L1:"
|
|
" beq L1000"
|
|
" TRAP1(9,2)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" movl d1,d0"
|
|
" bne L3"
|
|
" bra L5"
|
|
" RETURN(L1,2,1)"
|
|
"L2:"
|
|
" movl d1,d2"
|
|
" movl sp@+,d1"
|
|
" subql #8,d1"
|
|
" movl sp@+,a0"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1002:"
|
|
" movl sp@+,a0"
|
|
"L1001:"
|
|
" movl d1,d0"
|
|
" beq L5"
|
|
"L3:"
|
|
" movl d2,d0"
|
|
" bne L6"
|
|
"L4:"
|
|
" subql #8,d1"
|
|
" moveq #8,d2"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1004:"
|
|
" movl sp@+,a0"
|
|
"L1003:"
|
|
" movl d1,d0"
|
|
" bne L3"
|
|
"L5:"
|
|
" movl d2,d1"
|
|
" addql #8,d1"
|
|
" jmp a0@"
|
|
"L6:"
|
|
" movl a0,sp@-"
|
|
" movl d1,sp@-"
|
|
" movl d2,d1"
|
|
" subql #8,d1"
|
|
" movl d1,d2"
|
|
" movl sp@,d1"
|
|
" lea L2,a0"
|
|
" dbra d5,L1005"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1005"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,2,1)"
|
|
"L1006:"
|
|
"L1005:"
|
|
" movl d1,d0"
|
|
" bne L3"
|
|
" bra L5"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive create-x] ="
|
|
"L1:"
|
|
" bmi L1000"
|
|
" TRAP1(9,1)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" movl a0,sp@-"
|
|
" movl d1,sp@-"
|
|
" lea L2,a0"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,2,1)"
|
|
"L1002:"
|
|
"L1001:"
|
|
" moveq #-1,d0"
|
|
" JMP_PRIM(make-vector,0)"
|
|
" RETURN(L1,2,1)"
|
|
"L2:"
|
|
" movl d1,d2"
|
|
" movl sp@+,d1"
|
|
" moveq #0,d3"
|
|
" movl sp@+,a0"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1004:"
|
|
" movl sp@+,a0"
|
|
"L1003:"
|
|
" cmpl d1,d3"
|
|
" bge L4"
|
|
"L3:"
|
|
" movl d3,d0"
|
|
" asrl #1,d0"
|
|
" movl d2,a1"
|
|
" movl d3,a1@(1,d0:l)"
|
|
" addql #8,d3"
|
|
" dbra d5,L1005"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1005"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1006:"
|
|
" movl sp@+,a0"
|
|
"L1005:"
|
|
" cmpl d1,d3"
|
|
" blt L3"
|
|
"L4:"
|
|
" movl d2,d1"
|
|
" jmp a0@"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive create-y] ="
|
|
"L1:"
|
|
" bmi L1000"
|
|
" TRAP1(9,1)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" movl d1,a1"
|
|
" movl a1@(-3),d2"
|
|
" lsrl #7,d2"
|
|
" movl a0,sp@-"
|
|
" movl d1,sp@-"
|
|
" movl d2,sp@-"
|
|
" movl d2,d1"
|
|
" lea L2,a0"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,3,1)"
|
|
"L1002:"
|
|
"L1001:"
|
|
" moveq #-1,d0"
|
|
" JMP_PRIM(make-vector,0)"
|
|
" RETURN(L1,3,1)"
|
|
"L2:"
|
|
" movl sp@+,d2"
|
|
" subql #8,d2"
|
|
" movl d2,d3"
|
|
" movl d1,d2"
|
|
" movl sp@+,d1"
|
|
" movl sp@+,a0"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1004:"
|
|
" movl sp@+,a0"
|
|
"L1003:"
|
|
" movl d3,d0"
|
|
" blt L4"
|
|
"L3:"
|
|
" movl d3,d0"
|
|
" asrl #1,d0"
|
|
" movl d1,a1"
|
|
" movl a1@(1,d0:l),d4"
|
|
" movl d3,d0"
|
|
" asrl #1,d0"
|
|
" movl d2,a1"
|
|
" movl d4,a1@(1,d0:l)"
|
|
" subql #8,d3"
|
|
" dbra d5,L1005"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1005"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1006:"
|
|
" movl sp@+,a0"
|
|
"L1005:"
|
|
" movl d3,d0"
|
|
" bge L3"
|
|
"L4:"
|
|
" movl d2,d1"
|
|
" jmp a0@"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive my-try] ="
|
|
"L1:"
|
|
" bmi L1000"
|
|
" TRAP1(9,1)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" movl a0,sp@-"
|
|
" lea L2,a0"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1002:"
|
|
"L1001:"
|
|
" JMP_PROC(4,10)"
|
|
" RETURN(L1,1,1)"
|
|
"L2:"
|
|
" lea L3,a0"
|
|
" JMP_PROC(5,10)"
|
|
" RETURN(L1,1,1)"
|
|
"L3:"
|
|
" movl d1,a1"
|
|
" movl a1@(-3),d1"
|
|
" lsrl #7,d1"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1004:"
|
|
"L1003:"
|
|
" rts"
|
|
"L0:"
|
|
"|------------------------------------------------------"
|
|
"| #[primitive go] ="
|
|
"L1:"
|
|
" bmi L1000"
|
|
" TRAP1(9,1)"
|
|
" LBL_PTR(L1)"
|
|
"L1000:"
|
|
" moveq #0,d3"
|
|
" movl #800,d2"
|
|
" dbra d5,L1001"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1001"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1002:"
|
|
" movl sp@+,a0"
|
|
"L1001:"
|
|
" movl d2,d0"
|
|
" ble L4"
|
|
" bra L3"
|
|
" RETURN(L1,3,1)"
|
|
"L2:"
|
|
" movl d1,d3"
|
|
" movl sp@+,d1"
|
|
" subql #8,d1"
|
|
" movl d1,d2"
|
|
" movl sp@+,d1"
|
|
" movl sp@+,a0"
|
|
" dbra d5,L1003"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1003"
|
|
" movl a0,sp@-"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,1,1)"
|
|
"L1004:"
|
|
" movl sp@+,a0"
|
|
"L1003:"
|
|
" movl d2,d0"
|
|
" ble L4"
|
|
"L3:"
|
|
" movl a0,sp@-"
|
|
" movl d1,sp@-"
|
|
" movl d2,sp@-"
|
|
" lea L2,a0"
|
|
" dbra d5,L1005"
|
|
" moveq #9,d5"
|
|
" cmpl a5@,sp"
|
|
" bcc L1005"
|
|
" TRAP2(24)"
|
|
" RETURN(L1,3,1)"
|
|
"L1006:"
|
|
"L1005:"
|
|
" JMP_PROC(6,10)"
|
|
"L4:"
|
|
" movl d3,d1"
|
|
" jmp a0@"
|
|
"L0:"
|
|
"")
|