mirror of
git://git.code.sf.net/p/sbcl/sbcl
synced 2026-09-10 07:26:40 -04:00
369 lines
27 KiB
Common Lisp
369 lines
27 KiB
Common Lisp
(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)))
|