@img/sharp-libvips-dev-wasm32 1.3.0-rc.1 → 1.3.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +23 -23
  2. package/include/aom/aom_codec.h +1 -1
  3. package/include/aom/aom_decoder.h +4 -0
  4. package/include/aom/aom_encoder.h +19 -8
  5. package/include/aom/aom_ext_ratectrl.h +664 -0
  6. package/include/aom/aom_image.h +93 -30
  7. package/include/aom/aom_tpl.h +99 -0
  8. package/include/aom/aomcx.h +89 -16
  9. package/include/aom/aomdx.h +12 -0
  10. package/include/expat.h +15 -3
  11. package/include/expat_config.h +6 -6
  12. package/include/expat_external.h +4 -4
  13. package/include/glib-2.0/gio/gdbusconnection.h +2 -8
  14. package/include/glib-2.0/gio/gfileattribute.h +1 -1
  15. package/include/glib-2.0/gio/gfileinfo.h +5 -0
  16. package/include/glib-2.0/gio/gicon.h +1 -1
  17. package/include/glib-2.0/gio/gio-autocleanups.h +0 -1
  18. package/include/glib-2.0/gio/gio-visibility.h +34 -0
  19. package/include/glib-2.0/gio/gio.h +2 -0
  20. package/include/glib-2.0/gio/gioenums.h +66 -44
  21. package/include/glib-2.0/gio/gioenumtypes.h +2 -0
  22. package/include/glib-2.0/gio/giptosmessage.h +46 -0
  23. package/include/glib-2.0/gio/gipv6tclassmessage.h +46 -0
  24. package/include/glib-2.0/gio/gresolver.h +1 -1
  25. package/include/glib-2.0/gio/gsettings.h +1 -1
  26. package/include/glib-2.0/gio/gsocketcontrolmessage.h +2 -0
  27. package/include/glib-2.0/glib/gatomic.h +26 -2
  28. package/include/glib-2.0/glib/gfileutils.h +2 -2
  29. package/include/glib-2.0/glib/ghook.h +3 -1
  30. package/include/glib-2.0/glib/giochannel.h +1 -1
  31. package/include/glib-2.0/glib/gkeyfile.h +1 -1
  32. package/include/glib-2.0/glib/glib-visibility.h +34 -0
  33. package/include/glib-2.0/glib/gmacros.h +32 -0
  34. package/include/glib-2.0/glib/gmain.h +4 -0
  35. package/include/glib-2.0/glib/gmarkup.h +18 -1
  36. package/include/glib-2.0/glib/gmem.h +4 -4
  37. package/include/glib-2.0/glib/gmessages.h +7 -9
  38. package/include/glib-2.0/glib/gnode.h +1 -1
  39. package/include/glib-2.0/glib/goption.h +1 -1
  40. package/include/glib-2.0/glib/gsequence.h +2 -2
  41. package/include/glib-2.0/glib/gslice.h +12 -4
  42. package/include/glib-2.0/glib/gspawn.h +1 -1
  43. package/include/glib-2.0/glib/gstrfuncs.h +191 -1
  44. package/include/glib-2.0/glib/gtestutils.h +6 -3
  45. package/include/glib-2.0/glib/gtimer.h +1 -0
  46. package/include/glib-2.0/glib/guri.h +3 -3
  47. package/include/glib-2.0/glib/gutils.h +10 -1
  48. package/include/glib-2.0/glib/gvarianttype.h +16 -16
  49. package/include/glib-2.0/glib/gversionmacros.h +22 -0
  50. package/include/glib-2.0/gmodule/gmodule-visibility.h +34 -0
  51. package/include/glib-2.0/gmodule.h +1 -1
  52. package/include/glib-2.0/gobject/gbinding.h +1 -1
  53. package/include/glib-2.0/gobject/gobject-visibility.h +34 -0
  54. package/include/glib-2.0/gobject/gobject.h +1 -1
  55. package/include/glib-2.0/gobject/gparam.h +1 -1
  56. package/include/glib-2.0/gobject/gsignal.h +8 -8
  57. package/include/glib-2.0/gobject/gtype.h +17 -17
  58. package/include/hwy/aligned_allocator.h +44 -2
  59. package/include/hwy/auto_tune.h +22 -6
  60. package/include/hwy/base.h +60 -90
  61. package/include/hwy/bit_set.h +410 -0
  62. package/include/hwy/cache_control.h +3 -2
  63. package/include/hwy/detect_compiler_arch.h +134 -14
  64. package/include/hwy/detect_targets.h +82 -36
  65. package/include/hwy/highway.h +15 -0
  66. package/include/hwy/nanobenchmark.h +12 -3
  67. package/include/hwy/ops/arm_neon-inl.h +96 -25
  68. package/include/hwy/ops/arm_sve-inl.h +250 -95
  69. package/include/hwy/ops/emu128-inl.h +12 -7
  70. package/include/hwy/ops/generic_ops-inl.h +271 -131
  71. package/include/hwy/ops/loongarch_lasx-inl.h +31 -9
  72. package/include/hwy/ops/loongarch_lsx-inl.h +33 -12
  73. package/include/hwy/ops/ppc_vsx-inl.h +99 -19
  74. package/include/hwy/ops/rvv-inl.h +239 -130
  75. package/include/hwy/ops/scalar-inl.h +22 -7
  76. package/include/hwy/ops/set_macros-inl.h +163 -107
  77. package/include/hwy/ops/wasm_128-inl.h +13 -22
  78. package/include/hwy/ops/x86_128-inl.h +223 -120
  79. package/include/hwy/ops/x86_256-inl.h +70 -134
  80. package/include/hwy/ops/x86_512-inl.h +130 -134
  81. package/include/hwy/print-inl.h +2 -0
  82. package/include/hwy/profiler.h +355 -264
  83. package/include/hwy/robust_statistics.h +3 -1
  84. package/include/hwy/timer.h +44 -0
  85. package/include/lcms2.h +35 -5
  86. package/include/lcms2_plugin.h +1 -1
  87. package/include/libexif/exif-utils.h +1 -1
  88. package/include/libheif/heif.h +2 -0
  89. package/include/libheif/heif_aux_images.h +2 -2
  90. package/include/libheif/heif_brands.h +16 -4
  91. package/include/libheif/heif_color.h +147 -25
  92. package/include/libheif/heif_components.h +264 -0
  93. package/include/libheif/heif_context.h +18 -4
  94. package/include/libheif/heif_cxx.h +20 -18
  95. package/include/libheif/heif_decoding.h +63 -9
  96. package/include/libheif/heif_encoding.h +46 -12
  97. package/include/libheif/heif_error.h +15 -6
  98. package/include/libheif/heif_export.h +48 -0
  99. package/include/libheif/heif_image.h +94 -32
  100. package/include/libheif/heif_image_handle.h +54 -3
  101. package/include/libheif/heif_items.h +25 -2
  102. package/include/libheif/heif_library.h +13 -18
  103. package/include/libheif/heif_metadata.h +5 -2
  104. package/include/libheif/heif_omaf.h +104 -0
  105. package/include/libheif/heif_plugin.h +80 -13
  106. package/include/libheif/heif_properties.h +259 -5
  107. package/include/libheif/heif_regions.h +5 -3
  108. package/include/libheif/heif_security.h +24 -2
  109. package/include/libheif/heif_sequences.h +163 -14
  110. package/include/libheif/heif_text.h +161 -0
  111. package/include/libheif/heif_tiling.h +2 -2
  112. package/include/libheif/heif_uncompressed.h +29 -5
  113. package/include/libheif/heif_version.h +2 -2
  114. package/include/libpng16/png.h +637 -488
  115. package/include/libpng16/pngconf.h +2 -2
  116. package/include/libpng16/pnglibconf.h +2 -2
  117. package/include/png.h +637 -488
  118. package/include/pngconf.h +2 -2
  119. package/include/pnglibconf.h +2 -2
  120. package/include/resvg.h +3 -3
  121. package/include/tiffconf.h +9 -10
  122. package/include/tiffio.h +10 -9
  123. package/include/tiffvers.h +1 -1
  124. package/include/ultrahdr_api.h +5 -11
  125. package/include/vips/colour.h +2 -2
  126. package/include/vips/memory.h +1 -1
  127. package/include/vips/version.h +4 -4
  128. package/include/zlib.h +3 -3
  129. package/lib/glib-2.0/include/glibconfig.h +1 -3
  130. package/lib/libaom.a +0 -0
  131. package/lib/libcgif.a +0 -0
  132. package/lib/libexif.a +0 -0
  133. package/lib/libexif.la +1 -1
  134. package/lib/libexpat.a +0 -0
  135. package/lib/libexpat.la +2 -2
  136. package/lib/libffi.a +0 -0
  137. package/lib/libgio-2.0.a +0 -0
  138. package/lib/libglib-2.0.a +0 -0
  139. package/lib/libgmodule-2.0.a +0 -0
  140. package/lib/libgobject-2.0.a +0 -0
  141. package/lib/libgthread-2.0.a +0 -0
  142. package/lib/libheif.a +0 -0
  143. package/lib/libhwy.a +0 -0
  144. package/lib/libimagequant.a +0 -0
  145. package/lib/libjpeg.a +0 -0
  146. package/lib/liblcms2.a +0 -0
  147. package/lib/libpng.a +0 -0
  148. package/lib/libpng.la +2 -2
  149. package/lib/libpng16.a +0 -0
  150. package/lib/libpng16.la +2 -2
  151. package/lib/libresvg.a +0 -0
  152. package/lib/libsharpyuv.a +0 -0
  153. package/lib/libtiff.a +0 -0
  154. package/lib/libuhdr.a +0 -0
  155. package/lib/libvips-cpp.a +0 -0
  156. package/lib/libvips.a +0 -0
  157. package/lib/libwebp.a +0 -0
  158. package/lib/libwebpdecoder.a +0 -0
  159. package/lib/libwebpdemux.a +0 -0
  160. package/lib/libwebpmux.a +0 -0
  161. package/lib/libz.a +0 -0
  162. package/lib/pkgconfig/aom.pc +2 -2
  163. package/lib/pkgconfig/cgif.pc +1 -1
  164. package/lib/pkgconfig/expat.pc +1 -1
  165. package/lib/pkgconfig/gio-2.0.pc +1 -1
  166. package/lib/pkgconfig/glib-2.0.pc +1 -1
  167. package/lib/pkgconfig/gmodule-2.0.pc +1 -1
  168. package/lib/pkgconfig/gmodule-export-2.0.pc +1 -1
  169. package/lib/pkgconfig/gmodule-no-export-2.0.pc +1 -1
  170. package/lib/pkgconfig/gobject-2.0.pc +1 -1
  171. package/lib/pkgconfig/gthread-2.0.pc +1 -1
  172. package/lib/pkgconfig/lcms2.pc +1 -1
  173. package/lib/pkgconfig/libexif.pc +1 -1
  174. package/lib/pkgconfig/libheif.pc +1 -1
  175. package/lib/pkgconfig/libhwy.pc +3 -4
  176. package/lib/pkgconfig/libpng.pc +1 -1
  177. package/lib/pkgconfig/libpng16.pc +1 -1
  178. package/lib/pkgconfig/libsharpyuv.pc +1 -1
  179. package/lib/pkgconfig/libtiff-4.pc +2 -2
  180. package/lib/pkgconfig/libwebp.pc +1 -1
  181. package/lib/pkgconfig/libwebpdecoder.pc +11 -0
  182. package/lib/pkgconfig/libwebpmux.pc +1 -1
  183. package/lib/pkgconfig/vips-cpp.pc +1 -1
  184. package/lib/pkgconfig/vips.pc +1 -1
  185. package/package.json +1 -1
  186. package/versions.json +15 -15
  187. package/lib/libsharpyuv.la +0 -41
  188. package/lib/libtiff.la +0 -41
  189. package/lib/libwebp.la +0 -41
  190. package/lib/libwebpdemux.la +0 -41
  191. package/lib/libwebpmux.la +0 -41
