;;; -*- Mode:LISP; Package:NC; Base:10; Readtable:CL -*-


;;; DERIV -- This is a Common Lisp version of a symbolic
;;; derivative benchmark written by Vaughan Pratt.
;;; It uses a simple subset of Lisp and does a lot of 
;;; CONSing.

(defun deriv-aux (a)
  (list '/ (deriv a) a))

DERIV-AUX_4
   (OPEN-CALL (DERIV 1) (NEW-TAIL-OPEN 1) (O0 A0))
   (MOVEI O0 (QUOTE /) BOXED)
   (TAIL-CALL (LIST3 3) (O2 A0))


(defun deriv (a)
  (cond 
    ((atom a)
     (cond ((eq a 'x) 1) (t 0)))
    ((eq (car a) '+)
     (cons '+ (mapcar #'deriv (cdr a))))
    ((eq (car a) '-) 
     (cons '- (mapcar #'deriv 
		      (cdr a))))
    ((eq (car a) '*)
     (list '* 
	   a 
	   (cons '+ (mapcar #'deriv-aux (cdr a)))))
    ((eq (car a) '/)
     (list '- 
	   (list '/ 
		 (deriv (cadr a)) 
		 (caddr a))
	   (list '/ 
		 (cadr a) 
		 (list '*
		       (caddr a)
		       (caddr a)
		       (deriv (caddr a))))))
     (t 'error)))

DERIV_55
   (ALU-FIELD FIELD-PASS R2 A0 (REGISTER *ZERO* 4 0) (BYTE 6 -26) PW-II DT-NONE BOXED-RIGHT)
   (ALU L-R NOP R2 (REGISTER *TWO* 4 3) BW-24 DT-BOTH-FIXNUM)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_65 NIL)
C_58
   (MOVEI R1 (QUOTE X) BOXED)
   (ALU L-R NOP A0 R1 BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_62 NIL)
C_61
   (RETURNI (QUOTE 1))
C_62
   (RETURNI (QUOTE 0))
C_65
   (OPEN-CALL (CAR 1) R2 (O0 A0))
   (MOVEI R1 (QUOTE +) BOXED)
   (ALU L-R NOP R2 R1 BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_130 NIL)
C_68
   (TAIL-OPEN)
BLOCK_69
   (OPEN-CALL (CDR 1) A9 (O0 A0))
   (MOVEI O1 (QUOTE NIL) BOXED)
   (MOVEI A8 (QUOTE NIL) BOXED)
P_70
DO1029_77
   (ALU L-R NOP A9 (REGISTER *NIL* 4 5) BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_83 NIL)
C_80
C_128
   (MOVEI O0 (QUOTE +) BOXED)
   (TAIL-CALL (CONS 2) NIL)
C_83
   (OPEN-CALL (CAR 1) (NEW-OPEN 0) (O0 A9))
   (CALL (DERIV 1) (NEW-OPEN 0) NIL)
   (CALL (NCONS 1) A7 NIL)
P_88
   (MOVE NOP A8)
   (TEST BR-ZERO)
   (BRANCH C_91 NIL)
C_89
   (MOVE O0 A8 CH-OPEN)
   (CALL (RPLACD 2) IGNORE (O1 A7))
B_93
   (MOVE A8 A7)
   (OPEN-CALL (CDR 1) A9 (O0 A9))
P_106
   (UNCONDITIONAL-BRANCH DO1029_77 NIL)
C_91
   (UNCONDITIONAL-BRANCH B_93 (MOVE O1 A7))
C_130
   (OPEN-CALL (CAR 1) R2 (O0 A0))
   (MOVEI R1 (QUOTE -) BOXED)
   (ALU L-R NOP R2 R1 BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_195 NIL)
C_133
   (TAIL-OPEN)
BLOCK_134
   (OPEN-CALL (CDR 1) A6 (O0 A0))
   (MOVEI O1 (QUOTE NIL) BOXED)
   (MOVEI A5 (QUOTE NIL) BOXED)
P_135
DO1037_142
   (ALU L-R NOP A6 (REGISTER *NIL* 4 5) BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_148 NIL)
C_145
C_193
   (MOVEI O0 (QUOTE -) BOXED)
   (TAIL-CALL (CONS 2) NIL)
C_148
   (OPEN-CALL (CAR 1) (NEW-OPEN 0) (O0 A6))
   (CALL (DERIV 1) (NEW-OPEN 0) NIL)
   (CALL (NCONS 1) A4 NIL)
P_153
   (MOVE NOP A5)
   (TEST BR-ZERO)
   (BRANCH C_156 NIL)
C_154
   (MOVE O0 A5 CH-OPEN)
   (CALL (RPLACD 2) IGNORE (O1 A4))
B_158
   (MOVE A5 A4)
   (OPEN-CALL (CDR 1) A6 (O0 A6))
P_171
   (UNCONDITIONAL-BRANCH DO1037_142 NIL)
C_156
   (UNCONDITIONAL-BRANCH B_158 (MOVE O1 A4))
C_195
   (OPEN-CALL (CAR 1) R2 (O0 A0))
   (MOVEI R1 (QUOTE *) BOXED)
   (ALU L-R NOP R2 R1 BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_263 NIL)
C_198
   (OPEN)
BLOCK_199
   (OPEN-CALL (CDR 1) A3 (O0 A0))
   (MOVEI O1 (QUOTE NIL) BOXED)
   (MOVEI A2 (QUOTE NIL) BOXED)
P_200
DO1045_207
   (ALU L-R NOP A3 (REGISTER *NIL* 4 5) BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_213 NIL)
C_210
C_258
   (MOVEI O0 (QUOTE +) BOXED)
   (CALL (CONS 2) (NEW-TAIL-OPEN 2) NIL)
   (MOVEI O0 (QUOTE *) BOXED)
   (TAIL-CALL (LIST3 3) (O1 A0))
C_213
   (OPEN-CALL (CAR 1) (NEW-OPEN 0) (O0 A3))
   (CALL (DERIV-AUX 1) (NEW-OPEN 0) NIL)
   (CALL (NCONS 1) A1 NIL)
P_218
   (MOVE NOP A2)
   (TEST BR-ZERO)
   (BRANCH C_221 NIL)
C_219
   (MOVE O0 A2 CH-OPEN)
   (CALL (RPLACD 2) IGNORE (O1 A1))
B_223
   (MOVE A2 A1)
   (OPEN-CALL (CDR 1) A3 (O0 A3))
P_236
   (UNCONDITIONAL-BRANCH DO1045_207 NIL)
C_221
   (UNCONDITIONAL-BRANCH B_223 (MOVE O1 A1))
C_263
   (OPEN-CALL (CAR 1) R2 (O0 A0))
   (MOVEI R1 (QUOTE /) BOXED)
   (ALU L-R NOP R2 R1 BW-32 DT-NONE)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_301 NIL)
C_266
   (OPEN-CALL (CADR 1) (NEW-OPEN 0) (O0 A0))
   (CALL (DERIV 1) (NEW-OPEN 1) NIL)
   (OPEN-CALL (CADDR 1) O2 (O0 A0))
   (MOVEI O0 (QUOTE /) BOXED)
   (CALL (LIST3 3) (NEW-TAIL-OPEN 1) NIL)
   (OPEN-CALL (CADR 1) (NEW-OPEN 1) (O0 A0))
   (OPEN-CALL (CADDR 1) (NEW-OPEN 1) (O0 A0))
   (OPEN-CALL (CADDR 1) O2 (O0 A0))
   (OPEN-CALL (CADDR 1) (NEW-OPEN 0) (O0 A0))
   (CALL (DERIV 1) O3 NIL)
   (MOVEI O0 (QUOTE *) BOXED)
   (CALL (LIST4 4) O2 NIL)
   (MOVEI O0 (QUOTE /) BOXED)
   (CALL (LIST3 3) O2 NIL)
   (MOVEI O0 (QUOTE -) BOXED)
   (TAIL-CALL (LIST3 3) NIL)
C_301
   (RETURNI (QUOTE ERROR))




(defun run ()
 (do ((i 0 (1+ i)))
     ((= i 1000.))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))))

RUN_10
   (MOVEI A0 (QUOTE 0) BOXED)
P_13
DO1049_20
   (MOVEI R1 (QUOTE 1000) BOXED)
   (ALU L-R NOP A0 R1 BW-24 DT-BOTH-FIXNUM)
   (TEST BR-NOT-EQUAL)
   (BRANCH C_26 NIL)
C_23
   (RETURNI (QUOTE NIL))
C_26
   (MOVEI O0 (QUOTE (+ (* 3 X X) (* A X X) (* B X) 5)) BOXED CH-OPEN)
   (CALL (DERIV 1) IGNORE NIL)
   (MOVEI O0 (QUOTE (+ (* 3 X X) (* A X X) (* B X) 5)) BOXED CH-OPEN)
   (CALL (DERIV 1) IGNORE NIL)
   (MOVEI O0 (QUOTE (+ (* 3 X X) (* A X X) (* B X) 5)) BOXED CH-OPEN)
   (CALL (DERIV 1) IGNORE NIL)
   (MOVEI O0 (QUOTE (+ (* 3 X X) (* A X X) (* B X) 5)) BOXED CH-OPEN)
   (CALL (DERIV 1) IGNORE NIL)
   (MOVEI O0 (QUOTE (+ (* 3 X X) (* A X X) (* B X) 5)) BOXED CH-OPEN)
   (CALL (DERIV 1) IGNORE NIL)
   (UNCONDITIONAL-BRANCH DO1049_20 (ALU R+1 A0 IGNORE A0 BW-24 DT-BOTH-FIXNUM-WITH-OVERFLOW))








