~ 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