4 (let ((arr1 (make-array 10 :element-type
'single-float
:initial-element
0f0
))
5 (arr2 (make-array 10 :element-type
'single-float
:initial-element
0f0
)))
7 (loop for i from
0 below
10
9 (aref arr1 i
) (float (* i
100))
10 (aref arr2 i
) (float i
)))
12 (format t
"Before: ~S~%~S~%" arr1 arr2
)
13 (format t
"b <- a + b, idx 0~%")
15 (sb-sys:%primitive sb-vm
::%sse-add
/simple-array-single-float-1 arr2 arr2 arr1
0)
17 (format t
"After: ~S~%~S~%" arr1 arr2
)
19 (format t
"a <- sqrt(b), idx 4~%")
21 (sb-sys:%primitive sb-vm
::%sse-sqrt
/simple-array-single-float-1 arr1 arr2
4)
23 (format t
"After: ~S~%~S~%" arr1 arr2
)
28 (let ((arr1 (make-array 16 :element-type
'(unsigned-byte 8) :initial-element
0))
29 (arr2 (make-array 16 :element-type
'(unsigned-byte 8) :initial-element
0)))
31 (loop for i from
0 below
16 do
(setf (aref arr1 i
) (* (1+ i
) 10)
32 (aref arr2 i
) (1+ i
)))
34 (format t
"Before: ~S~%~S~%" arr1 arr2
)
35 (format t
"b <- a+b, idx 4~%")
37 (sb-sys:%primitive sb-vm
::%sse-add
/simple-array-unsigned-byte-8-1 arr2 arr1 arr2
4)
39 (format t
"After: ~S~%~S~%" arr1 arr2
)
43 (defparameter +sse-highbit-single-float-mask
+ (make-array 16 :element-type
'(unsigned-byte 8)
44 :initial-contents
'(0 0 0 128
48 (defparameter +sse-lowbits-single-float-mask
+ (make-array 16 :element-type
'(unsigned-byte 8)
49 :initial-contents
'(255 255 255 127
54 (defun sign (float-array)
55 (let ((res (make-array 16 :element-type
'(unsigned-byte 8) :initial-element
0)))
57 (sb-sys:%primitive sb-vm
::%SSE-AND
/SIMPLE-ARRAY-SINGLE-FLOAT
/SIMPLE-ARRAY-UNSIGNED-BYTE-8-1
60 +sse-highbit-single-float-mask
+
62 (values-list (mapcar #'(lambda (x) (/= x
0)) (list (aref res
3) (aref res
7) (aref res
11) (aref res
15))))))
64 (defun %neg
(float-array)
65 (let ((res (make-array 4 :element-type
'single-float
:initial-element
0f0
)))
67 (sb-sys:%primitive sb-vm
::%SSE-XOR
/SIMPLE-ARRAY-SINGLE-FLOAT
/SIMPLE-ARRAY-UNSIGNED-BYTE-8-1
70 +sse-highbit-single-float-mask
+
74 (defun %abs
(float-array)
75 (let ((res (make-array 4 :element-type
'single-float
:initial-element
0f0
)))
77 (sb-sys:%primitive sb-vm
::%SSE-AND
/SIMPLE-ARRAY-SINGLE-FLOAT
/SIMPLE-ARRAY-UNSIGNED-BYTE-8-1
80 +sse-lowbits-single-float-mask
+
85 (let ((arr1 (make-array 10 :element-type
'single-float
:initial-element
0f0
)))
86 (loop for i from
0 below
10 do
(setf (aref arr1 i
)
87 (float (* (expt -
1 i
) (- (* (1+ i
) 10) (* 2 i i
))))))
88 (format t
"array: ~S~%" arr1
)
89 (multiple-value-bind (s1 s2 s3 s4
) (sign arr1
)
90 (format t
"sign0->3: ~A ~A ~A ~A~%" s1 s2 s3 s4
))
91 (format t
"neg: ~S~%" (%neg arr1
))
92 (format t
"abs: ~S~%" (%abs arr1
))