~ chicken-core (chicken-5) d6800beb4017c6f07ab511e85543a2d471c26ad6


commit d6800beb4017c6f07ab511e85543a2d471c26ad6
Author:     felix <felix@y.(none)>
AuthorDate: Mon Mar 1 14:09:34 2010 +0100
Commit:     felix <felix@y.(none)>
CommitDate: Mon Mar 1 14:09:34 2010 +0100

    unboxing only effective in unsafe mode; added unboxed rewrites for pointer ops

diff --git a/batch-driver.scm b/batch-driver.scm
index 3f9fdf30..4812bbd4 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -129,9 +129,10 @@
 	  (##sys#hash-table-set!
 	   ##sys#line-number-database
 	   (car data2)
-	   (alist-cons data2 val
-		       (or (##sys#hash-table-ref ##sys#line-number-database (car data2))
-			   '() ) ) ) )
+	   (alist-cons 
+	    data2 val
+	    (or (##sys#hash-table-ref ##sys#line-number-database (car data2))
+		'() ) ) ) )
 	data2) )
 
     (define (arg-val str)
@@ -612,7 +613,7 @@
 				       (> (- (cputime) start-time) funny-message-timeout))
 			      (display "(don't worry - still compiling...)\n") )
 			    (print-node "closure-converted" '|9| node2)
-			    (when unbox
+			    (when (and unbox unsafe)
 			      (debugging 'p "performing unboxing")
 			      (begin-time)
 			      (perform-unboxing! node2)
diff --git a/c-platform.scm b/c-platform.scm
index 9de9fd05..cfa2b904 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -146,6 +146,11 @@
     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? address->pointer pointer->address
+    pointer+ pointer=?
+    pointer-u8-ref pointer-s8-ref pointer-u16-ref pointer-s16-ref
+    pointer-u32-ref pointer-s32-ref pointer-f32-ref pointer-f64-ref
+    pointer-u8-set! pointer-s8-set! pointer-u16-set! pointer-s16-set!
+    pointer-u32-set! pointer-s32-set! pointer-f32-set! pointer-f64-set!
     printf sprintf format) )
 
 (define internal-bindings
@@ -817,6 +822,25 @@
 (rewrite 'string 16 #f "C_a_i_string" #t #t) ; the last #t is actually too much, but we don't care
 (rewrite 'address->pointer 16 1 "C_a_i_address_to_pointer" #f 2)
 (rewrite 'pointer->address 16 1 "C_a_i_pointer_to_address" #f words-per-flonum)
+(rewrite 'pointer+ 16 2 "C_a_i_pointer_inc" #f 2)
+
+(rewrite 'pointer-u8-ref 2 1 "C_u_i_pointer_u8_ref" #f)
+(rewrite 'pointer-s8-ref 2 1 "C_u_i_pointer_s8_ref" #f)
+(rewrite 'pointer-u16-ref 2 1 "C_u_i_pointer_u16_ref" #f)
+(rewrite 'pointer-s16-ref 2 1 "C_u_i_pointer_s16_ref" #f)
+(rewrite 'pointer-u8-set! 2 2 "C_u_i_pointer_u8_set" #f)
+(rewrite 'pointer-s8-set! 2 2 "C_u_i_pointer_s8_set" #f)
+(rewrite 'pointer-u16-set! 2 2 "C_u_i_pointer_u16_set" #f)
+(rewrite 'pointer-s16-set! 2 2 "C_u_i_pointer_s16_set" #f)
+(rewrite 'pointer-u32-set! 2 2 "C_u_i_pointer_u32_set" #f)
+(rewrite 'pointer-s32-set! 2 2 "C_u_i_pointer_s32_set" #f)
+(rewrite 'pointer-f32-set! 2 2 "C_u_i_pointer_f32_set" #f)
+(rewrite 'pointer-f64-set! 2 2 "C_u_i_pointer_f64_set" #f)
+
+(rewrite 'pointer-u32-ref 16 1 "C_a_u_i_pointer_u32_ref" #f words-per-flonum)
+(rewrite 'pointer-s32-ref 16 1 "C_a_u_i_pointer_s32_ref" #f words-per-flonum)
+(rewrite 'pointer-f32-ref 16 1 "C_a_u_i_pointer_f32_ref" #f words-per-flonum)
+(rewrite 'pointer-f64-ref 16 1 "C_a_u_i_pointer_f64_ref" #f words-per-flonum)
 
 (rewrite
  '##sys#setslot 8
diff --git a/chicken.h b/chicken.h
index 7d671a97..85ee46b0 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1185,6 +1185,8 @@ 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_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))
 #define C_a_int_to_num(ptr, n, i)       C_int_to_num(ptr, i)
 #define C_a_unsigned_int_to_num(ptr, n, i)  C_unsigned_int_to_num(ptr, i)
 #define C_a_double_to_num(ptr, n)       C_double_to_number(C_flonum(ptr, n))
@@ -1292,6 +1294,33 @@ extern double trunc(double);
 
 #define C_u_i_bit_setp(x, i)            C_mk_bool((C_unfix(x) & (1 << C_unfix(i))) != 0)
 
+#define C_u_i_pointer_u8_ref(ptr)         C_fix(((unsigned char *)C_block_item(ptr, 0)))
+#define C_u_i_pointer_s8_ref(ptr)         C_fix(((char *)C_block_item(ptr, 0)))
+#define C_u_i_pointer_u16_ref(ptr)        C_fix(((unsigned short *)C_block_item(ptr, 0)))
+#define C_u_i_pointer_s16_ref(ptr)        C_fix(((short *)C_block_item(ptr, 0)))
+#define C_a_u_i_pointer_u32_ref(ap, n, ptr)  \
+  C_unsigned_int_to_num(ap, *((C_u32 *)C_block_item(ptr, 0)))
+#define C_a_u_i_pointer_s32_ref(ap, n, ptr)  \
+  C_int_to_num(ap, *((C_s32 *)C_block_item(ptr, 0)))
+#define C_a_u_i_pointer_f32_ref(ap, n, ptr)  C_flonum(ap, *((float *)C_block_item(ptr, 0)))
+#define C_a_u_i_pointer_f64_ref(ap, n, ptr)  C_flonum(ap, *((double *)C_block_item(ptr, 0)))
+#define C_u_i_pointer_u8_set(ptr, x)  \
+  (*((unsigned char *)C_block_item(ptr, 0)) = C_unfix(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_s8_set(ptr, x)  \
+  (*((char *)C_block_item(ptr, 0)) = C_unfix(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_u16_set(ptr, x)  \
+  (*((unsigned short *)C_block_item(ptr, 0)) = C_unfix(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_s16_set(ptr, x)  \
+  (*((short *)C_block_item(ptr, 0)) = C_unfix(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_u32_set(ptr, x)  \
+  (*((C_u32 *)C_block_item(ptr, 0)) = C_num_to_unsigned_int(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_s32_set(ptr, x)  \
+  (*((C_s32 *)C_block_item(ptr, 0)) = C_num_to_int(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_f32_set(ptr, x)  \
+  (*((float *)C_block_item(ptr, 0)) = C_flonum_magnitude(x), C_SCHEME_UNDEFINED)
+#define C_u_i_pointer_f64_set(ptr, x)  \
+  (*((double *)C_block_item(ptr, 0)) = C_flonum_magnitude(x), C_SCHEME_UNDEFINED)
+
 #ifdef C_BIG_ENDIAN
 # ifdef C_SIXTY_FOUR
 #  define C_lihdr(x, y, z)              ((C_LAMBDA_INFO_TYPE >> 56) & 0xff), \
@@ -1321,6 +1350,26 @@ extern double trunc(double);
 #define C_ub_i_flonum_greater_or_equal_p(n1, n2)  ((n1) >= (n2))
 #define C_ub_i_flonum_less_or_equal_p(n1, n2)  ((n1) <= (n2))
 
+#define C_ub_i_pointer_inc(p, n)        ((void *)((unsigned char *)(p) + (n)))
+#define C_ub_i_pointer_eqp(p1, p2)      ((p1) == (p2))
+
+#define C_ub_i_pointer_u8_ref(p)        (*((unsigned char *)(p)))
+#define C_ub_i_pointer_s8_ref(p)        (*((char *)(p)))
+#define C_ub_i_pointer_u16_ref(p)       (*((unsigned short *)(p)))
+#define C_ub_i_pointer_s16_ref(p)       (*((short *)(p)))
+#define C_ub_i_pointer_u32_ref(p)       (*((C_u32 *)(p)))
+#define C_ub_i_pointer_s32_ref(p)       (*((C_s32 *)(p)))
+#define C_ub_i_pointer_f32_ref(p)       (*((float *)(p)))
+#define C_ub_i_pointer_f64_ref(p)       (*((double *)(p)))
+#define C_ub_i_pointer_u8_set(p, n)     (*((unsigned char *)(p)) = (n))
+#define C_ub_i_pointer_s8_set(p, n)     (*((char *)(p)) = (n))
+#define C_ub_i_pointer_u16_set(p, n)    (*((unsigned short *)(p)) = (n))
+#define C_ub_i_pointer_s16_set(p, n)    (*((short *)(p)) = (n))
+#define C_ub_i_pointer_u32_set(p, n)    (*((C_u32 *)(p)) = (n))
+#define C_ub_i_pointer_s32_set(p, n)    (*((C_s32 *)(p)) = (n))
+#define C_ub_i_pointer_f32_set(p, n)    (*((float *)(p)) = (n))
+#define C_ub_i_pointer_f64_set(p, n)    (*((double *)(p)) = (n))
+
 #define C_end_of_main
 
 #ifdef C_PRIVATE_REPOSITORY
diff --git a/lolevel.scm b/lolevel.scm
index 64544d02..2139e6e5 100644
--- a/lolevel.scm
+++ b/lolevel.scm
@@ -45,7 +45,6 @@
 #endif
 
 #define C_w2b(x)                   C_fix(C_wordstobytes(C_unfix(x)))
-#define C_pointer_eqp(x, y)        C_mk_bool(C_c_pointer_nn(x) == C_c_pointer_nn(y))
 #define C_memmove_o(to, from, n, toff, foff) C_memmove((char *)(to) + (toff), (char *)(from) + (foff), (n))
 EOF
 ) )
@@ -355,54 +354,23 @@ EOF
 
 ;;; SRFI-4 number-vector:
 
-(define pointer-u8-set! (foreign-lambda* void ([c-pointer p] [int n]) "*((unsigned char *)p) = n;"))
-(define pointer-s8-set! (foreign-lambda* void ([c-pointer p] [int n]) "*((char *)p) = n;"))
-(define pointer-u16-set! (foreign-lambda* void ([c-pointer p] [int n]) "*((unsigned short *)p) = n;"))
-(define pointer-s16-set! (foreign-lambda* void ([c-pointer p] [int n]) "*((short *)p) = n;"))
-(define pointer-u32-set! (foreign-lambda* void ([c-pointer p] [int n]) "*((C_u32 *)p) = n;"))
-(define pointer-s32-set! (foreign-lambda* void ([c-pointer p] [int n]) "*((C_s32 *)p) = n;"))
-(define pointer-f32-set! (foreign-lambda* void ([c-pointer p] [double n]) "*((float *)p) = n;"))
-(define pointer-f64-set! (foreign-lambda* void ([c-pointer p] [float n]) "*((double *)p) = n;"))
-
-(define pointer-u8-ref
-  (getter-with-setter
-   (foreign-lambda* int ([c-pointer p]) "return(*((unsigned char *)p));")
-   pointer-u8-set!) )
-
-(define pointer-s8-ref
-  (getter-with-setter
-   (foreign-lambda* int ([c-pointer p]) "return(*((signed char *)p));")
-   pointer-s8-set!) )
-
-(define pointer-u16-ref
-  (getter-with-setter
-   (foreign-lambda* int ([c-pointer p]) "return(*((unsigned short *)p));")
-   pointer-u16-set!) )
-
-(define pointer-s16-ref
-  (getter-with-setter
-   (foreign-lambda* int ([c-pointer p]) "return(*((short *)p));")
-   pointer-s6-set!) )
-
-(define pointer-u32-ref
-  (getter-with-setter
-   (foreign-lambda* integer ([c-pointer p]) "return(*((C_u32 *)p));")
-   pointer-u32-set!) )
-
-(define pointer-s32-ref
-  (getter-with-setter
-   (foreign-lambda* integer ([c-pointer p]) "return(*((C_s32 *)p));")
-   pointer-s32-set!) )
-
-(define pointer-f32-ref
-  (getter-with-setter
-   (foreign-lambda* float ([c-pointer p]) "return(*((float *)p));")
-   pointer-f32-set!) )
-
-(define pointer-f64-ref
-  (getter-with-setter
-   (foreign-lambda* double ([c-pointer p]) "return(*((double *)p));")
-   pointer-f64-set!) )
+(define (pointer-u8-set! p n) (##core#inline "C_u_i_pointer_u8_set" p n))
+(define (pointer-s8-set! p n) (##core#inline "C_u_i_pointer_s8_set" p n))
+(define (pointer-u16-set! p n) (##core#inline "C_u_i_pointer_u16_set" p n))
+(define (pointer-s16-set! p n) (##core#inline "C_u_i_pointer_s16_set" p n))
+(define (pointer-u32-set! p n) (##core#inline "C_u_i_pointer_u32_set" p n))
+(define (pointer-s32-set! p n) (##core#inline "C_u_i_pointer_s32_set" p n))
+(define (pointer-f32-set! p n) (##core#inline "C_u_i_pointer_f32_set" p n))
+(define (pointer-f64-set! p n) (##core#inline "C_u_i_pointer_f64_set" p n))
+
+(define (pointer-u8-ref p) (##core#inline "C_u_i_pointer_u8_ref" p))
+(define (pointer-s8-ref p) (##core#inline "C_u_i_pointer_s8_ref" p))
+(define (pointer-u16-ref p) (##core#inline "C_u_i_pointer_u16_ref" p))
+(define (pointer-s16-ref p) (##core#inline "C_u_i_pointer_s16_ref" p))
+(define (pointer-u32-ref p) (##core#inline_allocate ("C_a_u_i_pointer_u32_ref" 4) p))
+(define (pointer-s32-ref p) (##core#inline_allocate ("C_a_u_i_pointer_s32_ref" 4) p))
+(define (pointer-f32-ref p) (##core#inline_allocate ("C_a_u_i_pointer_f32_ref" 4) p))
+(define (pointer-f64-ref p) (##core#inline_allocate ("C_a_u_i_pointer_f64_ref" 4) p))
 
 
 ;;; Procedures extended with data:
diff --git a/manual/faq b/manual/faq
index beca0597..ec91855c 100644
--- a/manual/faq
+++ b/manual/faq
@@ -463,6 +463,11 @@ The following extended bindings are handled specially:
 {{hash-table-ref}}
 {{block-set!}} {{number-of-slots}}
 {{first}} {{second}} {{third}} {{fourth}} {{null-pointer?}} {{pointer->object}}
+{{pointer+}} {{pointer=?}}
+{{pointer-u8-ref}} {{pointer-s8-ref}} {{pointer-u16-ref}} {{pointer-s16-ref}} 
+{{pointer-u32-ref}} {{pointer-s32-ref}} {{pointer-f32-ref}} {{pointer-f64-ref}} 
+{{pointer-u8-set!}} {{pointer-s8-set!}} {{pointer-u16-set!}} {{pointer-s16-set!}} 
+{{pointer-u32-set!}} {{pointer-s32-set!}} {{pointer-f32-set!}} {{pointer-f64-set!}} 
 {{make-record-instance}}
 {{locative-ref}} {{locative-set!}} {{locative?}} {{locative->object}} {{identity}}
 {{cpu-time}} {{error}} {{call/cc}} {{any?}}
diff --git a/support.scm b/support.scm
index 520d26ba..6b7b6d82 100644
--- a/support.scm
+++ b/support.scm
@@ -261,7 +261,9 @@
 		(if (exn? ex) 
 		    (exn-msg ex)
 		    (->string ex) ) ) 
-	(let ([xs (with-input-from-string str (lambda () (unfold eof-object? values (lambda (x) (read)) (read))))])
+	(let ([xs (with-input-from-string
+		      str
+		    (lambda () (unfold eof-object? values (lambda (x) (read)) (read))))])
 	  (cond [(null? xs) '(##core#undefined)]
 		[(null? (cdr xs)) (car xs)]
 		[else `(begin ,@xs)] ) ) ) ) ) )
diff --git a/unboxing.scm b/unboxing.scm
index 67c2f326..28e6a65a 100644
--- a/unboxing.scm
+++ b/unboxing.scm
@@ -35,7 +35,7 @@
   (when (##sys#fudge 13)
     (printf "[debug] ~?~%" fstr args)) )
 
-(define-syntax d (syntax-rules () ((_ . _) (void))))
+;(define-syntax d (syntax-rules () ((_ . _) (void))))
 
 
 (define (perform-unboxing! node)
@@ -47,12 +47,14 @@
       (let ((ae '()))
 
 	(define (boxed! v)		; 'boxed is sticky
+	  (d "boxing ~a" v )
 	  (cond ((assq v e) =>
 		 (lambda (a)
 		   (set-cdr! a #f) ) )
 		(else (set! e (alist-cons v #f e)))))
 
 	(define (unboxed! v t)
+	  (d "unboxing ~a -> ~a" v t)
 	  (cond ((assq v e) =>
 		 (lambda (a)
 		   (if (cdr a)
@@ -248,7 +250,7 @@
 	  (let ((subs (node-subexpressions n))
 		(params (node-parameters n))
 		(class (node-class n)) )
-	    ;;(d "walk: (~a) ~a ~a" pass2? class params)
+	    (d "walk: (~a) ~a ~a" pass2? class params)
 	    (case class
 
 	      ((##core#undefined
@@ -289,10 +291,9 @@
 			    (any unboxed-value? args))
 			(let ((alt (first rw))
 			      (atypes (second rw))
-			      (rtype (third rw))
-			      (safe? (fourth rw)))
+			      (rtype (third rw)))
 			  ;; result or arguments are unboxed - rewrite node to alternative
-			  (when (and (or unsafe safe?) pass2?)
+			  (when pass2?
 			    (rewrite! 
 			     n alt subs args atypes rtype 
 			     (and dest (assq dest e))))
@@ -369,7 +370,7 @@
 	       (for-each (o invalidate (cut walk <> #f #f pass2?)) subs)
 	       #f))))
 
-	;(d "walk lambda: ~a" id)
+	(d "walk lambda: ~a" id)
 	(walk body #f #f #f)
 	(walk body #f #f #t)))
     
@@ -387,14 +388,8 @@
      (begin
        (register-unboxed-op #f 'name 'atypes 'rtype 'alt) ...))))
 
-(define-syntax define-safe-unboxed-ops
-  (syntax-rules ()
-    ((_ (name atypes rtype alt) ...)
-     (begin
-       (register-unboxed-op #t 'name 'atypes 'rtype 'alt) ...))))
-
-(define (register-unboxed-op safe? name atypes rtype alt)
-  (##sys#put! (symbolify name) '##compiler#unboxed-op (list alt atypes rtype safe?)))
+(define (register-unboxed-op name atypes rtype alt)
+  (##sys#put! (symbolify name) '##compiler#unboxed-op (list alt atypes rtype)))
 
 
 ;; unboxed rewrites
@@ -430,24 +425,22 @@
   (C_flonum_lessp (flonum flonum) bool "C_ub_i_flonum_lessp")
   (C_flonum_greater_or_equal_p (flonum flonum) bool "C_ub_i_flonum_greater_or_equal_p")
   (C_flonum_less_or_equal_p (flonum flonum) bool "C_ub_i_flonum_less_or_equal_p")
-  ; address->pointer
-  ; pointer->address
-  ; pointer+
-  ; pointer=?
-  ; pointer-u8-ref
-  ; pointer-s8-ref
-  ; pointer-u16-ref
-  ; pointer-s16-ref
-  ; pointer-u32-ref
-  ; pointer-s32-ref
-  ; pointer-f32-ref
-  ; pointer-f64-ref
-  ; pointer-u8-set!
-  ; pointer-s8-set!
-  ; pointer-u16-set!
-  ; pointer-s16-set!
-  ; pointer-u32-set!
-  ; pointer-s32-set!
-  ; pointer-f32-set!
-  ; pointer-f64-set!
+  (C_a_u_i_pointer_inc (pointer fixnum) pointer "C_ub_i_pointer_inc")
+  (C_pointer_eqp (pointer pointer) bool "C_ub_i_pointer_eqp")
+  (C_u_i_pointer_u8_ref (pointer) fixnum "C_ub_i_pointer_u8_ref")
+  (C_u_i_pointer_s8_ref (pointer) fixnum "C_ub_i_pointer_s8_ref")
+  (C_u_i_pointer_u16_ref (pointer) fixnum "C_ub_i_pointer_u16_ref")
+  (C_u_i_pointer_s16_ref (pointer) fixnum "C_ub_i_pointer_s16_ref")
+  (C_u_i_pointer_u32_ref (pointer) fixnum "C_ub_i_pointer_u32_ref")
+  (C_u_i_pointer_s32_ref (pointer) fixnum "C_ub_i_pointer_s32_ref")
+  (C_u_i_pointer_f32_ref (pointer) flonum "C_ub_i_pointer_f32_ref")
+  (C_u_i_pointer_f64_ref (pointer) flonum "C_ub_i_pointer_f64_ref")
+  (C_u_i_pointer_u8_set (pointer fixnum) fixnum "C_ub_i_pointer_u8_ref")
+  (C_u_i_pointer_s8_set (pointer fixnum) fixnum "C_ub_i_pointer_s8_ref")
+  (C_u_i_pointer_u16_set (pointer fixnum) fixnum "C_ub_i_pointer_u16_ref")
+  (C_u_i_pointer_s16_set (pointer fixnum) fixnum "C_ub_i_pointer_s16_ref")
+  (C_u_i_pointer_u32_set (pointer fixnum) fixnum "C_ub_i_pointer_u32_ref")
+  (C_u_i_pointer_s32_set (pointer fixnum) fixnum "C_ub_i_pointer_s32_ref")
+  (C_u_i_pointer_f32_set (pointer flonum) flonum "C_ub_i_pointer_f32_ref")
+  (C_u_i_pointer_f64_set (pointer flonum) flonum "C_ub_i_pointer_f64_ref")
   )
Trap