@@ -1,4 +1,5 @@
1
1
  // Copyright 2021 Google LLC
2
+ // Copyright 2025 Arm Limited and/or its affiliates <open-source-office@arm.com>
2
3
  // SPDX-License-Identifier: Apache-2.0
3
4
  //
4
5
  // Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,14 +34,6 @@
33
34
  #define HWY_SVE_HAVE_2 0
34
35
  #endif
35
36
 
36
- // If 1, both __bf16 and a limited set of *_bf16 SVE intrinsics are available:
37
- // create/get/set/dup, ld/st, sel, rev, trn, uzp, zip.
38
- #if HWY_ARM_HAVE_SCALAR_BF16_TYPE && defined(__ARM_FEATURE_SVE_BF16)
39
- #define HWY_SVE_HAVE_BF16_FEATURE 1
40
- #else
41
- #define HWY_SVE_HAVE_BF16_FEATURE 0
42
- #endif
43
-
44
37
  // HWY_SVE_HAVE_BF16_VEC is defined to 1 if the SVE svbfloat16_t vector type
45
38
  // is supported, even if HWY_SVE_HAVE_BF16_FEATURE (= intrinsics) is 0.
46
39
  #if HWY_SVE_HAVE_BF16_FEATURE || \
@@ -389,9 +382,18 @@ HWY_API svbool_t PFalse() { return svpfalse_b(); }
389
382
  //
