Compiler trouble with sb-simd-sse2:f64.2-horizonal functions
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
SBCL |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
(require "SB-SIMD")
(setf sb-ext:
;; This works as expected:
(sb-simd-
;; This does not:
(let ((x (sb-simd-
(sb-simd-
;;=>0.0d0
(defmacro baz (body)
`(let ((x (sb-simd-
,@(cdr body)
(list
(
(
(
(
(
(
(
)))
(baz '(declare (optimize debug))) ;=> (4.68d0 5.1d0 4.4501477170144
(baz '(declare (optimize (debug 2)))) ;=> (4.68d0 5.1d0 4.4501477170144
(baz '(declare (optimize (debug 1)))) ;=> (0.0d0 1.2d0 0.0d0 1.2d0 0.0d0 1.2d0 1.2d0)
(baz '(declare (optimize (speed 0) (safety 3) (compilation-speed 0) (space 0) (debug 1)))) ;=> (0.0d0 1.2d0 0.0d0 1.2d0 0.0d0 1.2d0 1.2d0)
(baz '(declare (special x))) ;=> (4.68d0 5.1d0 4.4501477170144
(let ((x (sb-simd-
(loop for i in (apropos-list "f64.2-horizontal" (find-package "SB-SIMD-SSE2") t)
collect (funcall i x)))
;;=> (4.68d0 5.1d0 4.4501477170144
;; sb-eval and sb-fasteval both function correctly
(setf sb-ext:
(baz '(declare (optimize debug))) ;=> (4.68d0 5.1d0 4.4501477170144
(baz '(declare (optimize (debug 1)))) ;=> (4.68d0 5.1d0 4.4501477170144
(baz '(declare (special x))) ;=> (4.68d0 5.1d0 4.4501477170144
;; Other things that work as expected:
(setf sb-ext:
(let ((x (sb-simd-
(sb-simd-
;;=>4.68d0
(let ((x (sb-kernel:
(sb-simd-
;;=> #<SIMD-PACK 2.4000000000000d+0 7.8000000000000d+0>
(lisp-implement
The behavior described above remains unchanged when tested in a previous release and has probably been the same since sb-simd was introduced.
Changed in sbcl: | |
assignee: | nobody → Marco Heisig (marco-heisig-h) |
Changed in sbcl: | |
status: | Confirmed → Fix Committed |
assignee: | Marco Heisig (marco-heisig-h) → nobody |
Changed in sbcl: | |
status: | Fix Committed → Fix Released |
I think the issue might be with f64.2-shuffle, which is used by f64.2-values, which in turn is used to define the horizontal functions mentioned above.
(require "SB-SIMD") *evaluator- mode* :compile)
(setf sb-ext:
(sb-simd- sse2:f64. 2-shuffle (sb-simd- sse2:make- f64.2 1.2d0 3.9d0) 1)
=> #<SIMD-PACK 3.9000000000000d+0 1.2000000000000d+0>
(let ((x (sb-simd- sse2:make- f64.2 1.2d0 3.9d0))) sse2:f64. 2-shuffle x 1))
(sb-simd-
=> #<SIMD-PACK 0.0000000000000d+0 1.2000000000000d+0>
(let ((x (sb-simd- sse2:make- f64.2 1.2d0 3.9d0))) sse2:f64. 2-shuffle x 1))
(declare (optimize (debug 2)))
(sb-simd-
=> #<SIMD-PACK 3.9000000000000d+0 1.2000000000000d+0>
As above, f64.2-shuffle works fine with sb-eval and sb-fasteval.
You could "fix" f64.2-values and the horizontal functions with the following, but it would be better to figure out the cause of the f64.2-shuffle trouble.
From d4a01c7c1d10087 e33c025023b727c d41cbd1441 Mon Sep 17 00:00:00 2001 sse2:f64. 2-values
From: me <email address hidden>
Date: Wed, 29 Mar 2023 01:32:58 +0000
Subject: [PATCH] Adjust sb-simd-
--- sb-simd/ code/define- fake-vops. lisp | 2 +-
contrib/
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contrib/ sb-simd/ code/define- fake-vops. lisp b/contrib/ sb-simd/ code/define- fake-vops. lisp .e0099c63e 100644 sb-simd/ code/define- fake-vops. lisp sb-simd/ code/define- fake-vops. lisp -from-p128 x)
index 4432791c4.
--- a/contrib/
+++ b/contrib/
@@ -420,7 +420,7 @@
(define-fake-vop f64.2-values (x)
(values
(%f64!
- (%f64!-from-p128 (%f64.2-shuffle x 1))))
+ (%f64!-from-p128 (%f64.2-unpackhi x x))))
(define-fake-vop f64.2-broadcast (x)
(let ((v (%f64.2!-from-f64 x)))
--
2.39.1