~ chicken-core (chicken-5) 9ea0b69a9e6b49e9a64d2ba59e40fcc1d131997f


commit 9ea0b69a9e6b49e9a64d2ba59e40fcc1d131997f
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Dec 13 12:32:09 2009 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sun Dec 13 12:32:09 2009 +0100

    fXXvector-ref unboxed rewrites; rewrites for fpXXX fraction-ops; unboxed fix type is C int; fft is shit-fast

diff --git a/c-backend.scm b/c-backend.scm
index 6382646e..0709dab0 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -727,7 +727,7 @@
 
     (define (utype t)
       (case t
-	((fix) "long")
+	((fix) "int")
 	((flo) "double")
 	((chr) "char")
 	((ptr) "void *")
diff --git a/c-platform.scm b/c-platform.scm
index 23ce02f8..cd54c477 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -802,6 +802,10 @@
 (rewrite 'fplog 16 1 "C_a_i_flonum_log" #f words-per-flonum)
 (rewrite 'fpsqrt 16 1 "C_a_i_flonum_sqrt" #f words-per-flonum)
 (rewrite 'fpabs 16 1 "C_a_i_flonum_abs" #f words-per-flonum)
+(rewrite 'fptruncate 16 1 "C_a_i_flonum_truncate" #f words-per-flonum)
+(rewrite 'fpround 16 1 "C_a_i_flonum_truncate" #f words-per-flonum)
+(rewrite 'fpceiling 16 1 "C_a_i_flonum_truncate" #f words-per-flonum)
+(rewrite 'fpround 16 1 "C_a_i_flonum_truncate" #f words-per-flonum)
 
 (rewrite 'cons 16 2 "C_a_i_cons" #t 3)
 (rewrite '##sys#cons 16 2 "C_a_i_cons" #t 3)
diff --git a/chicken.h b/chicken.h
index 1f8c3997..b6506e1c 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1317,6 +1317,8 @@ 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_ref(b, i)      (((float *)C_data_pointer(C_block_item((b), 1)))[ C_unfix(i) ])
+#define C_ub_i_f64vector_ref(b, i)      (((double *)C_data_pointer(C_block_item((b), 1)))[ C_unfix(i) ])
 #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)
 
diff --git a/unboxing.scm b/unboxing.scm
index e4734ff4..86ec0093 100644
--- a/unboxing.scm
+++ b/unboxing.scm
@@ -393,4 +393,6 @@
   (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")
+  (C_a_i_f32vector_ref (* fix) flo "C_ub_i_f32vector_ref")
+  (C_a_i_f64vector_ref (* fix) flo "C_ub_i_f64vector_ref")
   )
Trap