master: arm64: better complex float array VOPs
stassats via Sbcl-commits <[email protected]> Sun, 28 Jun 2026 13:03:28 +0000
| Newsgroups | gmane.lisp.steel-bank.cvs |
|---|---|
| Message-ID | <[email protected]> |
The branch "master" has been updated in SBCL:
via ed6a7c9a44871d95e4356d70506666a6aa42f1fc (commit)
from a549f8c1356a107312eeaff707dc0e6b8d867d98 (commit)
- Log -----------------------------------------------------------------
commit ed6a7c9a44871d95e4356d70506666a6aa42f1fc
Author: Stas Boukarev <[email protected]>
Date: Sun Jun 28 03:21:37 2026 +0300
arm64: better complex float array VOPs
---
src/compiler/arm64/array.lisp | 92 +++++++++++++++++++-----------------------
src/compiler/arm64/macros.lisp | 4 +-
2 files changed, 44 insertions(+), 52 deletions(-)
diff --git a/src/compiler/arm64/array.lisp b/src/compiler/arm64/array.lisp
index 353782e12..eb747f361 100644
--- a/src/compiler/arm64/array.lisp
+++ b/src/compiler/arm64/array.lisp
@@ -253,7 +253,8 @@
(partial simple-array-signed-byte-32 tagged-num :word t signed-reg)
(partial simple-array-single-float single-float :single-float nil single-reg)
- (full simple-array-double-float double-float double-reg))
+ (full simple-array-double-float double-float double-reg)
+ (full simple-array-complex-single-float complex-single-float complex-single-reg))
;;; Integer vectors whose elements are smaller than a byte. I.e. bit, 2-bit,
;;; and 4-bit vectors.
@@ -424,69 +425,58 @@
;;; Complex float arrays.
-(define-vop (data-vector-ref/simple-array-complex-single-float)
- (:note "inline array access")
- (:translate data-vector-ref)
- (:policy :fast-safe)
- (:args (object :scs (descriptor-reg) :to :result)
- (index :scs (any-reg)))
- (:arg-types simple-array-complex-single-float positive-fixnum)
- (:results (value :scs (complex-single-reg)))
- (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset)
- (:result-types complex-single-float)
- (:generator 5
- (inst lsl offset index (- word-shift n-fixnum-tag-bits))
- (inst add offset offset (- (* vector-data-offset n-word-bytes)
- other-pointer-lowtag))
- (inst ldr value (@ object offset))))
-
-(define-vop (data-vector-set/simple-array-complex-single-float)
- (:note "inline array store")
- (:translate data-vector-set)
- (:policy :fast-safe)
- (:args (object :scs (descriptor-reg) :to :result)
- (index :scs (any-reg))
- (value :scs (complex-single-reg)))
- (:arg-types simple-array-complex-single-float positive-fixnum
- complex-single-float)
- (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset)
- (:generator 5
- (inst lsl offset index (- word-shift n-fixnum-tag-bits))
- (inst add offset offset (- (* vector-data-offset n-word-bytes)
- other-pointer-lowtag))
- (inst str value (@ object offset))))
(define-vop (data-vector-ref/simple-array-complex-double-float)
- (:note "inline array access")
(:translate data-vector-ref)
(:policy :fast-safe)
- (:args (object :scs (descriptor-reg) :to :result)
- (index :scs (any-reg)))
- (:arg-types simple-array-complex-double-float positive-fixnum)
+ (:args (object :scs (descriptor-reg))
+ (index :scs (any-reg unsigned-reg signed-reg immediate)))
+ (:arg-types simple-array-complex-double-float tagged-num)
(:results (value :scs (complex-double-reg)))
(:result-types complex-double-float)
- (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset)
- (:generator 7
- (inst lsl offset index (1+ (- word-shift n-fixnum-tag-bits)))
- (inst add offset offset (- (* vector-data-offset n-word-bytes)
- other-pointer-lowtag))
- (inst ldr value (@ object offset))))
+ (:generator 5
+ (sc-case index
+ (immediate
+ (inst ldr value
+ (@ object
+ (load-store-offset
+ (- (+ (ash vector-data-offset word-shift)
+ (ash (tn-value index) (1+ word-shift)))
+ other-pointer-lowtag)))))
+ (t
+ (inst add tmp-tn object
+ (lsl index
+ (1+ (- word-shift
+ (if (sc-is index any-reg)
+ n-fixnum-tag-bits
+ 0)))))
+ (loadw value tmp-tn vector-data-offset other-pointer-lowtag)))))
(define-vop (data-vector-set/simple-array-complex-double-float)
- (:note "inline array store")
(:translate data-vector-set)
(:policy :fast-safe)
- (:args (object :scs (descriptor-reg) :to :result)
- (index :scs (any-reg))
+ (:args (object :scs (descriptor-reg))
+ (index :scs (any-reg unsigned-reg signed-reg immediate))
(value :scs (complex-double-reg)))
- (:arg-types simple-array-complex-double-float positive-fixnum
+ (:arg-types simple-array-complex-double-float tagged-num
complex-double-float)
- (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset)
+ (:vop-var vop)
(:generator 5
- (inst lsl offset index (1+ (- word-shift n-fixnum-tag-bits)))
- (inst add offset offset (- (* vector-data-offset n-word-bytes)
- other-pointer-lowtag))
- (inst str value (@ object offset))))
+ (sc-case index
+ (immediate
+ (inst str value
+ (@ object
+ (load-store-offset
+ (- (+ (ash vector-data-offset word-shift)
+ (ash (tn-value index) (1+ word-shift)))
+ other-pointer-lowtag)))))
+ (t
+ (let ((unshift
+ (if (sc-is index any-reg)
+ n-fixnum-tag-bits
+ 0)))
+ (inst add tmp-tn object (lsl index (1+ (- word-shift unshift)))))
+ (storew value tmp-tn vector-data-offset other-pointer-lowtag)))))
;;; These vops are useful for accessing the bits of a vector irrespective of
;;; what type of vector it is.
diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp
index 07d4b457a..6f412a910 100644
--- a/src/compiler/arm64/macros.lisp
+++ b/src/compiler/arm64/macros.lisp
@@ -427,6 +427,8 @@
(value :scs (,@scs ,(case el-type
(double-float
'(fp-immediate (eql (tn-value tn) 0d0)))
+ (complex-single-float
+ '(fp-immediate (eql (tn-value tn) #c(0f0 0f0))))
(t
'zero)))))
(:arg-types ,type tagged-num ,el-type)
@@ -438,7 +440,7 @@
'((when barrier
(emit-gengc-barrier object nil tmp-tn t))))
,@(case el-type
- (double-float
+ ((double-float complex-single-float)
'((when (sc-is value fp-immediate)
(setf value zr-tn)))))
(sc-case index
-----------------------------------------------------------------------
hooks/post-receive
--
SBCL