~ chicken-core (chicken-5) c493d510081b32c02971812fc1b060bd3ae4360a


commit c493d510081b32c02971812fc1b060bd3ae4360a
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Thu Feb 12 23:03:24 2015 +0100
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Sun May 31 14:20:16 2015 +0200

    Improve performance a lot by also rewriting vararg numeric ops with two arguments of *unknown* types to the dyadic versions.
    
    Fix rewrite loop caused by ##sys#gcd and ##sys#lcm having an internal procedure name of gcd and lcm while the latter have specialization rewrites to the former.

diff --git a/types.db b/types.db
index 6df46c43..14d36cb7 100644
--- a/types.db
+++ b/types.db
@@ -265,7 +265,8 @@
 (zero? (#(procedure #:clean #:enforce #:foldable) zero? (number) boolean)
        ((integer) (eq? #(1) '0))
        (((or cplxnum ratnum)) '#f)
-       ((number) (##core#inline "C_u_i_zerop" #(1))))
+       ((number) (##core#inline "C_u_i_zerop" #(1)))
+       ((*) (##core#inline "C_i_zerop" #(1))))
 
 (odd? (#(procedure #:clean #:enforce #:foldable) odd? (number) boolean)
 	       ((fixnum) (##core#inline "C_i_fixnumoddp" #(1)))
@@ -319,7 +320,7 @@
     (##core#inline_allocate ("C_a_i_fixnum_plus" 3) #(1) #(2)))
    ((integer integer) (integer)
     (##sys#integer-plus #(1) #(2)))
-   ((number number) (number)
+   ((* *) (number)
     (##sys#+-2 #(1) #(2))))
 
 (- (#(procedure #:clean #:enforce #:foldable) - (number #!rest number) number)
@@ -343,7 +344,7 @@
     (##core#inline_allocate ("C_a_i_fixnum_difference" 3) #(1) #(2)))
    ((integer integer) (integer)
     (##sys#integer-minus #(1) #(2)))
-   ((number number) (number)
+   ((* *) (number)
     (##sys#--2 #(1) #(2))))
 
 (* (#(procedure #:clean #:enforce #:foldable) * (#!rest number) number)
@@ -371,7 +372,7 @@
     (##core#inline_allocate ("C_a_i_fixnum_times" 4) #(1) #(2)))
    ((integer integer) (integer)
     (##sys#integer-times #(1) #(2)))
-   ((number number) (number)
+   ((* *) (number)
     (##sys#*-2 #(1) #(2))))
 
 (/ (#(procedure #:clean #:enforce #:foldable) / (number #!rest number) number)
@@ -390,7 +391,7 @@
     (##core#inline_allocate ("C_a_i_flonum_quotient" 4) #(1) #(2)))
    ((integer integer) ((or integer ratnum))
     (##sys#/-2 #(1) #(2)))
-   ((number number) (number)
+   ((* *) (number)
     (##sys#/-2 #(1) #(2))))
 
 (= (#(procedure #:clean #:enforce #:foldable) = (#!rest number) boolean)
@@ -399,7 +400,7 @@
    ((fixnum fixnum) (eq? #(1) #(2)))
    ((float float) (##core#inline "C_flonum_equalp" #(1) #(2)))
    ((integer integer) (##core#inline "C_i_integer_equalp" #(1) #(2)))
-   ((number number) (##core#inline "C_i_nequalp" #(1) #(2))))
+   ((* *) (##core#inline "C_i_nequalp" #(1) #(2))))
 
 (> (#(procedure #:clean #:enforce #:foldable) > (#!rest number) boolean)
    (() '#t)
@@ -407,7 +408,7 @@
    ((fixnum fixnum) (fx> #(1) #(2)))
    ((float float) (##core#inline "C_flonum_greaterp" #(1) #(2)))
    ((integer integer) (##core#inline "C_i_integer_greaterp" #(1) #(2)))
-   ((number number) (##core#inline "C_i_greaterp" #(1) #(2))))
+   ((* *) (##core#inline "C_i_greaterp" #(1) #(2))))
 
 (< (#(procedure #:clean #:enforce #:foldable) < (#!rest number) boolean)
    (() '#t)
@@ -415,7 +416,7 @@
    ((fixnum fixnum) (fx< #(1) #(2)))
    ((integer integer) (##core#inline "C_i_integer_lessp" #(1) #(2)))
    ((float float) (##core#inline "C_flonum_lessp" #(1) #(2)))
-   ((number number) (##core#inline "C_i_lessp" #(1) #(2))))
+   ((* *) (##core#inline "C_i_lessp" #(1) #(2))))
 
 (>= (#(procedure #:clean #:enforce #:foldable) >= (#!rest number) boolean)
     (() '#t)
@@ -423,7 +424,7 @@
     ((fixnum fixnum) (fx>= #(1) #(2)))
     ((integer integer) (##core#inline "C_i_integer_greater_or_equalp" #(1) #(2)))
     ((float float) (##core#inline "C_flonum_greater_or_equal_p" #(1) #(2)))
-    ((number number) (##core#inline "C_i_greater_or_equalp" #(1) #(2))))
+    ((* *) (##core#inline "C_i_greater_or_equalp" #(1) #(2))))
 
 (<= (#(procedure #:clean #:enforce #:foldable) <= (#!rest number) boolean)
     (() '#t)
@@ -431,7 +432,7 @@
     ((fixnum fixnum) (fx<= #(1) #(2)))
     ((integer integer) (##core#inline "C_i_integer_less_or_equalp" #(1) #(2)))
     ((float float) (##core#inline "C_flonum_less_or_equal_p" #(1) #(2)))
-    ((number number) (##core#inline "C_i_less_or_equalp" #(1) #(2))))
+    ((* *) (##core#inline "C_i_less_or_equalp" #(1) #(2))))
 
 (quotient (#(procedure #:clean #:enforce #:foldable) quotient ((or integer float) (or integer float)) (or integer float))
 	  ;;XXX flonum/mixed case
@@ -485,15 +486,15 @@
      ((fixnum fixnum) (fixnum) (fxgcd #(1) #(2)))
      ((float float) (float) (fpgcd #(1) #(2)))
      ((integer integer) (integer) (##sys#integer-gcd #(1) #(2)))
-     ((number number) (number) (##sys#gcd #(1) #(2))))
+     ((* *) (##sys#gcd #(1) #(2))))
 
-(##sys#gcd (#(procedure #:clean #:enforce #:foldable) gcd (number number) number))
+(##sys#gcd (#(procedure #:clean #:enforce #:foldable) ##sys#gcd (number number) number))
 
 (lcm (#(procedure #:clean #:enforce #:foldable) lcm (#!rest number) number)
      (() '1)
-     ((number number) (##sys#lcm #(1) #(2))))
+     ((* *) (##sys#lcm #(1) #(2))))
 
-(##sys#lcm (#(procedure #:clean #:enforce #:foldable) lcm (number number) number))
+(##sys#lcm (#(procedure #:clean #:enforce #:foldable) ##sys#lcm (number number) number))
 
 (abs (#(procedure #:clean #:enforce #:foldable) abs (number) number)
      ((fixnum) (integer) (##core#inline_allocate ("C_a_i_fixnum_abs" 3) #(1)))
@@ -540,7 +541,7 @@
 (log (#(procedure #:clean #:enforce #:foldable) log (number) (or float cplxnum))
      ;; Unfortunately this doesn't work when the argument is negative
      ;;((float) (float) (##core#inline_allocate ("C_a_i_flonum_log" 4) #(1)))
-     ((number) (##sys#log-1 #(1))))
+     ((*) (##sys#log-1 #(1))))
 
 (expt (#(procedure #:clean #:enforce #:foldable) expt (number number) number)
       ;; This breaks in some extreme edge cases... Worth disabling?
Trap