xref: /csrg-svn/old/lisp/fp/fp.vax/primFp.l (revision 12092)
1*12092Sbaden (setq SCCS-primFp.l "@(#)primFp.l	1.2	04/29/83")
212070Sbaden ;  FP interpreter/compiler
312070Sbaden ;  Copyright (c) 1982  Scott B. Baden
412070Sbaden ;  Berkeley, California
512070Sbaden 
612070Sbaden (include specials.l)
712070Sbaden (declare (special y_l z_l)
812070Sbaden   (localf ok_pair ok_eqpair rpair$ lpair$ trnspz allNulls
9*12092Sbaden 	  allLists emptyHeader treeInsWithLen))
1012070Sbaden 
1112070Sbaden ; fp addition
1212070Sbaden 
1312070Sbaden (defun plus$fp (x)
1412070Sbaden   (cond (DynTraceFlg (IncrTimes 'plus$fp)))
1512070Sbaden   (cond ((ok_pair x 'numberp) (plus (car x) (cadr x)))
1612070Sbaden 	(t (bottom))))
1712070Sbaden 
1812070Sbaden ; unit function
1912070Sbaden 
2012070Sbaden (defun (u-fnc plus$fp) nil
2112070Sbaden   0)
2212070Sbaden 
2312070Sbaden ; fp subtraction
2412070Sbaden 
2512070Sbaden (defun sub$fp (x)
2612070Sbaden   (cond (DynTraceFlg (IncrTimes 'sub$fp)))
2712070Sbaden   (cond ((ok_pair x 'numberp) (diff (car x) (cadr x)))
2812070Sbaden 	(t (bottom))))
2912070Sbaden 
3012070Sbaden 
3112070Sbaden ; unit function
3212070Sbaden 
3312070Sbaden (defun (u-fnc sub$fp) nil
3412070Sbaden   0)
3512070Sbaden 
3612070Sbaden ; fp multiplication
3712070Sbaden 
3812070Sbaden (defun times$fp (x)
3912070Sbaden   (cond (DynTraceFlg (IncrTimes 'times$fp)))
4012070Sbaden   (cond ((ok_pair x 'numberp) (product (car x) (cadr x)))
4112070Sbaden 	(t (bottom))))
4212070Sbaden 
4312070Sbaden ; unit function
4412070Sbaden 
4512070Sbaden (defun (u-fnc times$fp) nil
4612070Sbaden   1)
4712070Sbaden 
4812070Sbaden 
4912070Sbaden ; fp division
5012070Sbaden 
5112070Sbaden (defun div$fp (x)
5212070Sbaden   (cond (DynTraceFlg (IncrTimes 'div$fp)))
5312070Sbaden   (cond ((ok_pair x 'numberp)
5412070Sbaden 	 (cond ((not (zerop (cadr x)))
5512070Sbaden 		(quotient (car x) (cadr x)))
5612070Sbaden 	       (t (bottom))))
5712070Sbaden 	(t (bottom))))
5812070Sbaden 
5912070Sbaden ; unit function
6012070Sbaden 
6112070Sbaden (defun (u-fnc div$fp) nil
6212070Sbaden   1)
6312070Sbaden 
6412070Sbaden 
6512070Sbaden 
6612070Sbaden ; logical functions, and or xor not
6712070Sbaden 
6812070Sbaden (defun and$fp (x)
6912070Sbaden   (cond (DynTraceFlg (IncrTimes 'and$fp)))
7012070Sbaden   (cond ((ok_pair x 'boolp)
7112070Sbaden 	 (cond
7212070Sbaden 	  ((eq 'F (car x)) 'F)
7312070Sbaden 	  (t (cadr x))))
7412070Sbaden 	(t (bottom))))
7512070Sbaden 
7612070Sbaden ; unit function
7712070Sbaden 
7812070Sbaden (defun (u-fnc and$fp) nil
7912070Sbaden   'T)
8012070Sbaden 
8112070Sbaden 
8212070Sbaden (defun or$fp (x)
8312070Sbaden   (cond (DynTraceFlg (IncrTimes 'or$fp)))
8412070Sbaden   (cond ((ok_pair x 'boolp)
8512070Sbaden 	 (cond
8612070Sbaden 	  ((eq 'T (car x)) 'T)
8712070Sbaden 	  (t (cadr x))))
8812070Sbaden 	(t (bottom))))
8912070Sbaden 
9012070Sbaden ; unit function
9112070Sbaden 
9212070Sbaden (defun (u-fnc or$fp) nil
9312070Sbaden   'F)
9412070Sbaden 
9512070Sbaden 
9612070Sbaden (defun xor$fp (x)
9712070Sbaden   (cond (DynTraceFlg (IncrTimes 'xor$fp)))
9812070Sbaden   (cond ((ok_pair x 'boolp)
9912070Sbaden 	 (let ((p (car x))
10012070Sbaden 	       (q (cadr x)))
10112070Sbaden 	      (cond ((or (and (eq p 'T) (eq q 'T))
10212070Sbaden 			 (and (eq p 'F) (eq q 'F)))
10312070Sbaden 		     'F)
10412070Sbaden 		    (t 'T))))
10512070Sbaden 	(t (bottom))))
10612070Sbaden 
10712070Sbaden ; unit function
10812070Sbaden 
10912070Sbaden (defun (u-fnc xor$fp) nil
11012070Sbaden   'F)
11112070Sbaden 
11212070Sbaden 
11312070Sbaden (defun not$fp (x)
11412070Sbaden   (cond (DynTraceFlg (IncrTimes 'not$fp)))
11512070Sbaden   (cond ((not (atom x)) (bottom))
11612070Sbaden 	((boolp x) (cond ((eq x 'T) 'F) (t 'T)))
11712070Sbaden 	(t (bottom))))
11812070Sbaden 
11912070Sbaden 
12012070Sbaden ; relational operators,  <  <=  =  >=  >  ~=
12112070Sbaden 
12212070Sbaden (defun lt$fp (x)
12312070Sbaden   (cond (DynTraceFlg (IncrTimes 'lt$fp)))
12412070Sbaden   (cond ((ok_pair x 'numberp)
12512070Sbaden 	 (cond ((lessp (car x) (cadr x)) 'T)
12612070Sbaden 	       (t 'F)))
12712070Sbaden 	(t (bottom))))
12812070Sbaden 
12912070Sbaden (defun le$fp (x)
13012070Sbaden   (cond (DynTraceFlg (IncrTimes 'le$fp)))
13112070Sbaden   (cond ((ok_pair x 'numberp)
13212070Sbaden 	 (cond ((not (greaterp (car x) (cadr x))) 'T)
13312070Sbaden 	       (t 'F)))
13412070Sbaden 	(t (bottom))))
13512070Sbaden 
13612070Sbaden (defun eq$fp (x)
13712070Sbaden   (cond (DynTraceFlg (IncrTimes 'eq$fp)))
13812070Sbaden   (cond ((ok_eqpair x )
13912070Sbaden 	 (cond ((equal  (car x) (cadr x)) 'T)
14012070Sbaden 	       (t 'F)))
14112070Sbaden 	(t (bottom))))
14212070Sbaden 
14312070Sbaden (defun ge$fp (x)
14412070Sbaden   (cond (DynTraceFlg (IncrTimes 'ge$fp)))
14512070Sbaden   (cond ((ok_pair x 'numberp)
14612070Sbaden 	 (cond ((not (lessp (car x) (cadr x))) 'T)
14712070Sbaden 	       (t 'F)))
14812070Sbaden 	(t (bottom))))
14912070Sbaden 
15012070Sbaden (defun gt$fp (x)
15112070Sbaden   (cond (DynTraceFlg (IncrTimes 'gt$fp)))
15212070Sbaden   (cond ((ok_pair x 'numberp)
15312070Sbaden 	 (cond ((greaterp (car x) (cadr x)) 'T)
15412070Sbaden 	       (t 'F)))
15512070Sbaden 	(t (bottom))))
15612070Sbaden 
15712070Sbaden (defun ne$fp (x)
15812070Sbaden   (cond (DynTraceFlg (IncrTimes 'ne$fp)))
15912070Sbaden   (cond ((ok_eqpair x)
16012070Sbaden 	 (cond ((not (equal  (car x) (cadr x))) 'T)
16112070Sbaden 	       (t 'F)))
16212070Sbaden 	(t (bottom))))
16312070Sbaden 
16412070Sbaden 
16512070Sbaden 
16612070Sbaden ; check arguments for eq and ne
16712070Sbaden 
16812070Sbaden (defun ok_eqpair (x)
16912070Sbaden   (cond ((not (atom x))
17012070Sbaden 	 (cond ((eq (length x) 2) t)))))
17112070Sbaden 
17212070Sbaden ; check arguments for binary arithmetics/logicals
17312070Sbaden 
17412070Sbaden (defun ok_pair (x typ)
17512070Sbaden   (cond ((not (atom x))
17612070Sbaden 	 (cond ((eq (length x) 2)
17712070Sbaden 		(cond
17812070Sbaden 		 ((and (atom (car x)) (atom (cadr x)))
17912070Sbaden 		  (cond ((and (funcall typ (car x))
18012070Sbaden 			      (funcall typ (cadr x))) t)))))))))
18112070Sbaden 
18212070Sbaden ; check if a variable is boolean, 'T' or 'F'
18312070Sbaden 
18412070Sbaden (defun boolp (x)
18512070Sbaden   (memq x '(T F)))
18612070Sbaden 
18712070Sbaden 
18812070Sbaden (defun undefp (x)
18912070Sbaden   (eq x '?))
19012070Sbaden 
19112070Sbaden (defun tl$fp (x)
19212070Sbaden   (cond (DynTraceFlg (IncrSize 'tl$fp (size x)) (IncrTimes 'tl$fp)))
19312070Sbaden   (cond ((atom x) (bottom))
19412070Sbaden 	(t (cdr x))))
19512070Sbaden 
19612070Sbaden 
19712070Sbaden (defun tlr$fp (x)
19812070Sbaden   (cond (DynTraceFlg (IncrSize 'tlr$fp (size x)) (IncrTimes 'tlr$fp)))
19912070Sbaden   (cond ((listp x) (cond
20012070Sbaden 		    ((onep (length x)) nil)
20112070Sbaden 		    (t (reverse (cdr (reverse x))))))
20212070Sbaden 	(t (bottom))))
20312070Sbaden 
20412070Sbaden ; this function is just like id$fp execept it also prints its
20512070Sbaden ; argument on the stdout. It is meant to be used only for debuging.
20612070Sbaden 
20712070Sbaden (defun out$fp (x)
20812070Sbaden   (fpPP x)
20912070Sbaden   (terpri)
21012070Sbaden   x)
21112070Sbaden 
21212070Sbaden (defun id$fp (x)
21312070Sbaden   (cond (DynTraceFlg (IncrSize 'id$fp (size x)) (IncrTimes 'id$fp)))
21412070Sbaden   x)
21512070Sbaden 
21612070Sbaden (defun atom$fp (x)
21712070Sbaden   (cond (DynTraceFlg (IncrSize 'atom$fp (size x)) (IncrTimes 'atom$fp)))
21812070Sbaden   (cond ((atom x) 'T)
21912070Sbaden 	(t 'F)))
22012070Sbaden 
22112070Sbaden (defun null$fp (x)
22212070Sbaden   (cond (DynTraceFlg (IncrSize 'null$fp (size x)) (IncrTimes 'null$fp)))
22312070Sbaden   (cond ((null x) 'T)
22412070Sbaden 	(t  'F)))
22512070Sbaden 
22612070Sbaden (defun reverse$fp (x)
22712070Sbaden   (cond (DynTraceFlg (IncrSize 'reverse$fp (size x)) (IncrTimes 'reverse$fp)))
22812070Sbaden   (cond  ((null x) x)
22912070Sbaden 	 ((listp x) (reverse x))
23012070Sbaden 	 (t (bottom))))
23112070Sbaden 
23212070Sbaden (defun lpair$ (x)
23312070Sbaden   (cond ((or (undefp x) (not (listp x))) nil)
23412070Sbaden 	(t
23512070Sbaden 	 (setq y_l (car x))
23612070Sbaden 	 (setq z_l (cdr x))
23712070Sbaden 	 (cond ((null z_l)  t)
23812070Sbaden 	       (t (cond ((or (not (listp z_l)) (not (onep (length z_l)))) nil)
23912070Sbaden 			(t (listp (setq z_l (car z_l))))))))))
24012070Sbaden 
24112070Sbaden (defun rpair$ (x)
24212070Sbaden   (cond ((or (undefp x) (not (listp x))) nil)
24312070Sbaden 	(t
24412070Sbaden 	 (setq y_l (car x))
24512070Sbaden 	 (setq z_l (cdr x))
24612070Sbaden 	 (cond ((null y_l)  t)
24712070Sbaden 	       (t (cond ((not (listp y_l)) nil)
24812070Sbaden 			(t (setq z_l (car z_l)) t)))))))
24912070Sbaden 
25012070Sbaden 
25112070Sbaden (defun distl$fp (x)
25212070Sbaden   (let ((y_l nil) (z_l nil))
25312070Sbaden        (cond ((lpair$ x)
25412070Sbaden 	      (cond (DynTraceFlg
25512070Sbaden 		     (IncrSize 'distl$fp (size z_l)) (IncrTimes 'distl$fp)))
25612070Sbaden 	      (mapcar '(lambda (u) (list y_l u)) z_l))
25712070Sbaden 	     (t (bottom)))))
25812070Sbaden 
25912070Sbaden (defun distr$fp (x)
26012070Sbaden   (let ((y_l nil) (z_l nil))
26112070Sbaden        (cond ((rpair$ x)
26212070Sbaden 	      (cond (DynTraceFlg
26312070Sbaden 		     (IncrSize 'distr$fp (size y_l)) (IncrTimes 'distr$fp)))
26412070Sbaden 	      (mapcar '(lambda (u) (list u z_l)) y_l))
26512070Sbaden 	     (t (bottom)))))
26612070Sbaden 
26712070Sbaden 
26812070Sbaden (defun length$fp (x)
26912070Sbaden   (cond (DynTraceFlg (IncrSize 'length$fp (size x)) (IncrTimes 'length$fp)))
27012070Sbaden   (cond ((listp x) (length x))
27112070Sbaden 	(t (bottom))))
27212070Sbaden 
27312070Sbaden (defun apndl$fp (x)
27412070Sbaden   (cond ((and (dtpr x) (eq 2 (length x)) (listp (cadr x)))
27512070Sbaden 	 (cond (DynTraceFlg
27612070Sbaden 		(IncrSize 'apndl$fp (size (cadr x))) (IncrTimes 'apndl$fp)))
27712070Sbaden 	 (cons (car x) (cadr x)))
27812070Sbaden 	(t (bottom))))
27912070Sbaden 
28012070Sbaden 
28112070Sbaden (defun apndr$fp (x)
28212070Sbaden   (cond ((and (dtpr x) (eq 2 (length x)) (listp (car x)))
28312070Sbaden 	 (cond (DynTraceFlg
28412070Sbaden 		(IncrSize 'apndr$fp (size (car x))) (IncrTimes 'apndr$fp)))
28512070Sbaden 	 (append (car x) (cdr x)))
28612070Sbaden 	(t (bottom))))
28712070Sbaden 
28812070Sbaden 
28912070Sbaden (defun rotl$fp (x)
29012070Sbaden   (cond (DynTraceFlg (IncrSize 'rotl$fp (size x)) (IncrTimes 'rotl$fp)))
29112070Sbaden   (cond ((null x) x)
29212070Sbaden 	((listp x) (cond ((onep (length x)) x)
29312070Sbaden 			 (t (append (cdr x) (list (car x))))))
29412070Sbaden 	(t (bottom))))
29512070Sbaden 
29612070Sbaden (defun rotr$fp (x)
29712070Sbaden   (cond (DynTraceFlg (IncrSize 'rotr$fp (size x)) (IncrTimes 'rotr$fp)))
29812070Sbaden   (cond ((null x) x)
29912070Sbaden 	((listp x) (cond ((onep (length x)) x)
30012070Sbaden 			 (t (reverse (rotl$fp (reverse x))))))
30112070Sbaden 	(t (bottom))))
30212070Sbaden 
30312070Sbaden 
30412070Sbaden (defun trans$fp (x)
305*12092Sbaden   (If (and (listp x) (allLists x))
30612070Sbaden       then (If (allNulls x)
30712070Sbaden 	       then
30812070Sbaden 	       (cond (DynTraceFlg
30912070Sbaden 		      (IncrSize 'trans$fp (size x))
31012070Sbaden 		      (IncrTimes 'trans$fp)))
31112070Sbaden 	       nil
31212070Sbaden 
31312070Sbaden 	       else
31412070Sbaden 	       (cond (DynTraceFlg
31512070Sbaden 		      (IncrSize 'trans$fp
31612070Sbaden 				(+ (size (car x))
31712070Sbaden 				   (size (cadr x)))) (IncrTimes 'trans$fp)))
31812070Sbaden 
31912070Sbaden 	       (do ((a x (cdr a))
32012070Sbaden 		    (f (length (car x))))
32112070Sbaden 		   ((null a) (trnspz x))
32212070Sbaden 		   (If (or (not (listp (car a))) (not (eq f (length (car a)))))
32312070Sbaden 		       then (bottom))))
32412070Sbaden       else
32512070Sbaden 
32612070Sbaden       (bottom)))
32712070Sbaden 
32812070Sbaden (defun allNulls (x)
32912070Sbaden   (do ((a x (cdr a)))
33012070Sbaden       ((null a) t)
33112070Sbaden       (If (car a) then (return nil))))
33212070Sbaden 
333*12092Sbaden (defun allLists (x)
334*12092Sbaden   (do ((a x (cdr a)))
335*12092Sbaden       ((null a) t)
336*12092Sbaden       (If (not (dtpr (car a))) then (return nil))))
33712070Sbaden 
338*12092Sbaden 
33912070Sbaden (defun trnspz (l)
34012070Sbaden   (do
34112070Sbaden    ((h (emptyHeader (length (car l))))
34212070Sbaden     (v l (cdr v)))
34312070Sbaden    ((null v) (mapcar 'car h))
34412070Sbaden    (mapcar #'(lambda (x y) (tconc x y)) h (car v))))
34512070Sbaden 
34612070Sbaden 
34712070Sbaden (defun emptyHeader (n)
34812070Sbaden   (do
34912070Sbaden    ((r nil)
35012070Sbaden     (c n (1- c)))
35112070Sbaden    ((= c 0) r)
35212070Sbaden    (setq r (cons (ncons nil) r))))
35312070Sbaden 
35412070Sbaden 
35512070Sbaden (defun iota$fp (x)
35612070Sbaden   (cond (DynTraceFlg  (IncrTimes 'iota$fp)))
35712070Sbaden   (cond ((undefp x) x)
35812070Sbaden 	((listp x) (bottom))
35912070Sbaden 	((not (fixp x)) (bottom))
36012070Sbaden 	((lessp x 0) (bottom))
36112070Sbaden 	((zerop x) nil)
36212070Sbaden 	(t
36312070Sbaden 	 (do ((z x (1- z))
36412070Sbaden 	      (rslt nil))
36512070Sbaden 	     ((zerop z) rslt)
36612070Sbaden 	     (setq rslt (cons z rslt))))))
36712070Sbaden 
36812070Sbaden ; this is the stuff that was added by dorab patel to make this have
36912070Sbaden ; the same functions as David Lahti's interpreter
37012070Sbaden 
37112070Sbaden 
37212070Sbaden ;; Modified by SBB to accept nil as a valid input
37312070Sbaden 
37412070Sbaden (defun last$fp (x)
37512070Sbaden   (cond (DynTraceFlg (IncrSize 'last$fp (size x)) (IncrTimes 'last$fp)))
37612070Sbaden     (cond ((null x) nil)
37712070Sbaden 	  ((listp x) (car (last x)))
37812070Sbaden 	  (t (bottom))))
37912070Sbaden 
38012070Sbaden ;; Added by SBB
38112070Sbaden 
38212070Sbaden (defun first$fp (x)
38312070Sbaden   (If DynTraceFlg then (IncrSize 'first$fp (size x)) (IncrTimes 'first$fp))
38412070Sbaden   (If (not (listp x)) then (bottom)
38512070Sbaden       else (car x)))
38612070Sbaden 
38712070Sbaden (defun front$fp (x)
38812070Sbaden   (cond (DynTraceFlg (IncrSize 'front$fp (size x)) (IncrTimes 'front$fp)))
38912070Sbaden     (cond ((null x) (bottom))
390*12092Sbaden 	  ((listp x) (reverse (cdr (reverse x))))
39112070Sbaden 	  (t (bottom))))
39212070Sbaden 
39312070Sbaden (defun pick$fp (sAndX)
39412070Sbaden   (let ((s (car sAndX))
39512070Sbaden 	(x (cadr sAndX)))
39612070Sbaden        (cond (DynTraceFlg (IncrSize 'pick$fp (size x)) (IncrTimes 'pick$fp)))
39712070Sbaden 
39812070Sbaden        (If (or (not (fixp s)) (zerop s)) then  (bottom)
39912070Sbaden 	   else
40012070Sbaden 
40112070Sbaden 	   (progn
40212070Sbaden 	    (cond (DynTraceFlg
40312070Sbaden 		   (IncrTimes 'select$fp)
40412070Sbaden 		   (IncrSize 'select$fp (size x))))
40512070Sbaden 
40612070Sbaden 	    (cond ((not (listp x)) (bottom))
40712070Sbaden 		  ((plusp s)
40812070Sbaden 		   (If (greaterp s (length x)) then (bottom)
40912070Sbaden 		       else (nthelem s x)))
41012070Sbaden 		  ((minusp s)
41112070Sbaden 		   (let  ((len (length x)))
41212070Sbaden 			 (If (greaterp (absval s) len) then (bottom)
41312070Sbaden 			     else (nthelem (plus len 1 s) x)))))))))
41412070Sbaden 
41512070Sbaden 
41612070Sbaden 
41712070Sbaden (defun concat$fp (x)
41812070Sbaden   (cond (DynTraceFlg (IncrSize 'concat$fp (size x)) (IncrTimes 'concat$fp)))
41912070Sbaden 
42012070Sbaden   (If (listp x)
42112070Sbaden       then
42212070Sbaden       (do ((a x  (cdr a))
42312070Sbaden 	   (y (copy x) (cdr y))
42412070Sbaden 	   (rslt (ncons nil)))
42512070Sbaden 	  ((null a) (car rslt))
42612070Sbaden 	  (If (not (listp (car a))) then (bottom))
42712070Sbaden 
42812070Sbaden 	  (lconc rslt (car y)))
42912070Sbaden 
43012070Sbaden       else (bottom)))
43112070Sbaden 
43212070Sbaden 
43312070Sbaden (defun pair$fp (x)
43412070Sbaden   (cond (DynTraceFlg (IncrSize 'pair$fp (size x)) (IncrTimes 'pair$fp)))
435*12092Sbaden   (cond ((not (listp x)) (bottom))
436*12092Sbaden 	((null x) (bottom))
437*12092Sbaden 	(t (do ((count 0 (add count 2)) ; set local vars
438*12092Sbaden 		(max (length x))
439*12092Sbaden 		(ret (ncons nil)))
440*12092Sbaden 	       ((not (lessp count max)) (car ret)) ; return car of tconc struc
441*12092Sbaden 	       (cond ((equal (diff max count) 1) ; if only one element left
442*12092Sbaden 		      (tconc ret (list (car x))))
443*12092Sbaden 		     (t (tconc ret (list (car x) (cadr x)))
444*12092Sbaden 			(setq x (cddr x))))))))
44512070Sbaden 
44612070Sbaden 
44712070Sbaden (defun split$fp (x)
44812070Sbaden   (cond (DynTraceFlg (IncrSize 'split$fp (size x)) (IncrTimes 'split$fp)))
44912070Sbaden   (cond ((not (listp x)) (bottom))
45012070Sbaden 	((null x) (bottom))
45112070Sbaden 	((eq (length x) 1) (list x nil))
45212070Sbaden 	(t
45312070Sbaden 	 (do ((count 1 (add1 count))
45412070Sbaden 	      (mid (fix (plus 0.5 (quotient (length x) 2.0))))
45512070Sbaden 	      (ret nil))
45612070Sbaden 	     ((greaterp count mid) (cons (nreverse ret) (list x)))
45712070Sbaden 	     (setq ret (cons (car x) ret))
45812070Sbaden 	     (setq x (cdr x))))))
45912070Sbaden 
46012070Sbaden 
46112070Sbaden ; Library functions: sin, asin, cos, acos, log, exp, mod
46212070Sbaden 
46312070Sbaden (defun sin$fp (x)
46412070Sbaden   (cond (DynTraceFlg  (IncrTimes 'sin$fp)))
46512070Sbaden   (cond ((numberp x) (sin x))
46612070Sbaden 	(t (bottom))))
46712070Sbaden 
46812070Sbaden (defun asin$fp (x)
46912070Sbaden   (cond (DynTraceFlg  (IncrTimes 'asin$fp)))
47012070Sbaden   (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (asin x))
47112070Sbaden 	(t (bottom))))
47212070Sbaden 
47312070Sbaden (defun cos$fp (x)
47412070Sbaden   (cond (DynTraceFlg  (IncrTimes 'cos$fp)))
47512070Sbaden   (cond ((numberp x) (cos x))
47612070Sbaden 	(t (bottom))))
47712070Sbaden 
47812070Sbaden (defun acos$fp (x)
47912070Sbaden   (cond (DynTraceFlg  (IncrTimes 'acos$fp)))
48012070Sbaden   (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (acos x))
48112070Sbaden 	(t (bottom))))
48212070Sbaden 
48312070Sbaden (defun log$fp (x)
48412070Sbaden   (cond (DynTraceFlg  (IncrTimes 'log$fp)))
48512070Sbaden   (cond ((and (numberp x) (not (minusp x))) (log x))
48612070Sbaden 	(t (bottom))))
48712070Sbaden 
48812070Sbaden (defun exp$fp (x)
48912070Sbaden   (cond (DynTraceFlg  (IncrTimes 'exp$fp)))
49012070Sbaden   (cond ((numberp x) (exp x))
49112070Sbaden 	(t (bottom))))
49212070Sbaden 
49312070Sbaden (defun mod$fp (x)
49412070Sbaden   (cond (DynTraceFlg  (IncrTimes 'mod$fp)))
49512070Sbaden   (cond ((ok_pair x 'numberp) (mod (car x) (cadr x)))
49612070Sbaden 	(t (bottom))))
49712070Sbaden 
49812070Sbaden 
49912070Sbaden ;; Tree insert function
50012070Sbaden 
50112070Sbaden 
50212070Sbaden (defun treeIns$fp (fn x)
50312070Sbaden   (If (not (listp x)) then  (bottom)
50412070Sbaden       else
50512070Sbaden       (If (null x) then  (unitTreeInsert fn)
50612070Sbaden 	  else
50712070Sbaden 	  (let ((len (length x)))
50812070Sbaden 	       (If (onep len) then (car x)
50912070Sbaden 		   else
51012070Sbaden 		   (If (twop len) then (funcall fn x )
51112070Sbaden 		       else (treeInsWithLen fn x len)))))))
51212070Sbaden 
51312070Sbaden 
51412070Sbaden (defun treeInsWithLen (fn x len)
51512070Sbaden   (let* ((r1 (copy x))
51612070Sbaden 	 (nLen (fix (plus 0.5 (quotient len 2.0))))
51712070Sbaden 	 (p (Cnth r1 nLen))
51812070Sbaden 	 (r2 (cdr p)))
51912070Sbaden 	(rplacd p nil)
52012070Sbaden 	(let ((saveLevel level))
52112070Sbaden 	     (setq level (1+ level))
52212070Sbaden 	     (let ((R1 (treeIns fn r1 nLen)))
52312070Sbaden 		  (setq level (1+ saveLevel))
52412070Sbaden 		  (let ((R2 (treeIns fn r2 (diff len nLen))))
52512070Sbaden 		       (setq level saveLevel)
52612070Sbaden 		       (funcall fn `(,R1 ,R2)))))))
527