~ chicken-core (chicken-5) d1217287c0b508e4495093b0114c37ca3c64e6c4


commit d1217287c0b508e4495093b0114c37ca3c64e6c4
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Jan 27 21:16:08 2011 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu Jan 27 21:16:08 2011 +0100

    changed argument-ref syntax for specializations; spec.s for fp-ops; works; happy

diff --git a/compiler-syntax.scm b/compiler-syntax.scm
index eec4f7e6..9d199ccc 100644
--- a/compiler-syntax.scm
+++ b/compiler-syntax.scm
@@ -185,9 +185,9 @@
 	    (define (fail ret? msg . args)
 	      (let ((ln (get-line x)))
 		(warning 
-		 (sprintf "`~a', in format string ~s~a, ~?" 
+		 (sprintf "~a`~a', in format string ~s, ~?" 
+		   (if ln (sprintf "(~a) " ln) "")
 		   func fstr 
-		   (if ln (sprintf "(~a)" ln) "")
 		   msg args) ))
 	      (when ret? (return #f)))
 	    (let ((code '())
diff --git a/scrutinizer.scm b/scrutinizer.scm
index 31206f6b..71613ad4 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -26,7 +26,7 @@
 
 (declare
   (unit scrutinizer)
-  (hide match-specialization specialize-node!))
+  (hide match-specialization specialize-node! specialization-statistics))
 
 
 (include "compiler-namespace")
@@ -67,7 +67,8 @@
 ;
 ;   SPECIALIZATION = ((MVAL ... [#!rest MVAL]) TEMPLATE)
 ;   MVAL = VAL | (not VAL) | (or VAL ...)
-;   TEMPLATE = INTEGER | SYMBOL | STRING
+;   TEMPLATE = #(INDEX)
+;            | INTEGER | SYMBOL | STRING
 ;            | (quote CONSTANT)
 ;            | (TEMPLATE . TEMPLATE)
 
@@ -75,6 +76,8 @@
 (define-constant +fragment-max-length+ 5)
 (define-constant +fragment-max-depth+ 3)
 
+(define specialization-statistics '())
+
 (define (scrutinize node db complain specialize)
   (define (constant-result lit)
     (cond ((string? lit) 'string)
@@ -492,7 +495,12 @@
 	      (for-each
 	       (lambda (spec)
 		 (when (match-specialization (car spec) (cdr args))
-		   (debugging 'x "specializing call" (cons pn (car spec)))
+		   (let ((op (cons pn (car spec))))
+		     (cond ((assoc op specialization-statistics) =>
+			    (lambda (a) (set-cdr! a (add1 (cdr a)))))
+			   (else
+			    (set! specialization-statistics
+			      (cons (cons op 1) specialization-statistics)))))
 		   (specialize-node! node (cadr spec))))
 	       specs)))
 	  r))))
@@ -662,7 +670,13 @@
 		'*))))
 	(d "  -> ~a" results)
 	results)))
-  (walk (first (node-subexpressions node)) '() '() #f #f))
+  (let ((rn (walk (first (node-subexpressions node)) '() '() #f #f)))
+    (when (debugging 'x "specializations:")
+      (for-each 
+       (lambda (ss)
+	 (printf "  ~a ~s~%" (cdr ss) (car ss)))
+       specialization-statistics))
+    rn))
 
 (define (load-type-database name #!optional (path (repository-path)))
   (and-let* ((dbfile (file-exists? (make-pathname path name))))
@@ -703,7 +717,10 @@
 (define (specialize-node! node template)
   (let ((args (cdr (node-subexpressions node))))
     (define (subst x)
-      (cond ((integer? x) (list-ref args (sub1 x)))
+      (cond ((and (vector? x)
+		  (= 1 (vector-length x)) 
+		  (integer? (vector-ref x 0)))
+	     (list-ref args (sub1 (vector-ref x 0))))
 	    ((not (pair? x)) x)
 	    ((eq? 'quote (car x)) x)	; to handle numeric constants
 	    (else (cons (subst (car x)) (subst (cdr x))))))
diff --git a/types.db b/types.db
index fe9f16dc..9d291514 100644
--- a/types.db
+++ b/types.db
@@ -26,7 +26,8 @@
 
 ;; scheme
  
-(not (procedure not (*) boolean))
+(not (procedure not (*) boolean)
+     ((not boolean) #t))
 (boolean? (procedure boolean (*) boolean))
 (eq? (procedure eq? (* *) boolean))
 (eqv? (procedure eqv? (* *) boolean))
@@ -84,7 +85,8 @@
 (symbol->string (procedure symbol->string (symbol) string))
 (string->symbol (procedure string->symbol (string) symbol))
 (number? (procedure number? (*) boolean))
-(integer? (procedure integer? (*) boolean))
+(integer? (procedure integer? (*) boolean)
+	  ((float) (fpinteger? #(1))))
 (exact? (procedure exact? (*) boolean))
 (real? (procedure real? (*) boolean))
 (complex? (procedure complex? (*) boolean))
@@ -95,40 +97,67 @@
 (even? (procedure even? (number) boolean))
 (positive? (procedure positive? (number) boolean))
 (negative? (procedure negative? (number) boolean))
-(max (procedure max (#!rest number) number))
-(min (procedure min (#!rest number) number))
+(max (procedure max (#!rest number) number)
+     ((float float) (fpmax #(1) #(2))))
+(min (procedure min (#!rest number) number)
+     ((float float) (fpmin #(1) #(2))))
 (+ (procedure + (#!rest number) number)
-   ((float float) (fp+ 1 2)))
-(- (procedure - (number #!rest number) number))
-(* (procedure * (#!rest number) number))
-(/ (procedure / (number #!rest number) number))
-(= (procedure = (#!rest number) boolean))
-(> (procedure > (#!rest number) boolean))
-(< (procedure < (#!rest number) boolean))
-(>= (procedure >= (#!rest number) boolean))
-(<= (procedure <= (#!rest number) boolean))
+   ((float float) (fp+ #(1) #(2))))
+(- (procedure - (number #!rest number) number)
+   ((float float) (fp- #(1) #(2)))
+   ((float) (fpneg #(1))))
+(* (procedure * (#!rest number) number)
+   ((float float) (fp* #(1) #(2))))
+(/ (procedure / (number #!rest number) number)
+   ((float float) (fp/ #(1) #(2))))
+(= (procedure = (#!rest number) boolean)
+   ((float float) (fp= #(1) #(2))))
+(> (procedure > (#!rest number) boolean)
+   ((float float) (fp> #(1) #(2))))
+(< (procedure < (#!rest number) boolean)
+   ((float float) (fp< #(1) #(2))))
+(>= (procedure >= (#!rest number) boolean)
+    ((float float) (fp>= #(1) #(2))))
+(<= (procedure <= (#!rest number) boolean)
+    ((float float) (fp<0 #(1) #(2))))
 (quotient (procedure quotient (number number) number))
 (remainder (procedure remainder (number number) number))
 (modulo (procedure modulo (number number) number))
 (gcd (procedure gcd (#!rest number) number))
 (lcm (procedure lcm (#!rest number) number))
-(abs (procedure abs (number) number))
-(floor (procedure floor (number) number))
-(ceiling (procedure ceiling (number) number))
-(truncate (procedure truncate (number) number))
-(round (procedure round (number) number))
+(abs (procedure abs (number) number)
+     ((float) (fpabs #(1))))
+(floor (procedure floor (number) number)
+       ((float) (fpfloor #(1))))
+(ceiling (procedure ceiling (number) number)
+	 ((float) (fpceiling #(1))))
+(truncate (procedure truncate (number) number)
+	  ((float) (fptruncate #(1))))
+(round (procedure round (number) number)
+       ((float) (fpround #(1))))
 (exact->inexact (procedure exact->inexact (number) number))
 (inexact->exact (procedure inexact->exact (number) number))
-(exp (procedure exp (number) float))
-(log (procedure log (number) float))
-(expt (procedure expt (number number) number))
-(sqrt (procedure sqrt (number) float))
-(sin (procedure sin (number) float))
-(cos (procedure cos (number) float))
-(tan (procedure tan (number) float))
-(asin (procedure asin (number) float))
-(acos (procedure acos (number) float))
-(atan (procedure atan (number #!optional number) float))
+(exp (procedure exp (number) float)
+     ((float) (fpexp #(1))))
+(log (procedure log (number) float)
+     ((float) (fplog #(1))))
+(expt (procedure expt (number number) number)
+      ((float) (fpexpt #(1))))
+(sqrt (procedure sqrt (number) float)
+      ((float) (fpsqrt #(1))))
+(sin (procedure sin (number) float)
+     ((float) (fpsin #(1))))
+(cos (procedure cos (number) float)
+     ((float) (fpcos #(1))))
+(tan (procedure tan (number) float)
+     ((float) (fptab #(1))))
+(asin (procedure asin (number) float)
+      ((float) (fpasin #(1))))
+(acos (procedure acos (number) float)
+      ((float) (fpacos #(1))))
+(atan (procedure atan (number #!optional number) float)
+      ((float) (fpatan #(1)))
+      ((float float) (fpatan2 #(1) #(2))))
 (number->string (procedure number->string (number #!optional number) string))
 (string->number (procedure string->number (string #!optional number) (or number boolean)))
 (char? (procedure char? (*) boolean))
Trap