comparison bindings/sb-alien/interface.lisp @ 636:9cda689dcc20

Use an appropriate data copier for the platform's bit width Dispatch on sb-vm:n-word-bits, though I think sbcl itself should probably define a system-area-double-float-copy bit-bash function. This also fixes a thinko, where only half of the times data was being copied, even on 64-bit platforms. Sheesh. Fixes #32
author mas01cr
date Tue, 29 Sep 2009 16:23:42 +0000
parents 641daceae79c
children 368c8c72e723
comparison
equal deleted inserted replaced
635:641daceae79c 636:9cda689dcc20
114 (nvectors (slot d 'nvectors)) 114 (nvectors (slot d 'nvectors))
115 (data (make-array (list nvectors dim) :element-type 'double-float)) 115 (data (make-array (list nvectors dim) :element-type 'double-float))
116 (vector (sb-ext:array-storage-vector data)) 116 (vector (sb-ext:array-storage-vector data))
117 ;; FIXME: this shares KEY 117 ;; FIXME: this shares KEY
118 (datum (%make-datum :key key :data data))) 118 (datum (%make-datum :key key :data data)))
119 (sb-kernel:system-area-ub64-copy (alien-sap (slot d 'data)) 0 119 (flet ((system-area-dfloat-copy (from-sap from-offset to-sap to-offset ndfloats)
120 (sb-sys:vector-sap vector) 0 120 ;; FIXME: the horror
121 (* dim nvectors)) 121 #+#.(cl:if (cl:= sb-vm:n-word-bits 64) '(:and) '(:or))
122 (unless (null-alien (slot d 'times)) 122 (sb-kernel:system-area-ub64-copy
123 (let ((times (make-array nvectors :element-type 'double-float))) 123 from-sap from-offset to-sap to-offset ndfloats)
124 (sb-kernel:system-area-ub64-copy (alien-sap (slot d 'times)) 0 124 #-#.(cl:if (cl:= sb-vm:n-word-bits 64) '(:and) '(:or))
125 (sb-sys:vector-sap times) 0 125 (sb-kernel:system-area-ub32-copy
126 nvectors) 126 from-sap from-offset to-sap to-offset (* 2 ndfloats))))
127 (setf (datum-times datum) times))) 127 (system-area-dfloat-copy (alien-sap (slot d 'data)) 0
128 (unless (null-alien (slot d 'power)) 128 (sb-sys:vector-sap vector) 0
129 (let ((power (make-array nvectors :element-type 'double-float))) 129 (* dim nvectors))
130 (sb-kernel:system-area-ub64-copy (alien-sap (slot d 'power)) 0 130 (unless (null-alien (slot d 'times))
131 (sb-sys:vector-sap power) 0 131 (let ((times (make-array (* 2 nvectors) :element-type 'double-float)))
132 nvectors) 132 (system-area-dfloat-copy (alien-sap (slot d 'times)) 0
133 (setf (datum-power datum) power))) 133 (sb-sys:vector-sap times) 0
134 (%free-datum (slot-value db 'alien) (addr d)) 134 (* 2 nvectors))
135 datum))) 135 (setf (datum-times datum) times)))
136 (unless (null-alien (slot d 'power))
137 (let ((power (make-array nvectors :element-type 'double-float)))
138 (system-area-dfloat-copy (alien-sap (slot d 'power)) 0
139 (sb-sys:vector-sap power) 0
140 nvectors)
141 (setf (datum-power datum) power)))
142 (%free-datum (slot-value db 'alien) (addr d))
143 datum))))
136 144
137 (defstruct result 145 (defstruct result
138 (key "" :type string) 146 (key "" :type string)
139 (distance 0d0 :type double-float) 147 (distance 0d0 :type double-float)
140 (qpos 0 :type (and unsigned-byte fixnum)) 148 (qpos 0 :type (and unsigned-byte fixnum))