~ chicken-core (chicken-5) a1a5e4b8c7de7ceb861871e28e353ac4e55900d8


commit a1a5e4b8c7de7ceb861871e28e353ac4e55900d8
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Dec 4 20:21:42 2009 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Fri Dec 4 20:21:42 2009 +0100

    fp-op rewrites, new srfi-4 test, much better implementation of fvector access

diff --git a/c-platform.scm b/c-platform.scm
index d415a2d8..215acb88 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -129,7 +129,8 @@
   '(bitwise-and bitwise-ior bitwise-xor bitwise-not add1 sub1 fx+ fx- fx* fx/ fxmod o
     fx= fx> fx< fx>= fx<= fixnum? fxneg fxmax fxmin identity fp+ fp- fp* fp/ fpmin fpmax fpneg
     fp> fp< fp= fp>= fp<= fxand fxnot fxior fxxor fxshr fxshl bit-set?
-    fpfloor fpceiling fptruncate fpround
+    fpfloor fpceiling fptruncate fpround fpsin fpcos fptan fpasin fpacos fpatan
+    fpatan2 fpexp fpexpt fplog fpsqrt
     arithmetic-shift void flush-output thread-specific thread-specific-set!
     not-pair? atom? null-list? print print* error cpu-time proper-list? call/cc
     blob-size u8vector->blob/shared s8vector->blob/shared u16vector->blob/shared
@@ -144,7 +145,7 @@
     u8vector-length s8vector-length u16vector-length s16vector-length u32vector-length s32vector-length
     f32vector-length f64vector-length setter
     u8vector-ref s8vector-ref u16vector-ref s16vector-ref u32vector-ref s32vector-ref
-    f32vector-ref f64vector-ref
+    f32vector-ref f64vector-ref f32vector-set! f64vector-set!
     u8vector-set! s8vector-set! u16vector-set! s16vector-set! u32vector-set! s32vector-set!
     locative-ref locative-set! locative->object locative? global-ref
     null-pointer? pointer->object flonum? finite?
@@ -185,6 +186,7 @@
     ##sys#byte ##sys#setbyte 
     u8vector-length s8vector-length u16vector-length s16vector-length u32vector-length s32vector-length
     f32vector-length f64vector-length ##sys#apply-values ##sys#setter setter
+    f32vector-set! f64vector-set!
     u8vector-ref s8vector-ref u16vector-ref s16vector-ref u32vector-ref s32vector-ref
     u8vector-set! s8vector-set! u16vector-set! s16vector-set! u32vector-set! s32vector-set!
     ##sys#intern-symbol ##sys#make-symbol make-record-instance error cpu-time ##sys#block-set!) )