390
383
  // This is used in functions that load/store memory; other functions (e.g.
391
384
  // arithmetic) can ignore d and use PTrue instead.
385
+ //
386
+ // Always use FirstN(N) for HWY_TARGET == HWY_SVE2_128 to avoid vector length
387
+ // information loss when using PTrue(d) predicates in memory intrinsics.
388
+ //
389
+ // SVE2_256 is untested due to unavailable hardware and cannot assume
390
+ // equal minimum and maximum vector lengths as SVE2_128 can.
392
391
  template <class D>
393
392
  svbool_t MakeMask(D d) {
394
- return IsFull(d) ? PTrue(d) : FirstN(d, Lanes(d));
393
+ #if HWY_TARGET != HWY_SVE2_128
394
+ HWY_IF_CONSTEXPR(IsFull(d)) { return PTrue(d); }
395
+ #endif
396
+ return FirstN(d, Lanes(d));
395
397
  }
396
398
 
397
399
  } // namespace detail
@@ -407,6 +409,20 @@ HWY_API svbool_t MaskFalse(const D /*d*/) {
407
409
  return detail::PFalse();
408
410
  }
409
411
 
412
+ #ifdef HWY_NATIVE_SET_MASK
413
+ #undef HWY_NATIVE_SET_MASK
414
+ #else
415
+ #define HWY_NATIVE_SET_MASK
416
+ #endif
417
+
418
+ template <class D>
419
+ HWY_API svbool_t SetMask(D d, bool val) {
420
+ // The SVE svdup_n_b* intrinsics are equivalent to the FirstN op below if
421
+ // detail::IsFull(d) is true since svdup_n_b* is simply a wrapper around the
422
+ // SVE whilelo instruction.
423
+ return FirstN(d, size_t{0} - static_cast<size_t>(val));
424
+ }
425
+
410
426
  // ================================================== INIT
411
427
 
412
428
  // ------------------------------ Set
