~ chicken-core (chicken-5) 0cb8eb7c910284c1696700ab5f45018c8822286e
commit 0cb8eb7c910284c1696700ab5f45018c8822286e Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri May 20 12:32:07 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri May 20 12:32:07 2011 +0200 fixed unboxing bugs related to assignment; unbox C_a_i_fix_to_flo diff --git a/chicken.h b/chicken.h index dfa41a7b..3c3d676a 100644 --- a/chicken.h +++ b/chicken.h @@ -1170,6 +1170,7 @@ extern double trunc(double); #define C_a_i_flonum(ptr, i, n) C_flonum(ptr, n) #define C_a_i_data_mpointer(ptr, n, x) C_mpointer(ptr, C_data_pointer(x)) #define C_a_i_fix_to_flo(p, n, f) C_flonum(p, C_unfix(f)) +#define C_cast_to_flonum(n) ((double)(n)) #define C_a_i_mpointer(ptr, n, x) C_mpointer(ptr, (x)) #define C_a_u_i_pointer_inc(ptr, n, p, i) C_mpointer(ptr, (C_char *)(p) + C_unfix(i)) #define C_pointer_eqp(x, y) C_mk_bool(C_c_pointer_nn(x) == C_c_pointer_nn(y)) diff --git a/unboxing.scm b/unboxing.scm index 4871e256..174ede5d 100644 --- a/unboxing.scm +++ b/unboxing.scm @@ -301,6 +301,51 @@ n)) n)) + (define (straighten-unboxed-assignment! n) + ;; change `(##core#unboxed_set! <v> <type> (let (...) <x>))' and + ;; `(let (...) (##core#unboxed_set! <v> <type> <x>))' + ;; (also for "##core#let_unboxed") + (let* ((class (node-class n)) + (subs (node-subexpressions n)) + (params (node-parameters n)) + (arg1 (first subs)) + (letsubs (node-subexpressions arg1))) + (when (memq (node-class arg1) '(let ##core#let_unboxed)) + (d "straighten unboxed assignment: ~a" params) + (let-values (((bvals body) (split-at letsubs (sub1 (length letsubs))))) + (copy-node! + (make-node + (node-class arg1) + (node-parameters arg1) + (append + bvals + (list + (straighten-unboxed-assignment! (make-node class params body))))) + n))) + n)) + + (define (straighten-assignment! n) + ;; change `(set! <v> (##core#let_unboxed (...) <x>))' to + ;; `(##core#let_unboxed (...) (set! <v> <x>))' + (let* ((class (node-class n)) + (subs (node-subexpressions n)) + (params (node-parameters n)) + (arg1 (first subs)) + (letsubs (node-subexpressions arg1))) + (when (eq? (node-class arg1) '##core#let_unboxed) + (d "straighten assignment: ~a" params) + (let-values (((bvals body) (split-at letsubs (sub1 (length letsubs))))) + (copy-node! + (make-node + '##core#let_unboxed + (node-parameters arg1) + (append + bvals + (list + (straighten-assignment! (make-node class params body))))) + n))) + n)) + ;; walk node and return either "(<var> . <type>)" or #f ;; - at second pass: rewrite "##core#inline[_allocate]" nodes (define (walk n dest udest pass2?) @@ -395,12 +440,15 @@ (a (assq var e)) (val (walk (first subs) var (and a (cdr a)) pass2?))) (cond (pass2? - (when (and a (cdr a)) ; may have mutated - (copy-node! - (make-node - '##core#unboxed_set! (list (alias var) (cdr a)) subs) - n))) - ((and val (cdr val)) + (cond ((and a (cdr a)) ; may have mutated in walk above + (copy-node! + (make-node + '##core#unboxed_set! (list (alias var) (cdr a)) subs) + n) + (straighten-unboxed-assignment! n)) + (else + (straighten-assignment! n)))) + ((and a val (cdr val)) (unboxed! var (cdr val))) (else (boxed! var) @@ -505,7 +553,8 @@ (C_a_i_flonum_truncate (flonum) flonum "C_trunc") (C_a_i_flonum_ceiling (flonum) flonum "C_ceil") (C_a_i_flonum_floor (flonum) flonum "C_floor") - (C_a_i_flonum_round (flonum) flonum "C_round")) + (C_a_i_flonum_round (flonum) flonum "C_round") + (C_a_i_fix_to_flo (fixnum) flonum "C_cast_to_flonum")) ;; others (define-unboxed-opsTrap