mirror of
git://git.code.sf.net/p/sbcl/sbcl
synced 2026-09-10 07:26:40 -04:00
feat(sb-simd): add modular AVX-512F, AVX-512BW, and AVX-512DQ vector support
This commit is contained in:
parent
9c92f31492
commit
16a029c1e0
|
|
@ -40,7 +40,27 @@
|
|||
|
||||
(defun fma-supported-p ()
|
||||
(and (>= (cpuid 0) 1)
|
||||
(logbitp 12 (nth-value 2 (cpuid 1))))))
|
||||
(logbitp 12 (nth-value 2 (cpuid 1)))))
|
||||
|
||||
(defun avx512f-supported-p ()
|
||||
(and (>= (cpuid 0) 7)
|
||||
(logbitp 16 (nth-value 1 (cpuid 7 0)))))
|
||||
|
||||
(defun avx512dq-supported-p ()
|
||||
(and (>= (cpuid 0) 7)
|
||||
(logbitp 17 (nth-value 1 (cpuid 7 0)))))
|
||||
|
||||
(defun avx512cd-supported-p ()
|
||||
(and (>= (cpuid 0) 7)
|
||||
(logbitp 28 (nth-value 1 (cpuid 7 0)))))
|
||||
|
||||
(defun avx512bw-supported-p ()
|
||||
(and (>= (cpuid 0) 7)
|
||||
(logbitp 30 (nth-value 1 (cpuid 7 0)))))
|
||||
|
||||
(defun avx512vl-supported-p ()
|
||||
(and (>= (cpuid 0) 7)
|
||||
(logbitp 31 (nth-value 1 (cpuid 7 0))))))
|
||||
|
||||
#-x86-64
|
||||
(progn
|
||||
|
|
@ -69,6 +89,21 @@
|
|||
nil)
|
||||
|
||||
(defun fma-supported-p ()
|
||||
nil)
|
||||
|
||||
(defun avx512f-supported-p ()
|
||||
nil)
|
||||
|
||||
(defun avx512dq-supported-p ()
|
||||
nil)
|
||||
|
||||
(defun avx512cd-supported-p ()
|
||||
nil)
|
||||
|
||||
(defun avx512bw-supported-p ()
|
||||
nil)
|
||||
|
||||
(defun avx512vl-supported-p ()
|
||||
nil))
|
||||
|
||||
(defun neon-supported-p ()
|
||||
|
|
|
|||
|
|
@ -169,7 +169,203 @@
|
|||
(:generator
|
||||
(inst vxorpd dst dst dst)
|
||||
(inst movsd dst src)))
|
||||
)
|
||||
(define-custom-vop sb-simd-avx512f::f32!-from-p512
|
||||
(:args (src :to :save))
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vxorps dst dst dst)
|
||||
(inst vmovss dst dst src)))
|
||||
(define-custom-vop sb-simd-avx512f::f64!-from-p512
|
||||
(:args (src :to :save))
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vxorpd dst dst dst)
|
||||
(inst vmovsd dst dst src)))
|
||||
;; AVX-512F
|
||||
(macrolet ((def-f32 (name cmp)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vcmpps ,cmp k a b)
|
||||
(inst vpmovm2d dst k))))
|
||||
(def-f64 (name cmp)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vcmppd ,cmp k a b)
|
||||
(inst vpmovm2q dst k))))
|
||||
(def-i32 (name inst imm)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst ,inst k a b ,imm)
|
||||
(inst vpmovm2d dst k))))
|
||||
(def-i64 (name inst imm)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst ,inst k a b ,imm)
|
||||
(inst vpmovm2q dst k))))
|
||||
(def-i8 (name inst imm)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst ,inst k a b ,imm)
|
||||
(inst vpmovm2b dst k))))
|
||||
(def-i16 (name inst imm)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst ,inst k a b ,imm)
|
||||
(inst vpmovm2w dst k)))))
|
||||
(def-f32 sb-simd-avx512f::two-arg-f32.16= :eq)
|
||||
(def-f32 sb-simd-avx512f::two-arg-f32.16/= :neq)
|
||||
(def-f32 sb-simd-avx512f::two-arg-f32.16< :lt)
|
||||
(def-f32 sb-simd-avx512f::two-arg-f32.16<= :le)
|
||||
(def-f32 sb-simd-avx512f::two-arg-f32.16> :gt)
|
||||
(def-f32 sb-simd-avx512f::two-arg-f32.16>= :ge)
|
||||
|
||||
(def-f64 sb-simd-avx512f::two-arg-f64.8= :eq)
|
||||
(def-f64 sb-simd-avx512f::two-arg-f64.8/= :neq)
|
||||
(def-f64 sb-simd-avx512f::two-arg-f64.8< :lt)
|
||||
(def-f64 sb-simd-avx512f::two-arg-f64.8<= :le)
|
||||
(def-f64 sb-simd-avx512f::two-arg-f64.8> :gt)
|
||||
(def-f64 sb-simd-avx512f::two-arg-f64.8>= :ge)
|
||||
|
||||
(def-i32 sb-simd-avx512f::two-arg-s32.16= vpcmpd 0)
|
||||
(def-i32 sb-simd-avx512f::two-arg-s32.16/= vpcmpd 4)
|
||||
(def-i32 sb-simd-avx512f::two-arg-s32.16< vpcmpd 1)
|
||||
(def-i32 sb-simd-avx512f::two-arg-s32.16<= vpcmpd 2)
|
||||
(def-i32 sb-simd-avx512f::two-arg-s32.16> vpcmpd 6)
|
||||
(def-i32 sb-simd-avx512f::two-arg-s32.16>= vpcmpd 5)
|
||||
|
||||
(def-i32 sb-simd-avx512f::two-arg-u32.16= vpcmpud 0)
|
||||
(def-i32 sb-simd-avx512f::two-arg-u32.16/= vpcmpud 4)
|
||||
(def-i32 sb-simd-avx512f::two-arg-u32.16< vpcmpud 1)
|
||||
(def-i32 sb-simd-avx512f::two-arg-u32.16<= vpcmpud 2)
|
||||
(def-i32 sb-simd-avx512f::two-arg-u32.16> vpcmpud 6)
|
||||
(def-i32 sb-simd-avx512f::two-arg-u32.16>= vpcmpud 5)
|
||||
|
||||
(def-i64 sb-simd-avx512f::two-arg-s64.8= vpcmpq 0)
|
||||
(def-i64 sb-simd-avx512f::two-arg-s64.8/= vpcmpq 4)
|
||||
(def-i64 sb-simd-avx512f::two-arg-s64.8< vpcmpq 1)
|
||||
(def-i64 sb-simd-avx512f::two-arg-s64.8<= vpcmpq 2)
|
||||
(def-i64 sb-simd-avx512f::two-arg-s64.8> vpcmpq 6)
|
||||
(def-i64 sb-simd-avx512f::two-arg-s64.8>= vpcmpq 5)
|
||||
|
||||
(def-i64 sb-simd-avx512f::two-arg-u64.8= vpcmpuq 0)
|
||||
(def-i64 sb-simd-avx512f::two-arg-u64.8/= vpcmpuq 4)
|
||||
(def-i64 sb-simd-avx512f::two-arg-u64.8< vpcmpuq 1)
|
||||
(def-i64 sb-simd-avx512f::two-arg-u64.8<= vpcmpuq 2)
|
||||
(def-i64 sb-simd-avx512f::two-arg-u64.8> vpcmpuq 6)
|
||||
(def-i64 sb-simd-avx512f::two-arg-u64.8>= vpcmpuq 5)
|
||||
|
||||
(def-i8 sb-simd-avx512bw::two-arg-s8.64= vpcmpb 0)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-s8.64/= vpcmpb 4)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-s8.64< vpcmpb 1)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-s8.64<= vpcmpb 2)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-s8.64> vpcmpb 6)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-s8.64>= vpcmpb 5)
|
||||
|
||||
(def-i8 sb-simd-avx512bw::two-arg-u8.64= vpcmpub 0)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-u8.64/= vpcmpub 4)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-u8.64< vpcmpub 1)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-u8.64<= vpcmpub 2)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-u8.64> vpcmpub 6)
|
||||
(def-i8 sb-simd-avx512bw::two-arg-u8.64>= vpcmpub 5)
|
||||
|
||||
(def-i16 sb-simd-avx512bw::two-arg-s16.32= vpcmpw 0)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-s16.32/= vpcmpw 4)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-s16.32< vpcmpw 1)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-s16.32<= vpcmpw 2)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-s16.32> vpcmpw 6)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-s16.32>= vpcmpw 5)
|
||||
|
||||
(def-i16 sb-simd-avx512bw::two-arg-u16.32= vpcmpuw 0)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-u16.32/= vpcmpuw 4)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-u16.32< vpcmpuw 1)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-u16.32<= vpcmpuw 2)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-u16.32> vpcmpuw 6)
|
||||
(def-i16 sb-simd-avx512bw::two-arg-u16.32>= vpcmpuw 5))
|
||||
|
||||
(define-custom-vop sb-simd-avx512f::f32.16-blend
|
||||
(:args (a) (b) (mask))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:temporary (:sc single-avx512-reg) mask-reg tmp)
|
||||
(:temporary (:sc int-avx512-reg) zero)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vpxorq zero zero zero)
|
||||
(inst vpcmpd k mask zero 1)
|
||||
(inst vpmovm2d mask-reg k)
|
||||
(inst vandps tmp b mask-reg)
|
||||
(inst vandnps dst mask-reg a)
|
||||
(inst vorps dst dst tmp)))
|
||||
|
||||
(define-custom-vop sb-simd-avx512f::f64.8-blend
|
||||
(:args (a) (b) (mask))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:temporary (:sc double-avx512-reg) mask-reg tmp)
|
||||
(:temporary (:sc int-avx512-reg) zero)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vpxorq zero zero zero)
|
||||
(inst vpcmpq k mask zero 1)
|
||||
(inst vpmovm2q mask-reg k)
|
||||
(inst vandpd tmp b mask-reg)
|
||||
(inst vandnpd dst mask-reg a)
|
||||
(inst vorpd dst dst tmp)))
|
||||
|
||||
(macrolet ((def-blend (name)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a) (b) (mask))
|
||||
(:temporary (:sc mask-reg) k)
|
||||
(:temporary (:sc int-avx512-reg) zero tmp mask-reg)
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vpxorq zero zero zero)
|
||||
(inst vpcmpb k mask zero 1)
|
||||
(inst vpmovm2b mask-reg k)
|
||||
(inst vpandd tmp b mask-reg)
|
||||
(inst vpandnd dst mask-reg a)
|
||||
(inst vpord dst dst tmp)))))
|
||||
(def-blend sb-simd-avx512f::u32.16-blend)
|
||||
(def-blend sb-simd-avx512f::s32.16-blend)
|
||||
(def-blend sb-simd-avx512f::u64.8-blend)
|
||||
(def-blend sb-simd-avx512f::s64.8-blend)
|
||||
(def-blend sb-simd-avx512bw::u8.64-blend)
|
||||
(def-blend sb-simd-avx512bw::s8.64-blend)
|
||||
(def-blend sb-simd-avx512bw::u16.32-blend)
|
||||
(def-blend sb-simd-avx512bw::s16.32-blend))
|
||||
|
||||
(macrolet ((def-not (name)
|
||||
`(define-custom-vop ,name
|
||||
(:args (a))
|
||||
(:results (dst))
|
||||
(:generator
|
||||
(inst vpternlogd dst a a #x55)))))
|
||||
(def-not sb-simd-avx512f::f32.16-not)
|
||||
(def-not sb-simd-avx512f::f64.8-not)
|
||||
(def-not sb-simd-avx512f::u32.16-not)
|
||||
(def-not sb-simd-avx512f::u64.8-not)
|
||||
(def-not sb-simd-avx512f::s32.16-not)
|
||||
(def-not sb-simd-avx512f::s64.8-not)
|
||||
(def-not sb-simd-avx512bw::u8.64-not)
|
||||
(def-not sb-simd-avx512bw::u16.32-not)
|
||||
(def-not sb-simd-avx512bw::s8.64-not)
|
||||
(def-not sb-simd-avx512bw::s16.32-not)))
|
||||
;; Neon
|
||||
#+arm64
|
||||
(progn
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@
|
|||
(progn
|
||||
(define-inline sb-simd-sse:p128 (x) (the sb-simd-sse:p128 x))
|
||||
(define-inline sb-simd-avx:p128 (x) (the sb-simd-avx:p128 x))
|
||||
(define-inline sb-simd-avx:p256 (x) (the sb-simd-avx:p256 x)))
|
||||
(define-inline sb-simd-avx:p256 (x) (the sb-simd-avx:p256 x))
|
||||
(define-inline sb-simd-avx512f:p512 (x) (the sb-simd-avx512f:p512 x)))
|
||||
#+arm64
|
||||
(define-inline sb-simd-neon:p128 (x) (the sb-simd-neon:p128 x))
|
||||
|
||||
|
|
|
|||
218
contrib/sb-simd/code/instruction-sets/avx512bw.lisp
Normal file
218
contrib/sb-simd/code/instruction-sets/avx512bw.lisp
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
(in-package #:sb-simd-avx512bw)
|
||||
|
||||
(define-instruction-set :avx512bw
|
||||
(:test (avx512bw-supported-p))
|
||||
(:include :avx512f)
|
||||
(:simd-packs
|
||||
(u8.64 u8 512 #:simd-pack-512-ub8 (#:int-avx512-reg))
|
||||
(u16.32 u16 512 #:simd-pack-512-ub16 (#:int-avx512-reg))
|
||||
(s8.64 s8 512 #:simd-pack-512-sb8 (#:int-avx512-reg))
|
||||
(s16.32 s16 512 #:simd-pack-512-sb16 (#:int-avx512-reg)))
|
||||
(:simd-casts
|
||||
(u8.64 u8.64-broadcast)
|
||||
(u16.32 u16.32-broadcast)
|
||||
(s8.64 s8.64-broadcast)
|
||||
(s16.32 s16.32-broadcast))
|
||||
(:reinterpret-casts
|
||||
(u8! sb-simd-avx::u8!-from-p128 sb-simd-avx::u8!-from-p256 u8!-from-p512)
|
||||
(u16! sb-simd-avx::u16!-from-p128 sb-simd-avx::u16!-from-p256 u16!-from-p512)
|
||||
(u8.64! u8.64!-from-u8 u8.64!-from-p128 u8.64!-from-p256 u8.64!-from-p512)
|
||||
(u16.32! u16.32!-from-u16 u16.32!-from-p128 u16.32!-from-p256 u16.32!-from-p512)
|
||||
(s8.64! s8.64!-from-s8 s8.64!-from-p128 s8.64!-from-p256 s8.64!-from-p512)
|
||||
(s16.32! s16.32!-from-s16 s16.32!-from-p128 s16.32!-from-p256 s16.32!-from-p512))
|
||||
(:instructions
|
||||
(u8!-from-p512 nil (u8) (p512) :cost 1 :encoding :fake-vop)
|
||||
(u16!-from-p512 nil (u16) (p512) :cost 1 :encoding :fake-vop)
|
||||
(u8.32!-from-p512 #:vextracti32x8 (u8.32) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(u16.16!-from-p512 #:vextracti32x8 (u16.16) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(s8.32!-from-p512 #:vextracti32x8 (s8.32) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(s16.16!-from-p512 #:vextracti32x8 (s16.16) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
|
||||
;; u8.64
|
||||
(u8.64!-from-u8 nil (u8.64) (u8) :cost 1 :encoding :fake-vop)
|
||||
(u8.64!-from-p128 #:vmovdqu64 (u8.64) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u8.64!-from-p256 #:vmovdqu64 (u8.64) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u8.64!-from-p512 #:vmovdqu64 (u8.64) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-u8.64 nil (u8.64) (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) :cost 1 :encoding :fake-vop)
|
||||
(u8.64-values nil (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) (u8.64) :cost 1 :encoding :fake-vop)
|
||||
(u8.64-broadcast nil (u8.64) (u8) :cost 1 :encoding :fake-vop)
|
||||
(u8.64-broadcastvec #:vpbroadcastb (u8.64) (u8.64) :cost 1)
|
||||
(u8.64-blend nil (u8.64) (u8.64 u8.64 u8.64) :cost 2 :encoding :custom)
|
||||
(two-arg-u8.64+ #:vpaddb (u8.64) (u8.64 u8.64) :cost 1 :associative t)
|
||||
(two-arg-u8.64- #:vpsubb (u8.64) (u8.64 u8.64) :cost 1)
|
||||
(two-arg-u8.64-and #:vpandd (u8.64) (u8.64 u8.64) :cost 1 :associative t)
|
||||
(two-arg-u8.64-or #:vpord (u8.64) (u8.64 u8.64) :cost 1 :associative t)
|
||||
(two-arg-u8.64-xor #:vpxord (u8.64) (u8.64 u8.64) :cost 1 :associative t)
|
||||
(u8.64-andc1 #:vpandnd (u8.64) (u8.64 u8.64) :cost 1)
|
||||
(u8.64-not nil (u8.64) (u8.64) :cost 1 :encoding :custom)
|
||||
(two-arg-u8.64-max #:vpmaxub (u8.64) (u8.64 u8.64) :cost 1 :associative t)
|
||||
(two-arg-u8.64-min #:vpminub (u8.64) (u8.64 u8.64) :cost 1 :associative t)
|
||||
(two-arg-u8.64= nil (u8.64) (u8.64 u8.64) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u8.64/= nil (u8.64) (u8.64 u8.64) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u8.64< nil (u8.64) (u8.64 u8.64) :cost 4 :encoding :custom)
|
||||
(two-arg-u8.64<= nil (u8.64) (u8.64 u8.64) :cost 4 :encoding :custom)
|
||||
(two-arg-u8.64> nil (u8.64) (u8.64 u8.64) :cost 4 :encoding :custom)
|
||||
(two-arg-u8.64>= nil (u8.64) (u8.64 u8.64) :cost 4 :encoding :custom)
|
||||
(u8.32-from-u8.64 #:vextracti32x8 (u8.32) (u8.64 imm1) :cost 1)
|
||||
(u8.64-insert-u8.32 #:vinserti32x8 (u8.64) (u8.64 u8.32 imm1) :cost 1)
|
||||
|
||||
;; u16.32
|
||||
(u16.32!-from-u16 nil (u16.32) (u16) :cost 1 :encoding :fake-vop)
|
||||
(u16.32!-from-p128 #:vmovdqu64 (u16.32) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u16.32!-from-p256 #:vmovdqu64 (u16.32) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u16.32!-from-p512 #:vmovdqu64 (u16.32) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-u16.32 nil (u16.32) (u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16) :cost 1 :encoding :fake-vop)
|
||||
(u16.32-values nil (u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16) (u16.32) :cost 1 :encoding :fake-vop)
|
||||
(u16.32-broadcast nil (u16.32) (u16) :cost 1 :encoding :fake-vop)
|
||||
(u16.32-broadcastvec #:vpbroadcastw (u16.32) (u16.32) :cost 1)
|
||||
(u16.32-blend nil (u16.32) (u16.32 u16.32 u16.32) :cost 2 :encoding :custom)
|
||||
(two-arg-u16.32+ #:vpaddw (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(two-arg-u16.32- #:vpsubw (u16.32) (u16.32 u16.32) :cost 1)
|
||||
(two-arg-u16.32-mullo #:vpmullw (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(two-arg-u16.32-and #:vpandd (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(two-arg-u16.32-or #:vpord (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(two-arg-u16.32-xor #:vpxord (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(u16.32-andc1 #:vpandnd (u16.32) (u16.32 u16.32) :cost 1)
|
||||
(u16.32-not nil (u16.32) (u16.32) :cost 1 :encoding :custom)
|
||||
(two-arg-u16.32-max #:vpmaxuw (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(two-arg-u16.32-min #:vpminuw (u16.32) (u16.32 u16.32) :cost 1 :associative t)
|
||||
(two-arg-u16.32= nil (u16.32) (u16.32 u16.32) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u16.32/= nil (u16.32) (u16.32 u16.32) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u16.32< nil (u16.32) (u16.32 u16.32) :cost 4 :encoding :custom)
|
||||
(two-arg-u16.32<= nil (u16.32) (u16.32 u16.32) :cost 4 :encoding :custom)
|
||||
(two-arg-u16.32> nil (u16.32) (u16.32 u16.32) :cost 4 :encoding :custom)
|
||||
(two-arg-u16.32>= nil (u16.32) (u16.32 u16.32) :cost 4 :encoding :custom)
|
||||
(u16.16-from-u16.32 #:vextracti32x8 (u16.16) (u16.32 imm1) :cost 1)
|
||||
(u16.32-insert-u16.16 #:vinserti32x8 (u16.32) (u16.32 u16.16 imm1) :cost 1)
|
||||
|
||||
;; s8.64
|
||||
(s8.64!-from-s8 nil (s8.64) (s8) :cost 1 :encoding :fake-vop)
|
||||
(s8.64!-from-p128 #:vmovdqu64 (s8.64) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s8.64!-from-p256 #:vmovdqu64 (s8.64) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s8.64!-from-p512 #:vmovdqu64 (s8.64) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-s8.64 nil (s8.64) (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) :cost 1 :encoding :fake-vop)
|
||||
(s8.64-values nil (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) (s8.64) :cost 1 :encoding :fake-vop)
|
||||
(s8.64-broadcast nil (s8.64) (s8) :cost 1 :encoding :fake-vop)
|
||||
(s8.64-broadcastvec #:vpbroadcastb (s8.64) (s8.64) :cost 1)
|
||||
(s8.64-blend nil (s8.64) (s8.64 s8.64 u8.64) :cost 2 :encoding :custom)
|
||||
(two-arg-s8.64+ #:vpaddb (s8.64) (s8.64 s8.64) :cost 1 :associative t)
|
||||
(two-arg-s8.64- #:vpsubb (s8.64) (s8.64 s8.64) :cost 1)
|
||||
(two-arg-s8.64-and #:vpandd (s8.64) (s8.64 s8.64) :cost 1 :associative t)
|
||||
(two-arg-s8.64-or #:vpord (s8.64) (s8.64 s8.64) :cost 1 :associative t)
|
||||
(two-arg-s8.64-xor #:vpxord (s8.64) (s8.64 s8.64) :cost 1 :associative t)
|
||||
(s8.64-andc1 #:vpandnd (s8.64) (s8.64 s8.64) :cost 1)
|
||||
(s8.64-not nil (s8.64) (s8.64) :cost 1 :encoding :custom)
|
||||
(two-arg-s8.64-max #:vpmaxsb (s8.64) (s8.64 s8.64) :cost 1 :associative t)
|
||||
(two-arg-s8.64-min #:vpminsb (s8.64) (s8.64 s8.64) :cost 1 :associative t)
|
||||
(two-arg-s8.64= nil (u8.64) (s8.64 s8.64) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s8.64/= nil (u8.64) (s8.64 s8.64) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s8.64< nil (u8.64) (s8.64 s8.64) :cost 4 :encoding :custom)
|
||||
(two-arg-s8.64<= nil (u8.64) (s8.64 s8.64) :cost 4 :encoding :custom)
|
||||
(two-arg-s8.64> nil (u8.64) (s8.64 s8.64) :cost 4 :encoding :custom)
|
||||
(two-arg-s8.64>= nil (u8.64) (s8.64 s8.64) :cost 4 :encoding :custom)
|
||||
(s8.32-from-s8.64 #:vextracti32x8 (s8.32) (s8.64 imm1) :cost 1)
|
||||
(s8.64-insert-s8.32 #:vinserti32x8 (s8.64) (s8.64 s8.32 imm1) :cost 1)
|
||||
|
||||
;; s16.32
|
||||
(s16.32!-from-s16 nil (s16.32) (s16) :cost 1 :encoding :fake-vop)
|
||||
(s16.32!-from-p128 #:vmovdqu64 (s16.32) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s16.32!-from-p256 #:vmovdqu64 (s16.32) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s16.32!-from-p512 #:vmovdqu64 (s16.32) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-s16.32 nil (s16.32) (s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16) :cost 1 :encoding :fake-vop)
|
||||
(s16.32-values nil (s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16) (s16.32) :cost 1 :encoding :fake-vop)
|
||||
(s16.32-broadcast nil (s16.32) (s16) :cost 1 :encoding :fake-vop)
|
||||
(s16.32-broadcastvec #:vpbroadcastw (s16.32) (s16.32) :cost 1)
|
||||
(s16.32-blend nil (s16.32) (s16.32 s16.32 u16.32) :cost 2 :encoding :custom)
|
||||
(two-arg-s16.32+ #:vpaddw (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(two-arg-s16.32- #:vpsubw (s16.32) (s16.32 s16.32) :cost 1)
|
||||
(two-arg-s16.32-mullo #:vpmullw (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(two-arg-s16.32-and #:vpandd (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(two-arg-s16.32-or #:vpord (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(two-arg-s16.32-xor #:vpxord (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(s16.32-andc1 #:vpandnd (s16.32) (s16.32 s16.32) :cost 1)
|
||||
(s16.32-not nil (s16.32) (s16.32) :cost 1 :encoding :custom)
|
||||
(two-arg-s16.32-max #:vpmaxsw (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(two-arg-s16.32-min #:vpminsw (s16.32) (s16.32 s16.32) :cost 1 :associative t)
|
||||
(two-arg-s16.32= nil (u16.32) (s16.32 s16.32) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s16.32/= nil (u16.32) (s16.32 s16.32) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s16.32< nil (u16.32) (s16.32 s16.32) :cost 4 :encoding :custom)
|
||||
(two-arg-s16.32<= nil (u16.32) (s16.32 s16.32) :cost 4 :encoding :custom)
|
||||
(two-arg-s16.32> nil (u16.32) (s16.32 s16.32) :cost 4 :encoding :custom)
|
||||
(two-arg-s16.32>= nil (u16.32) (s16.32 s16.32) :cost 4 :encoding :custom)
|
||||
(s16.16-from-s16.32 #:vextracti32x8 (s16.16) (s16.32 imm1) :cost 1)
|
||||
(s16.32-insert-s16.16 #:vinserti32x8 (s16.32) (s16.32 s16.16 imm1) :cost 1))
|
||||
(:loads
|
||||
(u8.64-load #:vmovdqu8 u8.64 u8vec u8-array u8.64-aref u8.64-row-major-aref u8.64-sap-ref)
|
||||
(u16.32-load #:vmovdqu16 u16.32 u16vec u16-array u16.32-aref u16.32-row-major-aref u16.32-sap-ref)
|
||||
(s8.64-load #:vmovdqu8 s8.64 s8vec s8-array s8.64-aref s8.64-row-major-aref s8.64-sap-ref)
|
||||
(s16.32-load #:vmovdqu16 s16.32 s16vec s16-array s16.32-aref s16.32-row-major-aref s16.32-sap-ref))
|
||||
(:stores
|
||||
(u8.64-store #:vmovdqu8 u8.64 u8vec u8-array u8.64-aref u8.64-row-major-aref u8.64-sap-ref)
|
||||
(u16.32-store #:vmovdqu16 u16.32 u16vec u16-array u16.32-aref u16.32-row-major-aref u16.32-sap-ref)
|
||||
(s8.64-store #:vmovdqu8 s8.64 s8vec s8-array s8.64-aref s8.64-row-major-aref s8.64-sap-ref)
|
||||
(s16.32-store #:vmovdqu16 s16.32 s16vec s16-array s16.32-aref s16.32-row-major-aref s16.32-sap-ref)
|
||||
(u8.64-ntstore #:vmovntdq u8.64 u8vec u8-array u8.64-non-temporal-aref u8.64-non-temporal-row-major-aref u8.64-non-temporal-sap-ref)
|
||||
(u16.32-ntstore #:vmovntdq u16.32 u16vec u16-array u16.32-non-temporal-aref u16.32-non-temporal-row-major-aref u16.32-non-temporal-sap-ref)
|
||||
(s8.64-ntstore #:vmovntdq s8.64 s8vec s8-array s8.64-non-temporal-aref s8.64-non-temporal-row-major-aref s8.64-non-temporal-sap-ref)
|
||||
(s16.32-ntstore #:vmovntdq s16.32 s16vec s16-array s16.32-non-temporal-aref s16.32-non-temporal-row-major-aref s16.32-non-temporal-sap-ref))
|
||||
(:associatives
|
||||
(u8.64-and two-arg-u8.64-and +u8-true+)
|
||||
(u8.64-or two-arg-u8.64-or +u8-false+)
|
||||
(u8.64-xor two-arg-u8.64-xor +u8-false+)
|
||||
(u8.64-max two-arg-u8.64-max nil)
|
||||
(u8.64-min two-arg-u8.64-min nil)
|
||||
(u8.64+ two-arg-u8.64+ 0)
|
||||
(u16.32-and two-arg-u16.32-and +u16-true+)
|
||||
(u16.32-or two-arg-u16.32-or +u16-false+)
|
||||
(u16.32-xor two-arg-u16.32-xor +u16-false+)
|
||||
(u16.32-max two-arg-u16.32-max nil)
|
||||
(u16.32-min two-arg-u16.32-min nil)
|
||||
(u16.32+ two-arg-u16.32+ 0)
|
||||
(s8.64-and two-arg-s8.64-and +s8-true+)
|
||||
(s8.64-or two-arg-s8.64-or +s8-false+)
|
||||
(s8.64-xor two-arg-s8.64-xor +s8-false+)
|
||||
(s8.64-max two-arg-s8.64-max nil)
|
||||
(s8.64-min two-arg-s8.64-min nil)
|
||||
(s8.64+ two-arg-s8.64+ 0)
|
||||
(s16.32-and two-arg-s16.32-and +s16-true+)
|
||||
(s16.32-or two-arg-s16.32-or +s16-false+)
|
||||
(s16.32-xor two-arg-s16.32-xor +s16-false+)
|
||||
(s16.32-max two-arg-s16.32-max nil)
|
||||
(s16.32-min two-arg-s16.32-min nil)
|
||||
(s16.32+ two-arg-s16.32+ 0))
|
||||
(:reducers
|
||||
(u8.64- two-arg-u8.64- 0)
|
||||
(u16.32- two-arg-u16.32- 0)
|
||||
(s8.64- two-arg-s8.64- 0)
|
||||
(s16.32- two-arg-s16.32- 0))
|
||||
(:comparisons
|
||||
(u8.64= two-arg-u8.64= u8.64-and +u8-true+)
|
||||
(u8.64< two-arg-u8.64< u8.64-and +u8-true+)
|
||||
(u8.64<= two-arg-u8.64<= u8.64-and +u8-true+)
|
||||
(u8.64> two-arg-u8.64> u8.64-and +u8-true+)
|
||||
(u8.64>= two-arg-u8.64>= u8.64-and +u8-true+)
|
||||
(u16.32= two-arg-u16.32= u16.32-and +u16-true+)
|
||||
(u16.32< two-arg-u16.32< u16.32-and +u16-true+)
|
||||
(u16.32<= two-arg-u16.32<= u16.32-and +u16-true+)
|
||||
(u16.32> two-arg-u16.32> u16.32-and +u16-true+)
|
||||
(u16.32>= two-arg-u16.32>= u16.32-and +u16-true+)
|
||||
(s8.64= two-arg-s8.64= u8.64-and +u8-true+)
|
||||
(s8.64< two-arg-s8.64< u8.64-and +u8-true+)
|
||||
(s8.64<= two-arg-s8.64<= u8.64-and +u8-true+)
|
||||
(s8.64> two-arg-s8.64> u8.64-and +u8-true+)
|
||||
(s8.64>= two-arg-s8.64>= u8.64-and +u8-true+)
|
||||
(s16.32= two-arg-s16.32= u16.32-and +u16-true+)
|
||||
(s16.32< two-arg-s16.32< u16.32-and +u16-true+)
|
||||
(s16.32<= two-arg-s16.32<= u16.32-and +u16-true+)
|
||||
(s16.32> two-arg-s16.32> u16.32-and +u16-true+)
|
||||
(s16.32>= two-arg-s16.32>= u16.32-and +u16-true+))
|
||||
(:unequals
|
||||
(u8.64/= two-arg-u8.64/= u8.64-and +u8-true+)
|
||||
(u16.32/= two-arg-u16.32/= u16.32-and +u16-true+)
|
||||
(s8.64/= two-arg-s8.64/= u8.64-and +u8-true+)
|
||||
(s16.32/= two-arg-s16.32/= u16.32-and +u16-true+))
|
||||
(:ifs
|
||||
(u8.64-if u8.64-blend)
|
||||
(u16.32-if u16.32-blend)
|
||||
(s8.64-if s8.64-blend)
|
||||
(s16.32-if s16.32-blend)))
|
||||
11
contrib/sb-simd/code/instruction-sets/avx512dq.lisp
Normal file
11
contrib/sb-simd/code/instruction-sets/avx512dq.lisp
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
(in-package #:sb-simd-avx512dq)
|
||||
|
||||
(define-instruction-set :avx512dq
|
||||
(:test (avx512dq-supported-p))
|
||||
(:include :avx512bw)
|
||||
(:instructions
|
||||
(two-arg-u64.8* #:vpmullq (u64.8) (u64.8 u64.8) :cost 4 :associative t)
|
||||
(two-arg-s64.8* #:vpmullq (s64.8) (s64.8 s64.8) :cost 4 :associative t))
|
||||
(:associatives
|
||||
(u64.8* two-arg-u64.8* 1)
|
||||
(s64.8* two-arg-s64.8* 1)))
|
||||
368
contrib/sb-simd/code/instruction-sets/avx512f.lisp
Normal file
368
contrib/sb-simd/code/instruction-sets/avx512f.lisp
Normal file
|
|
@ -0,0 +1,368 @@
|
|||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
(define-instruction-set :avx512f
|
||||
(:test (avx512f-supported-p))
|
||||
(:include :fma)
|
||||
(:simd-packs
|
||||
(p512 nil 512 #:simd-pack-512 (#:int-avx512-reg #:double-avx512-reg #:single-avx512-reg))
|
||||
(f32.16 f32 512 #:simd-pack-512-single (#:single-avx512-reg))
|
||||
(f64.8 f64 512 #:simd-pack-512-double (#:double-avx512-reg))
|
||||
(u32.16 u32 512 #:simd-pack-512-ub32 (#:int-avx512-reg))
|
||||
(u64.8 u64 512 #:simd-pack-512-ub64 (#:int-avx512-reg))
|
||||
(s32.16 s32 512 #:simd-pack-512-sb32 (#:int-avx512-reg))
|
||||
(s64.8 s64 512 #:simd-pack-512-sb64 (#:int-avx512-reg)))
|
||||
(:simd-casts
|
||||
(f32.16 f32.16-broadcast)
|
||||
(f64.8 f64.8-broadcast)
|
||||
(u32.16 u32.16-broadcast)
|
||||
(u64.8 u64.8-broadcast)
|
||||
(s32.16 s32.16-broadcast)
|
||||
(s64.8 s64.8-broadcast))
|
||||
(:reinterpret-casts
|
||||
(f32! sb-simd-avx::f32!-from-p128 sb-simd-avx::f32!-from-p256 f32!-from-p512)
|
||||
(f64! sb-simd-avx::f64!-from-p128 sb-simd-avx::f64!-from-p256 f64!-from-p512)
|
||||
(u32! sb-simd-avx::u32!-from-p128 sb-simd-avx::u32!-from-p256 u32!-from-p512)
|
||||
(u64! sb-simd-avx::u64!-from-p128 sb-simd-avx::u64!-from-p256 u64!-from-p512)
|
||||
(f32.16! f32.16!-from-f32 f32.16!-from-p128 f32.16!-from-p256 f32.16!-from-p512)
|
||||
(f64.8! f64.8!-from-f64 f64.8!-from-p128 f64.8!-from-p256 f64.8!-from-p512)
|
||||
(u32.16! u32.16!-from-u32 u32.16!-from-p128 u32.16!-from-p256 u32.16!-from-p512)
|
||||
(u64.8! u64.8!-from-u64 u64.8!-from-p128 u64.8!-from-p256 u64.8!-from-p512)
|
||||
(s32.16! s32.16!-from-s32 s32.16!-from-p128 s32.16!-from-p256 s32.16!-from-p512)
|
||||
(s64.8! s64.8!-from-s64 s64.8!-from-p128 s64.8!-from-p256 s64.8!-from-p512))
|
||||
(:instructions
|
||||
;; Scalars from p512
|
||||
(f32!-from-p512 nil (f32) (p512) :cost 1 :encoding :custom :always-translatable nil)
|
||||
(f64!-from-p512 nil (f64) (p512) :cost 1 :encoding :custom :always-translatable nil)
|
||||
(u32!-from-p512 nil (u32) (p512) :cost 1 :encoding :fake-vop)
|
||||
(u64!-from-p512 #:vmovq (u64) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(f32.8!-from-p512 #:vextractf32x8 (f32.8) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(f64.4!-from-p512 #:vextractf64x4 (f64.4) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(u32.8!-from-p512 #:vextracti32x8 (u32.8) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(u64.4!-from-p512 #:vextracti64x4 (u64.4) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(s32.8!-from-p512 #:vextracti32x8 (s32.8) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
(s64.4!-from-p512 #:vextracti64x4 (s64.4) (p512) :cost 1 :suffix '(0) :always-translatable nil)
|
||||
|
||||
;; f32.16
|
||||
(f32.16-from-s32.16 #:vcvtdq2ps (f32.16) (s32.16) :cost 5)
|
||||
(f32.16-from-u32.16 #:vcvtudq2ps (f32.16) (u32.16) :cost 5)
|
||||
(f32.16!-from-f32 #:vmovups (f32.16) (f32) :cost 1 :encoding :move)
|
||||
(f32.16!-from-p128 #:vmovups (f32.16) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(f32.16!-from-p256 #:vmovups (f32.16) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(f32.16!-from-p512 #:vmovups (f32.16) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-f32.16 nil (f32.16) (f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) :cost 1 :encoding :fake-vop)
|
||||
(f32.16-values nil (f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) (f32.16) :cost 1 :encoding :fake-vop)
|
||||
(f32.16-broadcast #:vbroadcastss (f32.16) (f32) :cost 1)
|
||||
(f32.16-blend nil (f32.16) (f32.16 f32.16 u32.16) :cost 2 :encoding :custom)
|
||||
(two-arg-f32.16-and #:vandps (f32.16) (f32.16 f32.16) :cost 1 :associative t)
|
||||
(two-arg-f32.16-or #:vorps (f32.16) (f32.16 f32.16) :cost 1 :associative t)
|
||||
(two-arg-f32.16-xor #:vxorps (f32.16) (f32.16 f32.16) :cost 1 :associative t)
|
||||
(two-arg-f32.16-max #:vmaxps (f32.16) (f32.16 f32.16) :cost 3 :associative t)
|
||||
(two-arg-f32.16-min #:vminps (f32.16) (f32.16 f32.16) :cost 3 :associative t)
|
||||
(f32.16-andc1 #:vandnps (f32.16) (f32.16 f32.16) :cost 1)
|
||||
(f32.16-not nil (f32.16) (f32.16) :cost 1 :encoding :custom)
|
||||
(two-arg-f32.16+ #:vaddps (f32.16) (f32.16 f32.16) :cost 3 :associative t)
|
||||
(two-arg-f32.16- #:vsubps (f32.16) (f32.16 f32.16) :cost 3)
|
||||
(two-arg-f32.16* #:vmulps (f32.16) (f32.16 f32.16) :cost 4 :associative t)
|
||||
(two-arg-f32.16/ #:vdivps (f32.16) (f32.16 f32.16) :cost 14)
|
||||
(two-arg-f32.16= nil (u32.16) (f32.16 f32.16) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-f32.16/= nil (u32.16) (f32.16 f32.16) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-f32.16< nil (u32.16) (f32.16 f32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-f32.16<= nil (u32.16) (f32.16 f32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-f32.16> nil (u32.16) (f32.16 f32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-f32.16>= nil (u32.16) (f32.16 f32.16) :cost 4 :encoding :custom)
|
||||
(f32.16-horizontal-and nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-horizontal-or nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-horizontal-xor nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-horizontal-max nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-horizontal-min nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-horizontal+ nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-horizontal* nil (f32) (f32.16) :cost 5 :encoding :fake-vop)
|
||||
(f32.16-sqrt #:vsqrtps (f32.16) (f32.16) :cost 14)
|
||||
(f32.16-reciprocal #:vrcp14ps (f32.16) (f32.16) :cost 4)
|
||||
(f32.16-rsqrt #:vrsqrt14ps (f32.16) (f32.16) :cost 4)
|
||||
(f32.16-%round #:vrndscaleps (f32.16) (f32.16 imm8) :cost 2)
|
||||
(f32.8-from-f32.16 #:vextractf32x8 (f32.8) (f32.16 imm1) :cost 1)
|
||||
(f32.16-insert-f32.8 #:vinsertf32x8 (f32.16) (f32.16 f32.8 imm1) :cost 1)
|
||||
(f32.16-fmadd #:vfmadd213ps (f32.16) (f32.16 f32.16 f32.16) :cost 1 :encoding :fma)
|
||||
(f32.16-fnmadd #:vfnmadd213ps (f32.16) (f32.16 f32.16 f32.16) :cost 1 :encoding :fma)
|
||||
(f32.16-fmsub #:vfmsub213ps (f32.16) (f32.16 f32.16 f32.16) :cost 1 :encoding :fma)
|
||||
(f32.16-fmaddsub #:vfmaddsub213ps (f32.16) (f32.16 f32.16 f32.16) :cost 1 :encoding :fma)
|
||||
(f32.16-fmsubadd #:vfmsubadd213ps (f32.16) (f32.16 f32.16 f32.16) :cost 1 :encoding :fma)
|
||||
|
||||
;; f64.8
|
||||
(f64.8-from-s64.8 #:vcvtqq2pd (f64.8) (s64.8) :cost 5)
|
||||
(f64.8-from-u64.8 #:vcvtuqq2pd (f64.8) (u64.8) :cost 5)
|
||||
(f64.8!-from-f64 #:vmovupd (f64.8) (f64) :cost 1 :encoding :move)
|
||||
(f64.8!-from-p128 #:vmovupd (f64.8) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(f64.8!-from-p256 #:vmovupd (f64.8) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(f64.8!-from-p512 #:vmovupd (f64.8) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-f64.8 nil (f64.8) (f64 f64 f64 f64 f64 f64 f64 f64) :cost 1 :encoding :fake-vop)
|
||||
(f64.8-values nil (f64 f64 f64 f64 f64 f64 f64 f64) (f64.8) :cost 1 :encoding :fake-vop)
|
||||
(f64.8-broadcast #:vbroadcastsd (f64.8) (f64) :cost 1)
|
||||
(f64.8-blend nil (f64.8) (f64.8 f64.8 u64.8) :cost 2 :encoding :custom)
|
||||
(two-arg-f64.8-and #:vandpd (f64.8) (f64.8 f64.8) :cost 1 :associative t)
|
||||
(two-arg-f64.8-or #:vorpd (f64.8) (f64.8 f64.8) :cost 1 :associative t)
|
||||
(two-arg-f64.8-xor #:vxorpd (f64.8) (f64.8 f64.8) :cost 1 :associative t)
|
||||
(two-arg-f64.8-max #:vmaxpd (f64.8) (f64.8 f64.8) :cost 3 :associative t)
|
||||
(two-arg-f64.8-min #:vminpd (f64.8) (f64.8 f64.8) :cost 3 :associative t)
|
||||
(f64.8-andc1 #:vandnpd (f64.8) (f64.8 f64.8) :cost 1)
|
||||
(f64.8-not nil (f64.8) (f64.8) :cost 1 :encoding :custom)
|
||||
(two-arg-f64.8+ #:vaddpd (f64.8) (f64.8 f64.8) :cost 3 :associative t)
|
||||
(two-arg-f64.8- #:vsubpd (f64.8) (f64.8 f64.8) :cost 3)
|
||||
(two-arg-f64.8* #:vmulpd (f64.8) (f64.8 f64.8) :cost 4 :associative t)
|
||||
(two-arg-f64.8/ #:vdivpd (f64.8) (f64.8 f64.8) :cost 20)
|
||||
(two-arg-f64.8= nil (u64.8) (f64.8 f64.8) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-f64.8/= nil (u64.8) (f64.8 f64.8) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-f64.8< nil (u64.8) (f64.8 f64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-f64.8<= nil (u64.8) (f64.8 f64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-f64.8> nil (u64.8) (f64.8 f64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-f64.8>= nil (u64.8) (f64.8 f64.8) :cost 4 :encoding :custom)
|
||||
(f64.8-horizontal-and nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-horizontal-or nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-horizontal-xor nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-horizontal-max nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-horizontal-min nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-horizontal+ nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-horizontal* nil (f64) (f64.8) :cost 5 :encoding :fake-vop)
|
||||
(f64.8-sqrt #:vsqrtpd (f64.8) (f64.8) :cost 20)
|
||||
(f64.8-%round #:vrndscalepd (f64.8) (f64.8 imm8) :cost 2)
|
||||
(f64.4-from-f64.8 #:vextractf64x4 (f64.4) (f64.8 imm1) :cost 1)
|
||||
(f64.8-insert-f64.4 #:vinsertf64x4 (f64.8) (f64.8 f64.4 imm1) :cost 1)
|
||||
(f64.8-fmadd #:vfmadd213pd (f64.8) (f64.8 f64.8 f64.8) :cost 1 :encoding :fma)
|
||||
(f64.8-fnmadd #:vfnmadd213pd (f64.8) (f64.8 f64.8 f64.8) :cost 1 :encoding :fma)
|
||||
(f64.8-fmsub #:vfmsub213pd (f64.8) (f64.8 f64.8 f64.8) :cost 1 :encoding :fma)
|
||||
(f64.8-fmaddsub #:vfmaddsub213pd (f64.8) (f64.8 f64.8 f64.8) :cost 1 :encoding :fma)
|
||||
(f64.8-fmsubadd #:vfmsubadd213pd (f64.8) (f64.8 f64.8 f64.8) :cost 1 :encoding :fma)
|
||||
|
||||
;; u32.16
|
||||
(u32.16!-from-u32 #:vmovd (u32.16) (u32) :cost 1 :encoding :move)
|
||||
(u32.16!-from-p128 #:vmovdqu64 (u32.16) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u32.16!-from-p256 #:vmovdqu64 (u32.16) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u32.16!-from-p512 #:vmovdqu64 (u32.16) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-u32.16 nil (u32.16) (u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32) :cost 1 :encoding :fake-vop)
|
||||
(u32.16-values nil (u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32 u32) (u32.16) :cost 1 :encoding :fake-vop)
|
||||
(u32.16-broadcast #:vpbroadcastd (u32.16) (u32) :cost 1)
|
||||
(u32.16-blend nil (u32.16) (u32.16 u32.16 u32.16) :cost 2 :encoding :custom)
|
||||
(two-arg-u32.16+ #:vpaddd (u32.16) (u32.16 u32.16) :cost 1 :associative t)
|
||||
(two-arg-u32.16- #:vpsubd (u32.16) (u32.16 u32.16) :cost 1)
|
||||
(two-arg-u32.16* #:vpmulld (u32.16) (u32.16 u32.16) :cost 4 :associative t)
|
||||
(two-arg-u32.16-and #:vpandd (u32.16) (u32.16 u32.16) :cost 1 :associative t)
|
||||
(two-arg-u32.16-or #:vpord (u32.16) (u32.16 u32.16) :cost 1 :associative t)
|
||||
(two-arg-u32.16-xor #:vpxord (u32.16) (u32.16 u32.16) :cost 1 :associative t)
|
||||
(u32.16-andc1 #:vpandnd (u32.16) (u32.16 u32.16) :cost 1)
|
||||
(u32.16-not nil (u32.16) (u32.16) :cost 1 :encoding :custom)
|
||||
(two-arg-u32.16-max #:vpmaxud (u32.16) (u32.16 u32.16) :cost 1 :associative t)
|
||||
(two-arg-u32.16-min #:vpminud (u32.16) (u32.16 u32.16) :cost 1 :associative t)
|
||||
(u32.16-shiftl #:vpsllvd (u32.16) (u32.16 u32.16) :cost 1)
|
||||
(u32.16-shiftr #:vpsrlvd (u32.16) (u32.16 u32.16) :cost 1)
|
||||
(two-arg-u32.16= nil (u32.16) (u32.16 u32.16) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u32.16/= nil (u32.16) (u32.16 u32.16) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u32.16< nil (u32.16) (u32.16 u32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-u32.16<= nil (u32.16) (u32.16 u32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-u32.16> nil (u32.16) (u32.16 u32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-u32.16>= nil (u32.16) (u32.16 u32.16) :cost 4 :encoding :custom)
|
||||
(u32.8-from-u32.16 #:vextracti32x8 (u32.8) (u32.16 imm1) :cost 1)
|
||||
(u32.16-insert-u32.8 #:vinserti32x8 (u32.16) (u32.16 u32.8 imm1) :cost 1)
|
||||
|
||||
;; u64.8
|
||||
(u64.8!-from-u64 #:vmovq (u64.8) (u64) :cost 1 :encoding :move)
|
||||
(u64.8!-from-p128 #:vmovdqu64 (u64.8) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u64.8!-from-p256 #:vmovdqu64 (u64.8) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(u64.8!-from-p512 #:vmovdqu64 (u64.8) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-u64.8 nil (u64.8) (u64 u64 u64 u64 u64 u64 u64 u64) :cost 1 :encoding :fake-vop)
|
||||
(u64.8-values nil (u64 u64 u64 u64 u64 u64 u64 u64) (u64.8) :cost 1 :encoding :fake-vop)
|
||||
(u64.8-broadcast #:vpbroadcastq (u64.8) (u64) :cost 1)
|
||||
(u64.8-blend nil (u64.8) (u64.8 u64.8 u64.8) :cost 2 :encoding :custom)
|
||||
(two-arg-u64.8+ #:vpaddq (u64.8) (u64.8 u64.8) :cost 1 :associative t)
|
||||
(two-arg-u64.8- #:vpsubq (u64.8) (u64.8 u64.8) :cost 1)
|
||||
(two-arg-u64.8-and #:vpandq (u64.8) (u64.8 u64.8) :cost 1 :associative t)
|
||||
(two-arg-u64.8-or #:vporq (u64.8) (u64.8 u64.8) :cost 1 :associative t)
|
||||
(two-arg-u64.8-xor #:vpxorq (u64.8) (u64.8 u64.8) :cost 1 :associative t)
|
||||
(u64.8-andc1 #:vpandnq (u64.8) (u64.8 u64.8) :cost 1)
|
||||
(u64.8-not nil (u64.8) (u64.8) :cost 1 :encoding :custom)
|
||||
(two-arg-u64.8-max #:vpmaxuq (u64.8) (u64.8 u64.8) :cost 1 :associative t)
|
||||
(two-arg-u64.8-min #:vpminuq (u64.8) (u64.8 u64.8) :cost 1 :associative t)
|
||||
(u64.8-shiftl #:vpsllvq (u64.8) (u64.8 u64.8) :cost 1)
|
||||
(u64.8-shiftr #:vpsrlvq (u64.8) (u64.8 u64.8) :cost 1)
|
||||
(two-arg-u64.8= nil (u64.8) (u64.8 u64.8) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u64.8/= nil (u64.8) (u64.8 u64.8) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-u64.8< nil (u64.8) (u64.8 u64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-u64.8<= nil (u64.8) (u64.8 u64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-u64.8> nil (u64.8) (u64.8 u64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-u64.8>= nil (u64.8) (u64.8 u64.8) :cost 4 :encoding :custom)
|
||||
(u64.4-from-u64.8 #:vextracti64x4 (u64.4) (u64.8 imm1) :cost 1)
|
||||
(u64.8-insert-u64.4 #:vinserti64x4 (u64.8) (u64.8 u64.4 imm1) :cost 1)
|
||||
|
||||
;; s32.16
|
||||
(s32.16!-from-s32 #:vmovd (s32.16) (s32) :cost 1 :encoding :move)
|
||||
(s32.16!-from-p128 #:vmovdqu64 (s32.16) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s32.16!-from-p256 #:vmovdqu64 (s32.16) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s32.16!-from-p512 #:vmovdqu64 (s32.16) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-s32.16 nil (s32.16) (s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32) :cost 1 :encoding :fake-vop)
|
||||
(s32.16-values nil (s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32 s32) (s32.16) :cost 1 :encoding :fake-vop)
|
||||
(s32.16-broadcast #:vpbroadcastd (s32.16) (s32) :cost 1)
|
||||
(s32.16-blend nil (s32.16) (s32.16 s32.16 u32.16) :cost 2 :encoding :custom)
|
||||
(two-arg-s32.16+ #:vpaddd (s32.16) (s32.16 s32.16) :cost 1 :associative t)
|
||||
(two-arg-s32.16- #:vpsubd (s32.16) (s32.16 s32.16) :cost 1)
|
||||
(two-arg-s32.16* #:vpmulld (s32.16) (s32.16 s32.16) :cost 4 :associative t)
|
||||
(two-arg-s32.16-and #:vpandd (s32.16) (s32.16 s32.16) :cost 1 :associative t)
|
||||
(two-arg-s32.16-or #:vpord (s32.16) (s32.16 s32.16) :cost 1 :associative t)
|
||||
(two-arg-s32.16-xor #:vpxord (s32.16) (s32.16 s32.16) :cost 1 :associative t)
|
||||
(s32.16-andc1 #:vpandnd (s32.16) (s32.16 s32.16) :cost 1)
|
||||
(s32.16-not nil (s32.16) (s32.16) :cost 1 :encoding :custom)
|
||||
(two-arg-s32.16-max #:vpmaxsd (s32.16) (s32.16 s32.16) :cost 1 :associative t)
|
||||
(two-arg-s32.16-min #:vpminsd (s32.16) (s32.16 s32.16) :cost 1 :associative t)
|
||||
(s32.16-shiftl #:vpsllvd (s32.16) (s32.16 u32.16) :cost 1)
|
||||
(s32.16-shiftr #:vpsravd (s32.16) (s32.16 u32.16) :cost 1)
|
||||
(two-arg-s32.16= nil (u32.16) (s32.16 s32.16) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s32.16/= nil (u32.16) (s32.16 s32.16) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s32.16< nil (u32.16) (s32.16 s32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-s32.16<= nil (u32.16) (s32.16 s32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-s32.16> nil (u32.16) (s32.16 s32.16) :cost 4 :encoding :custom)
|
||||
(two-arg-s32.16>= nil (u32.16) (s32.16 s32.16) :cost 4 :encoding :custom)
|
||||
(s32.8-from-s32.16 #:vextracti32x8 (s32.8) (s32.16 imm1) :cost 1)
|
||||
(s32.16-insert-s32.8 #:vinserti32x8 (s32.16) (s32.16 s32.8 imm1) :cost 1)
|
||||
|
||||
;; s64.8
|
||||
(s64.8!-from-s64 #:vmovq (s64.8) (s64) :cost 1 :encoding :move)
|
||||
(s64.8!-from-p128 #:vmovdqu64 (s64.8) (p128) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s64.8!-from-p256 #:vmovdqu64 (s64.8) (p256) :cost 1 :encoding :move :always-translatable nil)
|
||||
(s64.8!-from-p512 #:vmovdqu64 (s64.8) (p512) :cost 1 :encoding :move :always-translatable nil)
|
||||
(make-s64.8 nil (s64.8) (s64 s64 s64 s64 s64 s64 s64 s64) :cost 1 :encoding :fake-vop)
|
||||
(s64.8-values nil (s64 s64 s64 s64 s64 s64 s64 s64) (s64.8) :cost 1 :encoding :fake-vop)
|
||||
(s64.8-broadcast #:vpbroadcastq (s64.8) (s64) :cost 1)
|
||||
(s64.8-blend nil (s64.8) (s64.8 s64.8 u64.8) :cost 2 :encoding :custom)
|
||||
(two-arg-s64.8+ #:vpaddq (s64.8) (s64.8 s64.8) :cost 1 :associative t)
|
||||
(two-arg-s64.8- #:vpsubq (s64.8) (s64.8 s64.8) :cost 1)
|
||||
(two-arg-s64.8-and #:vpandq (s64.8) (s64.8 s64.8) :cost 1 :associative t)
|
||||
(two-arg-s64.8-or #:vporq (s64.8) (s64.8 s64.8) :cost 1 :associative t)
|
||||
(two-arg-s64.8-xor #:vpxorq (s64.8) (s64.8 s64.8) :cost 1 :associative t)
|
||||
(s64.8-andc1 #:vpandnq (s64.8) (s64.8 s64.8) :cost 1)
|
||||
(s64.8-not nil (s64.8) (s64.8) :cost 1 :encoding :custom)
|
||||
(two-arg-s64.8-max #:vpmaxsq (s64.8) (s64.8 s64.8) :cost 1 :associative t)
|
||||
(two-arg-s64.8-min #:vpminsq (s64.8) (s64.8 s64.8) :cost 1 :associative t)
|
||||
(s64.8-shiftl #:vpsllvq (s64.8) (s64.8 u64.8) :cost 1)
|
||||
(s64.8-shiftr #:vpsravq (s64.8) (s64.8 u64.8) :cost 1)
|
||||
(two-arg-s64.8= nil (u64.8) (s64.8 s64.8) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s64.8/= nil (u64.8) (s64.8 s64.8) :cost 4 :encoding :custom :associative t)
|
||||
(two-arg-s64.8< nil (u64.8) (s64.8 s64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-s64.8<= nil (u64.8) (s64.8 s64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-s64.8> nil (u64.8) (s64.8 s64.8) :cost 4 :encoding :custom)
|
||||
(two-arg-s64.8>= nil (u64.8) (s64.8 s64.8) :cost 4 :encoding :custom)
|
||||
(s64.4-from-s64.8 #:vextracti64x4 (s64.4) (s64.8 imm1) :cost 1)
|
||||
(s64.8-insert-s64.4 #:vinserti64x4 (s64.8) (s64.8 s64.4 imm1) :cost 1))
|
||||
(:loads
|
||||
(f32.16-load #:vmovups f32.16 f32vec f32-array f32.16-aref f32.16-row-major-aref f32.16-sap-ref)
|
||||
(f64.8-load #:vmovupd f64.8 f64vec f64-array f64.8-aref f64.8-row-major-aref f64.8-sap-ref)
|
||||
(u32.16-load #:vmovdqu32 u32.16 u32vec u32-array u32.16-aref u32.16-row-major-aref u32.16-sap-ref)
|
||||
(u64.8-load #:vmovdqu64 u64.8 u64vec u64-array u64.8-aref u64.8-row-major-aref u64.8-sap-ref)
|
||||
(s32.16-load #:vmovdqu32 s32.16 s32vec s32-array s32.16-aref s32.16-row-major-aref s32.16-sap-ref)
|
||||
(s64.8-load #:vmovdqu64 s64.8 s64vec s64-array s64.8-aref s64.8-row-major-aref s64.8-sap-ref))
|
||||
(:stores
|
||||
(f32.16-store #:vmovups f32.16 f32vec f32-array f32.16-aref f32.16-row-major-aref f32.16-sap-ref)
|
||||
(f64.8-store #:vmovupd f64.8 f64vec f64-array f64.8-aref f64.8-row-major-aref f64.8-sap-ref)
|
||||
(u32.16-store #:vmovdqu32 u32.16 u32vec u32-array u32.16-aref u32.16-row-major-aref u32.16-sap-ref)
|
||||
(u64.8-store #:vmovdqu64 u64.8 u64vec u64-array u64.8-aref u64.8-row-major-aref u64.8-sap-ref)
|
||||
(s32.16-store #:vmovdqu32 s32.16 s32vec s32-array s32.16-aref s32.16-row-major-aref s32.16-sap-ref)
|
||||
(s64.8-store #:vmovdqu64 s64.8 s64vec s64-array s64.8-aref s64.8-row-major-aref s64.8-sap-ref)
|
||||
(f32.16-ntstore #:vmovntps f32.16 f32vec f32-array f32.16-non-temporal-aref f32.16-non-temporal-row-major-aref f32.16-non-temporal-sap-ref)
|
||||
(f64.8-ntstore #:vmovntpd f64.8 f64vec f64-array f64.8-non-temporal-aref f64.8-non-temporal-row-major-aref f64.8-non-temporal-sap-ref)
|
||||
(u32.16-ntstore #:vmovntdq u32.16 u32vec u32-array u32.16-non-temporal-aref u32.16-non-temporal-row-major-aref u32.16-non-temporal-sap-ref)
|
||||
(u64.8-ntstore #:vmovntdq u64.8 u64vec u64-array u64.8-non-temporal-aref u64.8-non-temporal-row-major-aref u64.8-non-temporal-sap-ref)
|
||||
(s32.16-ntstore #:vmovntdq s32.16 s32vec s32-array s32.16-non-temporal-aref s32.16-non-temporal-row-major-aref s32.16-non-temporal-sap-ref)
|
||||
(s64.8-ntstore #:vmovntdq s64.8 s64vec s64-array s64.8-non-temporal-aref s64.8-non-temporal-row-major-aref s64.8-non-temporal-sap-ref))
|
||||
(:associatives
|
||||
(f32.16-and two-arg-f32.16-and +f32-true+)
|
||||
(f32.16-or two-arg-f32.16-or +f32-false+)
|
||||
(f32.16-xor two-arg-f32.16-xor +f32-false+)
|
||||
(f32.16-max two-arg-f32.16-max nil)
|
||||
(f32.16-min two-arg-f32.16-min nil)
|
||||
(f32.16+ two-arg-f32.16+ 0f0)
|
||||
(f32.16* two-arg-f32.16* 1f0)
|
||||
(f64.8-and two-arg-f64.8-and +f64-true+)
|
||||
(f64.8-or two-arg-f64.8-or +f64-false+)
|
||||
(f64.8-xor two-arg-f64.8-xor +f64-false+)
|
||||
(f64.8-max two-arg-f64.8-max nil)
|
||||
(f64.8-min two-arg-f64.8-min nil)
|
||||
(f64.8+ two-arg-f64.8+ 0d0)
|
||||
(f64.8* two-arg-f64.8* 1d0)
|
||||
(u32.16-and two-arg-u32.16-and +u32-true+)
|
||||
(u32.16-or two-arg-u32.16-or +u32-false+)
|
||||
(u32.16-xor two-arg-u32.16-xor +u32-false+)
|
||||
(u32.16-max two-arg-u32.16-max nil)
|
||||
(u32.16-min two-arg-u32.16-min nil)
|
||||
(u32.16+ two-arg-u32.16+ 0)
|
||||
(u32.16* two-arg-u32.16* 1)
|
||||
(u64.8-and two-arg-u64.8-and +u64-true+)
|
||||
(u64.8-or two-arg-u64.8-or +u64-false+)
|
||||
(u64.8-xor two-arg-u64.8-xor +u64-false+)
|
||||
(u64.8-max two-arg-u64.8-max nil)
|
||||
(u64.8-min two-arg-u64.8-min nil)
|
||||
(u64.8+ two-arg-u64.8+ 0)
|
||||
(s32.16-and two-arg-s32.16-and +s32-true+)
|
||||
(s32.16-or two-arg-s32.16-or +s32-false+)
|
||||
(s32.16-xor two-arg-s32.16-xor +s32-false+)
|
||||
(s32.16-max two-arg-s32.16-max nil)
|
||||
(s32.16-min two-arg-s32.16-min nil)
|
||||
(s32.16+ two-arg-s32.16+ 0)
|
||||
(s32.16* two-arg-s32.16* 1)
|
||||
(s64.8-and two-arg-s64.8-and +s64-true+)
|
||||
(s64.8-or two-arg-s64.8-or +s64-false+)
|
||||
(s64.8-xor two-arg-s64.8-xor +s64-false+)
|
||||
(s64.8-max two-arg-s64.8-max nil)
|
||||
(s64.8-min two-arg-s64.8-min nil)
|
||||
(s64.8+ two-arg-s64.8+ 0))
|
||||
(:reducers
|
||||
(f32.16- two-arg-f32.16- 0f0)
|
||||
(f32.16/ two-arg-f32.16/ 1f0)
|
||||
(f64.8- two-arg-f64.8- 0d0)
|
||||
(f64.8/ two-arg-f64.8/ 1d0)
|
||||
(u32.16- two-arg-u32.16- 0)
|
||||
(u64.8- two-arg-u64.8- 0)
|
||||
(s32.16- two-arg-s32.16- 0)
|
||||
(s64.8- two-arg-s64.8- 0))
|
||||
(:comparisons
|
||||
(f32.16= two-arg-f32.16= u32.16-and +u32-true+)
|
||||
(f32.16< two-arg-f32.16< u32.16-and +u32-true+)
|
||||
(f32.16<= two-arg-f32.16<= u32.16-and +u32-true+)
|
||||
(f32.16> two-arg-f32.16> u32.16-and +u32-true+)
|
||||
(f32.16>= two-arg-f32.16>= u32.16-and +u32-true+)
|
||||
(f64.8= two-arg-f64.8= u64.8-and +u64-true+)
|
||||
(f64.8< two-arg-f64.8< u64.8-and +u64-true+)
|
||||
(f64.8<= two-arg-f64.8<= u64.8-and +u64-true+)
|
||||
(f64.8> two-arg-f64.8> u64.8-and +u64-true+)
|
||||
(f64.8>= two-arg-f64.8>= u64.8-and +u64-true+)
|
||||
(u32.16= two-arg-u32.16= u32.16-and +u32-true+)
|
||||
(u32.16< two-arg-u32.16< u32.16-and +u32-true+)
|
||||
(u32.16<= two-arg-u32.16<= u32.16-and +u32-true+)
|
||||
(u32.16> two-arg-u32.16> u32.16-and +u32-true+)
|
||||
(u32.16>= two-arg-u32.16>= u32.16-and +u32-true+)
|
||||
(u64.8= two-arg-u64.8= u64.8-and +u64-true+)
|
||||
(u64.8< two-arg-u64.8< u64.8-and +u64-true+)
|
||||
(u64.8<= two-arg-u64.8<= u64.8-and +u64-true+)
|
||||
(u64.8> two-arg-u64.8> u64.8-and +u64-true+)
|
||||
(u64.8>= two-arg-u64.8>= u64.8-and +u64-true+)
|
||||
(s32.16= two-arg-s32.16= u32.16-and +u32-true+)
|
||||
(s32.16< two-arg-s32.16< u32.16-and +u32-true+)
|
||||
(s32.16<= two-arg-s32.16<= u32.16-and +u32-true+)
|
||||
(s32.16> two-arg-s32.16> u32.16-and +u32-true+)
|
||||
(s32.16>= two-arg-s32.16>= u32.16-and +u32-true+)
|
||||
(s64.8= two-arg-s64.8= u64.8-and +u64-true+)
|
||||
(s64.8< two-arg-s64.8< u64.8-and +u64-true+)
|
||||
(s64.8<= two-arg-s64.8<= u64.8-and +u64-true+)
|
||||
(s64.8> two-arg-s64.8> u64.8-and +u64-true+)
|
||||
(s64.8>= two-arg-s64.8>= u64.8-and +u64-true+))
|
||||
(:unequals
|
||||
(f32.16/= two-arg-f32.16/= u32.16-and +u32-true+)
|
||||
(f64.8/= two-arg-f64.8/= u64.8-and +u64-true+)
|
||||
(u32.16/= two-arg-u32.16/= u32.16-and +u32-true+)
|
||||
(u64.8/= two-arg-u64.8/= u64.8-and +u64-true+)
|
||||
(s32.16/= two-arg-s32.16/= u32.16-and +u32-true+)
|
||||
(s64.8/= two-arg-s64.8/= u64.8-and +u64-true+))
|
||||
(:ifs
|
||||
(f32.16-if f32.16-blend)
|
||||
(f64.8-if f64.8-blend)
|
||||
(u32.16-if u32.16-blend)
|
||||
(u64.8-if u64.8-blend)
|
||||
(s32.16-if s32.16-blend)
|
||||
(s64.8-if s64.8-blend)))
|
||||
|
|
@ -252,6 +252,11 @@
|
|||
#:avx-supported-p
|
||||
#:avx2-supported-p
|
||||
#:fma-supported-p
|
||||
#:avx512f-supported-p
|
||||
#:avx512dq-supported-p
|
||||
#:avx512cd-supported-p
|
||||
#:avx512bw-supported-p
|
||||
#:avx512vl-supported-p
|
||||
#:neon-supported-p))
|
||||
|
||||
(progn
|
||||
|
|
@ -2121,6 +2126,393 @@
|
|||
#:f64.4-fmaddsub
|
||||
#:f64.4-fmsubadd))
|
||||
|
||||
#+x86-64
|
||||
(defpackage #:sb-simd-avx512f
|
||||
(:use #:common-lisp #:sb-simd-internals #:sb-simd-fma)
|
||||
(:shadow
|
||||
#:f32!
|
||||
#:f64!
|
||||
#:u32!
|
||||
#:u64!)
|
||||
#0#
|
||||
#1#
|
||||
#8#
|
||||
#9#
|
||||
#10#
|
||||
#12=
|
||||
(:export
|
||||
#:f32!
|
||||
#:f64!
|
||||
#:u32!
|
||||
#:u64!
|
||||
#:p512
|
||||
;; f32.16
|
||||
#:make-f32.16
|
||||
#:f32.16
|
||||
#:f32.16!
|
||||
#:f32.16-values
|
||||
#:f32.16-broadcast
|
||||
#:f32.16-if
|
||||
#:f32.16-from-s32.16
|
||||
#:f32.16-from-u32.16
|
||||
#:f32.16-and
|
||||
#:f32.16-or
|
||||
#:f32.16-xor
|
||||
#:f32.16-andc1
|
||||
#:f32.16-not
|
||||
#:f32.16-max
|
||||
#:f32.16-min
|
||||
#:f32.16+
|
||||
#:f32.16-
|
||||
#:f32.16*
|
||||
#:f32.16/
|
||||
#:f32.16-horizontal-and
|
||||
#:f32.16-horizontal-or
|
||||
#:f32.16-horizontal-xor
|
||||
#:f32.16-horizontal-max
|
||||
#:f32.16-horizontal-min
|
||||
#:f32.16-horizontal+
|
||||
#:f32.16-horizontal*
|
||||
#:f32.16=
|
||||
#:f32.16/=
|
||||
#:f32.16<
|
||||
#:f32.16<=
|
||||
#:f32.16>
|
||||
#:f32.16>=
|
||||
#:f32.16-sqrt
|
||||
#:f32.16-reciprocal
|
||||
#:f32.16-rsqrt
|
||||
#:f32.16-round
|
||||
#:f32.16-floor
|
||||
#:f32.16-ceiling
|
||||
#:f32.16-truncate
|
||||
#:f32.8-from-f32.16
|
||||
#:f32.16-insert-f32.8
|
||||
#:f32.16-fmadd
|
||||
#:f32.16-fnmadd
|
||||
#:f32.16-fmsub
|
||||
#:f32.16-fmaddsub
|
||||
#:f32.16-fmsubadd
|
||||
#:f32.16-incf
|
||||
#:f32.16-decf
|
||||
#:f32.16-aref #:f32.16-row-major-aref #:f32.16-sap-ref
|
||||
#:f32.16-non-temporal-aref #:f32.16-non-temporal-row-major-aref #:f32.16-non-temporal-sap-ref
|
||||
;; f64.8
|
||||
#:make-f64.8
|
||||
#:f64.8
|
||||
#:f64.8!
|
||||
#:f64.8-values
|
||||
#:f64.8-broadcast
|
||||
#:f64.8-if
|
||||
#:f64.8-from-s64.8
|
||||
#:f64.8-from-u64.8
|
||||
#:f64.8-and
|
||||
#:f64.8-or
|
||||
#:f64.8-xor
|
||||
#:f64.8-andc1
|
||||
#:f64.8-not
|
||||
#:f64.8-max
|
||||
#:f64.8-min
|
||||
#:f64.8+
|
||||
#:f64.8-
|
||||
#:f64.8*
|
||||
#:f64.8/
|
||||
#:f64.8-horizontal-and
|
||||
#:f64.8-horizontal-or
|
||||
#:f64.8-horizontal-xor
|
||||
#:f64.8-horizontal-max
|
||||
#:f64.8-horizontal-min
|
||||
#:f64.8-horizontal+
|
||||
#:f64.8-horizontal*
|
||||
#:f64.8=
|
||||
#:f64.8/=
|
||||
#:f64.8<
|
||||
#:f64.8<=
|
||||
#:f64.8>
|
||||
#:f64.8>=
|
||||
#:f64.8-sqrt
|
||||
#:f64.8-round
|
||||
#:f64.8-floor
|
||||
#:f64.8-ceiling
|
||||
#:f64.8-truncate
|
||||
#:f64.4-from-f64.8
|
||||
#:f64.8-insert-f64.4
|
||||
#:f64.8-fmadd
|
||||
#:f64.8-fnmadd
|
||||
#:f64.8-fmsub
|
||||
#:f64.8-fmaddsub
|
||||
#:f64.8-fmsubadd
|
||||
#:f64.8-incf
|
||||
#:f64.8-decf
|
||||
#:f64.8-aref #:f64.8-row-major-aref #:f64.8-sap-ref
|
||||
#:f64.8-non-temporal-aref #:f64.8-non-temporal-row-major-aref #:f64.8-non-temporal-sap-ref
|
||||
;; u32.16
|
||||
#:make-u32.16
|
||||
#:u32.16
|
||||
#:u32.16!
|
||||
#:u32.16-values
|
||||
#:u32.16-broadcast
|
||||
#:u32.16-if
|
||||
#:u32.16-and
|
||||
#:u32.16-or
|
||||
#:u32.16-xor
|
||||
#:u32.16-andc1
|
||||
#:u32.16-not
|
||||
#:u32.16-max
|
||||
#:u32.16-min
|
||||
#:u32.16+
|
||||
#:u32.16-
|
||||
#:u32.16*
|
||||
#:u32.16=
|
||||
#:u32.16/=
|
||||
#:u32.16>
|
||||
#:u32.16<
|
||||
#:u32.16>=
|
||||
#:u32.16<=
|
||||
#:u32.16-shiftl
|
||||
#:u32.16-shiftr
|
||||
#:u32.8-from-u32.16
|
||||
#:u32.16-insert-u32.8
|
||||
#:u32.16-incf
|
||||
#:u32.16-decf
|
||||
#:u32.16-aref #:u32.16-row-major-aref #:u32.16-sap-ref
|
||||
#:u32.16-non-temporal-aref #:u32.16-non-temporal-row-major-aref #:u32.16-non-temporal-sap-ref
|
||||
;; u64.8
|
||||
#:make-u64.8
|
||||
#:u64.8
|
||||
#:u64.8!
|
||||
#:u64.8-values
|
||||
#:u64.8-broadcast
|
||||
#:u64.8-if
|
||||
#:u64.8-and
|
||||
#:u64.8-or
|
||||
#:u64.8-xor
|
||||
#:u64.8-andc1
|
||||
#:u64.8-not
|
||||
#:u64.8-max
|
||||
#:u64.8-min
|
||||
#:u64.8+
|
||||
#:u64.8-
|
||||
#:u64.8=
|
||||
#:u64.8/=
|
||||
#:u64.8>
|
||||
#:u64.8<
|
||||
#:u64.8>=
|
||||
#:u64.8<=
|
||||
#:u64.8-shiftl
|
||||
#:u64.8-shiftr
|
||||
#:u64.4-from-u64.8
|
||||
#:u64.8-insert-u64.4
|
||||
#:u64.8-incf
|
||||
#:u64.8-decf
|
||||
#:u64.8-aref #:u64.8-row-major-aref #:u64.8-sap-ref
|
||||
#:u64.8-non-temporal-aref #:u64.8-non-temporal-row-major-aref #:u64.8-non-temporal-sap-ref
|
||||
;; s32.16
|
||||
#:make-s32.16
|
||||
#:s32.16
|
||||
#:s32.16!
|
||||
#:s32.16-values
|
||||
#:s32.16-broadcast
|
||||
#:s32.16-if
|
||||
#:s32.16-and
|
||||
#:s32.16-or
|
||||
#:s32.16-xor
|
||||
#:s32.16-andc1
|
||||
#:s32.16-not
|
||||
#:s32.16-max
|
||||
#:s32.16-min
|
||||
#:s32.16+
|
||||
#:s32.16-
|
||||
#:s32.16*
|
||||
#:s32.16=
|
||||
#:s32.16/=
|
||||
#:s32.16>
|
||||
#:s32.16<
|
||||
#:s32.16>=
|
||||
#:s32.16<=
|
||||
#:s32.16-shiftl
|
||||
#:s32.16-shiftr
|
||||
#:s32.8-from-s32.16
|
||||
#:s32.16-insert-s32.8
|
||||
#:s32.16-incf
|
||||
#:s32.16-decf
|
||||
#:s32.16-aref #:s32.16-row-major-aref #:s32.16-sap-ref
|
||||
#:s32.16-non-temporal-aref #:s32.16-non-temporal-row-major-aref #:s32.16-non-temporal-sap-ref
|
||||
;; s64.8
|
||||
#:make-s64.8
|
||||
#:s64.8
|
||||
#:s64.8!
|
||||
#:s64.8-values
|
||||
#:s64.8-broadcast
|
||||
#:s64.8-if
|
||||
#:s64.8-and
|
||||
#:s64.8-or
|
||||
#:s64.8-xor
|
||||
#:s64.8-andc1
|
||||
#:s64.8-not
|
||||
#:s64.8-max
|
||||
#:s64.8-min
|
||||
#:s64.8+
|
||||
#:s64.8-
|
||||
#:s64.8=
|
||||
#:s64.8/=
|
||||
#:s64.8>
|
||||
#:s64.8<
|
||||
#:s64.8>=
|
||||
#:s64.8<=
|
||||
#:s64.8-shiftl
|
||||
#:s64.8-shiftr
|
||||
#:s64.4-from-s64.8
|
||||
#:s64.8-insert-s64.4
|
||||
#:s64.8-incf
|
||||
#:s64.8-decf
|
||||
#:s64.8-aref #:s64.8-row-major-aref #:s64.8-sap-ref
|
||||
#:s64.8-non-temporal-aref #:s64.8-non-temporal-row-major-aref #:s64.8-non-temporal-sap-ref))
|
||||
|
||||
#+x86-64
|
||||
(defpackage #:sb-simd-avx512bw
|
||||
(:use #:common-lisp #:sb-simd-internals #:sb-simd-avx512f)
|
||||
(:shadow
|
||||
#:u8!
|
||||
#:u16!)
|
||||
#0#
|
||||
#1#
|
||||
#8#
|
||||
#9#
|
||||
#10#
|
||||
#12#
|
||||
#13=
|
||||
(:export
|
||||
#:u8!
|
||||
#:u16!
|
||||
;; u8.64
|
||||
#:make-u8.64
|
||||
#:u8.64
|
||||
#:u8.64!
|
||||
#:u8.64-values
|
||||
#:u8.64-broadcast
|
||||
#:u8.64-if
|
||||
#:u8.64-and
|
||||
#:u8.64-or
|
||||
#:u8.64-xor
|
||||
#:u8.64-andc1
|
||||
#:u8.64-not
|
||||
#:u8.64-max
|
||||
#:u8.64-min
|
||||
#:u8.64+
|
||||
#:u8.64-
|
||||
#:u8.64=
|
||||
#:u8.64/=
|
||||
#:u8.64>
|
||||
#:u8.64<
|
||||
#:u8.64>=
|
||||
#:u8.64<=
|
||||
#:u8.32-from-u8.64
|
||||
#:u8.64-insert-u8.32
|
||||
#:u8.64-incf
|
||||
#:u8.64-decf
|
||||
#:u8.64-aref #:u8.64-row-major-aref #:u8.64-sap-ref
|
||||
#:u8.64-non-temporal-aref #:u8.64-non-temporal-row-major-aref #:u8.64-non-temporal-sap-ref
|
||||
;; u16.32
|
||||
#:make-u16.32
|
||||
#:u16.32
|
||||
#:u16.32!
|
||||
#:u16.32-values
|
||||
#:u16.32-broadcast
|
||||
#:u16.32-if
|
||||
#:u16.32-and
|
||||
#:u16.32-or
|
||||
#:u16.32-xor
|
||||
#:u16.32-andc1
|
||||
#:u16.32-not
|
||||
#:u16.32-max
|
||||
#:u16.32-min
|
||||
#:u16.32+
|
||||
#:u16.32-
|
||||
#:u16.32=
|
||||
#:u16.32/=
|
||||
#:u16.32>
|
||||
#:u16.32<
|
||||
#:u16.32>=
|
||||
#:u16.32<=
|
||||
#:u16.16-from-u16.32
|
||||
#:u16.32-insert-u16.16
|
||||
#:u16.32-incf
|
||||
#:u16.32-decf
|
||||
#:u16.32-aref #:u16.32-row-major-aref #:u16.32-sap-ref
|
||||
#:u16.32-non-temporal-aref #:u16.32-non-temporal-row-major-aref #:u16.32-non-temporal-sap-ref
|
||||
;; s8.64
|
||||
#:make-s8.64
|
||||
#:s8.64
|
||||
#:s8.64!
|
||||
#:s8.64-values
|
||||
#:s8.64-broadcast
|
||||
#:s8.64-if
|
||||
#:s8.64-and
|
||||
#:s8.64-or
|
||||
#:s8.64-xor
|
||||
#:s8.64-andc1
|
||||
#:s8.64-not
|
||||
#:s8.64-max
|
||||
#:s8.64-min
|
||||
#:s8.64+
|
||||
#:s8.64-
|
||||
#:s8.64=
|
||||
#:s8.64/=
|
||||
#:s8.64>
|
||||
#:s8.64<
|
||||
#:s8.64>=
|
||||
#:s8.64<=
|
||||
#:s8.32-from-s8.64
|
||||
#:s8.64-insert-s8.32
|
||||
#:s8.64-incf
|
||||
#:s8.64-decf
|
||||
#:s8.64-aref #:s8.64-row-major-aref #:s8.64-sap-ref
|
||||
#:s8.64-non-temporal-aref #:s8.64-non-temporal-row-major-aref #:s8.64-non-temporal-sap-ref
|
||||
;; s16.32
|
||||
#:make-s16.32
|
||||
#:s16.32
|
||||
#:s16.32!
|
||||
#:s16.32-values
|
||||
#:s16.32-broadcast
|
||||
#:s16.32-if
|
||||
#:s16.32-and
|
||||
#:s16.32-or
|
||||
#:s16.32-xor
|
||||
#:s16.32-andc1
|
||||
#:s16.32-not
|
||||
#:s16.32-max
|
||||
#:s16.32-min
|
||||
#:s16.32+
|
||||
#:s16.32-
|
||||
#:s16.32=
|
||||
#:s16.32/=
|
||||
#:s16.32>
|
||||
#:s16.32<
|
||||
#:s16.32>=
|
||||
#:s16.32<=
|
||||
#:s16.16-from-s16.32
|
||||
#:s16.32-insert-s16.16
|
||||
#:s16.32-incf
|
||||
#:s16.32-decf
|
||||
#:s16.32-aref #:s16.32-row-major-aref #:s16.32-sap-ref
|
||||
#:s16.32-non-temporal-aref #:s16.32-non-temporal-row-major-aref #:s16.32-non-temporal-sap-ref))
|
||||
|
||||
#+x86-64
|
||||
(defpackage #:sb-simd-avx512dq
|
||||
(:use #:common-lisp #:sb-simd-internals #:sb-simd-avx512bw)
|
||||
#0#
|
||||
#1#
|
||||
#8#
|
||||
#9#
|
||||
#10#
|
||||
#12#
|
||||
#13#
|
||||
#14=
|
||||
(:export
|
||||
#:u64.8*
|
||||
#:s64.8*))
|
||||
|
||||
#+arm64
|
||||
(defpackage #:sb-simd-arm64
|
||||
(:use #:common-lisp #:sb-simd-internals #:sb-simd)
|
||||
|
|
@ -2688,6 +3080,7 @@
|
|||
|
||||
(dolist (p '("SB-SIMD" "SB-SIMD-NEON" "SB-SIMD-ARM64"
|
||||
"SB-SIMD-AVX" "SB-SIMD-AVX2" "SB-SIMD-FMA"
|
||||
"SB-SIMD-AVX512F" "SB-SIMD-AVX512BW" "SB-SIMD-AVX512DQ"
|
||||
"SB-SIMD-INTERNALS" "SB-SIMD-SSE" "SB-SIMD-SSE2"
|
||||
"SB-SIMD-SSE3" "SB-SIMD-SSE4.1" "SB-SIMD-SSE4.2"
|
||||
"SB-SIMD-SSSE3" "SB-SIMD-X86-64"))
|
||||
|
|
|
|||
|
|
@ -188,6 +188,13 @@
|
|||
(declare (ignore element-type))
|
||||
'phony-simd-pack-256))
|
||||
|
||||
#-sb-simd-pack-512
|
||||
(progn
|
||||
(defstruct phony-simd-pack-512)
|
||||
(deftype simd-pack-512 (&optional element-type)
|
||||
(declare (ignore element-type))
|
||||
'phony-simd-pack-512))
|
||||
|
||||
(defmethod decode-record-definition ((_ (eql 'simd-record)) expr)
|
||||
(destructuring-bind (name scalar-record-name bits primitive-type scs) expr
|
||||
(let ((simd-pack-type
|
||||
|
|
@ -196,7 +203,10 @@
|
|||
(128 (find-symbol "SIMD-PACK" "SB-EXT"))
|
||||
(256 (or (find-symbol "SIMD-PACK-256" "SB-EXT")
|
||||
#-sb-simd-pack-256
|
||||
'simd-pack-256)))))
|
||||
'simd-pack-256))
|
||||
(512 (or (find-symbol "SIMD-PACK-512" "SB-EXT")
|
||||
#-sb-simd-pack-512
|
||||
'simd-pack-512)))))
|
||||
(cond ((not base-type) 't)
|
||||
((not scalar-record-name) base-type)
|
||||
(t `(,base-type ,scalar-record-name))))))
|
||||
|
|
|
|||
|
|
@ -1364,3 +1364,184 @@
|
|||
|
||||
(define-fake-vop f64.4-reverse (a)
|
||||
(%f64.4-permute4x64 a #b00011011))
|
||||
|
||||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
(define-fake-vop u32!-from-p512 (x)
|
||||
(logand #xffffffff (%u64!-from-p512 x)))
|
||||
|
||||
(define-fake-vop make-f32.16 (a b c d e f g h i j k l m n o p)
|
||||
(let ((lo (sb-simd-avx::%make-f32.8 a b c d e f g h))
|
||||
(hi (sb-simd-avx::%make-f32.8 i j k l m n o p)))
|
||||
(%f32.16-insert-f32.8 (%f32.16!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop f32.16-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx::%f32.8-values (%f32.8!-from-p512 x))
|
||||
(sb-simd-avx::%f32.8-values (%f32.8-from-f32.16 x 1))))
|
||||
|
||||
(define-fake-vop make-f64.8 (a b c d e f g h)
|
||||
(let ((lo (sb-simd-avx::%make-f64.4 a b c d))
|
||||
(hi (sb-simd-avx::%make-f64.4 e f g h)))
|
||||
(%f64.8-insert-f64.4 (%f64.8!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop f64.8-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx::%f64.4-values (%f64.4!-from-p512 x))
|
||||
(sb-simd-avx::%f64.4-values (%f64.4-from-f64.8 x 1))))
|
||||
|
||||
(define-fake-vop make-u64.8 (a b c d e f g h)
|
||||
(let ((lo (sb-simd-avx2::%make-u64.4 a b c d))
|
||||
(hi (sb-simd-avx2::%make-u64.4 e f g h)))
|
||||
(%u64.8-insert-u64.4 (%u64.8!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop u64.8-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%u64.4-values (%u64.4!-from-p512 x))
|
||||
(sb-simd-avx2::%u64.4-values (%u64.4-from-u64.8 x 1))))
|
||||
|
||||
(define-fake-vop make-s64.8 (a b c d e f g h)
|
||||
(let ((lo (sb-simd-avx2::%make-s64.4 a b c d))
|
||||
(hi (sb-simd-avx2::%make-s64.4 e f g h)))
|
||||
(%s64.8-insert-s64.4 (%s64.8!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop s64.8-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%s64.4-values (%s64.4!-from-p512 x))
|
||||
(sb-simd-avx2::%s64.4-values (%s64.4-from-s64.8 x 1))))
|
||||
|
||||
(define-fake-vop make-u32.16 (a b c d e f g h i j k l m n o p)
|
||||
(let ((lo (sb-simd-avx2::%make-u32.8 a b c d e f g h))
|
||||
(hi (sb-simd-avx2::%make-u32.8 i j k l m n o p)))
|
||||
(%u32.16-insert-u32.8 (%u32.16!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop u32.16-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%u32.8-values (%u32.8!-from-p512 x))
|
||||
(sb-simd-avx2::%u32.8-values (%u32.8-from-u32.16 x 1))))
|
||||
|
||||
(define-fake-vop make-s32.16 (a b c d e f g h i j k l m n o p)
|
||||
(let ((lo (sb-simd-avx2::%make-s32.8 a b c d e f g h))
|
||||
(hi (sb-simd-avx2::%make-s32.8 i j k l m n o p)))
|
||||
(%s32.16-insert-s32.8 (%s32.16!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop s32.16-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%s32.8-values (%s32.8!-from-p512 x))
|
||||
(sb-simd-avx2::%s32.8-values (%s32.8-from-s32.16 x 1))))
|
||||
|
||||
|
||||
(macrolet ((def-f32 (name hop sop)
|
||||
`(define-fake-vop ,name (x)
|
||||
(let ((lo (%f32.8!-from-p512 x))
|
||||
(hi (%f32.8-from-f32.16 x 1)))
|
||||
(,sop (,hop lo) (,hop hi)))))
|
||||
(def-f64 (name hop sop)
|
||||
`(define-fake-vop ,name (x)
|
||||
(let ((lo (%f64.4!-from-p512 x))
|
||||
(hi (%f64.4-from-f64.8 x 1)))
|
||||
(,sop (,hop lo) (,hop hi))))))
|
||||
(def-f32 f32.16-horizontal-and sb-simd-avx::%f32.8-horizontal-and sb-simd-avx::%two-arg-f32-and)
|
||||
(def-f32 f32.16-horizontal-or sb-simd-avx::%f32.8-horizontal-or sb-simd-avx::%two-arg-f32-or)
|
||||
(def-f32 f32.16-horizontal-xor sb-simd-avx::%f32.8-horizontal-xor sb-simd-avx::%two-arg-f32-xor)
|
||||
(def-f32 f32.16-horizontal-max sb-simd-avx::%f32.8-horizontal-max sb-simd-avx::%two-arg-f32-max)
|
||||
(def-f32 f32.16-horizontal-min sb-simd-avx::%f32.8-horizontal-min sb-simd-avx::%two-arg-f32-min)
|
||||
(def-f32 f32.16-horizontal+ sb-simd-avx::%f32.8-horizontal+ sb-simd-avx::%two-arg-f32+)
|
||||
(def-f32 f32.16-horizontal* sb-simd-avx::%f32.8-horizontal* sb-simd-avx::%two-arg-f32*)
|
||||
|
||||
(def-f64 f64.8-horizontal-and sb-simd-avx::%f64.4-horizontal-and sb-simd-avx::%two-arg-f64-and)
|
||||
(def-f64 f64.8-horizontal-or sb-simd-avx::%f64.4-horizontal-or sb-simd-avx::%two-arg-f64-or)
|
||||
(def-f64 f64.8-horizontal-xor sb-simd-avx::%f64.4-horizontal-xor sb-simd-avx::%two-arg-f64-xor)
|
||||
(def-f64 f64.8-horizontal-max sb-simd-avx::%f64.4-horizontal-max sb-simd-avx::%two-arg-f64-max)
|
||||
(def-f64 f64.8-horizontal-min sb-simd-avx::%f64.4-horizontal-min sb-simd-avx::%two-arg-f64-min)
|
||||
(def-f64 f64.8-horizontal+ sb-simd-avx::%f64.4-horizontal+ sb-simd-avx::%two-arg-f64+)
|
||||
(def-f64 f64.8-horizontal* sb-simd-avx::%f64.4-horizontal* sb-simd-avx::%two-arg-f64*))
|
||||
|
||||
(in-package #:sb-simd-avx512bw)
|
||||
|
||||
(define-fake-vop u8!-from-p512 (x)
|
||||
(logand #xff (sb-simd-avx512f::%u64!-from-p512 x)))
|
||||
|
||||
(define-fake-vop u16!-from-p512 (x)
|
||||
(logand #xffff (sb-simd-avx512f::%u64!-from-p512 x)))
|
||||
|
||||
(define-fake-vop make-u16.32 (u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32)
|
||||
(let ((lo (sb-simd-avx2::%make-u16.16 u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16))
|
||||
(hi (sb-simd-avx2::%make-u16.16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32)))
|
||||
(%u16.32-insert-u16.16 (%u16.32!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop u16.32-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%u16.16-values (%u16.16!-from-p512 x))
|
||||
(sb-simd-avx2::%u16.16-values (%u16.16-from-u16.32 x 1))))
|
||||
|
||||
(define-fake-vop make-s16.32 (u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32)
|
||||
(let ((lo (sb-simd-avx2::%make-s16.16 u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16))
|
||||
(hi (sb-simd-avx2::%make-s16.16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32)))
|
||||
(%s16.32-insert-s16.16 (%s16.32!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop s16.32-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%s16.16-values (%s16.16!-from-p512 x))
|
||||
(sb-simd-avx2::%s16.16-values (%s16.16-from-s16.32 x 1))))
|
||||
|
||||
(define-fake-vop make-u8.64
|
||||
(u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16
|
||||
u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32
|
||||
u33 u34 u35 u36 u37 u38 u39 u40 u41 u42 u43 u44 u45 u46 u47 u48
|
||||
u49 u50 u51 u52 u53 u54 u55 u56 u57 u58 u59 u60 u61 u62 u63 u64)
|
||||
(let ((lo (sb-simd-avx2::%make-u8.32
|
||||
u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16
|
||||
u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32))
|
||||
(hi (sb-simd-avx2::%make-u8.32
|
||||
u33 u34 u35 u36 u37 u38 u39 u40 u41 u42 u43 u44 u45 u46 u47 u48
|
||||
u49 u50 u51 u52 u53 u54 u55 u56 u57 u58 u59 u60 u61 u62 u63 u64)))
|
||||
(%u8.64-insert-u8.32 (%u8.64!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop u8.64-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%u8.32-values (%u8.32!-from-p512 x))
|
||||
(sb-simd-avx2::%u8.32-values (%u8.32-from-u8.64 x 1))))
|
||||
|
||||
(define-fake-vop make-s8.64
|
||||
(u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16
|
||||
u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32
|
||||
u33 u34 u35 u36 u37 u38 u39 u40 u41 u42 u43 u44 u45 u46 u47 u48
|
||||
u49 u50 u51 u52 u53 u54 u55 u56 u57 u58 u59 u60 u61 u62 u63 u64)
|
||||
(let ((lo (sb-simd-avx2::%make-s8.32
|
||||
u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16
|
||||
u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32))
|
||||
(hi (sb-simd-avx2::%make-s8.32
|
||||
u33 u34 u35 u36 u37 u38 u39 u40 u41 u42 u43 u44 u45 u46 u47 u48
|
||||
u49 u50 u51 u52 u53 u54 u55 u56 u57 u58 u59 u60 u61 u62 u63 u64)))
|
||||
(%s8.64-insert-s8.32 (%s8.64!-from-p256 lo) hi 1)))
|
||||
|
||||
(define-fake-vop s8.64-values (x)
|
||||
(multiple-value-call #'values
|
||||
(sb-simd-avx2::%s8.32-values (%s8.32!-from-p512 x))
|
||||
(sb-simd-avx2::%s8.32-values (%s8.32-from-s8.64 x 1))))
|
||||
|
||||
(define-fake-vop u8.64-broadcast (x)
|
||||
(%u8.64-broadcastvec (%u8.64!-from-p256 (sb-simd-avx::%u8.32!-from-u8 x))))
|
||||
|
||||
(define-fake-vop s8.64-broadcast (x)
|
||||
(%s8.64-broadcastvec (%s8.64!-from-p256 (sb-simd-avx::%s8.32!-from-s8 x))))
|
||||
|
||||
(define-fake-vop u16.32-broadcast (x)
|
||||
(%u16.32-broadcastvec (%u16.32!-from-p256 (sb-simd-avx::%u16.16!-from-u16 x))))
|
||||
|
||||
(define-fake-vop s16.32-broadcast (x)
|
||||
(%s16.32-broadcastvec (%s16.32!-from-p256 (sb-simd-avx::%s16.16!-from-s16 x))))
|
||||
|
||||
(define-fake-vop u8.64!-from-u8 (x)
|
||||
(%u8.64-broadcast x))
|
||||
|
||||
(define-fake-vop s8.64!-from-s8 (x)
|
||||
(%s8.64-broadcast x))
|
||||
|
||||
(define-fake-vop u16.32!-from-u16 (x)
|
||||
(%u16.32-broadcast x))
|
||||
|
||||
(define-fake-vop s16.32!-from-s16 (x)
|
||||
(%s16.32-broadcast x))
|
||||
|
||||
|
|
|
|||
|
|
@ -107,3 +107,38 @@
|
|||
|
||||
(define-modify-macro s64.4-incf (&optional (num 1)) two-arg-s64.4+)
|
||||
(define-modify-macro s64.4-decf (&optional (num 1)) two-arg-s64.4-)
|
||||
|
||||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
(define-modify-macro f32.16-incf (&optional (num 1f0)) two-arg-f32.16+)
|
||||
(define-modify-macro f32.16-decf (&optional (num 1f0)) two-arg-f32.16-)
|
||||
|
||||
(define-modify-macro f64.8-incf (&optional (num 1d0)) two-arg-f64.8+)
|
||||
(define-modify-macro f64.8-decf (&optional (num 1d0)) two-arg-f64.8-)
|
||||
|
||||
(define-modify-macro u32.16-incf (&optional (num 1)) two-arg-u32.16+)
|
||||
(define-modify-macro u32.16-decf (&optional (num 1)) two-arg-u32.16-)
|
||||
|
||||
(define-modify-macro u64.8-incf (&optional (num 1)) two-arg-u64.8+)
|
||||
(define-modify-macro u64.8-decf (&optional (num 1)) two-arg-u64.8-)
|
||||
|
||||
(define-modify-macro s32.16-incf (&optional (num 1)) two-arg-s32.16+)
|
||||
(define-modify-macro s32.16-decf (&optional (num 1)) two-arg-s32.16-)
|
||||
|
||||
(define-modify-macro s64.8-incf (&optional (num 1)) two-arg-s64.8+)
|
||||
(define-modify-macro s64.8-decf (&optional (num 1)) two-arg-s64.8-)
|
||||
|
||||
(in-package #:sb-simd-avx512bw)
|
||||
|
||||
(define-modify-macro u8.64-incf (&optional (num 1)) two-arg-u8.64+)
|
||||
(define-modify-macro u8.64-decf (&optional (num 1)) two-arg-u8.64-)
|
||||
|
||||
(define-modify-macro u16.32-incf (&optional (num 1)) two-arg-u16.32+)
|
||||
(define-modify-macro u16.32-decf (&optional (num 1)) two-arg-u16.32-)
|
||||
|
||||
(define-modify-macro s8.64-incf (&optional (num 1)) two-arg-s8.64+)
|
||||
(define-modify-macro s8.64-decf (&optional (num 1)) two-arg-s8.64-)
|
||||
|
||||
(define-modify-macro s16.32-incf (&optional (num 1)) two-arg-s16.32+)
|
||||
(define-modify-macro s16.32-decf (&optional (num 1)) two-arg-s16.32-)
|
||||
|
||||
|
|
|
|||
|
|
@ -73,3 +73,30 @@
|
|||
|
||||
(define-inline f64.4-truncate (x)
|
||||
(f64.4-%round x #b11))
|
||||
|
||||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
(define-inline f32.16-round (x)
|
||||
(f32.16-%round x #x00))
|
||||
|
||||
(define-inline f32.16-floor (x)
|
||||
(f32.16-%round x #x01))
|
||||
|
||||
(define-inline f32.16-ceiling (x)
|
||||
(f32.16-%round x #x02))
|
||||
|
||||
(define-inline f32.16-truncate (x)
|
||||
(f32.16-%round x #x03))
|
||||
|
||||
(define-inline f64.8-round (x)
|
||||
(f64.8-%round x #x00))
|
||||
|
||||
(define-inline f64.8-floor (x)
|
||||
(f64.8-%round x #x01))
|
||||
|
||||
(define-inline f64.8-ceiling (x)
|
||||
(f64.8-%round x #x02))
|
||||
|
||||
(define-inline f64.8-truncate (x)
|
||||
(f64.8-%round x #x03))
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,9 @@
|
|||
(:file "avx" :if-feature :x86-64)
|
||||
(:file "avx2" :if-feature :x86-64)
|
||||
(:file "fma" :if-feature :x86-64)
|
||||
(:file "avx512f" :if-feature :x86-64)
|
||||
(:file "avx512bw" :if-feature :x86-64)
|
||||
(:file "avx512dq" :if-feature :x86-64)
|
||||
(:file "arm64" :if-feature :arm64)
|
||||
(:file "neon" :if-feature :arm64)))
|
||||
(:file "define-types")
|
||||
|
|
|
|||
|
|
@ -49,3 +49,19 @@
|
|||
(sb-simd-test-suite:define-aref-test s16.16-aref (signed-byte 16) 16 s16.16-values)
|
||||
(sb-simd-test-suite:define-aref-test s32.8-aref (signed-byte 32) 8 s32.8-values)
|
||||
(sb-simd-test-suite:define-aref-test s64.4-aref (signed-byte 64) 4 s64.4-values)
|
||||
|
||||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
(sb-simd-test-suite:define-aref-test f32.16-aref single-float 16 f32.16-values)
|
||||
(sb-simd-test-suite:define-aref-test f64.8-aref double-float 8 f64.8-values)
|
||||
(sb-simd-test-suite:define-aref-test u32.16-aref (unsigned-byte 32) 16 u32.16-values)
|
||||
(sb-simd-test-suite:define-aref-test u64.8-aref (unsigned-byte 64) 8 u64.8-values)
|
||||
(sb-simd-test-suite:define-aref-test s32.16-aref (signed-byte 32) 16 s32.16-values)
|
||||
(sb-simd-test-suite:define-aref-test s64.8-aref (signed-byte 64) 8 s64.8-values)
|
||||
|
||||
(in-package #:sb-simd-avx512bw)
|
||||
|
||||
(sb-simd-test-suite:define-aref-test u8.64-aref (unsigned-byte 8) 64 u8.64-values)
|
||||
(sb-simd-test-suite:define-aref-test u16.32-aref (unsigned-byte 16) 32 u16.32-values)
|
||||
(sb-simd-test-suite:define-aref-test s8.64-aref (signed-byte 8) 64 s8.64-values)
|
||||
(sb-simd-test-suite:define-aref-test s16.32-aref (signed-byte 16) 32 s16.32-values)
|
||||
|
|
|
|||
|
|
@ -54,3 +54,21 @@
|
|||
(sb-simd-test-suite:define-horizontal-test f64.4-horizontal* f64*)
|
||||
|
||||
(in-package #:sb-simd-avx2)
|
||||
|
||||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal-and f32-and)
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal-or f32-or)
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal-xor f32-xor)
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal-max f32-max)
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal-min f32-min)
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal+ f32+)
|
||||
(sb-simd-test-suite:define-horizontal-test f32.16-horizontal* f32*)
|
||||
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal-and f64-and)
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal-or f64-or)
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal-xor f64-xor)
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal-max f64-max)
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal-min f64-min)
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal+ f64+)
|
||||
(sb-simd-test-suite:define-horizontal-test f64.8-horizontal* f64*)
|
||||
|
|
|
|||
|
|
@ -15,7 +15,10 @@
|
|||
(check-package '#:sb-simd-sse4.1)
|
||||
(check-package '#:sb-simd-sse4.2)
|
||||
(check-package '#:sb-simd-avx)
|
||||
(check-package '#:sb-simd-avx2))
|
||||
(check-package '#:sb-simd-avx2)
|
||||
(check-package '#:sb-simd-avx512f :skip '(f32-fmaddsub f32-fmsubadd f64-fmaddsub f64-fmsubadd))
|
||||
(check-package '#:sb-simd-avx512bw :skip '(f32-fmaddsub f32-fmsubadd f64-fmaddsub f64-fmsubadd))
|
||||
(check-package '#:sb-simd-avx512dq :skip '(f32-fmaddsub f32-fmsubadd f64-fmaddsub f64-fmsubadd)))
|
||||
#+arm64
|
||||
(check-package '#:sb-simd-neon)
|
||||
;; Ensure that every instruction has a corresponding VOP.
|
||||
|
|
|
|||
|
|
@ -506,3 +506,214 @@
|
|||
(sb-simd-test-suite:define-simple-simd-test f64.4-fmadd (f64.4) (f64.4 f64.4 f64.4) f64-fmadd)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.4-fnmadd (f64.4) (f64.4 f64.4 f64.4) f64-fnmadd)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.4-fmsub (f64.4) (f64.4 f64.4 f64.4) f64-fmsub)
|
||||
|
||||
(in-package #:sb-simd-avx512f)
|
||||
|
||||
;; f32.16
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-if (f32.16) (u32.16 f32.16 f32.16) f32-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-and (f32.16) (&rest f32.16) f32-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-or (f32.16) (&rest f32.16) f32-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-xor (f32.16) (&rest f32.16) f32-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-andc1 (f32.16) (f32.16 f32.16) f32-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-not (f32.16) (f32.16) f32-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-max (f32.16) (f32.16 &rest f32.16) f32-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-min (f32.16) (f32.16 &rest f32.16) f32-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16+ (f32.16) (&rest f32.16) f32+)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16- (f32.16) (f32.16 &rest f32.16) f32-)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16* (f32.16) (&rest f32.16) f32*)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16/ (f32.16) (f32.16 &rest f32.16) f32/)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16= (u32.16) (f32.16 &rest f32.16) f32=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16/= (u32.16) (f32.16 &rest f32.16) f32/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16< (u32.16) (f32.16 &rest f32.16) f32<)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16<= (u32.16) (f32.16 &rest f32.16) f32<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16> (u32.16) (f32.16 &rest f32.16) f32>)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16>= (u32.16) (f32.16 &rest f32.16) f32>=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-sqrt (f32.16) (f32.16) f32-sqrt)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-fmadd (f32.16) (f32.16 f32.16 f32.16) f32-fmadd)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-fnmadd (f32.16) (f32.16 f32.16 f32.16) f32-fnmadd)
|
||||
(sb-simd-test-suite:define-simple-simd-test f32.16-fmsub (f32.16) (f32.16 f32.16 f32.16) f32-fmsub)
|
||||
|
||||
;; f64.8
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-if (f64.8) (u64.8 f64.8 f64.8) f64-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-and (f64.8) (&rest f64.8) f64-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-or (f64.8) (&rest f64.8) f64-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-xor (f64.8) (&rest f64.8) f64-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-andc1 (f64.8) (f64.8 f64.8) f64-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-not (f64.8) (f64.8) f64-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-max (f64.8) (f64.8 &rest f64.8) f64-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-min (f64.8) (f64.8 &rest f64.8) f64-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8+ (f64.8) (&rest f64.8) f64+)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8- (f64.8) (f64.8 &rest f64.8) f64-)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8* (f64.8) (&rest f64.8) f64*)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8/ (f64.8) (f64.8 &rest f64.8) f64/)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8= (u64.8) (f64.8 &rest f64.8) f64=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8/= (u64.8) (f64.8 &rest f64.8) f64/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8< (u64.8) (f64.8 &rest f64.8) f64<)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8<= (u64.8) (f64.8 &rest f64.8) f64<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8> (u64.8) (f64.8 &rest f64.8) f64>)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8>= (u64.8) (f64.8 &rest f64.8) f64>=)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-sqrt (f64.8) (f64.8) f64-sqrt)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-fmadd (f64.8) (f64.8 f64.8 f64.8) f64-fmadd)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-fnmadd (f64.8) (f64.8 f64.8 f64.8) f64-fnmadd)
|
||||
(sb-simd-test-suite:define-simple-simd-test f64.8-fmsub (f64.8) (f64.8 f64.8 f64.8) f64-fmsub)
|
||||
|
||||
;; u32.16
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-if (u32.16) (u32.16 u32.16 u32.16) u32-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-and (u32.16) (&rest u32.16) u32-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-or (u32.16) (&rest u32.16) u32-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-xor (u32.16) (&rest u32.16) u32-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-andc1 (u32.16) (u32.16 u32.16) u32-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-not (u32.16) (u32.16) u32-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-max (u32.16) (u32.16 &rest u32.16) u32-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16-min (u32.16) (u32.16 &rest u32.16) u32-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16+ (u32.16) (&rest u32.16) u32+)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16- (u32.16) (u32.16 &rest u32.16) u32-)
|
||||
(sb-simd-test-suite:define-test u32.16*
|
||||
(sb-simd-test-suite:is (sb-simd-test-suite::simd= (u32.16* (u32.16-broadcast 3) (u32.16-broadcast 5))
|
||||
(u32.16-broadcast 15))))
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16= (u32.16) (u32.16 &rest u32.16) u32=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16/= (u32.16) (u32.16 &rest u32.16) u32/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16< (u32.16) (u32.16 &rest u32.16) u32<)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16<= (u32.16) (u32.16 &rest u32.16) u32<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16> (u32.16) (u32.16 &rest u32.16) u32>)
|
||||
(sb-simd-test-suite:define-simple-simd-test u32.16>= (u32.16) (u32.16 &rest u32.16) u32>=)
|
||||
|
||||
;; s32.16
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-if (s32.16) (u32.16 s32.16 s32.16) s32-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-and (s32.16) (&rest s32.16) s32-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-or (s32.16) (&rest s32.16) s32-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-xor (s32.16) (&rest s32.16) s32-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-andc1 (s32.16) (s32.16 s32.16) s32-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-not (s32.16) (s32.16) s32-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-max (s32.16) (s32.16 &rest s32.16) s32-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16-min (s32.16) (s32.16 &rest s32.16) s32-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16+ (s32.16) (&rest s32.16) s32+)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16- (s32.16) (s32.16 &rest s32.16) s32-)
|
||||
(sb-simd-test-suite:define-test s32.16*
|
||||
(sb-simd-test-suite:is (sb-simd-test-suite::simd= (s32.16* (s32.16-broadcast -3) (s32.16-broadcast 5))
|
||||
(s32.16-broadcast -15))))
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16= (u32.16) (s32.16 &rest s32.16) s32=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16/= (u32.16) (s32.16 &rest s32.16) s32/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16< (u32.16) (s32.16 &rest s32.16) s32<)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16<= (u32.16) (s32.16 &rest s32.16) s32<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16> (u32.16) (s32.16 &rest s32.16) s32>)
|
||||
(sb-simd-test-suite:define-simple-simd-test s32.16>= (u32.16) (s32.16 &rest s32.16) s32>=)
|
||||
|
||||
;; u64.8
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-if (u64.8) (u64.8 u64.8 u64.8) u64-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-and (u64.8) (&rest u64.8) u64-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-or (u64.8) (&rest u64.8) u64-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-xor (u64.8) (&rest u64.8) u64-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-andc1 (u64.8) (u64.8 u64.8) u64-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-not (u64.8) (u64.8) u64-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-max (u64.8) (u64.8 &rest u64.8) u64-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8-min (u64.8) (u64.8 &rest u64.8) u64-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8+ (u64.8) (&rest u64.8) u64+)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8- (u64.8) (u64.8 &rest u64.8) u64-)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8= (u64.8) (u64.8 &rest u64.8) u64=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8/= (u64.8) (u64.8 &rest u64.8) u64/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8< (u64.8) (u64.8 &rest u64.8) u64<)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8<= (u64.8) (u64.8 &rest u64.8) u64<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8> (u64.8) (u64.8 &rest u64.8) u64>)
|
||||
(sb-simd-test-suite:define-simple-simd-test u64.8>= (u64.8) (u64.8 &rest u64.8) u64>=)
|
||||
|
||||
;; s64.8
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-if (s64.8) (u64.8 s64.8 s64.8) s64-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-and (s64.8) (&rest s64.8) s64-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-or (s64.8) (&rest s64.8) s64-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-xor (s64.8) (&rest s64.8) s64-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-andc1 (s64.8) (s64.8 s64.8) s64-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-not (s64.8) (s64.8) s64-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-max (s64.8) (s64.8 &rest s64.8) s64-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8-min (s64.8) (s64.8 &rest s64.8) s64-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8+ (s64.8) (&rest s64.8) s64+)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8- (s64.8) (s64.8 &rest s64.8) s64-)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8= (u64.8) (s64.8 &rest s64.8) s64=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8/= (u64.8) (s64.8 &rest s64.8) s64/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8< (u64.8) (s64.8 &rest s64.8) s64<)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8<= (u64.8) (s64.8 &rest s64.8) s64<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8> (u64.8) (s64.8 &rest s64.8) s64>)
|
||||
(sb-simd-test-suite:define-simple-simd-test s64.8>= (u64.8) (s64.8 &rest s64.8) s64>=)
|
||||
|
||||
(in-package #:sb-simd-avx512bw)
|
||||
|
||||
;; u8.64
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-if (u8.64) (u8.64 u8.64 u8.64) u8-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-and (u8.64) (&rest u8.64) u8-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-or (u8.64) (&rest u8.64) u8-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-xor (u8.64) (&rest u8.64) u8-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-andc1 (u8.64) (u8.64 u8.64) u8-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-not (u8.64) (u8.64) u8-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-max (u8.64) (u8.64 &rest u8.64) u8-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64-min (u8.64) (u8.64 &rest u8.64) u8-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64+ (u8.64) (&rest u8.64) u8+)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64- (u8.64) (u8.64 &rest u8.64) u8-)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64= (u8.64) (u8.64 &rest u8.64) u8=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64/= (u8.64) (u8.64 &rest u8.64) u8/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64< (u8.64) (u8.64 &rest u8.64) u8<)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64<= (u8.64) (u8.64 &rest u8.64) u8<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64> (u8.64) (u8.64 &rest u8.64) u8>)
|
||||
(sb-simd-test-suite:define-simple-simd-test u8.64>= (u8.64) (u8.64 &rest u8.64) u8>=)
|
||||
|
||||
;; s8.64
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-if (s8.64) (u8.64 s8.64 s8.64) s8-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-and (s8.64) (&rest s8.64) s8-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-or (s8.64) (&rest s8.64) s8-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-xor (s8.64) (&rest s8.64) s8-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-andc1 (s8.64) (s8.64 s8.64) s8-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-not (s8.64) (s8.64) s8-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-max (s8.64) (s8.64 &rest s8.64) s8-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64-min (s8.64) (s8.64 &rest s8.64) s8-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64+ (s8.64) (&rest s8.64) s8+)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64- (s8.64) (s8.64 &rest s8.64) s8-)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64= (u8.64) (s8.64 &rest s8.64) s8=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64/= (u8.64) (s8.64 &rest s8.64) s8/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64< (u8.64) (s8.64 &rest s8.64) s8<)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64<= (u8.64) (s8.64 &rest s8.64) s8<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64> (u8.64) (s8.64 &rest s8.64) s8>)
|
||||
(sb-simd-test-suite:define-simple-simd-test s8.64>= (u8.64) (s8.64 &rest s8.64) s8>=)
|
||||
|
||||
;; u16.32
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-if (u16.32) (u16.32 u16.32 u16.32) u16-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-and (u16.32) (&rest u16.32) u16-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-or (u16.32) (&rest u16.32) u16-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-xor (u16.32) (&rest u16.32) u16-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-andc1 (u16.32) (u16.32 u16.32) u16-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-not (u16.32) (u16.32) u16-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-max (u16.32) (u16.32 &rest u16.32) u16-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32-min (u16.32) (u16.32 &rest u16.32) u16-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32+ (u16.32) (&rest u16.32) u16+)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32- (u16.32) (u16.32 &rest u16.32) u16-)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32= (u16.32) (u16.32 &rest u16.32) u16=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32/= (u16.32) (u16.32 &rest u16.32) u16/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32< (u16.32) (u16.32 &rest u16.32) u16<)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32<= (u16.32) (u16.32 &rest u16.32) u16<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32> (u16.32) (u16.32 &rest u16.32) u16>)
|
||||
(sb-simd-test-suite:define-simple-simd-test u16.32>= (u16.32) (u16.32 &rest u16.32) u16>=)
|
||||
|
||||
;; s16.32
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-if (s16.32) (u16.32 s16.32 s16.32) s16-if)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-and (s16.32) (&rest s16.32) s16-and)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-or (s16.32) (&rest s16.32) s16-or)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-xor (s16.32) (&rest s16.32) s16-xor)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-andc1 (s16.32) (s16.32 s16.32) s16-andc1)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-not (s16.32) (s16.32) s16-not)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-max (s16.32) (s16.32 &rest s16.32) s16-max)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32-min (s16.32) (s16.32 &rest s16.32) s16-min)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32+ (s16.32) (&rest s16.32) s16+)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32- (s16.32) (s16.32 &rest s16.32) s16-)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32= (u16.32) (s16.32 &rest s16.32) s16=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32/= (u16.32) (s16.32 &rest s16.32) s16/=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32< (u16.32) (s16.32 &rest s16.32) s16<)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32<= (u16.32) (s16.32 &rest s16.32) s16<=)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32> (u16.32) (s16.32 &rest s16.32) s16>)
|
||||
(sb-simd-test-suite:define-simple-simd-test s16.32>= (u16.32) (s16.32 &rest s16.32) s16>=)
|
||||
|
||||
(in-package #:sb-simd-avx512dq)
|
||||
|
||||
(sb-simd-test-suite:define-test u64.8*
|
||||
(sb-simd-test-suite:is (sb-simd-test-suite::simd= (u64.8* (u64.8-broadcast 3) (u64.8-broadcast 5))
|
||||
(u64.8-broadcast 15))))
|
||||
(sb-simd-test-suite:define-test s64.8*
|
||||
(sb-simd-test-suite:is (sb-simd-test-suite::simd= (s64.8* (s64.8-broadcast -3) (s64.8-broadcast 5))
|
||||
(s64.8-broadcast -15))))
|
||||
|
|
|
|||
|
|
@ -43,6 +43,17 @@
|
|||
(sb-vm::%simd-pack-ref-64 pack 2)
|
||||
(sb-vm::%simd-pack-ref-64 pack 3)))
|
||||
|
||||
#+sb-simd-pack-512
|
||||
(defun %simd-pack-512-ub64s (pack)
|
||||
(values (sb-vm::%simd-pack-ref-64 pack 0)
|
||||
(sb-vm::%simd-pack-ref-64 pack 1)
|
||||
(sb-vm::%simd-pack-ref-64 pack 2)
|
||||
(sb-vm::%simd-pack-ref-64 pack 3)
|
||||
(sb-vm::%simd-pack-ref-64 pack 4)
|
||||
(sb-vm::%simd-pack-ref-64 pack 5)
|
||||
(sb-vm::%simd-pack-ref-64 pack 6)
|
||||
(sb-vm::%simd-pack-ref-64 pack 7)))
|
||||
|
||||
(defun simd= (a b)
|
||||
(typecase a
|
||||
(sb-ext:simd-pack
|
||||
|
|
@ -56,6 +67,13 @@
|
|||
(multiple-value-bind (a0 a1 a2 a3) (%simd-pack-256-ub64s a)
|
||||
(multiple-value-bind (b0 b1 b2 b3) (%simd-pack-256-ub64s b)
|
||||
(and (= a0 b0) (= a1 b1) (= a2 b2) (= a3 b3))))))
|
||||
#+sb-simd-pack-512
|
||||
(sb-ext:simd-pack-512
|
||||
(when (sb-ext:simd-pack-512-p b)
|
||||
(multiple-value-bind (a0 a1 a2 a3 a4 a5 a6 a7) (%simd-pack-512-ub64s a)
|
||||
(multiple-value-bind (b0 b1 b2 b3 b4 b5 b6 b7) (%simd-pack-512-ub64s b)
|
||||
(and (= a0 b0) (= a1 b1) (= a2 b2) (= a3 b3)
|
||||
(= a4 b4) (= a5 b5) (= a6 b6) (= a7 b7))))))
|
||||
(otherwise nil)))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
|||
Loading…
Reference in a new issue