sbcl.sbcl/contrib/sb-simd/code/instruction-sets/avx512bw.lisp

219 lines
16 KiB
Common Lisp

(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)))