@@ -788,6 +790,18 @@
 (rewrite 'truncate 15 'flonum 'fixnum 'fptruncate #f)
 (rewrite 'round 15 'flonum 'fixnum 'fpround #f)
 
+(rewrite 'fpsin 16 1 "C_a_i_flonum_sin" #f words-per-flonum)
+(rewrite 'fpcos 16 1 "C_a_i_flonum_cos" #f words-per-flonum)
+(rewrite 'fptan 16 1 "C_a_i_flonum_tan" #f words-per-flonum)
+(rewrite 'fpasin 16 1 "C_a_i_flonum_asin" #f words-per-flonum)
+(rewrite 'fpacos 16 1 "C_a_i_flonum_acos" #f words-per-flonum)
+(rewrite 'fpatan 16 1 "C_a_i_flonum_atan" #f words-per-flonum)
+(rewrite 'fpatan2 16 2 "C_a_i_flonum_atan2" #f words-per-flonum)
+(rewrite 'fpexp 16 1 "C_a_i_flonum_exp" #f words-per-flonum)
+(rewrite 'fpexpt 16 2 "C_a_i_flonum_expt" #f words-per-flonum)
+(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 'cons 16 2 "C_a_i_cons" #t 3)
 (rewrite '##sys#cons 16 2 "C_a_i_cons" #t 3)
 (rewrite 'list 16 #f "C_a_i_list" #t '(3))
@@ -903,6 +917,8 @@
 (rewrite 's16vector-set! 2 3 "C_u_i_s16vector_set" #f #f)
 (rewrite 'u32vector-set! 2 3 "C_u_i_u32vector_set" #f #f)
 (rewrite 's32vector-set! 2 3 "C_u_i_s32vector_set" #f #f)
+(rewrite 'f32vector-set! 2 3 "C_u_i_f32vector_set" #f #f)
+(rewrite 'f64vector-set! 2 3 "C_u_i_f64vector_set" #f #f)
 
 (rewrite 'u8vector-length 2 1 "C_u_i_8vector_length" #f #f)
 (rewrite 's8vector-length 2 1 "C_u_i_8vector_length" #f #f)
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index dfecdb9b..b7ad3133 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -151,22 +151,22 @@
 (##sys#extend-macro-environment
  'assert '()
  (##sys#er-transformer
- (lambda (form r c)
-   (##sys#check-syntax 'assert form '#(_ 1))
-   (let* ((exp (cadr form))
-	  (msg-and-args (cddr form))
-	  (%if (r 'if))
-	  (%quote (r 'quote))
-	  (msg (if (eq? '() msg-and-args)
-		   `(##core#immutable '"assertion failed")
-		   (car msg-and-args) ) ) )
-     `(,%if (##core#check ,exp)
-	    (##core#undefined)
-	    (##sys#error 
-	     ,msg 
-	     ,@(if (fx> (length msg-and-args) 1)
-		   (cdr msg-and-args)
-		   '() ) ) ) ) )) )
+  (lambda (form r c)
+    (##sys#check-syntax 'assert form '#(_ 1))
+    (let* ((exp (cadr form))
+	   (msg-and-args (cddr form))
+	   (%if (r 'if))
+	   (%quote (r 'quote))
+	   (msg (if (eq? '() msg-and-args)
+		    `(##core#immutable '"assertion failed")
+		    (car msg-and-args) ) ) )
+      `(,%if (##core#check ,exp)
+	     (##core#undefined)
+	     (##sys#error 
+	      ,msg 
+	      ,@(if (fx> (length msg-and-args) 1)
+		    (cdr msg-and-args)
+		    `((,%quote ,(##sys#strip-syntax exp))))))))))
 
 (##sys#extend-macro-environment
  'ensure
diff --git a/chicken.h b/chicken.h
index 1c6e2597..716aa58e 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1277,8 +1277,10 @@ extern double trunc(double);
 #define C_a_i_flonum_floor(ptr, n, x)   C_flonum(ptr, C_floor(C_flonum_magnitude(x)))
 #define C_a_i_flonum_round(ptr, n, x)   C_flonum(ptr, C_round(C_flonum_magnitude(x)))
 
-#define C_a_i_f32vector_ref(ptr, n, b, i)  C_flonum(ptr, ((float *)C_data_pointer(b))[ C_unfix(i) ])
-#define C_a_i_f64vector_ref(ptr, n, b, i)  C_flonum(ptr, ((double *)C_data_pointer(b))[ C_unfix(i) ])
+#define C_a_i_f32vector_ref(ptr, n, b, i)  C_flonum(ptr, ((float *)C_data_pointer(C_block_item((b), 1)))[ C_unfix(i) ])
+#define C_a_i_f64vector_ref(ptr, n, b, i)  C_flonum(ptr, ((double *)C_data_pointer(C_block_item((b), 1)))[ C_unfix(i) ])
+#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_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)))
diff --git a/distribution/manifest b/distribution/manifest
index e0efa5d0..927073cd 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -161,6 +161,7 @@ tests/inlining-tests.scm
 tests/locative-stress-test.scm
 tests/r4rstest.scm
 tests/runtests.sh
+tests/srfi-4-tests.scm
 tests/srfi-18-tests.scm
 tests/hash-table-tests.scm
 tests/apply-test.scm
diff --git a/srfi-4.scm b/srfi-4.scm
index 33d1c0d4..77bdde1a 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -118,8 +118,12 @@ EOF
 (define (##sys#s16vector-set! v i x) (##core#inline "C_s16poke" (##core#inline "C_slot" v 1) i x))
 (define (##sys#u32vector-set! v i x) (##core#inline "C_u32poke" (##core#inline "C_slot" v 1) i x))
 (define (##sys#s32vector-set! v i x) (##core#inline "C_s32poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#f32vector-set! v i x) (##core#inline "C_f32poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#f64vector-set! v i x) (##core#inline "C_f64poke" (##core#inline "C_slot" v 1) i x))
+
+(define (##sys#f32vector-set! v i x)
+  (##core#inline "C_u_i_f32vector_set" v i x))
+
+(define (##sys#f64vector-set! v i x)
+  (##core#inline "C_u_i_f64vector_set" v i x))
 
 
 ;;; Get vector length:
diff --git a/tests/fft.scm b/tests/fft.scm
index 787fcebb..ca28bb3a 100644
--- a/tests/fft.scm
+++ b/tests/fft.scm
@@ -25,8 +25,7 @@
     (defalias fl* fp*)
     (defalias fl/ fp/)
     (defalias fl+ fp+)
-    (defalias fl- fp-)
-    (defalias flsqrt sqrt)))
+    (defalias fl- fp-)))
  (else))
 
 (cond-expand
@@ -2064,7 +2063,7 @@
     (let ((a
 	   (make-f64vector (fx* two^n 2) 0.)))
       (do ((i 0 (fx+ i 1)))
-	  ((fx= i iters))
+	  ((fx= i iters)) ; (write table) (newline))
 	(direct-fft-recursive-4 a table)
 	(inverse-fft-recursive-4 a table)))))
 
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 52246a22..f2267793 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -155,6 +155,9 @@ echo "======================================== fixnum tests ..."
 $compile fixnum-tests.scm
 ./a.out
 
+echo "======================================== srfi-4 tests ..."
+$interpret -s srfi-4-tests.scm
+
 echo "======================================== srfi-18 tests ..."
 $interpret -s srfi-18-tests.scm
 echo "*** Skipping \"feeley-dynwind\" (for now) ***"
@@ -208,7 +211,7 @@ $compile -e embedded2.scm
 ./a.out
 
 echo "======================================== timing compilation ..."
-time $compile compiler.scm -S -O5 -debug pb -vv
+time $compile compiler.scm -S -O5 -debug pb -v
 time ./a.out
 
 echo "======================================== running floating-point benchmark ..."
diff --git a/tests/srfi-4-tests.scm b/tests/srfi-4-tests.scm
new file mode 100644
index 00000000..126fc294
--- /dev/null
+++ b/tests/srfi-4-tests.scm
@@ -0,0 +1,30 @@
+;;;; srfi-4-tests.scm
+
+
+(use srfi-1 srfi-4)
+
+
+(define-syntax (test1 x r c)
+  (let* ((t (strip-syntax (cadr x)))
+	 (name (symbol->string (strip-syntax t))))
+    (define (conc op)
+      (string->symbol (string-append name op)))
+    `(let ((x (,(conc "vector") 100 101)))
+       (print x)
+       (assert (= 100 (,(conc "vector-ref") x 0)))
+       (,(conc "vector-set!") x 1 99)
+       (assert (= 99 (,(conc "vector-ref") x 1)))
+       (assert (= 2 (,(conc "vector-length") x)))
+       (assert
+	(every =
+	 '(100 99)
+	 (,(conc "vector->list") x))))))
+
+(test1 u8)
+(test1 u16)
+(test1 u32)
+(test1 s8)
+(test1 s16)
+(test1 s32)
+(test1 f32)
+(test1 f64)
Trap