~ chicken-core (chicken-5) 0684e04a8a0b6330b538c845f05d9dc68c4d6b20
commit 0684e04a8a0b6330b538c845f05d9dc68c4d6b20 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sat Dec 12 14:56:59 2009 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sat Dec 12 14:56:59 2009 +0100 unboxing improvements; more unboxed primitives diff --git a/chicken.h b/chicken.h index 4495e6f3..1f8c3997 100644 --- a/chicken.h +++ b/chicken.h @@ -1317,6 +1317,9 @@ extern double trunc(double); #define C_u_i_f32vector_set(v, i, x) ((((float *)C_data_pointer(C_block_item((v), 1)))[ C_unfix(i) ] = C_flonum_magnitude(x)), C_SCHEME_UNDEFINED) #define C_u_i_f64vector_set(v, i, x) ((((double *)C_data_pointer(C_block_item((v), 1)))[ C_unfix(i) ] = C_flonum_magnitude(x)), C_SCHEME_UNDEFINED) +#define C_ub_i_f32vector_set(v, i, x) ((((float *)C_data_pointer(C_block_item((v), 1)))[ C_unfix(i) ] = (x)), 0) +#define C_ub_i_f64vector_set(v, i, x) ((((double *)C_data_pointer(C_block_item((v), 1)))[ C_unfix(i) ] = (x)), 0) + #define C_a_i_flonum_sin(ptr, c, x) C_flonum(ptr, C_sin(C_flonum_magnitude(x))) #define C_a_i_flonum_cos(ptr, c, x) C_flonum(ptr, C_cos(C_flonum_magnitude(x))) #define C_a_i_flonum_tan(ptr, c, x) C_flonum(ptr, C_tan(C_flonum_magnitude(x))) diff --git a/tests/runtests.sh b/tests/runtests.sh index c5babbb7..d39af87e 100644 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -212,7 +212,6 @@ $compile -e embedded2.scm echo "======================================== timing compilation ..." time $compile compiler.scm -S -O5 -debug pb -v -echo "executing" time ./a.out echo "======================================== running floating-point benchmark ..." @@ -222,5 +221,8 @@ time ./a.out echo "unboxed:" $compile fft.scm -O5 -D unboxed time ./a.out +echo "unboxed/unboxing:" +$compile fft.scm -O5 -D unboxed -unboxing +time ./a.out echo "======================================== done." diff --git a/unboxing.scm b/unboxing.scm index ac1de597..e4734ff4 100644 --- a/unboxing.scm +++ b/unboxing.scm @@ -119,7 +119,7 @@ (make-node '##core#inline_allocate (list "C_a_i_mpointer" 2) ; hardcoded size (list (make-node '##core#unboxed_ref (list tmp rtype) '())))) - ((chr) + ((chr fix) (make-node '##core#inline (list (if (eq? rtype 'chr) "C_make_character" "C_fix")) @@ -247,7 +247,7 @@ (when (and a (cdr a)) (copy-node! (make-node '##core#unboxed_ref (list (alias v) (cdr a)) '()) - n)) ) + n))) ((not a) #f) ; global ((not udest) (boxed! v))) a)) @@ -278,7 +278,8 @@ (when (and a (car a) (cdr a)) (unboxed! (car a) (cdr a)))) args) - (when dest (unboxed! dest rtype))) + (when dest + (unboxed! dest rtype))) (cons #f rtype)))))) ((let) @@ -326,7 +327,7 @@ (if (eq? r 'none) (walk (second clauses) dest udest pass2?) (merge r (walk (second clauses) dest udest pass2?))))) - ((null? (cdr clauses)) + ((null? (cddr clauses)) (merge r (walk (car clauses) dest udest pass2?))) ) ) ((##core#call ##core#direct_call) @@ -374,11 +375,22 @@ (C_a_i_flonum_difference (flo flo) flo "C_ub_i_flonum_difference") (C_a_i_flonum_times (flo flo) flo "C_ub_i_flonum_times") (C_a_i_flonum_quotient (flo flo) flo "C_ub_i_flonum_quotient") - ;XXX add more rewrites for `fp...' operations + (C_a_i_flonum_sin (flo) flo "C_sin") + (C_a_i_flonum_cos (flo) flo "C_cos") + (C_a_i_flonum_tan (flo) flo "C_tab") + (C_a_i_flonum_asin (flo) flo "C_asin") + (C_a_i_flonum_acos (flo) flo "C_acos") + (C_a_i_flonum_atan (flo) flo "C_atan") + (C_a_i_flonum_atan2 (flo flo) flo "C_atan2") + (C_a_i_flonum_exp (flo) flo "C_exp") + (C_a_i_flonum_expt (flo flo) flo "C_pow") + (C_a_i_flonum_log (flo) flo "C_log") + (C_a_i_flonum_sqrt (flo) flo "C_sqrt") + (C_a_i_flonum_abs (flo) flo "C_fabs") + (C_a_i_flonum_truncate (flo) flo "C_trunc") + (C_a_i_flonum_ceiling (flo) flo "C_ceil") + (C_a_i_flonum_floor (flo) flo "C_floor") + (C_a_i_flonum_round (flo) flo "C_round") + (C_u_i_f32vector_set (* fix flo) fix "C_ub_i_f32vector_set") + (C_u_i_f64vector_set (* fix flo) fix "C_ub_i_f64vector_set") ) - - -;;XXX still broken: -; -; - literals that are passed to unboxed operations -; (these must be bound via ##core#let_unboxed)Trap