(in-package #:sb-simd-neon)

(define-instruction-set :neon
  (:test (neon-supported-p))
  (:include :arm64)
  (:simd-packs
   (p128  nil 128 #:simd-pack (#:int-neon-reg #:double-neon-reg #:single-neon-reg))
   (f32.4 f32 128 #:simd-pack-single (#:single-neon-reg))
   (f64.2 f64 128 #:simd-pack-double (#:double-neon-reg))
   (u8.16 u8  128 #:simd-pack-ub8 (#:int-neon-reg))
   (u16.8 u16 128 #:simd-pack-ub16 (#:int-neon-reg))
   (u32.4 u32 128 #:simd-pack-ub32 (#:int-neon-reg))
   (u64.2 u64 128 #:simd-pack-ub64 (#:int-neon-reg))
   (s8.16 s8  128 #:simd-pack-sb8 (#:int-neon-reg))
   (s16.8 s16 128 #:simd-pack-sb16 (#:int-neon-reg))
   (s32.4 s32 128 #:simd-pack-sb32 (#:int-neon-reg))
   (s64.2 s64 128 #:simd-pack-sb64 (#:int-neon-reg)))
  (:simd-casts
   (f32.4 f32.4-broadcast)
   (f64.2 f64.2-broadcast)
   (u8.16 u8.16-broadcast)
   (u16.8 u16.8-broadcast)
   (u32.4 u32.4-broadcast)
   (u64.2 u64.2-broadcast)
   (s8.16 s8.16-broadcast)
   (s16.8 s16.8-broadcast)
   (s32.4 s32.4-broadcast)
   (s64.2 s64.2-broadcast))
  (:reinterpret-casts
   (f32!   f32!-from-p128)
   (f64!   f64!-from-p128)
   (u8!    u8!-from-p128)
   (u16!   u16!-from-p128)
   (u32!   u32!-from-p128)
   (u64!   u64!-from-p128)
   (s8!    s8!-from-p128)
   (s16!   s16!-from-p128)
   (s32!   s32!-from-p128)
   (s64!   s64!-from-p128)
   (f32.4! f32.4!-from-f32 f32.4!-from-p128)
   (f64.2! f64.2!-from-f64 f64.2!-from-p128)
   (u8.16! u8.16!-from-u8  u8.16!-from-p128)
   (u16.8! u16.8!-from-u16 u16.8!-from-p128)
   (u32.4! u32.4!-from-u32 u32.4!-from-p128)
   (u64.2! u64.2!-from-u64 u64.2!-from-p128)
   (s8.16! s8.16!-from-s8  s8.16!-from-p128)
   (s16.8! s16.8!-from-s16 s16.8!-from-p128)
   (s32.4! s32.4!-from-s32 s32.4!-from-p128)
   (s64.2! s64.2!-from-s64 s64.2!-from-p128))
  (:instructions
   ;; f32
   (f32!-from-p128    nil        (f32) (p128)          :cost 1 :encoding :custom :always-translatable nil)
   ;; f32.4
   (f32.4!-from-f32   nil        (f32.4) (f32)         :cost 1 :encoding :custom)
   (f32.4!-from-p128  #:mov      (f32.4) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (f32.4-from-f64.2  #:fcvtn    (f32.4) (f64.2)       :cost 1)
   (f32.4-from-f64.2-hi #:fcvtn2 (f32.4) (f32.4 f64.2) :cost 1 :encoding :neon-rmw)
   (f32.4-from-s32.4  #:scvtf    (f32.4) (s32.4)       :cost 5 :suffix '(:4s))
   (f32.4-from-u32.4  #:ucvtf    (f32.4) (u32.4)       :cost 5 :suffix '(:4s))
   (make-f32.4        nil        (f32.4) (f32 f32 f32 f32) :cost 1 :encoding :fake-vop)
   (f32.4-values      nil        (f32 f32 f32 f32) (f32.4) :cost 1 :encoding :fake-vop)
   (f32.4-broadcast   #:dup      (f32.4) (f32)         :cost 1 :suffix '(:4s))
   (two-arg-f32.4-and #:and      (f32.4) (f32.4 f32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-f32.4-or  #:orr      (f32.4) (f32.4 f32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-f32.4-xor #:eor      (f32.4) (f32.4 f32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-f32.4-max #:fmax     (f32.4) (f32.4 f32.4) :cost 3 :associative t :suffix '(:4s))
   (two-arg-f32.4-min #:fmin     (f32.4) (f32.4 f32.4) :cost 3 :associative t :suffix '(:4s))
   (two-arg-f32.4+    #:fadd     (f32.4) (f32.4 f32.4) :cost 2 :associative t :suffix '(:4s))
   (two-arg-f32.4-    #:fsub     (f32.4) (f32.4 f32.4) :cost 2 :suffix '(:4s))
   (two-arg-f32.4*    #:fmul     (f32.4) (f32.4 f32.4) :cost 2 :associative t :suffix '(:4s))
   (two-arg-f32.4/    #:fdiv     (f32.4) (f32.4 f32.4) :cost 8 :suffix '(:4s))
   (two-arg-f32.4=    #:fcmeq    (u32.4) (f32.4 f32.4) :cost 4 :associative t :suffix '(:4s))
   (two-arg-f32.4/=   nil        (u32.4) (f32.4 f32.4) :cost 4 :encoding :fake-vop)
   (two-arg-f32.4<    nil        (u32.4) (f32.4 f32.4) :cost 4 :encoding :fake-vop)
   (two-arg-f32.4<=   nil        (u32.4) (f32.4 f32.4) :cost 4 :encoding :fake-vop)
   (two-arg-f32.4>    #:fcmgt    (u32.4) (f32.4 f32.4) :cost 4 :suffix '(:4s))
   (two-arg-f32.4>=   #:fcmge    (u32.4) (f32.4 f32.4) :cost 4 :suffix '(:4s))
   (f32.4-pair-min    #:fminp    (f32.4) (f32.4 f32.4) :cost 2 :suffix '(:4s) :associative t)
   (f32.4-horizontal-min #:fminv (f32) (f32.4)         :cost 2 :associative t)
   (f32.4-pair-max    #:fmaxp    (f32.4) (f32.4 f32.4) :cost 2 :suffix '(:4s) :associative t)
   (f32.4-horizontal-max #:fmaxv (f32) (f32.4)         :cost 2 :associative t)
   (f32.4-pair+       #:faddp    (f32.4) (f32.4 f32.4) :cost 2 :suffix '(:4s) :associative t)
   (f32.4-horizontal+ nil        (f32) (f32.4)         :cost 2 :encoding :fake-vop)
   (f32.4-andc1       nil        (f32.4) (f32.4 f32.4) :cost 1 :encoding :fake-vop)
   (f32.4-andc2       #:bic      (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:16b))
   (f32.4-not         #:not      (f32.4) (f32.4)       :cost 1 :suffix '(:16b))
   (f32.4-sqrt        #:fsqrt    (f32.4) (f32.4)       :cost 15 :suffix '(:4s))
   (f32.4-bit-select  #:bsl      (f32.4) (u32.4 f32.4 f32.4) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (f32.4-lane-extract nil       (f32) (f32.4 imm2) :cost 1 :encoding :custom)
   (f32.4-lane-insert nil        (f32.4) (f32.4 f32 imm2) :cost 1 :encoding :custom)
   (f32.4-dup         nil        (f32.4) (f32.4 imm2) :cost 1 :encoding :custom)
   (f32.4-ins         nil        (f32.4) (f32.4 f32.4 imm2 imm2) :cost 1 :encoding :custom)
   (f32.4-transpose-even #:trn1  (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:4s))
   (f32.4-transpose-odd #:trn2   (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:4s))
   (f32.4-unzip-even  #:uzp1     (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:4s))
   (f32.4-unzip-odd   #:uzp2     (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:4s))
   (f32.4-zip-even    #:zip1     (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:4s))
   (f32.4-zip-odd     #:zip2     (f32.4) (f32.4 f32.4) :cost 1 :suffix '(:4s))
   ;; f64
   (f64!-from-p128    nil        (f64) (p128)          :cost 1 :encoding :custom :always-translatable nil)
   ;; f64.2
   (f64.2!-from-f64   nil        (f64.2) (f64)         :cost 1 :encoding :custom)
   (f64.2!-from-p128  #:mov      (f64.2) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (f64.2-from-f32.4  #:fcvtl    (f64.2) (f32.4)       :cost 1)
   (f64.2-from-f32.4-hi #:fcvtl2 (f64.2) (f32.4)       :cost 1)
   (f64.2-from-s64.2  #:scvtf    (f64.2) (s64.2)       :cost 5 :suffix '(:2d))
   (f64.2-from-u64.2  #:ucvtf    (f64.2) (u64.2)       :cost 5 :suffix '(:2d))
   (make-f64.2        nil        (f64.2) (f64 f64)     :cost 1 :encoding :fake-vop)
   (f64.2-values      nil        (f64 f64) (f64.2)     :cost 1 :encoding :fake-vop)
   (f64.2-broadcast   #:dup      (f64.2) (f64)         :cost 1 :suffix '(:2d))
   (two-arg-f64.2-and #:and      (f64.2) (f64.2 f64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-f64.2-or  #:orr      (f64.2) (f64.2 f64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-f64.2-xor #:eor      (f64.2) (f64.2 f64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-f64.2-max #:fmax     (f64.2) (f64.2 f64.2) :cost 3 :associative t :suffix '(:2d))
   (two-arg-f64.2-min #:fmin     (f64.2) (f64.2 f64.2) :cost 3 :associative t :suffix '(:2d))
   (two-arg-f64.2+    #:fadd     (f64.2) (f64.2 f64.2) :cost 2 :associative t :suffix '(:2d))
   (two-arg-f64.2-    #:fsub     (f64.2) (f64.2 f64.2) :cost 2 :suffix '(:2d))
   (two-arg-f64.2*    #:fmul     (f64.2) (f64.2 f64.2) :cost 2 :associative t :suffix '(:2d))
   (two-arg-f64.2/    #:fdiv     (f64.2) (f64.2 f64.2) :cost 8 :suffix '(:2d))
   (two-arg-f64.2=    #:fcmeq    (u64.2) (f64.2 f64.2) :cost 4 :associative t :suffix '(:2d))
   (two-arg-f64.2/=   nil        (u64.2) (f64.2 f64.2) :cost 4 :encoding :fake-vop)
   (two-arg-f64.2<    nil        (u64.2) (f64.2 f64.2) :cost 4 :encoding :fake-vop)
   (two-arg-f64.2<=   nil        (u64.2) (f64.2 f64.2) :cost 4 :encoding :fake-vop)
   (two-arg-f64.2>    #:fcmgt    (u64.2) (f64.2 f64.2) :cost 4 :suffix '(:2d))
   (two-arg-f64.2>=   #:fcmge    (u64.2) (f64.2 f64.2) :cost 4 :suffix '(:2d))
   (f64.2-pair-min    #:fminp    (f64.2) (f64.2 f64.2) :cost 2 :suffix '(:2d) :associative t)
   (f64.2-horizontal-min #:fminp (f64) (f64.2)         :cost 2 :suffix '(:2d))
   (f64.2-pair-max    #:fmaxp    (f64.2) (f64.2 f64.2) :cost 2 :suffix '(:2d) :associative t)
   (f64.2-horizontal-max #:fmaxp (f64) (f64.2)         :cost 2 :suffix '(:2d))
   (f64.2-pair+       #:faddp    (f64.2) (f64.2 f64.2) :cost 2 :suffix '(:2d) :associative t)
   (f64.2-horizontal+ #:faddp    (f64) (f64.2)         :cost 2 :suffix '(:2d))
   (f64.2-andc1       nil        (f64.2) (f64.2 f64.2) :cost 1 :encoding :fake-vop)
   (f64.2-andc2       #:bic      (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:16b))
   (f64.2-not         #:not      (f64.2) (f64.2)       :cost 1 :suffix '(:16b))
   (f64.2-sqrt        #:fsqrt    (f64.2) (f64.2)       :cost 15 :suffix '(:2d))
   (f64.2-bit-select  #:bsl      (f64.2) (u64.2 f64.2 f64.2) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (f64.2-lane-extract nil       (f64) (f64.2 imm1)    :cost 1 :encoding :custom)
   (f64.2-lane-insert nil        (f64.2) (f64.2 f64 imm1) :cost 1 :encoding :custom)
   (f64.2-dup         nil        (f64.2) (f64.2 imm1)  :cost 1 :encoding :custom)
   (f64.2-ins         nil        (f64.2) (f64.2 f64.2 imm1 imm1) :cost 1 :encoding :custom)
   (f64.2-transpose-even #:trn1  (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:2d))
   (f64.2-transpose-odd #:trn2   (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:2d))
   (f64.2-unzip-even  #:uzp1     (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:2d))
   (f64.2-unzip-odd   #:uzp2     (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:2d))
   (f64.2-zip-even    #:zip1     (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:2d))
   (f64.2-zip-odd     #:zip2     (f64.2) (f64.2 f64.2) :cost 1 :suffix '(:2d))
   ;; u8
   (u8!-from-p128     #:umov     (u8) (p128)           :cost 1 :encoding :move :suffix '(0 :b) :always-translatable nil)
   ;; u8.16
   (u8.16!-from-u8    nil        (u8.16) (u8)          :cost 1 :encoding :custom)
   (u8.16!-from-p128  #:mov      (u8.16) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (u8.16-from-u16.8  #:xtn      (u8.16) (u16.8)       :cost 1 :suffix '(:8b))
   (u8.16-from-u16.8-hi #:xtn2   (u8.16) (u8.16 u16.8) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (u8.16-from-u16.8-saturating #:uqxtn (u8.16) (u16.8)  :cost 1 :suffix '(:8b))
   (u8.16-from-u16.8-saturating-hi #:uqxtn2 (u8.16) (u8.16 u16.8) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (make-u8.16        nil        (u8.16) (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) :cost 1 :encoding :fake-vop)
   (u8.16-values      nil        (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) (u8.16) :cost 1 :encoding :fake-vop)
   (u8.16-broadcast   #:dup      (u8.16) (u8)          :cost 1 :suffix '(:16b))
   (two-arg-u8.16-and #:and      (u8.16) (u8.16 u8.16) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u8.16-or  #:orr      (u8.16) (u8.16 u8.16) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u8.16-xor #:eor      (u8.16) (u8.16 u8.16) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u8.16-max #:umax     (u8.16) (u8.16 u8.16) :cost 3 :associative t :suffix '(:16b))
   (two-arg-u8.16-min #:umin     (u8.16) (u8.16 u8.16) :cost 3 :associative t :suffix '(:16b))
   (u8.16-andc1       nil        (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop)
   (u8.16-andc2       #:bic      (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-not         #:not      (u8.16) (u8.16)       :cost 1 :suffix '(:16b))
   (two-arg-u8.16+    #:add      (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-u8.16+-saturating #:uqadd (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-u8.16-    #:sub      (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b))
   (two-arg-u8.16--saturating #:uqsub (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-u8.16*    #:mul      (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (u8.16*-long       #:umull    (u16.8) (u8.16 u8.16) :cost 2 :suffix '(:8b) :associative t)
   (u8.16*-long-hi    #:umull2   (u16.8) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-u8.16=    #:cmeq     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (two-arg-u8.16/=   nil        (u8.16) (u8.16 u8.16) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-u8.16>    #:cmhi     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (two-arg-u8.16<    nil        (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop)
   (two-arg-u8.16>=   #:cmhs     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (two-arg-u8.16<=   nil        (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop)
   (u8.16-pair-min    #:uminp    (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (u8.16-horizontal-min #:uminv (u8) (u8.16)          :cost 2 :encoding :neon-int-result :suffix '(:16b) :associative t)
   (u8.16-pair-max    #:umaxp    (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (u8.16-horizontal-max #:umaxv (u8) (u8.16)          :cost 2 :encoding :neon-int-result :suffix '(:16b) :associative t)
   (u8.16-pair+       #:addp     (u8.16) (u8.16 u8.16) :cost 2 :suffix '(:16b) :associative t)
   (u8.16-horizontal+ #:addv     (u8) (u8.16)          :cost 2 :encoding :neon-int-result :suffix '(:16b) :associative t)
   (u8.16-shiftr      nil        (u8.16) (u8.16 imm3)  :cost 1 :encoding :custom)
   (u8.16-shiftl      nil        (u8.16) (u8.16 imm3)  :cost 1 :encoding :custom)
   (u8.16-shiftl-long nil        (u16.8) (u8.16 imm3)  :cost 1 :encoding :custom)
   (u8.16-shiftl-long-hi nil     (u16.8) (u8.16 imm3)  :cost 1 :encoding :custom)
   (u8.16-rev16       #:rev16    (u8.16) (u8.16)       :cost 1 :suffix '(:16b))
   (u8.16-rev32       #:rev32    (u8.16) (u8.16)       :cost 1 :suffix '(:16b))
   (u8.16-rev64       #:rev64    (u8.16) (u8.16)       :cost 1 :suffix '(:16b))
   (u8.16-bit-select  #:bsl      (u8.16) (u8.16 u8.16 u8.16) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (u8.16-lane-extract nil       (u8) (u8.16 imm4)     :cost 1 :encoding :custom)
   (u8.16-lane-insert nil        (u8.16) (u8.16 u8 imm4) :cost 1 :encoding :custom)
   (u8.16-dup         nil        (u8.16) (u8.16 imm4)  :cost 1 :encoding :custom)
   (u8.16-ins         nil        (u8.16) (u8.16 u8.16 imm4 imm4) :cost 1 :encoding :custom)
   (u8.16-transpose-even #:trn1  (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-transpose-odd #:trn2   (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-unzip-even  #:uzp1     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-unzip-odd   #:uzp2     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-zip-even    #:zip1     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-zip-odd     #:zip2     (u8.16) (u8.16 u8.16) :cost 1 :suffix '(:16b))
   (u8.16-shuffle     nil        (u8.16) (u8.16 u8.16) :cost 1 :encoding :custom)
   ;; u16
   (u16!-from-p128    #:umov     (u16) (p128)          :cost 1 :encoding :move :suffix '(0 :h) :always-translatable nil)
   ;; u16.8
   (u16.8!-from-u16   nil        (u16.8) (u16)         :cost 1 :encoding :custom)
   (u16.8!-from-p128  #:mov      (u16.8) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (u16.8-from-u8.16  nil        (u16.8) (u8.16)       :cost 1 :encoding :custom)
   (u16.8-from-u8.16-hi nil      (u16.8) (u8.16)       :cost 1 :encoding :custom)
   (u16.8-from-u32.4  #:xtn      (u16.8) (u32.4)       :cost 1 :suffix '(:4h))
   (u16.8-from-u32.4-hi #:xtn2   (u16.8) (u16.8 u32.4) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (u16.8-from-u32.4-saturating #:uqxtn (u16.8) (u32.4)  :cost 1 :suffix '(:4h))
   (u16.8-from-u32.4-saturating-hi #:uqxtn2 (u16.8) (u16.8 u32.4) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (make-u16.8        nil        (u16.8) (u16 u16 u16 u16 u16 u16 u16 u16) :cost 1 :encoding :fake-vop)
   (u16.8-values      nil        (u16 u16 u16 u16 u16 u16 u16 u16) (u16.8) :cost 1 :encoding :fake-vop)
   (u16.8-broadcast   #:dup      (u16.8) (u16)         :cost 1 :suffix '(:8h))
   (two-arg-u16.8-and #:and      (u16.8) (u16.8 u16.8) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u16.8-or  #:orr      (u16.8) (u16.8 u16.8) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u16.8-xor #:eor      (u16.8) (u16.8 u16.8) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u16.8-max #:umax     (u16.8) (u16.8 u16.8) :cost 3 :associative t :suffix '(:8h))
   (two-arg-u16.8-min #:umin     (u16.8) (u16.8 u16.8) :cost 3 :associative t :suffix '(:8h))
   (u16.8-andc1       nil        (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop)
   (u16.8-andc2       #:bic      (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:16b))
   (u16.8-not         #:not      (u16.8) (u16.8)       :cost 1 :suffix '(:16b))
   (two-arg-u16.8+    #:add      (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (two-arg-u16.8+-saturating #:uqadd (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (two-arg-u16.8-    #:sub      (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h))
   (two-arg-u16.8--saturating #:uqsub (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h))
   (two-arg-u16.8*    #:mul      (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (u16.8*-long       #:umull    (u32.4) (u16.8 u16.8) :cost 2 :suffix '(:4h) :associative t)
   (u16.8*-long-hi    #:umull2   (u32.4) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (two-arg-u16.8=    #:cmeq     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (two-arg-u16.8/=   nil        (u16.8) (u16.8 u16.8) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-u16.8>    #:cmhi     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (two-arg-u16.8<    nil        (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop)
   (two-arg-u16.8>=   #:cmhs     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (two-arg-u16.8<=   nil        (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop)
   (u16.8-pair-min    #:uminp    (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (u16.8-horizontal-min #:uminv (u16) (u16.8)         :cost 2 :encoding :neon-int-result :suffix '(:8h) :associative t)
   (u16.8-pair-max    #:umaxp    (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (u16.8-horizontal-max #:umaxv (u16) (u16.8)         :cost 2 :encoding :neon-int-result :suffix '(:8h) :associative t)
   (u16.8-pair+       #:addp     (u16.8) (u16.8 u16.8) :cost 2 :suffix '(:8h) :associative t)
   (u16.8-horizontal+ #:addv     (u16) (u16.8)         :cost 2 :encoding :neon-int-result :suffix '(:8h) :associative t)
   (u16.8-shiftr      nil        (u16.8) (u16.8 imm4)  :cost 1 :encoding :custom)
   (u16.8-shiftl      nil        (u16.8) (u16.8 imm4)  :cost 1 :encoding :custom)
   (u16.8-shiftl-long nil        (u32.4) (u16.8 imm4)  :cost 1 :encoding :custom)
   (u16.8-shiftl-long-hi nil     (u32.4) (u16.8 imm4)  :cost 1 :encoding :custom)
   (u16.8-bit-select  #:bsl      (u16.8) (u16.8 u16.8 u16.8) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (u16.8-lane-extract nil       (u16) (u16.8 imm3)    :cost 1 :encoding :custom)
   (u16.8-lane-insert nil        (u16.8) (u16.8 u16 imm3) :cost 1 :encoding :custom)
   (u16.8-dup         nil        (u16.8) (u16.8 imm3)  :cost 1 :encoding :custom)
   (u16.8-ins         nil        (u16.8) (u16.8 u16.8 imm3 imm3) :cost 1 :encoding :custom)
   (u16.8-transpose-even #:trn1  (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (u16.8-transpose-odd #:trn2   (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (u16.8-unzip-even  #:uzp1     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (u16.8-unzip-odd   #:uzp2     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (u16.8-zip-even    #:zip1     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   (u16.8-zip-odd     #:zip2     (u16.8) (u16.8 u16.8) :cost 1 :suffix '(:8h))
   ;; u32
   (u32!-from-p128    #:umov     (u32) (p128)          :cost 1 :encoding :move :suffix '(0 :s) :always-translatable nil)
   ;; u32.4
   (u32.4!-from-u32   nil        (u32.4) (u32)         :cost 1 :encoding :custom)
   (u32.4!-from-p128  #:mov      (u32.4) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (u32.4-from-f32.4  #:fcvtnu   (u32.4) (f32.4)       :cost 5 :suffix '(:4s))
   (u32.4-from-u16.8  nil        (u32.4) (u16.8)       :cost 1 :encoding :custom)
   (u32.4-from-u16.8-hi nil      (u32.4) (u16.8)       :cost 1 :encoding :custom)
   (u32.4-from-u64.2  #:xtn      (u32.4) (u64.2)       :cost 1 :suffix '(:4h))
   (u32.4-from-u64.2-hi #:xtn2   (u32.4) (u32.4 u64.2) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (u32.4-from-u64.2-saturating #:uqxtn (u32.4) (u64.2)  :cost 1 :suffix '(:4h))
   (u32.4-from-u64.2-saturating-hi #:uqxtn2 (u32.4) (u32.4 u64.2) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (make-u32.4        nil        (u32.4) (u32 u32 u32 u32) :cost 1 :encoding :fake-vop)
   (u32.4-values      nil        (u32 u32 u32 u32) (u32.4) :cost 1 :encoding :fake-vop)
   (u32.4-broadcast   #:dup      (u32.4) (u32)         :cost 1 :suffix '(:4s))
   (two-arg-u32.4-and #:and      (u32.4) (u32.4 u32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u32.4-or  #:orr      (u32.4) (u32.4 u32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u32.4-xor #:eor      (u32.4) (u32.4 u32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u32.4-max #:umax     (u32.4) (u32.4 u32.4) :cost 3 :associative t :suffix '(:4s))
   (two-arg-u32.4-min #:umin     (u32.4) (u32.4 u32.4) :cost 3 :associative t :suffix '(:4s))
   (u32.4-andc1       nil        (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop)
   (u32.4-andc2       #:bic      (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:16b))
   (u32.4-not         #:not      (u32.4) (u32.4)       :cost 1 :suffix '(:16b))
   (two-arg-u32.4+    #:add      (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (two-arg-u32.4+-saturating #:uqadd (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (two-arg-u32.4-    #:sub      (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s))
   (two-arg-u32.4--saturating #:uqsub (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s))
   (two-arg-u32.4*    #:mul      (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (u32.4*-long       #:umull    (u64.2) (u32.4 u32.4) :cost 2 :suffix '(:2s) :associative t)
   (u32.4*-long-hi    #:umull2   (u64.2) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (two-arg-u32.4=    #:cmeq     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (two-arg-u32.4/=   nil        (u32.4) (u32.4 u32.4) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-u32.4>    #:cmhi     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (two-arg-u32.4<    nil        (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop)
   (two-arg-u32.4>=   #:cmhs     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (two-arg-u32.4<=   nil        (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop)
   (u32.4-pair-min    #:uminp    (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (u32.4-horizontal-min #:uminv (u32) (u32.4)         :cost 2 :encoding :neon-int-result :suffix '(:4s) :associative t)
   (u32.4-pair-max    #:umaxp    (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (u32.4-horizontal-max #:umaxv (u32) (u32.4)         :cost 2 :encoding :neon-int-result :suffix '(:4s) :associative t)
   (u32.4-pair+       #:addp     (u32.4) (u32.4 u32.4) :cost 2 :suffix '(:4s) :associative t)
   (u32.4-horizontal+ #:addv     (u32) (u32.4)         :cost 2 :encoding :neon-int-result :suffix '(:4s) :associative t)
   (u32.4-shiftr      nil        (u32.4) (u32.4 imm5)  :cost 1 :encoding :custom)
   (u32.4-shiftl      nil        (u32.4) (u32.4 imm5)  :cost 1 :encoding :custom)
   (u32.4-shiftl-long nil        (u64.2) (u32.4 imm5)  :cost 1 :encoding :custom)
   (u32.4-shiftl-long-hi nil     (u64.2) (u32.4 imm5)  :cost 1 :encoding :custom)
   (u32.4-bit-select  #:bsl      (u32.4) (u32.4 u32.4 u32.4) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (u32.4-lane-extract nil       (u32) (u32.4 imm2)    :cost 1 :encoding :custom)
   (u32.4-lane-insert nil        (u32.4) (u32.4 u32 imm2) :cost 1 :encoding :custom)
   (u32.4-dup         nil        (u32.4) (u32.4 imm2)  :cost 1 :encoding :custom)
   (u32.4-ins         nil        (u32.4) (u32.4 u32.4 imm2 imm2) :cost 1 :encoding :custom)
   (u32.4-transpose-even #:trn1  (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (u32.4-transpose-odd #:trn2   (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (u32.4-unzip-even  #:uzp1     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (u32.4-unzip-odd   #:uzp2     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (u32.4-zip-even    #:zip1     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   (u32.4-zip-odd     #:zip2     (u32.4) (u32.4 u32.4) :cost 1 :suffix '(:4s))
   ;; u64
   (u64!-from-p128    #:umov     (u64) (p128)          :cost 1 :encoding :move :suffix '(0 :d) :always-translatable nil)
   ;; u64.2
   (u64.2!-from-u64   nil        (u64.2) (u64)         :cost 1 :encoding :custom)
   (u64.2!-from-p128  #:mov      (u64.2) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (u64.2-from-f64.2  #:fcvtnu   (u64.2) (f64.2)       :cost 5 :suffix '(:2d))
   (u64.2-from-u32.4  nil        (u64.2) (u32.4)       :cost 1 :encoding :custom)
   (u64.2-from-u32.4-hi nil      (u64.2) (u32.4)       :cost 1 :encoding :custom)
   (make-u64.2        nil        (u64.2) (u64 u64)     :cost 1 :encoding :fake-vop)
   (u64.2-values      nil        (u64 u64) (u64.2)     :cost 1 :encoding :fake-vop)
   (u64.2-broadcast   #:dup      (u64.2) (u64)         :cost 1 :suffix '(:2d))
   (two-arg-u64.2-and #:and      (u64.2) (u64.2 u64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u64.2-or  #:orr      (u64.2) (u64.2 u64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u64.2-xor #:eor      (u64.2) (u64.2 u64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-u64.2-max #:umax     (u64.2) (u64.2 u64.2) :cost 3 :associative t :suffix '(:2d))
   (two-arg-u64.2-min #:umin     (u64.2) (u64.2 u64.2) :cost 3 :associative t :suffix '(:2d))
   (u64.2-andc1       nil        (u64.2) (u64.2 u64.2) :cost 1 :encoding :fake-vop)
   (u64.2-andc2       #:bic      (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:16b))
   (u64.2-not         #:not      (u64.2) (u64.2)       :cost 1 :suffix '(:16b))
   (two-arg-u64.2+    #:add      (u64.2) (u64.2 u64.2) :cost 2 :suffix '(:2d) :associative t)
   (two-arg-u64.2+-saturating #:uqadd (u64.2) (u64.2 u64.2) :cost 2 :suffix '(:2d) :associative t)
   (two-arg-u64.2-    #:sub      (u64.2) (u64.2 u64.2) :cost 2 :suffix '(:2d))
   (two-arg-u64.2--saturating #:uqsub (u64.2) (u64.2 u64.2) :cost 2 :suffix '(:2d))
   (two-arg-u64.2*    #:mul      (u64.2) (u64.2 u64.2) :cost 2 :suffix '(:2d) :associative t)
   (two-arg-u64.2=    #:cmeq     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (two-arg-u64.2/=   nil        (u64.2) (u64.2 u64.2) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-u64.2>    #:cmhi     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (two-arg-u64.2<    nil        (u64.2) (u64.2 u64.2) :cost 1 :encoding :fake-vop)
   (two-arg-u64.2>=   #:cmhs     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (two-arg-u64.2<=   nil        (u64.2) (u64.2 u64.2) :cost 1 :encoding :fake-vop)
   (u64.2-pair-min    nil        (u64.2) (u64.2 u64.2) :cost 2 :encoding :fake-vop :associative t)
   (u64.2-horizontal-min nil     (u64) (u64.2)         :cost 2 :encoding :fake-vop :associative t)
   (u64.2-pair-max    nil        (u64.2) (u64.2 u64.2) :cost 2 :encoding :fake-vop :associative t)
   (u64.2-horizontal-max nil     (u64) (u64.2)         :cost 2 :encoding :fake-vop :associative t)
   (u64.2-pair+       nil        (u64.2) (u64.2 u64.2) :cost 2 :encoding :fake-vop :associative t)
   (u64.2-horizontal+ nil        (u64) (u64.2)         :cost 2 :encoding :fake-vop :associative t)
   (u64.2-shiftr      nil        (u64.2) (u64.2 imm6)  :cost 1 :encoding :custom)
   (u64.2-shiftl      nil        (u64.2) (u64.2 imm6)  :cost 1 :encoding :custom)
   (u64.2-bit-select  #:bsl      (u64.2) (u64.2 u64.2 u64.2) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (u64.2-lane-extract nil       (u64) (u64.2 imm1)    :cost 1 :encoding :custom)
   (u64.2-lane-insert nil        (u64.2) (u64.2 u64 imm1) :cost 1 :encoding :custom)
   (u64.2-dup         nil        (u64.2) (u64.2 imm1)  :cost 1 :encoding :custom)
   (u64.2-ins         nil        (u64.2) (u64.2 u64.2 imm1 imm1) :cost 1 :encoding :custom)
   (u64.2-transpose-even #:trn1  (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (u64.2-transpose-odd #:trn2   (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (u64.2-unzip-even  #:uzp1     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (u64.2-unzip-odd   #:uzp2     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (u64.2-zip-even    #:zip1     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   (u64.2-zip-odd     #:zip2     (u64.2) (u64.2 u64.2) :cost 1 :suffix '(:2d))
   ;; s8
   (s8!-from-p128     #:smov     (s8) (p128)           :cost 1 :encoding :move :suffix '(0 :b) :always-translatable nil)
   ;; s8.16
   (s8.16!-from-s8    nil        (s8.16) (s8)          :cost 1 :encoding :custom)
   (s8.16!-from-p128  #:mov      (s8.16) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (s8.16-from-s16.8  #:xtn      (s8.16) (s16.8)       :cost 1 :suffix '(:8b))
   (s8.16-from-s16.8-hi #:xtn2   (s8.16) (s8.16 s16.8) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (s8.16-from-s16.8-saturating #:sqxtn (s8.16) (s16.8)  :cost 1 :suffix '(:8b))
   (s8.16-from-s16.8-saturating-hi #:sqxtn2 (s8.16) (s8.16 s16.8) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (make-s8.16        nil        (s8.16) (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) :cost 1 :encoding :fake-vop)
   (s8.16-values      nil        (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) (s8.16) :cost 1 :encoding :fake-vop)
   (s8.16-broadcast   #:dup      (s8.16) (s8)          :cost 1 :suffix '(:16b))
   (two-arg-s8.16-and #:and      (s8.16) (s8.16 s8.16) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s8.16-or  #:orr      (s8.16) (s8.16 s8.16) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s8.16-xor #:eor      (s8.16) (s8.16 s8.16) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s8.16-max #:smax     (s8.16) (s8.16 s8.16) :cost 3 :associative t :suffix '(:16b))
   (two-arg-s8.16-min #:smin     (s8.16) (s8.16 s8.16) :cost 3 :associative t :suffix '(:16b))
   (s8.16-andc1       nil        (s8.16) (s8.16 s8.16) :cost 1 :encoding :fake-vop)
   (s8.16-andc2       #:bic      (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (s8.16-not         #:not      (s8.16) (s8.16)       :cost 1 :suffix '(:16b))
   (two-arg-s8.16+    #:add      (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-s8.16+-saturating #:sqadd (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-s8.16-    #:sub      (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b))
   (two-arg-s8.16--saturating #:sqsub (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b))
   (two-arg-s8.16*    #:mul      (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b) :associative t)
   (two-arg-s8.16=    #:cmeq     (u8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (two-arg-s8.16/=   nil        (u8.16) (s8.16 s8.16) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-s8.16>    #:cmgt     (u8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (two-arg-s8.16<    nil        (u8.16) (s8.16 s8.16) :cost 1 :encoding :fake-vop)
   (two-arg-s8.16>=   #:cmge     (u8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (two-arg-s8.16<=   nil        (u8.16) (s8.16 s8.16) :cost 1 :encoding :fake-vop)
   (s8.16-pair-min    #:sminp    (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b) :associative t)
   (s8.16-horizontal-min #:sminv (s8) (s8.16)          :cost 2 :encoding :neon-int-result :suffix '(:16b) :associative t)
   (s8.16-pair-max    #:smaxp    (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b) :associative t)
   (s8.16-horizontal-max #:smaxv (s8) (s8.16)          :cost 2 :encoding :neon-int-result :suffix '(:16b) :associative t)
   (s8.16-pair+       #:addp     (s8.16) (s8.16 s8.16) :cost 2 :suffix '(:16b) :associative t)
   (s8.16-horizontal+ #:addv     (s8) (s8.16)          :cost 2 :encoding :neon-int-result :suffix '(:16b) :associative t)
   (s8.16-shiftr      nil        (s8.16) (s8.16 imm3)  :cost 1 :encoding :custom)
   (s8.16-shiftl      nil        (s8.16) (s8.16 imm3)  :cost 1 :encoding :custom)
   (s8.16-shiftl-long nil        (s16.8) (s8.16 imm3)  :cost 1 :encoding :custom)
   (s8.16-shiftl-long-hi nil     (s16.8) (s8.16 imm3)  :cost 1 :encoding :custom)
   (s8.16-bit-select  #:bsl      (s8.16) (u8.16 s8.16 s8.16) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (s8.16-lane-extract nil       (s8) (s8.16 imm4)     :cost 1 :encoding :custom)
   (s8.16-lane-insert nil        (s8.16) (s8.16 s8 imm4) :cost 1 :encoding :custom)
   (s8.16-dup         nil        (s8.16) (s8.16 imm4)  :cost 1 :encoding :custom)
   (s8.16-ins         nil        (s8.16) (s8.16 s8.16 imm4 imm4) :cost 1 :encoding :custom)
   (s8.16-transpose-even #:trn1  (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (s8.16-transpose-odd #:trn2   (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (s8.16-unzip-even  #:uzp1     (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (s8.16-unzip-odd   #:uzp2     (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (s8.16-zip-even    #:zip1     (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   (s8.16-zip-odd     #:zip2     (s8.16) (s8.16 s8.16) :cost 1 :suffix '(:16b))
   ;; s16
   (s16!-from-p128    #:smov     (s16) (p128)          :cost 1 :encoding :move :suffix '(0 :h) :always-translatable nil)
   ;; s16.8
   (s16.8!-from-s16   nil        (s16.8) (s16)         :cost 1 :encoding :custom)
   (s16.8!-from-p128  #:mov      (s16.8) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (s16.8-from-s8.16  nil        (s16.8) (s8.16)       :cost 1 :encoding :custom)
   (s16.8-from-s8.16-hi nil      (s16.8) (s8.16)       :cost 1 :encoding :custom)
   (s16.8-from-s32.4  #:xtn      (s16.8) (s32.4)       :cost 1 :suffix '(:4h))
   (s16.8-from-s32.4-hi #:xtn2   (s16.8) (s16.8 s32.4) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (s16.8-from-s32.4-saturating #:sqxtn (s16.8) (s32.4)  :cost 1 :suffix '(:4h))
   (s16.8-from-s32.4-saturating-hi #:sqxtn2 (s16.8) (s16.8 s32.4) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (make-s16.8        nil        (s16.8) (s16 s16 s16 s16 s16 s16 s16 s16) :cost 1 :encoding :fake-vop)
   (s16.8-values      nil        (s16 s16 s16 s16 s16 s16 s16 s16) (s16.8) :cost 1 :encoding :fake-vop)
   (s16.8-broadcast   #:dup      (s16.8) (s16)         :cost 1 :suffix '(:8h))
   (two-arg-s16.8-and #:and      (s16.8) (s16.8 s16.8) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s16.8-or  #:orr      (s16.8) (s16.8 s16.8) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s16.8-xor #:eor      (s16.8) (s16.8 s16.8) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s16.8-max #:smax     (s16.8) (s16.8 s16.8) :cost 3 :associative t :suffix '(:8h))
   (two-arg-s16.8-min #:smin     (s16.8) (s16.8 s16.8) :cost 3 :associative t :suffix '(:8h))
   (s16.8-andc1       nil        (s16.8) (s16.8 s16.8) :cost 1 :encoding :fake-vop)
   (s16.8-andc2       #:bic      (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:16b))
   (s16.8-not         #:not      (s16.8) (s16.8)       :cost 1 :suffix '(:16b))
   (two-arg-s16.8+    #:add      (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h) :associative t)
   (two-arg-s16.8+-saturating #:sqadd (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h) :associative t)
   (two-arg-s16.8-    #:sub      (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h))
   (two-arg-s16.8--saturating #:sqsub (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h))
   (two-arg-s16.8*    #:mul      (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h) :associative t)
   (two-arg-s16.8=    #:cmeq     (u16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (two-arg-s16.8/=   nil        (u16.8) (s16.8 s16.8) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-s16.8>    #:cmgt     (u16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (two-arg-s16.8<    nil        (u16.8) (s16.8 s16.8) :cost 1 :encoding :fake-vop)
   (two-arg-s16.8>=   #:cmge     (u16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (two-arg-s16.8<=   nil        (u16.8) (s16.8 s16.8) :cost 1 :encoding :fake-vop)
   (s16.8-pair-min    #:sminp    (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h) :associative t)
   (s16.8-horizontal-min #:sminv (s16) (s16.8)         :cost 2 :encoding :neon-int-result :suffix '(:8h) :associative t)
   (s16.8-pair-max    #:smaxp    (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h) :associative t)
   (s16.8-horizontal-max #:smaxv (s16) (s16.8)         :cost 2 :encoding :neon-int-result :suffix '(:8h) :associative t)
   (s16.8-pair+       #:addp     (s16.8) (s16.8 s16.8) :cost 2 :suffix '(:8h) :associative t)
   (s16.8-horizontal+ #:addv     (s16) (s16.8)         :cost 2 :encoding :neon-int-result :suffix '(:8h) :associative t)
   (s16.8-shiftr      nil        (s16.8) (s16.8 imm4)  :cost 1 :encoding :custom)
   (s16.8-shiftl      nil        (s16.8) (s16.8 imm4)  :cost 1 :encoding :custom)
   (s16.8-shiftl-long nil        (s32.4) (s16.8 imm4)  :cost 1 :encoding :custom)
   (s16.8-shiftl-long-hi nil     (s32.4) (s16.8 imm4)  :cost 1 :encoding :custom)
   (s16.8-bit-select  #:bsl      (s16.8) (u16.8 s16.8 s16.8) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (s16.8-lane-extract nil       (s16) (s16.8 imm3)    :cost 1 :encoding :custom)
   (s16.8-lane-insert nil        (s16.8) (s16.8 s16 imm3) :cost 1 :encoding :custom)
   (s16.8-dup         nil        (s16.8) (s16.8 imm3)  :cost 1 :encoding :custom)
   (s16.8-ins         nil        (s16.8) (s16.8 s16.8 imm3 imm3) :cost 1 :encoding :custom)
   (s16.8-transpose-even #:trn1  (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (s16.8-transpose-odd #:trn2   (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (s16.8-unzip-even  #:uzp1     (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (s16.8-unzip-odd   #:uzp2     (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (s16.8-zip-even    #:zip1     (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   (s16.8-zip-odd     #:zip2     (s16.8) (s16.8 s16.8) :cost 1 :suffix '(:8h))
   ;; s32
   (s32!-from-p128    #:smov     (s32) (p128)          :cost 1 :encoding :move :suffix '(0 :s) :always-translatable nil)
   ;; s32.4
   (s32.4!-from-s32   nil        (s32.4) (s32)         :cost 1 :encoding :custom)
   (s32.4!-from-p128  #:mov      (s32.4) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (s32.4-from-f32.4  #:fcvtns   (s32.4) (f32.4)       :cost 5 :suffix '(:4s))
   (s32.4-from-s16.8  nil        (s32.4) (s16.8)       :cost 1 :encoding :custom)
   (s32.4-from-s16.8-hi nil      (s32.4) (s16.8)       :cost 1 :encoding :custom)
   (s32.4-from-s64.2  #:xtn      (s32.4) (s64.2)       :cost 1 :suffix '(:4h))
   (s32.4-from-s64.2-hi #:xtn2   (s32.4) (s32.4 s64.2) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (s32.4-from-s64.2-saturating #:sqxtn (s32.4) (s64.2) :cost 1 :suffix '(:4h))
   (s32.4-from-s64.2-saturating-hi #:sqxtn2 (s32.4) (s32.4 s64.2) :cost 1 :encoding :neon-rmw :suffix '(:8h))
   (make-s32.4        nil        (s32.4) (s32 s32 s32 s32) :cost 1 :encoding :fake-vop)
   (s32.4-values      nil        (s32 s32 s32 s32) (s32.4) :cost 1 :encoding :fake-vop)
   (s32.4-broadcast   #:dup      (s32.4) (s32)         :cost 1 :suffix '(:4s))
   (two-arg-s32.4-and #:and      (s32.4) (s32.4 s32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s32.4-or  #:orr      (s32.4) (s32.4 s32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s32.4-xor #:eor      (s32.4) (s32.4 s32.4) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s32.4-max #:smax     (s32.4) (s32.4 s32.4) :cost 3 :associative t :suffix '(:4s))
   (two-arg-s32.4-min #:smin     (s32.4) (s32.4 s32.4) :cost 3 :associative t :suffix '(:4s))
   (s32.4-andc1       nil        (s32.4) (s32.4 s32.4) :cost 1 :encoding :fake-vop)
   (s32.4-andc2       #:bic      (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:16b))
   (s32.4-not         #:not      (s32.4) (s32.4)       :cost 1 :suffix '(:16b))
   (two-arg-s32.4+    #:add      (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s) :associative t)
   (two-arg-s32.4+-saturating #:sqadd (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s) :associative t)
   (two-arg-s32.4-    #:sub      (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s))
   (two-arg-s32.4--saturating #:sqsub (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s))
   (two-arg-s32.4*    #:mul      (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s) :associative t)
   (two-arg-s32.4=    #:cmeq     (u32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (two-arg-s32.4/=   nil        (u32.4) (s32.4 s32.4) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-s32.4>    #:cmgt     (u32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (two-arg-s32.4<    nil        (u32.4) (s32.4 s32.4) :cost 1 :encoding :fake-vop)
   (two-arg-s32.4>=   #:cmge     (u32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (two-arg-s32.4<=   nil        (u32.4) (s32.4 s32.4) :cost 1 :encoding :fake-vop)
   (s32.4-pair-min    #:sminp    (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s) :associative t)
   (s32.4-horizontal-min #:sminv (s32) (s32.4)         :cost 2 :encoding :neon-int-result :suffix '(:4s) :associative t)
   (s32.4-pair-max    #:smaxp    (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s) :associative t)
   (s32.4-horizontal-max #:smaxv (s32) (s32.4)         :cost 2 :encoding :neon-int-result :suffix '(:4s) :associative t)
   (s32.4-pair+       #:addp     (s32.4) (s32.4 s32.4) :cost 2 :suffix '(:4s) :associative t)
   (s32.4-horizontal+ #:addv     (s32) (s32.4)         :cost 2 :encoding :neon-int-result :suffix '(:4s) :associative t)
   (s32.4-shiftr      nil        (s32.4) (s32.4 imm5)  :cost 1 :encoding :custom)
   (s32.4-shiftl      nil        (s32.4) (s32.4 imm5)  :cost 1 :encoding :custom)
   (s32.4-shiftl-long nil        (s64.2) (s32.4 imm5)  :cost 1 :encoding :custom)
   (s32.4-shiftl-long-hi nil     (s64.2) (s32.4 imm5)  :cost 1 :encoding :custom)
   (s32.4-bit-select  #:bsl      (s32.4) (u32.4 s32.4 s32.4) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (s32.4-lane-extract nil       (s32) (s32.4 imm2)    :cost 1 :encoding :custom)
   (s32.4-lane-insert nil        (s32.4) (s32.4 s32 imm2) :cost 1 :encoding :custom)
   (s32.4-dup         nil        (s32.4) (s32.4 imm2)  :cost 1 :encoding :custom)
   (s32.4-ins         nil        (s32.4) (s32.4 s32.4 imm2 imm2) :cost 1 :encoding :custom)
   (s32.4-transpose-even #:trn1  (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (s32.4-transpose-odd #:trn2   (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (s32.4-unzip-even  #:uzp1     (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (s32.4-unzip-odd   #:uzp2     (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (s32.4-zip-even    #:zip1     (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   (s32.4-zip-odd     #:zip2     (s32.4) (s32.4 s32.4) :cost 1 :suffix '(:4s))
   ;; s64
   (s64!-from-p128    #:umov     (s64) (p128)          :cost 1 :encoding :move :suffix '(0 :d) :always-translatable nil)
   ;; s64.2
   (s64.2!-from-s64   nil        (s64.2) (s64)         :cost 1 :encoding :custom)
   (s64.2!-from-p128  #:mov      (s64.2) (p128)        :cost 1 :encoding :move :always-translatable nil :suffix '(:16b))
   (s64.2-from-f64.2  #:fcvtns   (s64.2) (f64.2)       :cost 5 :suffix '(:2d))
   (s64.2-from-s32.4  nil        (s64.2) (s32.4)       :cost 1 :encoding :custom)
   (s64.2-from-s32.4-hi nil      (s64.2) (s32.4)       :cost 1 :encoding :custom)
   (make-s64.2        nil        (s64.2) (s64 s64)     :cost 1 :encoding :fake-vop)
   (s64.2-values      nil        (s64 s64) (s64.2)     :cost 1 :encoding :fake-vop)
   (s64.2-broadcast   #:dup      (s64.2) (s64)         :cost 1 :suffix '(:2d))
   (two-arg-s64.2-and #:and      (s64.2) (s64.2 s64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s64.2-or  #:orr      (s64.2) (s64.2 s64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s64.2-xor #:eor      (s64.2) (s64.2 s64.2) :cost 1 :associative t :suffix '(:16b))
   (two-arg-s64.2-max #:smax     (s64.2) (s64.2 s64.2) :cost 3 :associative t :suffix '(:2d))
   (two-arg-s64.2-min #:smin     (s64.2) (s64.2 s64.2) :cost 3 :associative t :suffix '(:2d))
   (s64.2-andc1       nil        (s64.2) (s64.2 s64.2) :cost 1 :encoding :fake-vop)
   (s64.2-andc2       #:bic      (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:16b))
   (s64.2-not         #:not      (s64.2) (s64.2)       :cost 1 :suffix '(:16b))
   (two-arg-s64.2+    #:add      (s64.2) (s64.2 s64.2) :cost 2 :suffix '(:2d) :associative t)
   (two-arg-s64.2+-saturating #:sqadd (s64.2) (s64.2 s64.2) :cost 2 :suffix '(:2d) :associative t)
   (two-arg-s64.2-    #:sub      (s64.2) (s64.2 s64.2) :cost 2 :suffix '(:2d))
   (two-arg-s64.2--saturating #:sqsub (s64.2) (s64.2 s64.2) :cost 2 :suffix '(:2d))
   (two-arg-s64.2*    #:mul      (s64.2) (s64.2 s64.2) :cost 2 :suffix '(:2d) :associative t)
   (two-arg-s64.2=    #:cmeq     (u64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (two-arg-s64.2/=   nil        (u64.2) (s64.2 s64.2) :cost 2 :associative t :encoding :fake-vop)
   (two-arg-s64.2>    #:cmgt     (u64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (two-arg-s64.2<    nil        (u64.2) (s64.2 s64.2) :cost 1 :encoding :fake-vop)
   (two-arg-s64.2>=   #:cmge     (u64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (two-arg-s64.2<=   nil        (u64.2) (s64.2 s64.2) :cost 1 :encoding :fake-vop)
   (s64.2-pair-min    nil        (s64.2) (s64.2 s64.2) :cost 2 :encoding :fake-vop :associative t)
   (s64.2-horizontal-min nil     (s64) (s64.2)         :cost 2 :encoding :fake-vop :associative t)
   (s64.2-pair-max    nil        (s64.2) (s64.2 s64.2) :cost 2 :encoding :fake-vop :associative t)
   (s64.2-horizontal-max nil     (s64) (s64.2)         :cost 2 :encoding :fake-vop :associative t)
   (s64.2-pair+       nil        (s64.2) (s64.2 s64.2) :cost 2 :encoding :fake-vop :associative t)
   (s64.2-horizontal+ nil        (s64) (s64.2)         :cost 2 :encoding :fake-vop :associative t)
   (s64.2-shiftr      nil        (s64.2) (s64.2 imm6)  :cost 1 :encoding :custom)
   (s64.2-shiftl      nil        (s64.2) (s64.2 imm6)  :cost 1 :encoding :custom)
   (s64.2-bit-select  #:bsl      (s64.2) (u64.2 s64.2 s64.2) :cost 1 :encoding :neon-rmw :suffix '(:16b))
   (s64.2-lane-extract nil       (s64) (s64.2 imm1)    :cost 1 :encoding :custom)
   (s64.2-lane-insert nil        (s64.2) (s64.2 s64 imm1) :cost 1 :encoding :custom)
   (s64.2-dup         nil        (s64.2) (s64.2 imm1)  :cost 1 :encoding :custom)
   (s64.2-ins         nil        (s64.2) (s64.2 s64.2 imm1 imm1) :cost 1 :encoding :custom)
   (s64.2-transpose-even #:trn1  (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (s64.2-transpose-odd #:trn2   (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (s64.2-unzip-even  #:uzp1     (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (s64.2-unzip-odd   #:uzp2     (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (s64.2-zip-even    #:zip1     (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d))
   (s64.2-zip-odd     #:zip2     (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d)))
  (:loads
   #+sb-unicode
   (u32.4-load-from-string #:ldr u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
   (f32.4-load        #:ldr  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref)
   (f64.2-load        #:ldr  f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref)
   (u8.16-load        #:ldr  u8.16 u8vec  u8-array  u8.16-aref u8.16-row-major-aref)
   (u16.8-load        #:ldr  u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref)
   (u32.4-load        #:ldr  u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref)
   (u64.2-load        #:ldr  u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref)
   (s8.16-load        #:ldr  s8.16 s8vec  s8-array  s8.16-aref s8.16-row-major-aref)
   (s16.8-load        #:ldr  s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref)
   (s32.4-load        #:ldr  s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref)
   (s64.2-load        #:ldr  s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref))
  (:stores
   #+sb-unicode
   (u32.4-store-into-string #:str u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
   (f32.4-store       #:str  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref)
   (f64.2-store       #:str  f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref)
   (u8.16-store       #:str  u8.16 u8vec  u8-array  u8.16-aref u8.16-row-major-aref)
   (u16.8-store       #:str  u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref)
   (u32.4-store       #:str  u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref)
   (u64.2-store       #:str  u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref)
   (s8.16-store       #:str  s8.16 s8vec  s8-array  s8.16-aref s8.16-row-major-aref)
   (s16.8-store       #:str  s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref)
   (s32.4-store       #:str  s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref)
   (s64.2-store       #:str  s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref))
  (:associatives
   (f32.4-and two-arg-f32.4-and +f32-true+)
   (f32.4-or  two-arg-f32.4-or  +f32-false+)
   (f32.4-xor two-arg-f32.4-xor +f32-false+)
   (f32.4-max two-arg-f32.4-max nil)
   (f32.4-min two-arg-f32.4-min nil)
   (f32.4+    two-arg-f32.4+ 0f0)
   (f32.4*    two-arg-f32.4* 1f0)
   (f64.2-and two-arg-f64.2-and +f64-true+)
   (f64.2-or  two-arg-f64.2-or  +f64-false+)
   (f64.2-xor two-arg-f64.2-xor +f64-false+)
   (f64.2-max two-arg-f64.2-max nil)
   (f64.2-min two-arg-f64.2-min nil)
   (f64.2+    two-arg-f64.2+ 0f0)
   (f64.2*    two-arg-f64.2* 1f0)
   (u8.16-and two-arg-u8.16-and +u8-true+)
   (u8.16-or  two-arg-u8.16-or  +u8-false+)
   (u8.16-xor two-arg-u8.16-xor +u8-false+)
   (u8.16-max two-arg-u8.16-max nil)
   (u8.16-min two-arg-u8.16-min nil)
   (u8.16+    two-arg-u8.16+ 0)
   (u8.16+-saturating two-arg-u8.16+-saturating 0)
   (u8.16*    two-arg-u8.16* 1)
   (u16.8-and two-arg-u16.8-and +u16-true+)
   (u16.8-or  two-arg-u16.8-or  +u16-false+)
   (u16.8-xor two-arg-u16.8-xor +u16-false+)
   (u16.8-max two-arg-u16.8-max nil)
   (u16.8-min two-arg-u16.8-min nil)
   (u16.8+    two-arg-u16.8+ 0)
   (u16.8+-saturating two-arg-u16.8+-saturating 0)
   (u16.8*    two-arg-u16.8* 1)
   (u32.4-and two-arg-u32.4-and +u32-true+)
   (u32.4-or  two-arg-u32.4-or  +u32-false+)
   (u32.4-xor two-arg-u32.4-xor +u32-false+)
   (u32.4-max two-arg-u32.4-max nil)
   (u32.4-min two-arg-u32.4-min nil)
   (u32.4+    two-arg-u32.4+ 0)
   (u32.4+-saturating two-arg-u32.4+-saturating 0)
   (u32.4*    two-arg-u32.4* 1)
   (u64.2-and two-arg-u64.2-and +u64-true+)
   (u64.2-or  two-arg-u64.2-or  +u64-false+)
   (u64.2-xor two-arg-u64.2-xor +u64-false+)
   (u64.2-max two-arg-u64.2-max nil)
   (u64.2-min two-arg-u64.2-min nil)
   (u64.2+    two-arg-u64.2+ 0)
   (u64.2+-saturating two-arg-u64.2+-saturating 0)
   (u64.2*    two-arg-u64.2* 1)
   (s8.16-and two-arg-s8.16-and +s8-true+)
   (s8.16-or  two-arg-s8.16-or  +s8-false+)
   (s8.16-xor two-arg-s8.16-xor +s8-false+)
   (s8.16-max two-arg-s8.16-max nil)
   (s8.16-min two-arg-s8.16-min nil)
   (s8.16+    two-arg-s8.16+ 0)
   (s8.16+-saturating two-arg-s8.16+-saturating 0)
   (s8.16*    two-arg-s8.16* 1)
   (s16.8-and two-arg-s16.8-and +s16-true+)
   (s16.8-or  two-arg-s16.8-or  +s16-false+)
   (s16.8-xor two-arg-s16.8-xor +s16-false+)
   (s16.8-max two-arg-s16.8-max nil)
   (s16.8-min two-arg-s16.8-min nil)
   (s16.8+    two-arg-s16.8+ 0)
   (s16.8+-saturating two-arg-s16.8+-saturating 0)
   (s16.8*    two-arg-s16.8* 1)
   (s32.4-and two-arg-s32.4-and +s32-true+)
   (s32.4-or  two-arg-s32.4-or  +s32-false+)
   (s32.4-xor two-arg-s32.4-xor +s32-false+)
   (s32.4-max two-arg-s32.4-max nil)
   (s32.4-min two-arg-s32.4-min nil)
   (s32.4+    two-arg-s32.4+ 0)
   (s32.4+-saturating two-arg-s32.4+-saturating 0)
   (s32.4*    two-arg-s32.4* 1)
   (s64.2-and two-arg-s64.2-and +s64-true+)
   (s64.2-or  two-arg-s64.2-or  +s64-false+)
   (s64.2-xor two-arg-s64.2-xor +s64-false+)
   (s64.2-max two-arg-s64.2-max nil)
   (s64.2-min two-arg-s64.2-min nil)
   (s64.2+    two-arg-s64.2+ 0)
   (s64.2+-saturating two-arg-s64.2+-saturating 0)
   (s64.2*    two-arg-s64.2* 1))
  (:comparisons
   (f32.4=  two-arg-f32.4=  u32.4-and +u32-true+)
   (f32.4<  two-arg-f32.4<  u32.4-and +u32-true+)
   (f32.4<= two-arg-f32.4<= u32.4-and +u32-true+)
   (f32.4>  two-arg-f32.4>  u32.4-and +u32-true+)
   (f32.4>= two-arg-f32.4>= u32.4-and +u32-true+)
   (f64.2=  two-arg-f64.2=  u64.2-and +u64-true+)
   (f64.2<  two-arg-f64.2<  u64.2-and +u64-true+)
   (f64.2<= two-arg-f64.2<= u64.2-and +u64-true+)
   (f64.2>  two-arg-f64.2>  u64.2-and +u64-true+)
   (f64.2>= two-arg-f64.2>= u64.2-and +u64-true+)
   (u8.16=  two-arg-u8.16=  u8.16-and +u8-true+)
   (u8.16<  two-arg-u8.16<  u8.16-and +u8-true+)
   (u8.16<= two-arg-u8.16<= u8.16-and +u8-true+)
   (u8.16>  two-arg-u8.16>  u8.16-and +u8-true+)
   (u8.16>= two-arg-u8.16>= u8.16-and +u8-true+)
   (u16.8=  two-arg-u16.8=  u16.8-and +u16-true+)
   (u16.8<  two-arg-u16.8<  u16.8-and +u16-true+)
   (u16.8<= two-arg-u16.8<= u16.8-and +u16-true+)
   (u16.8>  two-arg-u16.8>  u16.8-and +u16-true+)
   (u16.8>= two-arg-u16.8>= u16.8-and +u16-true+)
   (u32.4=  two-arg-u32.4=  u32.4-and +u32-true+)
   (u32.4<  two-arg-u32.4<  u32.4-and +u32-true+)
   (u32.4<= two-arg-u32.4<= u32.4-and +u32-true+)
   (u32.4>  two-arg-u32.4>  u32.4-and +u32-true+)
   (u32.4>= two-arg-u32.4>= u32.4-and +u32-true+)
   (u64.2=  two-arg-u64.2=  u64.2-and +u64-true+)
   (u64.2<  two-arg-u64.2<  u64.2-and +u64-true+)
   (u64.2<= two-arg-u64.2<= u64.2-and +u64-true+)
   (u64.2>  two-arg-u64.2>  u64.2-and +u64-true+)
   (u64.2>= two-arg-u64.2>= u64.2-and +u64-true+)
   (s8.16=  two-arg-s8.16=  u8.16-and +u8-true+)
   (s8.16<  two-arg-s8.16<  u8.16-and +u8-true+)
   (s8.16<= two-arg-s8.16<= u8.16-and +u8-true+)
   (s8.16>  two-arg-s8.16>  u8.16-and +u8-true+)
   (s8.16>= two-arg-s8.16>= u8.16-and +u8-true+)
   (s16.8=  two-arg-s16.8=  u16.8-and +u16-true+)
   (s16.8<  two-arg-s16.8<  u16.8-and +u16-true+)
   (s16.8<= two-arg-s16.8<= u16.8-and +u16-true+)
   (s16.8>  two-arg-s16.8>  u16.8-and +u16-true+)
   (s16.8>= two-arg-s16.8>= u16.8-and +u16-true+)
   (s32.4=  two-arg-s32.4=  u32.4-and +u32-true+)
   (s32.4<  two-arg-s32.4<  u32.4-and +u32-true+)
   (s32.4<= two-arg-s32.4<= u32.4-and +u32-true+)
   (s32.4>  two-arg-s32.4>  u32.4-and +u32-true+)
   (s32.4>= two-arg-s32.4>= u32.4-and +u32-true+)
   (s64.2=  two-arg-s64.2=  u64.2-and +u64-true+)
   (s64.2<  two-arg-s64.2<  u64.2-and +u64-true+)
   (s64.2<= two-arg-s64.2<= u64.2-and +u64-true+)
   (s64.2>  two-arg-s64.2>  u64.2-and +u64-true+)
   (s64.2>= two-arg-s64.2>= u64.2-and +u64-true+))
  (:reducers
   (f32.4- two-arg-f32.4- 0f0)
   (f32.4/ two-arg-f32.4/ 1f0)
   (f64.2- two-arg-f64.2- 0d0)
   (f64.2/ two-arg-f64.2/ 1d0)
   (u8.16- two-arg-u8.16- 0)
   (u8.16--saturating two-arg-u8.16--saturating 0)
   (u16.8- two-arg-u16.8- 0)
   (u16.8--saturating two-arg-u16.8--saturating 0)
   (u32.4- two-arg-u32.4- 0)
   (u32.4--saturating two-arg-u32.4--saturating 0)
   (u64.2- two-arg-u64.2- 0)
   (u64.2--saturating two-arg-u64.2--saturating 0)
   (s8.16- two-arg-s8.16- 0)
   (s8.16--saturating two-arg-s8.16--saturating 0)
   (s16.8- two-arg-s16.8- 0)
   (s16.8--saturating two-arg-s16.8--saturating 0)
   (s32.4- two-arg-s32.4- 0)
   (s32.4--saturating two-arg-s32.4--saturating 0)
   (s64.2- two-arg-s64.2- 0)
   (s64.2--saturating two-arg-s64.2--saturating 0))
  (:unequals
   (f32.4/= two-arg-f32.4/= u32.4-and +u32-true+)
   (f64.2/= two-arg-f64.2/= u64.2-and +u64-true+)
   (u8.16/= two-arg-u8.16/= u8.16-and +u8-true+)
   (u16.8/= two-arg-u16.8/= u16.8-and +u16-true+)
   (u32.4/= two-arg-u32.4/= u32.4-and +u32-true+)
   (u64.2/= two-arg-u64.2/= u64.2-and +u64-true+)
   (s8.16/= two-arg-s8.16/= u8.16-and +u8-true+)
   (s16.8/= two-arg-s16.8/= u16.8-and +u16-true+)
   (s32.4/= two-arg-s32.4/= u32.4-and +u32-true+)
   (s64.2/= two-arg-s64.2/= u64.2-and +u64-true+)))