@@ -848,8 +864,31 @@ HWY_API V AndNot(const V a, const V b) {
848
864
 
849
865
  #if HWY_SVE_HAVE_2
850
866
 
867
+ #ifdef HWY_NATIVE_XOR3
868
+ #undef HWY_NATIVE_XOR3
869
+ #else
870
+ #define HWY_NATIVE_XOR3
871
+ #endif
872
+
873
+ #ifdef HWY_NATIVE_BCAX
874
+ #undef HWY_NATIVE_BCAX
875
+ #else
876
+ #define HWY_NATIVE_BCAX
877
+ #endif
878
+
851
879
  HWY_SVE_FOREACH_UI(HWY_SVE_RETV_ARGVVV, Xor3, eor3)
852
880
 
881
+ // As with AndNot, we follow the x86 convention where the first argument is
882
+ // negated, whereas the intrinsic has it last.
883
+ #define HWY_SVE_RETV_ARGVVV_SWAP(BASE, CHAR, BITS, HALF, NAME, OP) \
884
+ HWY_API HWY_SVE_V(BASE, BITS) \
885
+ NAME(HWY_SVE_V(BASE, BITS) a, HWY_SVE_V(BASE, BITS) b, \
886
+ HWY_SVE_V(BASE, BITS) c) { \
887
+ return sv##OP##_##CHAR##BITS(a, c, b); \
888
+ }
889
+ HWY_SVE_FOREACH_UI(HWY_SVE_RETV_ARGVVV_SWAP, XorAndNot, bcax)
890
+ #undef HWY_SVE_RETV_ARGVVV_SWAP
891
+
853
892
  template <class V, HWY_IF_FLOAT_V(V)>
854
893
  HWY_API V Xor3(const V x1, const V x2, const V x3) {
855
894
  const DFromV<V> df;
@@ -857,12 +896,15 @@ HWY_API V Xor3(const V x1, const V x2, const V x3) {
857
896
  return BitCast(df, Xor3(BitCast(du, x1), BitCast(du, x2), BitCast(du, x3)));
858
897
  }
859
898
 
860
- #else
861
- template <class V>
862
- HWY_API V Xor3(V x1, V x2, V x3) {
863
- return Xor(x1, Xor(x2, x3));
899
+ template <class V, HWY_IF_FLOAT_V(V)>
900
+ HWY_API V XorAndNot(const V x, const V a1, const V a2) {
901
+ const DFromV<V> df;
902
+ const RebindToUnsigned<decltype(df)> du;
903
+ return BitCast(df,
904
+ XorAndNot(BitCast(du, x), BitCast(du, a1), BitCast(du, a2)));
864
905
  }
865
- #endif
906
+
907
+ #endif // HWY_SVE_HAVE_2
866
908
 
867
909
  // ------------------------------ Or3
868
910
  template <class V>
@@ -3542,10 +3584,10 @@ HWY_API V InterleaveUpper(D d, const V a, const V b) {
3542
3584
  }
3543
3585
 
3544
3586
  // ------------------------------ InterleaveWholeLower
3545
- #ifdef HWY_NATIVE_INTERLEAVE_WHOLE
3546
- #undef HWY_NATIVE_INTERLEAVE_WHOLE
3587
+ #ifdef HWY_TOGGLE_INTERLEAVE_WHOLE
3588
+ #undef HWY_TOGGLE_INTERLEAVE_WHOLE
3547
3589
  #else
3548
- #define HWY_NATIVE_INTERLEAVE_WHOLE
3590
+ #define HWY_TOGGLE_INTERLEAVE_WHOLE
3549
3591
  #endif
3550
3592
 
3551
3593
  template <class D>
@@ -4079,6 +4121,56 @@ HWY_API V InterleaveOddBlocks(D d, V a, V b) {
4079
4121
  #endif
4080
4122
  }
4081
4123
 
4124
+ // ------------------------------ InterleaveLowerBlocks
4125
+ // (InterleaveEvenBlocks)
4126
+
4127
+ template <class D, class V = VFromD<D>>
4128
+ HWY_API V InterleaveLowerBlocks(D d, V a, V b) {
4129
+ #if HWY_TARGET == HWY_SVE_256
4130
+ return InterleaveEvenBlocks(d, a, b);
4131
+ #elif HWY_TARGET == HWY_SVE2_128
4132
+ (void)d;
4133
+ (void)b;
4134
+ return a;
4135
+ #else
4136
+ const Repartition<uint64_t, decltype(d)> du64;
4137
+ const svuint64_t a64 = BitCast(du64, a);
4138
+ const svuint64_t b64 = BitCast(du64, b);
4139
+ svuint64_t even = detail::InterleaveEven(a64, b64); // a0 b0 a2 b2
4140
+ svuint64_t odd = detail::InterleaveOdd(a64, b64); // a1 b1 a3 b3
4141
+ return BitCast(d, detail::ZipLowerSame(even, odd)); // a10 b10
4142
+ #endif
4143
+ }
4144
+
4145
+ // ------------------------------ InterleaveUpperBlocks
4146
+ // (ConcatUpperUpper, SlideDownLanes, OddEvenBlocks)
4147
+
4148
+ template <class D, class V = VFromD<D>>
4149
+ HWY_API V InterleaveUpperBlocks(D d, V a, V b) {
4150
+ #if HWY_TARGET == HWY_SVE_256
4151
+ return InterleaveOddBlocks(d, a, b);
4152
+ #elif HWY_TARGET == HWY_SVE2_128
4153
+ (void)d;
4154
+ (void)b;
4155
+ return a;
4156
+ #else
4157
+ const Repartition<uint64_t, decltype(d)> du64;
4158
+ const svuint64_t a64 = BitCast(du64, a);
4159
+ const svuint64_t b64 = BitCast(du64, b);
4160
+ svuint64_t even = detail::InterleaveEven(a64, b64); // a0 b0 a2 b2
4161
+ svuint64_t odd = detail::InterleaveOdd(a64, b64); // a1 b1 a3 b3
4162
+ HWY_IF_CONSTEXPR(detail::IsFull(d)) {
4163
+ return BitCast(d, detail::ZipUpperSame(even, odd)); // a32 b32
4164
+ }
4165
+ // ZipUpperSame assumes full vectors; instead use UpperHalf to honor the
4166
+ // capped/fractional tag.
4167
+ const Half<decltype(du64)> du64h;
4168
+ even = ResizeBitCast(du64, UpperHalf(du64h, even));
4169
+ odd = ResizeBitCast(du64, UpperHalf(du64h, odd));
4170
+ return BitCast(d, detail::ZipLowerSame(even, odd));
4171
+ #endif // HWY_TARGET
4172
+ }
4173
+
4082
4174
  // ------------------------------ Reverse
4083
4175
 
4084
4176
  namespace detail {
@@ -5304,7 +5396,7 @@ HWY_API V AverageRound(const V a, const V b) {
5304
5396
  // `p` points to at least 8 readable bytes, not all of which need be valid.
5305
5397
  template <class D, HWY_IF_T_SIZE_D(D, 1)>
5306
5398
  HWY_INLINE svbool_t LoadMaskBits(D d, const uint8_t* HWY_RESTRICT bits) {
5307
- #if HWY_COMPILER_CLANG >= 1901 || HWY_COMPILER_GCC_ACTUAL >= 1200
5399
+ #if HWY_COMPILER_CLANG >= 2200 || HWY_COMPILER_GCC_ACTUAL >= 1200
5308
5400
  typedef svbool_t UnalignedSveMaskT
5309
5401
  __attribute__((__aligned__(1), __may_alias__));
5310
5402
  (void)d;
@@ -5467,12 +5559,11 @@ HWY_API size_t StoreMaskBits(D d, svbool_t m, uint8_t* bits) {
5467
5559
  HWY_IF_CONSTEXPR(N < 8) {
5468
5560
  // BitsFromMask guarantees upper bits are zero, hence no masking.
5469
5561
  bits[0] = static_cast<uint8_t>(bits64);
5562
+ return 1;
5470
5563
  }
5471
- else {
5472
- static_assert(N % 8 == 0, "N is pow2 >= 8, hence divisible");
5473
- static_assert(HWY_IS_LITTLE_ENDIAN, "");
5474
- hwy::CopyBytes<N / 8>(&bits64, bits);
5475
- }
5564
+ static_assert(N < 8 || N % 8 == 0, "N is pow2 >= 8, hence divisible");
5565
+ static_assert(HWY_IS_LITTLE_ENDIAN, "");
5566
+ hwy::CopyBytes<N / 8>(&bits64, bits);
5476
5567
  constexpr size_t num_bytes = hwy::DivCeil(N, size_t{8});
5477
5568
  return num_bytes;
5478
5569
  #else
@@ -6346,42 +6437,126 @@ HWY_API V PairwiseAdd(D d, V a, V b) {
6346
6437
  #endif // HWY_SVE_HAVE_2
6347
6438
  #endif // HWY_TARGET != HWY_SCALAR
6348
6439
 
6349
- // ------------------------------ WidenMulPairwiseAdd
6440
+ // ------------------------------ MulEvenAdd/MulOddAdd (PromoteEvenTo)
6441
+
6442
+ // Always implemented here because this op is used in WidenMulEven.
6443
+ #ifdef HWY_NATIVE_MUL_EVEN_BF16
6444
+ #undef HWY_NATIVE_MUL_EVEN_BF16
6445
+ #else
6446
+ #define HWY_NATIVE_MUL_EVEN_BF16
6447
+ #endif
6350
6448
 
6351
6449
  template <size_t N, int kPow2>
6352
- HWY_API svfloat32_t WidenMulPairwiseAdd(Simd<float, N, kPow2> df, VBF16 a,
6353
- VBF16 b) {
6354
- #if HWY_SVE_HAVE_F32_TO_BF16C
6355
- const svfloat32_t even = svbfmlalb_f32(Zero(df), a, b);
6356
- return svbfmlalt_f32(even, a, b);
6450
+ HWY_API svfloat32_t MulEvenAdd(Simd<float, N, kPow2> dw, VBF16 a, VBF16 b,
6451
+ const svfloat32_t c) {
6452
+ #if HWY_SVE_HAVE_BF16_FEATURE
6453
+ return svbfmlalb_f32(c, a, b);
6357
6454
  #else
6358
- return MulAdd(PromoteEvenTo(df, a), PromoteEvenTo(df, b),
6359
- Mul(PromoteOddTo(df, a), PromoteOddTo(df, b)));
6455
+ return MulAdd(PromoteEvenTo(dw, a), PromoteEvenTo(dw, b), c);
6360
6456
  #endif // HWY_SVE_HAVE_BF16_FEATURE
6361
6457
  }
6362
6458
 
6363
6459
  template <size_t N, int kPow2>
6364
- HWY_API svint32_t WidenMulPairwiseAdd(Simd<int32_t, N, kPow2> d32, svint16_t a,
6365
- svint16_t b) {
6460
+ HWY_API svfloat32_t MulOddAdd(Simd<float, N, kPow2> dw, VBF16 a, VBF16 b,
6461
+ const svfloat32_t c) {
6462
+ #if HWY_SVE_HAVE_BF16_FEATURE
6463
+ (void)dw;
6464
+ return svbfmlalt_f32(c, a, b);
6465
+ #else
6466
+ return MulAdd(PromoteOddTo(dw, a), PromoteOddTo(dw, b), c);
6467
+ #endif // HWY_SVE_HAVE_BF16_FEATURE
6468
+ }
6469
+
6470
+ // Highway API only guarantees support for bf16*bf16+f32; also implement UI32
6471
+ // to allow reusing this op for integer WidenMulPairwiseAdd:
6472
+
6473
+ template <size_t N, int kPow2>
6474
+ HWY_API svint32_t MulEvenAdd(Simd<int32_t, N, kPow2> dw, svint16_t a,
6475
+ svint16_t b, const svint32_t c) {
6366
6476
  #if HWY_SVE_HAVE_2
6367
- (void)d32;
6368
- return svmlalt_s32(svmullb_s32(a, b), a, b);
6477
+ (void)dw;
6478
+ return svmlalb_s32(c, a, b);
6369
6479
  #else
6370
- return MulAdd(PromoteEvenTo(d32, a), PromoteEvenTo(d32, b),
6371
- Mul(PromoteOddTo(d32, a), PromoteOddTo(d32, b)));
6372
- #endif
6480
+ return MulAdd(PromoteEvenTo(dw, a), PromoteEvenTo(dw, b), c);
6481
+ #endif // HWY_SVE_HAVE_2
6373
6482
  }
6374
6483
 
6375
6484
  template <size_t N, int kPow2>
6376
- HWY_API svuint32_t WidenMulPairwiseAdd(Simd<uint32_t, N, kPow2> d32,
6377
- svuint16_t a, svuint16_t b) {
6485
+ HWY_API svuint32_t MulEvenAdd(Simd<uint32_t, N, kPow2> dw, svuint16_t a,
6486
+ svuint16_t b, const svuint32_t c) {
6378
6487
  #if HWY_SVE_HAVE_2
6379
- (void)d32;
6380
- return svmlalt_u32(svmullb_u32(a, b), a, b);
6488
+ (void)dw;
6489
+ return svmlalb_u32(c, a, b);
6381
6490
  #else
6382
- return MulAdd(PromoteEvenTo(d32, a), PromoteEvenTo(d32, b),
6383
- Mul(PromoteOddTo(d32, a), PromoteOddTo(d32, b)));
6384
- #endif
6491
+ return MulAdd(PromoteEvenTo(dw, a), PromoteEvenTo(dw, b), c);
6492
+ #endif // HWY_SVE_HAVE_2
6493
+ }
6494
+
6495
+ template <size_t N, int kPow2>
6496
+ HWY_API svint32_t MulOddAdd(Simd<int32_t, N, kPow2> dw, svint16_t a,
6497
+ svint16_t b, const svint32_t c) {
6498
+ #if HWY_SVE_HAVE_2
6499
+ (void)dw;
6500
+ return svmlalt_s32(c, a, b);
6501
+ #else
6502
+ return MulAdd(PromoteOddTo(dw, a), PromoteOddTo(dw, b), c);
6503
+ #endif // HWY_SVE_HAVE_2
6504
+ }
6505
+
6506
+ template <size_t N, int kPow2>
6507
+ HWY_API svuint32_t MulOddAdd(Simd<uint32_t, N, kPow2> dw, svuint16_t a,
6508
+ svuint16_t b, const svuint32_t c) {
6509
+ #if HWY_SVE_HAVE_2
6510
+ (void)dw;
6511
+ return svmlalt_u32(c, a, b);
6512
+ #else
6513
+ return MulAdd(PromoteOddTo(dw, a), PromoteOddTo(dw, b), c);
6514
+ #endif // HWY_SVE_HAVE_2
6515
+ }
6516
+
6517
+ // ------------------------------ WidenMulEven (MulEvenAdd, PromoteEvenTo)
6518
+
6519
+ template <size_t N, int kPow2>
6520
+ HWY_API svfloat32_t WidenMulEven(Simd<float, N, kPow2> dw, VBF16 a, VBF16 b) {
6521
+ #if HWY_SVE_HAVE_BF16_FEATURE
6522
+ (void)dw;
6523
+ return MulEvenAdd(dw, Zero(dw), a, b);
6524
+ #else
6525
+ // Same as MulEvenAdd, but without generating a zero argument.
6526
+ return Mul(PromoteEvenTo(dw, a), PromoteEvenTo(dw, b));
6527
+ #endif // HWY_SVE_HAVE_BF16_FEATURE
6528
+ }
6529
+
6530
+ template <size_t N, int kPow2>
6531
+ HWY_API svint32_t WidenMulEven(Simd<int32_t, N, kPow2> dw, svint16_t a,
6532
+ svint16_t b) {
6533
+ #if HWY_SVE_HAVE_2
6534
+ (void)dw;
6535
+ return svmullb_s32(a, b);
6536
+ #else
6537
+ // Same as MulEvenAdd, but without generating a zero argument.
6538
+ return Mul(PromoteEvenTo(dw, a), PromoteEvenTo(dw, b));
6539
+ #endif // HWY_SVE_HAVE_2
6540
+ }
6541
+
6542
+ template <size_t N, int kPow2>
6543
+ HWY_API svuint32_t WidenMulEven(Simd<uint32_t, N, kPow2> dw, svuint16_t a,
6544
+ svuint16_t b) {
6545
+ #if HWY_SVE_HAVE_2
6546
+ (void)dw;
6547
+ return svmullb_u32(a, b);
6548
+ #else
6549
+ // Same as MulEvenAdd, but without generating a zero argument.
6550
+ return Mul(PromoteEvenTo(dw, a), PromoteEvenTo(dw, b));
6551
+ #endif // HWY_SVE_HAVE_2
6552
+ }
6553
+
6554
+ // ------------------------------ WidenMulPairwiseAdd (WidenMulEven, MulOddAdd)
6555
+ // Deduce from VN: RepartitionToNarrow could be either F16 or BF16 for float.
6556
+ template <class VN, class DN = DFromV<VN>, class DW = RepartitionToWide<DN>,
6557
+ class VW = VFromD<DW>>
6558
+ HWY_API VW WidenMulPairwiseAdd(DW dw, VN a, VN b) {
6559
+ return MulOddAdd(dw, a, b, WidenMulEven(dw, a, b));
6385
6560
  }
6386
6561
 
6387
6562
  // ------------------------------ SatWidenMulPairwiseAccumulate
@@ -6428,69 +6603,47 @@ HWY_API VFromD<DI32> SatWidenMulAccumFixedPoint(DI32 /*di32*/,
6428
6603
 
6429
6604
  #endif // HWY_SVE_HAVE_2
6430
6605
 
6431
- // ------------------------------ ReorderWidenMulAccumulate (MulAdd, ZipLower)
6606
+ // ------------------------------ ReorderWidenMulAccumulate (MulOddEven)
6432
6607
 
6433
6608
  #if HWY_SVE_HAVE_BF16_FEATURE
6434
6609
 
6435
- // NOTE: we currently do not use SVE BFDOT for bf16 ReorderWidenMulAccumulate
6436
- // because, apparently unlike NEON, it uses round to odd unless the additional
6437
- // FEAT_EBF16 feature is available and enabled.
6438
- #ifdef HWY_NATIVE_MUL_EVEN_BF16
6439
- #undef HWY_NATIVE_MUL_EVEN_BF16
6610
+ #ifdef HWY_NATIVE_REORDER_WIDEN_MUL_ACC_BF16
6611
+ #undef HWY_NATIVE_REORDER_WIDEN_MUL_ACC_BF16
6440
6612
  #else
6441
- #define HWY_NATIVE_MUL_EVEN_BF16
6613
+ #define HWY_NATIVE_REORDER_WIDEN_MUL_ACC_BF16
6442
6614
  #endif
6443
6615
 
6616
+ // NOTE: svbfdot uses round to odd unless the additional FEAT_EBF16 feature is
6617
+ // available and enabled.
6444
6618
  template <size_t N, int kPow2>
6445
- HWY_API svfloat32_t MulEvenAdd(Simd<float, N, kPow2> /* d */, VBF16 a, VBF16 b,
6446
- const svfloat32_t c) {
6447
- return svbfmlalb_f32(c, a, b);
6619
+ HWY_API svfloat32_t ReorderWidenMulAccumulate(Simd<float, N, kPow2> d32,
6620
+ VBF16 a, VBF16 b,
6621
+ const svfloat32_t sum0,
6622
+ svfloat32_t& sum1) {
6623
+ (void)d32;
6624
+ (void)sum1;
6625
+ return svbfdot_f32(sum0, a, b);
6448
6626
  }
6449
6627
 
6450
- template <size_t N, int kPow2>
6451
- HWY_API svfloat32_t MulOddAdd(Simd<float, N, kPow2> /* d */, VBF16 a, VBF16 b,
6452
- const svfloat32_t c) {
6453
- return svbfmlalt_f32(c, a, b);
6628
+ template <class VW, HWY_IF_FLOAT_V(VW)>
6629
+ HWY_API VW RearrangeToOddPlusEven(const VW sum0, const VW) {
6630
+ // sum1 is unused and the invariant already holds.
6631
+ return sum0;
6454
6632
  }
6455
6633
 
6456
6634
  #endif // HWY_SVE_HAVE_BF16_FEATURE
6457
6635
 
6458
- template <size_t N, int kPow2>
6459
- HWY_API svint32_t ReorderWidenMulAccumulate(Simd<int32_t, N, kPow2> d32,
6460
- svint16_t a, svint16_t b,
6461
- const svint32_t sum0,
6462
- svint32_t& sum1) {
6463
- #if HWY_SVE_HAVE_2
6464
- (void)d32;
6465
- sum1 = svmlalt_s32(sum1, a, b);
6466
- return svmlalb_s32(sum0, a, b);
6467
- #else
6468
- // Lane order within sum0/1 is undefined, hence we can avoid the
6469
- // longer-latency lane-crossing PromoteTo by using PromoteEvenTo.
6470
- sum1 = MulAdd(PromoteOddTo(d32, a), PromoteOddTo(d32, b), sum1);
6471
- return MulAdd(PromoteEvenTo(d32, a), PromoteEvenTo(d32, b), sum0);
6472
- #endif
6473
- }
6474
-
6475
- template <size_t N, int kPow2>
6476
- HWY_API svuint32_t ReorderWidenMulAccumulate(Simd<uint32_t, N, kPow2> d32,
6477
- svuint16_t a, svuint16_t b,
6478
- const svuint32_t sum0,
6479
- svuint32_t& sum1) {
6480
- #if HWY_SVE_HAVE_2
6481
- (void)d32;
6482
- sum1 = svmlalt_u32(sum1, a, b);
6483
- return svmlalb_u32(sum0, a, b);
6484
- #else
6485
- // Lane order within sum0/1 is undefined, hence we can avoid the
6486
- // longer-latency lane-crossing PromoteTo by using PromoteEvenTo.
6487
- sum1 = MulAdd(PromoteOddTo(d32, a), PromoteOddTo(d32, b), sum1);
6488
- return MulAdd(PromoteEvenTo(d32, a), PromoteEvenTo(d32, b), sum0);
6489
- #endif
6636
+ // F32 version is implemented above, or in generic_ops-inl.h.
6637
+ template <class VN, class DN = DFromV<VN>, class DW = RepartitionToWide<DN>,
6638
+ class VW = VFromD<DW>, HWY_IF_NOT_FLOAT_D(DW)>
6639
+ HWY_API VW ReorderWidenMulAccumulate(DW dw, VN a, VN b, const VW sum0,
6640
+ VW& sum1) {
6641
+ sum1 = MulOddAdd(dw, a, b, sum1);
6642
+ return MulEvenAdd(dw, a, b, sum0);
6490
6643
  }
6491
6644
 
6492
6645
  // ------------------------------ RearrangeToOddPlusEven
6493
- template <class VW>
6646
+ template <class VW, HWY_IF_NOT_FLOAT_V(VW)>
6494
6647
  HWY_API VW RearrangeToOddPlusEven(const VW sum0, const VW sum1) {
6495
6648
  // sum0 is the sum of bottom/even lanes and sum1 of top/odd lanes.
6496
6649
  return Add(sum0, sum1);
@@ -6531,9 +6684,10 @@ HWY_API VFromD<DU32> SumOfMulQuadAccumulate(DU32 /*du32*/, svuint8_t a,
6531
6684
  template <class DI32, HWY_IF_I32_D(DI32)>
6532
6685
  HWY_API VFromD<DI32> SumOfMulQuadAccumulate(DI32 di32, svuint8_t a_u,
6533
6686
  svint8_t b_i, svint32_t sum) {
6534
- // TODO: use svusdot_u32 on SVE targets that require support for both SVE2
6535
- // and SVE I8MM.
6536
-
6687
+ #if HWY_SVE_HAVE_2 && __ARM_FEATURE_MATMUL_INT8
6688
+ (void)di32;
6689
+ return svusdot_s32(sum, a_u, b_i);
6690
+ #else
6537
6691
  const RebindToUnsigned<decltype(di32)> du32;
6538
6692
  const Repartition<uint8_t, decltype(di32)> du8;
6539
6693
 
@@ -6543,6 +6697,7 @@ HWY_API VFromD<DI32> SumOfMulQuadAccumulate(DI32 di32, svuint8_t a_u,
6543
6697
  ShiftLeft<8>(svdot_u32(Zero(du32), a_u, ShiftRight<7>(b_u)));
6544
6698
 
6545
6699
  return BitCast(di32, Sub(result_sum0, result_sum1));
6700
+ #endif
6546
6701
  }
6547
6702
 
6548
6703
  #ifdef HWY_NATIVE_I16_I16_SUMOFMULQUADACCUMULATE
@@ -316,12 +316,6 @@ HWY_API Vec128<T, N> operator^(Vec128<T, N> a, Vec128<T, N> b) {
316
316
  return Xor(a, b);
317
317
  }
318
318
 
319
- // ------------------------------ Xor3
320
- template <typename T, size_t N>
321
- HWY_API Vec128<T, N> Xor3(Vec128<T, N> x1, Vec128<T, N> x2, Vec128<T, N> x3) {
322
- return Xor(x1, Xor(x2, x3));
323
- }
324
-
325
319
  // ------------------------------ Or3
326
320
  template <typename T, size_t N>
327
321
  HWY_API Vec128<T, N> Or3(Vec128<T, N> o1, Vec128<T, N> o2, Vec128<T, N> o3) {
@@ -2323,6 +2317,17 @@ HWY_API V InterleaveOddBlocks(D, V a, V /*b*/) {
2323
2317
  return a;
2324
2318
  }
2325
2319
 
2320
+ // ------------------------------ InterleaveLowerBlocks
2321
+ template <class D, class V = VFromD<D>>
2322
+ HWY_API V InterleaveLowerBlocks(D, V a, V /*b*/) {
2323
+ return a;
2324
+ }
2325
+ // ------------------------------ InterleaveUpperBlocks
2326
+ template <class D, class V = VFromD<D>>
2327
+ HWY_API V InterleaveUpperBlocks(D, V a, V /*b*/) {
2328
+ return a;
2329
+ }
2330
+
2326
2331
  // ------------------------------ TableLookupLanes
2327
2332
 
2328
2333
  // Returned by SetTableIndices for use by TableLookupLanes.
@@ -2905,7 +2910,7 @@ HWY_API VFromD<D> ReorderWidenMulAccumulate(D d32, V16 a, V16 b,
2905
2910
  }
2906
2911
 
2907
2912
  // ------------------------------ RearrangeToOddPlusEven
2908
- template <class VW>
2913
+ template <class VW, HWY_IF_NOT_FLOAT_V(VW)>
2909
2914
  HWY_API VW RearrangeToOddPlusEven(VW sum0, VW sum1) {
2910
2915
  return Add(sum0, sum1);
2911
2916
  }