@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.
- package/README.md +23 -23
- package/include/aom/aom_codec.h +1 -1
- package/include/aom/aom_decoder.h +4 -0
- package/include/aom/aom_encoder.h +19 -8
- package/include/aom/aom_ext_ratectrl.h +664 -0
- package/include/aom/aom_image.h +93 -30
- package/include/aom/aom_tpl.h +99 -0
- package/include/aom/aomcx.h +89 -16
- package/include/aom/aomdx.h +12 -0
- package/include/expat.h +15 -3
- package/include/expat_config.h +6 -6
- package/include/expat_external.h +4 -4
- package/include/glib-2.0/gio/gdbusconnection.h +2 -8
- package/include/glib-2.0/gio/gfileattribute.h +1 -1
- package/include/glib-2.0/gio/gfileinfo.h +5 -0
- package/include/glib-2.0/gio/gicon.h +1 -1
- package/include/glib-2.0/gio/gio-autocleanups.h +0 -1
- package/include/glib-2.0/gio/gio-visibility.h +34 -0
- package/include/glib-2.0/gio/gio.h +2 -0
- package/include/glib-2.0/gio/gioenums.h +66 -44
- package/include/glib-2.0/gio/gioenumtypes.h +2 -0
- package/include/glib-2.0/gio/giptosmessage.h +46 -0
- package/include/glib-2.0/gio/gipv6tclassmessage.h +46 -0
- package/include/glib-2.0/gio/gresolver.h +1 -1
- package/include/glib-2.0/gio/gsettings.h +1 -1
- package/include/glib-2.0/gio/gsocketcontrolmessage.h +2 -0
- package/include/glib-2.0/glib/gatomic.h +26 -2
- package/include/glib-2.0/glib/gfileutils.h +2 -2
- package/include/glib-2.0/glib/ghook.h +3 -1
- package/include/glib-2.0/glib/giochannel.h +1 -1
- package/include/glib-2.0/glib/gkeyfile.h +1 -1
- package/include/glib-2.0/glib/glib-visibility.h +34 -0
- package/include/glib-2.0/glib/gmacros.h +32 -0
- package/include/glib-2.0/glib/gmain.h +4 -0
- package/include/glib-2.0/glib/gmarkup.h +18 -1
- package/include/glib-2.0/glib/gmem.h +4 -4
- package/include/glib-2.0/glib/gmessages.h +7 -9
- package/include/glib-2.0/glib/gnode.h +1 -1
- package/include/glib-2.0/glib/goption.h +1 -1
- package/include/glib-2.0/glib/gsequence.h +2 -2
- package/include/glib-2.0/glib/gslice.h +12 -4
- package/include/glib-2.0/glib/gspawn.h +1 -1
- package/include/glib-2.0/glib/gstrfuncs.h +191 -1
- package/include/glib-2.0/glib/gtestutils.h +6 -3
- package/include/glib-2.0/glib/gtimer.h +1 -0
- package/include/glib-2.0/glib/guri.h +3 -3
- package/include/glib-2.0/glib/gutils.h +10 -1
- package/include/glib-2.0/glib/gvarianttype.h +16 -16
- package/include/glib-2.0/glib/gversionmacros.h +22 -0
- package/include/glib-2.0/gmodule/gmodule-visibility.h +34 -0
- package/include/glib-2.0/gmodule.h +1 -1
- package/include/glib-2.0/gobject/gbinding.h +1 -1
- package/include/glib-2.0/gobject/gobject-visibility.h +34 -0
- package/include/glib-2.0/gobject/gobject.h +1 -1
- package/include/glib-2.0/gobject/gparam.h +1 -1
- package/include/glib-2.0/gobject/gsignal.h +8 -8
- package/include/glib-2.0/gobject/gtype.h +17 -17
- package/include/hwy/aligned_allocator.h +44 -2
- package/include/hwy/auto_tune.h +22 -6
- package/include/hwy/base.h +60 -90
- package/include/hwy/bit_set.h +410 -0
- package/include/hwy/cache_control.h +3 -2
- package/include/hwy/detect_compiler_arch.h +134 -14
- package/include/hwy/detect_targets.h +82 -36
- package/include/hwy/highway.h +15 -0
- package/include/hwy/nanobenchmark.h +12 -3
- package/include/hwy/ops/arm_neon-inl.h +96 -25
- package/include/hwy/ops/arm_sve-inl.h +250 -95
- package/include/hwy/ops/emu128-inl.h +12 -7
- package/include/hwy/ops/generic_ops-inl.h +271 -131
- package/include/hwy/ops/loongarch_lasx-inl.h +31 -9
- package/include/hwy/ops/loongarch_lsx-inl.h +33 -12
- package/include/hwy/ops/ppc_vsx-inl.h +99 -19
- package/include/hwy/ops/rvv-inl.h +239 -130
- package/include/hwy/ops/scalar-inl.h +22 -7
- package/include/hwy/ops/set_macros-inl.h +163 -107
- package/include/hwy/ops/wasm_128-inl.h +13 -22
- package/include/hwy/ops/x86_128-inl.h +223 -120
- package/include/hwy/ops/x86_256-inl.h +70 -134
- package/include/hwy/ops/x86_512-inl.h +130 -134
- package/include/hwy/print-inl.h +2 -0
- package/include/hwy/profiler.h +355 -264
- package/include/hwy/robust_statistics.h +3 -1
- package/include/hwy/timer.h +44 -0
- package/include/lcms2.h +35 -5
- package/include/lcms2_plugin.h +1 -1
- package/include/libexif/exif-utils.h +1 -1
- package/include/libheif/heif.h +2 -0
- package/include/libheif/heif_aux_images.h +2 -2
- package/include/libheif/heif_brands.h +16 -4
- package/include/libheif/heif_color.h +147 -25
- package/include/libheif/heif_components.h +264 -0
- package/include/libheif/heif_context.h +18 -4
- package/include/libheif/heif_cxx.h +20 -18
- package/include/libheif/heif_decoding.h +63 -9
- package/include/libheif/heif_encoding.h +46 -12
- package/include/libheif/heif_error.h +15 -6
- package/include/libheif/heif_export.h +48 -0
- package/include/libheif/heif_image.h +94 -32
- package/include/libheif/heif_image_handle.h +54 -3
- package/include/libheif/heif_items.h +25 -2
- package/include/libheif/heif_library.h +13 -18
- package/include/libheif/heif_metadata.h +5 -2
- package/include/libheif/heif_omaf.h +104 -0
- package/include/libheif/heif_plugin.h +80 -13
- package/include/libheif/heif_properties.h +259 -5
- package/include/libheif/heif_regions.h +5 -3
- package/include/libheif/heif_security.h +24 -2
- package/include/libheif/heif_sequences.h +163 -14
- package/include/libheif/heif_text.h +161 -0
- package/include/libheif/heif_tiling.h +2 -2
- package/include/libheif/heif_uncompressed.h +29 -5
- package/include/libheif/heif_version.h +2 -2
- package/include/libpng16/png.h +637 -488
- package/include/libpng16/pngconf.h +2 -2
- package/include/libpng16/pnglibconf.h +2 -2
- package/include/png.h +637 -488
- package/include/pngconf.h +2 -2
- package/include/pnglibconf.h +2 -2
- package/include/resvg.h +3 -3
- package/include/tiffconf.h +9 -10
- package/include/tiffio.h +10 -9
- package/include/tiffvers.h +1 -1
- package/include/ultrahdr_api.h +5 -11
- package/include/vips/colour.h +2 -2
- package/include/vips/memory.h +1 -1
- package/include/vips/version.h +4 -4
- package/include/zlib.h +3 -3
- package/lib/glib-2.0/include/glibconfig.h +1 -3
- package/lib/libaom.a +0 -0
- package/lib/libcgif.a +0 -0
- package/lib/libexif.a +0 -0
- package/lib/libexif.la +1 -1
- package/lib/libexpat.a +0 -0
- package/lib/libexpat.la +2 -2
- package/lib/libffi.a +0 -0
- package/lib/libgio-2.0.a +0 -0
- package/lib/libglib-2.0.a +0 -0
- package/lib/libgmodule-2.0.a +0 -0
- package/lib/libgobject-2.0.a +0 -0
- package/lib/libgthread-2.0.a +0 -0
- package/lib/libheif.a +0 -0
- package/lib/libhwy.a +0 -0
- package/lib/libimagequant.a +0 -0
- package/lib/libjpeg.a +0 -0
- package/lib/liblcms2.a +0 -0
- package/lib/libpng.a +0 -0
- package/lib/libpng.la +2 -2
- package/lib/libpng16.a +0 -0
- package/lib/libpng16.la +2 -2
- package/lib/libresvg.a +0 -0
- package/lib/libsharpyuv.a +0 -0
- package/lib/libtiff.a +0 -0
- package/lib/libuhdr.a +0 -0
- package/lib/libvips-cpp.a +0 -0
- package/lib/libvips.a +0 -0
- package/lib/libwebp.a +0 -0
- package/lib/libwebpdecoder.a +0 -0
- package/lib/libwebpdemux.a +0 -0
- package/lib/libwebpmux.a +0 -0
- package/lib/libz.a +0 -0
- package/lib/pkgconfig/aom.pc +2 -2
- package/lib/pkgconfig/cgif.pc +1 -1
- package/lib/pkgconfig/expat.pc +1 -1
- package/lib/pkgconfig/gio-2.0.pc +1 -1
- package/lib/pkgconfig/glib-2.0.pc +1 -1
- package/lib/pkgconfig/gmodule-2.0.pc +1 -1
- package/lib/pkgconfig/gmodule-export-2.0.pc +1 -1
- package/lib/pkgconfig/gmodule-no-export-2.0.pc +1 -1
- package/lib/pkgconfig/gobject-2.0.pc +1 -1
- package/lib/pkgconfig/gthread-2.0.pc +1 -1
- package/lib/pkgconfig/lcms2.pc +1 -1
- package/lib/pkgconfig/libexif.pc +1 -1
- package/lib/pkgconfig/libheif.pc +1 -1
- package/lib/pkgconfig/libhwy.pc +3 -4
- package/lib/pkgconfig/libpng.pc +1 -1
- package/lib/pkgconfig/libpng16.pc +1 -1
- package/lib/pkgconfig/libsharpyuv.pc +1 -1
- package/lib/pkgconfig/libtiff-4.pc +2 -2
- package/lib/pkgconfig/libwebp.pc +1 -1
- package/lib/pkgconfig/libwebpdecoder.pc +11 -0
- package/lib/pkgconfig/libwebpmux.pc +1 -1
- package/lib/pkgconfig/vips-cpp.pc +1 -1
- package/lib/pkgconfig/vips.pc +1 -1
- package/package.json +1 -1
- package/versions.json +15 -15
- package/lib/libsharpyuv.la +0 -41
- package/lib/libtiff.la +0 -41
- package/lib/libwebp.la +0 -41
- package/lib/libwebpdemux.la +0 -41
- 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
|
-
|
|
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
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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
|
-
|
|
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
|
|
3546
|
-
#undef
|
|
3587
|
+
#ifdef HWY_TOGGLE_INTERLEAVE_WHOLE
|
|
3588
|
+
#undef HWY_TOGGLE_INTERLEAVE_WHOLE
|
|
3547
3589
|
#else
|
|
3548
|
-
#define
|
|
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 >=
|
|
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
|
-
|
|
5472
|
-
|
|
5473
|
-
|
|
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
|
-
// ------------------------------
|
|
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
|
|
6353
|
-
|
|
6354
|
-
#if
|
|
6355
|
-
|
|
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(
|
|
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
|
|
6365
|
-
|
|
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)
|
|
6368
|
-
return
|
|
6477
|
+
(void)dw;
|
|
6478
|
+
return svmlalb_s32(c, a, b);
|
|
6369
6479
|
#else
|
|
6370
|
-
return MulAdd(PromoteEvenTo(
|
|
6371
|
-
|
|
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
|
|
6377
|
-
|
|
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)
|
|
6380
|
-
return
|
|
6488
|
+
(void)dw;
|
|
6489
|
+
return svmlalb_u32(c, a, b);
|
|
6381
6490
|
#else
|
|
6382
|
-
return MulAdd(PromoteEvenTo(
|
|
6383
|
-
|
|
6384
|
-
|
|
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 (
|
|
6606
|
+
// ------------------------------ ReorderWidenMulAccumulate (MulOddEven)
|
|
6432
6607
|
|
|
6433
6608
|
#if HWY_SVE_HAVE_BF16_FEATURE
|
|
6434
6609
|
|
|
6435
|
-
|
|
6436
|
-
|
|
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
|
|
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
|
|
6446
|
-
|
|
6447
|
-
|
|
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 <
|
|
6451
|
-
HWY_API
|
|
6452
|
-
|
|
6453
|
-
return
|
|
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
|
-
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
(
|
|
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
|
-
|
|
6535
|
-
|
|
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
|
}
|