@img/sharp-libvips-dev 1.2.1 → 1.2.2-rc.2

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 (115) hide show
  1. package/include/aom/aom_decoder.h +1 -1
  2. package/include/aom/aom_encoder.h +2 -0
  3. package/include/aom/aomcx.h +106 -25
  4. package/include/ffi.h +3 -3
  5. package/include/freetype2/freetype/config/ftconfig.h +1 -1
  6. package/include/freetype2/freetype/config/ftheader.h +1 -1
  7. package/include/freetype2/freetype/config/ftoption.h +37 -12
  8. package/include/freetype2/freetype/config/ftstdlib.h +1 -1
  9. package/include/freetype2/freetype/config/integer-types.h +29 -2
  10. package/include/freetype2/freetype/config/mac-support.h +1 -1
  11. package/include/freetype2/freetype/config/public-macros.h +3 -3
  12. package/include/freetype2/freetype/freetype.h +51 -47
  13. package/include/freetype2/freetype/ftadvanc.h +1 -1
  14. package/include/freetype2/freetype/ftbbox.h +1 -1
  15. package/include/freetype2/freetype/ftbdf.h +1 -1
  16. package/include/freetype2/freetype/ftbitmap.h +1 -1
  17. package/include/freetype2/freetype/ftbzip2.h +1 -1
  18. package/include/freetype2/freetype/ftcache.h +1 -1
  19. package/include/freetype2/freetype/ftcid.h +1 -1
  20. package/include/freetype2/freetype/ftcolor.h +13 -4
  21. package/include/freetype2/freetype/ftdriver.h +3 -3
  22. package/include/freetype2/freetype/fterrdef.h +1 -1
  23. package/include/freetype2/freetype/fterrors.h +1 -1
  24. package/include/freetype2/freetype/ftfntfmt.h +1 -1
  25. package/include/freetype2/freetype/ftgasp.h +1 -1
  26. package/include/freetype2/freetype/ftglyph.h +1 -1
  27. package/include/freetype2/freetype/ftgxval.h +1 -1
  28. package/include/freetype2/freetype/ftgzip.h +1 -1
  29. package/include/freetype2/freetype/ftimage.h +6 -2
  30. package/include/freetype2/freetype/ftincrem.h +1 -1
  31. package/include/freetype2/freetype/ftlcdfil.h +1 -1
  32. package/include/freetype2/freetype/ftlist.h +1 -1
  33. package/include/freetype2/freetype/ftlogging.h +184 -0
  34. package/include/freetype2/freetype/ftlzw.h +1 -1
  35. package/include/freetype2/freetype/ftmac.h +1 -1
  36. package/include/freetype2/freetype/ftmm.h +159 -103
  37. package/include/freetype2/freetype/ftmodapi.h +1 -1
  38. package/include/freetype2/freetype/ftmoderr.h +1 -1
  39. package/include/freetype2/freetype/ftotval.h +1 -1
  40. package/include/freetype2/freetype/ftoutln.h +1 -1
  41. package/include/freetype2/freetype/ftparams.h +1 -1
  42. package/include/freetype2/freetype/ftpfr.h +1 -1
  43. package/include/freetype2/freetype/ftrender.h +1 -1
  44. package/include/freetype2/freetype/ftsizes.h +1 -1
  45. package/include/freetype2/freetype/ftsnames.h +1 -1
  46. package/include/freetype2/freetype/ftstroke.h +1 -1
  47. package/include/freetype2/freetype/ftsynth.h +1 -1
  48. package/include/freetype2/freetype/ftsystem.h +1 -1
  49. package/include/freetype2/freetype/fttrigon.h +1 -1
  50. package/include/freetype2/freetype/fttypes.h +1 -1
  51. package/include/freetype2/freetype/ftwinfnt.h +2 -3
  52. package/include/freetype2/freetype/otsvg.h +1 -1
  53. package/include/freetype2/freetype/t1tables.h +1 -1
  54. package/include/freetype2/freetype/ttnameid.h +129 -129
  55. package/include/freetype2/freetype/tttables.h +8 -5
  56. package/include/freetype2/freetype/tttags.h +1 -1
  57. package/include/freetype2/ft2build.h +1 -1
  58. package/include/glib-2.0/gio/gdbuserror.h +9 -8
  59. package/include/glib-2.0/gio/ginetaddress.h +12 -0
  60. package/include/glib-2.0/gio/gioenums.h +9 -2
  61. package/include/glib-2.0/glib/gstring.h +2 -2
  62. package/include/glib-2.0/glib/gunicode.h +1 -1
  63. package/include/glib-2.0/gobject/glib-types.h +1 -1
  64. package/include/glib-2.0/gobject/gparam.h +1 -1
  65. package/include/glib-2.0/gobject/gvalue.h +78 -35
  66. package/include/harfbuzz/hb-script-list.h +12 -0
  67. package/include/harfbuzz/hb-version.h +3 -3
  68. package/include/hwy/abort.h +2 -19
  69. package/include/hwy/aligned_allocator.h +11 -7
  70. package/include/hwy/auto_tune.h +504 -0
  71. package/include/hwy/base.h +425 -104
  72. package/include/hwy/cache_control.h +16 -0
  73. package/include/hwy/detect_compiler_arch.h +32 -1
  74. package/include/hwy/detect_targets.h +251 -67
  75. package/include/hwy/foreach_target.h +35 -0
  76. package/include/hwy/highway.h +185 -76
  77. package/include/hwy/nanobenchmark.h +1 -19
  78. package/include/hwy/ops/arm_neon-inl.h +969 -458
  79. package/include/hwy/ops/arm_sve-inl.h +1137 -359
  80. package/include/hwy/ops/emu128-inl.h +97 -11
  81. package/include/hwy/ops/generic_ops-inl.h +1222 -34
  82. package/include/hwy/ops/loongarch_lasx-inl.h +4664 -0
  83. package/include/hwy/ops/loongarch_lsx-inl.h +5933 -0
  84. package/include/hwy/ops/ppc_vsx-inl.h +306 -126
  85. package/include/hwy/ops/rvv-inl.h +546 -51
  86. package/include/hwy/ops/scalar-inl.h +77 -22
  87. package/include/hwy/ops/set_macros-inl.h +138 -17
  88. package/include/hwy/ops/shared-inl.h +50 -10
  89. package/include/hwy/ops/wasm_128-inl.h +137 -92
  90. package/include/hwy/ops/x86_128-inl.h +773 -214
  91. package/include/hwy/ops/x86_256-inl.h +712 -255
  92. package/include/hwy/ops/x86_512-inl.h +429 -753
  93. package/include/hwy/ops/x86_avx3-inl.h +501 -0
  94. package/include/hwy/per_target.h +2 -1
  95. package/include/hwy/profiler.h +622 -486
  96. package/include/hwy/targets.h +62 -20
  97. package/include/hwy/timer-inl.h +8 -160
  98. package/include/hwy/timer.h +170 -3
  99. package/include/hwy/x86_cpuid.h +81 -0
  100. package/include/libheif/heif_cxx.h +25 -5
  101. package/include/libheif/heif_regions.h +5 -5
  102. package/include/libheif/heif_version.h +2 -2
  103. package/include/librsvg-2.0/librsvg/rsvg-version.h +3 -3
  104. package/include/libxml2/libxml/valid.h +0 -3
  105. package/include/libxml2/libxml/xmlerror.h +1 -1
  106. package/include/libxml2/libxml/xmlversion.h +4 -4
  107. package/include/pango-1.0/pango/pango-enum-types.h +3 -0
  108. package/include/pango-1.0/pango/pango-features.h +3 -3
  109. package/include/pango-1.0/pango/pango-font.h +30 -0
  110. package/include/pango-1.0/pango/pango-version-macros.h +26 -0
  111. package/include/vips/connection.h +4 -4
  112. package/include/vips/version.h +4 -4
  113. package/include/zlib.h +3 -3
  114. package/package.json +1 -1
  115. package/versions.json +13 -13
@@ -61,217 +61,305 @@ namespace hwy {
61
61
  //------------------------------------------------------------------------------
62
62
  // Export user functions for static/dynamic dispatch
63
63
 
64
+ // The static target is the best baseline. When using foreach_target.h, this is
65
+ // the last target compiled. Otherwise, it is the only target.
66
+
64
67
  // Evaluates to 0 inside a translation unit if it is generating anything but the
65
- // static target (the last one if multiple targets are enabled). Used to prevent
66
- // redefinitions of HWY_EXPORT. Unless foreach_target.h is included, we only
67
- // compile once anyway, so this is 1 unless it is or has been included.
68
+ // static target. Used to prevent redefinitions of HWY_EXPORT. Unless
69
+ // foreach_target.h is included, we only compile once anyway, so this is 1
70
+ // unless it is or has been included.
68
71
  #ifndef HWY_ONCE
69
72
  #define HWY_ONCE 1
70
73
  #endif
71
74
 
72
- // HWY_STATIC_DISPATCH(FUNC_NAME) is the namespace-qualified FUNC_NAME for
73
- // HWY_STATIC_TARGET (the only defined namespace unless HWY_TARGET_INCLUDE is
74
- // defined), and can be used to deduce the return type of Choose*.
75
+ // `HWY_STATIC_NAMESPACE` expands to its namespace name, e.g. `N_AVX2`.
75
76
  #if HWY_STATIC_TARGET == HWY_SCALAR
76
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SCALAR::FUNC_NAME
77
+ #define HWY_STATIC_NAMESPACE N_SCALAR
77
78
  #elif HWY_STATIC_TARGET == HWY_EMU128
78
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_EMU128::FUNC_NAME
79
- #elif HWY_STATIC_TARGET == HWY_RVV
80
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_RVV::FUNC_NAME
81
- #elif HWY_STATIC_TARGET == HWY_WASM_EMU256
82
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_WASM_EMU256::FUNC_NAME
79
+ #define HWY_STATIC_NAMESPACE N_EMU128
83
80
  #elif HWY_STATIC_TARGET == HWY_WASM
84
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_WASM::FUNC_NAME
81
+ #define HWY_STATIC_NAMESPACE N_WASM
82
+ #elif HWY_STATIC_TARGET == HWY_WASM_EMU256
83
+ #define HWY_STATIC_NAMESPACE N_WASM_EMU256
84
+ #elif HWY_STATIC_TARGET == HWY_Z14
85
+ #define HWY_STATIC_NAMESPACE N_Z14
86
+ #elif HWY_STATIC_TARGET == HWY_Z15
87
+ #define HWY_STATIC_NAMESPACE N_Z15
88
+ #elif HWY_STATIC_TARGET == HWY_PPC8
89
+ #define HWY_STATIC_NAMESPACE N_PPC8
90
+ #elif HWY_STATIC_TARGET == HWY_PPC9
91
+ #define HWY_STATIC_NAMESPACE N_PPC9
92
+ #elif HWY_STATIC_TARGET == HWY_PPC10
93
+ #define HWY_STATIC_NAMESPACE N_PPC10
94
+ #elif HWY_STATIC_TARGET == HWY_LSX
95
+ #define HWY_STATIC_NAMESPACE N_LSX
96
+ #elif HWY_STATIC_TARGET == HWY_LASX
97
+ #define HWY_STATIC_NAMESPACE N_LASX
98
+ #elif HWY_STATIC_TARGET == HWY_RVV
99
+ #define HWY_STATIC_NAMESPACE N_RVV
85
100
  #elif HWY_STATIC_TARGET == HWY_NEON_WITHOUT_AES
86
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_NEON_WITHOUT_AES::FUNC_NAME
101
+ #define HWY_STATIC_NAMESPACE N_NEON_WITHOUT_AES
87
102
  #elif HWY_STATIC_TARGET == HWY_NEON
88
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_NEON::FUNC_NAME
103
+ #define HWY_STATIC_NAMESPACE N_NEON
89
104
  #elif HWY_STATIC_TARGET == HWY_NEON_BF16
90
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_NEON_BF16::FUNC_NAME
105
+ #define HWY_STATIC_NAMESPACE N_NEON_BF16
91
106
  #elif HWY_STATIC_TARGET == HWY_SVE
92
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SVE::FUNC_NAME
107
+ #define HWY_STATIC_NAMESPACE N_SVE
93
108
  #elif HWY_STATIC_TARGET == HWY_SVE2
94
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SVE2::FUNC_NAME
109
+ #define HWY_STATIC_NAMESPACE N_SVE2
95
110
  #elif HWY_STATIC_TARGET == HWY_SVE_256
96
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SVE_256::FUNC_NAME
111
+ #define HWY_STATIC_NAMESPACE N_SVE_256
97
112
  #elif HWY_STATIC_TARGET == HWY_SVE2_128
98
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SVE2_128::FUNC_NAME
99
- #elif HWY_STATIC_TARGET == HWY_PPC8
100
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_PPC8::FUNC_NAME
101
- #elif HWY_STATIC_TARGET == HWY_PPC9
102
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_PPC9::FUNC_NAME
103
- #elif HWY_STATIC_TARGET == HWY_PPC10
104
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_PPC10::FUNC_NAME
105
- #elif HWY_STATIC_TARGET == HWY_Z14
106
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_Z14::FUNC_NAME
107
- #elif HWY_STATIC_TARGET == HWY_Z15
108
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_Z15::FUNC_NAME
113
+ #define HWY_STATIC_NAMESPACE N_SVE2_128
109
114
  #elif HWY_STATIC_TARGET == HWY_SSE2
110
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SSE2::FUNC_NAME
115
+ #define HWY_STATIC_NAMESPACE N_SSE2
111
116
  #elif HWY_STATIC_TARGET == HWY_SSSE3
112
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SSSE3::FUNC_NAME
117
+ #define HWY_STATIC_NAMESPACE N_SSSE3
113
118
  #elif HWY_STATIC_TARGET == HWY_SSE4
114
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_SSE4::FUNC_NAME
119
+ #define HWY_STATIC_NAMESPACE N_SSE4
115
120
  #elif HWY_STATIC_TARGET == HWY_AVX2
116
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_AVX2::FUNC_NAME
121
+ #define HWY_STATIC_NAMESPACE N_AVX2
117
122
  #elif HWY_STATIC_TARGET == HWY_AVX3
118
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_AVX3::FUNC_NAME
123
+ #define HWY_STATIC_NAMESPACE N_AVX3
119
124
  #elif HWY_STATIC_TARGET == HWY_AVX3_DL
120
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_AVX3_DL::FUNC_NAME
125
+ #define HWY_STATIC_NAMESPACE N_AVX3_DL
121
126
  #elif HWY_STATIC_TARGET == HWY_AVX3_ZEN4
122
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_AVX3_ZEN4::FUNC_NAME
127
+ #define HWY_STATIC_NAMESPACE N_AVX3_ZEN4
123
128
  #elif HWY_STATIC_TARGET == HWY_AVX3_SPR
124
- #define HWY_STATIC_DISPATCH(FUNC_NAME) N_AVX3_SPR::FUNC_NAME
129
+ #define HWY_STATIC_NAMESPACE N_AVX3_SPR
130
+ #elif HWY_STATIC_TARGET == HWY_AVX10_2
131
+ #define HWY_STATIC_NAMESPACE N_AVX10_2
125
132
  #endif
126
133
 
127
- // HWY_CHOOSE_*(FUNC_NAME) expands to the function pointer for that target or
128
- // nullptr is that target was not compiled.
134
+ // `HWY_STATIC_DISPATCH(FUNC_NAME)` is the namespace-qualified FUNC_NAME for
135
+ // `HWY_STATIC_TARGET`, and can be used to deduce the return type of Choose*.
136
+ #define HWY_STATIC_DISPATCH(FUNC_NAME) HWY_STATIC_NAMESPACE::FUNC_NAME
137
+
138
+ // `HWY_CHOOSE_*(FUNC_NAME)` expands to the function pointer for that target or
139
+ // nullptr if that target was not compiled.
140
+ // `HWY_VISIT_*(VISITOR)` expands to `VISITOR(TARGET, NAMESPACE)` or nothing if
141
+ // that target was not compiled.
129
142
  #if HWY_TARGETS & HWY_EMU128
130
143
  #define HWY_CHOOSE_FALLBACK(FUNC_NAME) &N_EMU128::FUNC_NAME
144
+ #define HWY_VISIT_FALLBACK(VISITOR) VISITOR(HWY_EMU128, N_EMU128)
131
145
  #elif HWY_TARGETS & HWY_SCALAR
132
146
  #define HWY_CHOOSE_FALLBACK(FUNC_NAME) &N_SCALAR::FUNC_NAME
147
+ #define HWY_VISIT_FALLBACK(VISITOR) VISITOR(HWY_SCALAR, N_SCALAR)
133
148
  #else
134
149
  // When HWY_SCALAR/HWY_EMU128 are not present and other targets were disabled at
135
150
  // runtime, fall back to the baseline with HWY_STATIC_DISPATCH().
136
151
  #define HWY_CHOOSE_FALLBACK(FUNC_NAME) &HWY_STATIC_DISPATCH(FUNC_NAME)
152
+ #define HWY_VISIT_FALLBACK(VISITOR) \
153
+ VISITOR(HWY_STATIC_TARGET, HWY_STATIC_NAMESPACE)
154
+ #endif
155
+
156
+ #if HWY_TARGETS & HWY_WASM
157
+ #define HWY_CHOOSE_WASM(FUNC_NAME) &N_WASM::FUNC_NAME
158
+ #define HWY_VISIT_WASM(VISITOR) VISITOR(HWY_WASM, N_WASM)
159
+ #else
160
+ #define HWY_CHOOSE_WASM(FUNC_NAME) nullptr
161
+ #define HWY_VISIT_WASM(VISITOR)
137
162
  #endif
138
163
 
139
164
  #if HWY_TARGETS & HWY_WASM_EMU256
140
165
  #define HWY_CHOOSE_WASM_EMU256(FUNC_NAME) &N_WASM_EMU256::FUNC_NAME
166
+ #define HWY_VISIT_WASM_EMU256(VISITOR) VISITOR(HWY_WASM_EMU256, N_WASM_EMU256)
141
167
  #else
142
168
  #define HWY_CHOOSE_WASM_EMU256(FUNC_NAME) nullptr
169
+ #define HWY_VISIT_WASM_EMU256(VISITOR)
143
170
  #endif
144
171
 
145
- #if HWY_TARGETS & HWY_WASM
146
- #define HWY_CHOOSE_WASM(FUNC_NAME) &N_WASM::FUNC_NAME
172
+ #if HWY_TARGETS & HWY_Z14
173
+ #define HWY_CHOOSE_Z14(FUNC_NAME) &N_Z14::FUNC_NAME
174
+ #define HWY_VISIT_Z14(VISITOR) VISITOR(HWY_Z14, N_Z14)
147
175
  #else
148
- #define HWY_CHOOSE_WASM(FUNC_NAME) nullptr
176
+ #define HWY_CHOOSE_Z14(FUNC_NAME) nullptr
177
+ #define HWY_VISIT_Z14(VISITOR)
178
+ #endif
179
+
180
+ #if HWY_TARGETS & HWY_Z15
181
+ #define HWY_CHOOSE_Z15(FUNC_NAME) &N_Z15::FUNC_NAME
182
+ #define HWY_VISIT_Z15(VISITOR) VISITOR(HWY_Z15, N_Z15)
183
+ #else
184
+ #define HWY_CHOOSE_Z15(FUNC_NAME) nullptr
185
+ #define HWY_VISIT_Z15(VISITOR)
186
+ #endif
187
+
188
+ #if HWY_TARGETS & HWY_PPC8
189
+ #define HWY_CHOOSE_PPC8(FUNC_NAME) &N_PPC8::FUNC_NAME
190
+ #define HWY_VISIT_PPC8(VISITOR) VISITOR(HWY_PPC8, N_PPC8)
191
+ #else
192
+ #define HWY_CHOOSE_PPC8(FUNC_NAME) nullptr
193
+ #define HWY_VISIT_PPC8(VISITOR)
194
+ #endif
195
+
196
+ #if HWY_TARGETS & HWY_PPC9
197
+ #define HWY_CHOOSE_PPC9(FUNC_NAME) &N_PPC9::FUNC_NAME
198
+ #define HWY_VISIT_PPC9(VISITOR) VISITOR(HWY_PPC9, N_PPC9)
199
+ #else
200
+ #define HWY_CHOOSE_PPC9(FUNC_NAME) nullptr
201
+ #define HWY_VISIT_PPC9(VISITOR)
202
+ #endif
203
+
204
+ #if HWY_TARGETS & HWY_LSX
205
+ #define HWY_CHOOSE_LSX(FUNC_NAME) &N_LSX::FUNC_NAME
206
+ #define HWY_VISIT_LSX(VISITOR) VISITOR(HWY_LSX, N_LSX)
207
+ #else
208
+ #define HWY_CHOOSE_LSX(FUNC_NAME) nullptr
209
+ #define HWY_VISIT_LSX(VISITOR)
210
+ #endif
211
+
212
+ #if HWY_TARGETS & HWY_LASX
213
+ #define HWY_CHOOSE_LASX(FUNC_NAME) &N_LASX::FUNC_NAME
214
+ #define HWY_VISIT_LASX(VISITOR) VISITOR(HWY_LASX, N_LASX)
215
+ #else
216
+ #define HWY_CHOOSE_LASX(FUNC_NAME) nullptr
217
+ #define HWY_VISIT_LASX(VISITOR)
218
+ #endif
219
+
220
+ #if HWY_TARGETS & HWY_PPC10
221
+ #define HWY_CHOOSE_PPC10(FUNC_NAME) &N_PPC10::FUNC_NAME
222
+ #define HWY_VISIT_PPC10(VISITOR) VISITOR(HWY_PPC10, N_PPC10)
223
+ #else
224
+ #define HWY_CHOOSE_PPC10(FUNC_NAME) nullptr
225
+ #define HWY_VISIT_PPC10(VISITOR)
149
226
  #endif
150
227
 
151
228
  #if HWY_TARGETS & HWY_RVV
152
229
  #define HWY_CHOOSE_RVV(FUNC_NAME) &N_RVV::FUNC_NAME
230
+ #define HWY_VISIT_RVV(VISITOR) VISITOR(HWY_RVV, N_RVV)
153
231
  #else
154
232
  #define HWY_CHOOSE_RVV(FUNC_NAME) nullptr
233
+ #define HWY_VISIT_RVV(VISITOR)
155
234
  #endif
156
235
 
157
236
  #if HWY_TARGETS & HWY_NEON_WITHOUT_AES
158
237
  #define HWY_CHOOSE_NEON_WITHOUT_AES(FUNC_NAME) &N_NEON_WITHOUT_AES::FUNC_NAME
238
+ #define HWY_VISIT_NEON_WITHOUT_AES(VISITOR) \
239
+ VISITOR(HWY_NEON_WITHOUT_AES, N_NEON_WITHOUT_AES)
159
240
  #else
160
241
  #define HWY_CHOOSE_NEON_WITHOUT_AES(FUNC_NAME) nullptr
242
+ #define HWY_VISIT_NEON_WITHOUT_AES(VISITOR)
161
243
  #endif
162
244
 
163
245
  #if HWY_TARGETS & HWY_NEON
164
246
  #define HWY_CHOOSE_NEON(FUNC_NAME) &N_NEON::FUNC_NAME
247
+ #define HWY_VISIT_NEON(VISITOR) VISITOR(HWY_NEON, N_NEON)
165
248
  #else
166
249
  #define HWY_CHOOSE_NEON(FUNC_NAME) nullptr
250
+ #define HWY_VISIT_NEON(VISITOR)
167
251
  #endif
168
252
 
169
253
  #if HWY_TARGETS & HWY_NEON_BF16
170
254
  #define HWY_CHOOSE_NEON_BF16(FUNC_NAME) &N_NEON_BF16::FUNC_NAME
255
+ #define HWY_VISIT_NEON_BF16(VISITOR) VISITOR(HWY_NEON_BF16, N_NEON_BF16)
171
256
  #else
172
257
  #define HWY_CHOOSE_NEON_BF16(FUNC_NAME) nullptr
258
+ #define HWY_VISIT_NEON_BF16(VISITOR)
173
259
  #endif
174
260
 
175
261
  #if HWY_TARGETS & HWY_SVE
176
262
  #define HWY_CHOOSE_SVE(FUNC_NAME) &N_SVE::FUNC_NAME
263
+ #define HWY_VISIT_SVE(VISITOR) VISITOR(HWY_SVE, N_SVE)
177
264
  #else
178
265
  #define HWY_CHOOSE_SVE(FUNC_NAME) nullptr
266
+ #define HWY_VISIT_SVE(VISITOR)
179
267
  #endif
180
268
 
181
269
  #if HWY_TARGETS & HWY_SVE2
182
270
  #define HWY_CHOOSE_SVE2(FUNC_NAME) &N_SVE2::FUNC_NAME
271
+ #define HWY_VISIT_SVE2(VISITOR) VISITOR(HWY_SVE2, N_SVE2)
183
272
  #else
184
273
  #define HWY_CHOOSE_SVE2(FUNC_NAME) nullptr
274
+ #define HWY_VISIT_SVE2(VISITOR)
185
275
  #endif
186
276
 
187
277
  #if HWY_TARGETS & HWY_SVE_256
188
278
  #define HWY_CHOOSE_SVE_256(FUNC_NAME) &N_SVE_256::FUNC_NAME
279
+ #define HWY_VISIT_SVE_256(VISITOR) VISITOR(HWY_SVE_256, N_SVE_256)
189
280
  #else
190
281
  #define HWY_CHOOSE_SVE_256(FUNC_NAME) nullptr
282
+ #define HWY_VISIT_SVE_256(VISITOR)
191
283
  #endif
192
284
 
193
285
  #if HWY_TARGETS & HWY_SVE2_128
194
286
  #define HWY_CHOOSE_SVE2_128(FUNC_NAME) &N_SVE2_128::FUNC_NAME
287
+ #define HWY_VISIT_SVE2_128(VISITOR) VISITOR(HWY_SVE2_128, N_SVE2_128)
195
288
  #else
196
289
  #define HWY_CHOOSE_SVE2_128(FUNC_NAME) nullptr
197
- #endif
198
-
199
- #if HWY_TARGETS & HWY_PPC8
200
- #define HWY_CHOOSE_PPC8(FUNC_NAME) &N_PPC8::FUNC_NAME
201
- #else
202
- #define HWY_CHOOSE_PPC8(FUNC_NAME) nullptr
203
- #endif
204
-
205
- #if HWY_TARGETS & HWY_PPC9
206
- #define HWY_CHOOSE_PPC9(FUNC_NAME) &N_PPC9::FUNC_NAME
207
- #else
208
- #define HWY_CHOOSE_PPC9(FUNC_NAME) nullptr
209
- #endif
210
-
211
- #if HWY_TARGETS & HWY_PPC10
212
- #define HWY_CHOOSE_PPC10(FUNC_NAME) &N_PPC10::FUNC_NAME
213
- #else
214
- #define HWY_CHOOSE_PPC10(FUNC_NAME) nullptr
215
- #endif
216
-
217
- #if HWY_TARGETS & HWY_Z14
218
- #define HWY_CHOOSE_Z14(FUNC_NAME) &N_Z14::FUNC_NAME
219
- #else
220
- #define HWY_CHOOSE_Z14(FUNC_NAME) nullptr
221
- #endif
222
-
223
- #if HWY_TARGETS & HWY_Z15
224
- #define HWY_CHOOSE_Z15(FUNC_NAME) &N_Z15::FUNC_NAME
225
- #else
226
- #define HWY_CHOOSE_Z15(FUNC_NAME) nullptr
290
+ #define HWY_VISIT_SVE2_128(VISITOR)
227
291
  #endif
228
292
 
229
293
  #if HWY_TARGETS & HWY_SSE2
230
294
  #define HWY_CHOOSE_SSE2(FUNC_NAME) &N_SSE2::FUNC_NAME
295
+ #define HWY_VISIT_SSE2(VISITOR) VISITOR(HWY_SSE2, N_SSE2)
231
296
  #else
232
297
  #define HWY_CHOOSE_SSE2(FUNC_NAME) nullptr
298
+ #define HWY_VISIT_SSE2(VISITOR)
233
299
  #endif
234
300
 
235
301
  #if HWY_TARGETS & HWY_SSSE3
236
302
  #define HWY_CHOOSE_SSSE3(FUNC_NAME) &N_SSSE3::FUNC_NAME
303
+ #define HWY_VISIT_SSSE3(VISITOR) VISITOR(HWY_SSSE3, N_SSSE3)
237
304
  #else
238
305
  #define HWY_CHOOSE_SSSE3(FUNC_NAME) nullptr
306
+ #define HWY_VISIT_SSSE3(VISITOR)
239
307
  #endif
240
308
 
241
309
  #if HWY_TARGETS & HWY_SSE4
242
310
  #define HWY_CHOOSE_SSE4(FUNC_NAME) &N_SSE4::FUNC_NAME
311
+ #define HWY_VISIT_SSE4(VISITOR) VISITOR(HWY_SSE4, N_SSE4)
243
312
  #else
244
313
  #define HWY_CHOOSE_SSE4(FUNC_NAME) nullptr
314
+ #define HWY_VISIT_SSE4(VISITOR)
245
315
  #endif
246
316
 
247
317
  #if HWY_TARGETS & HWY_AVX2
248
318
  #define HWY_CHOOSE_AVX2(FUNC_NAME) &N_AVX2::FUNC_NAME
319
+ #define HWY_VISIT_AVX2(VISITOR) VISITOR(HWY_AVX2, N_AVX2)
249
320
  #else
250
321
  #define HWY_CHOOSE_AVX2(FUNC_NAME) nullptr
322
+ #define HWY_VISIT_AVX2(VISITOR)
251
323
  #endif
252
324
 
253
325
  #if HWY_TARGETS & HWY_AVX3
254
326
  #define HWY_CHOOSE_AVX3(FUNC_NAME) &N_AVX3::FUNC_NAME
327
+ #define HWY_VISIT_AVX3(VISITOR) VISITOR(HWY_AVX3, N_AVX3)
255
328
  #else
256
329
  #define HWY_CHOOSE_AVX3(FUNC_NAME) nullptr
330
+ #define HWY_VISIT_AVX3(VISITOR)
257
331
  #endif
258
332
 
259
333
  #if HWY_TARGETS & HWY_AVX3_DL
260
334
  #define HWY_CHOOSE_AVX3_DL(FUNC_NAME) &N_AVX3_DL::FUNC_NAME
335
+ #define HWY_VISIT_AVX3_DL(VISITOR) VISITOR(HWY_AVX3_DL, N_AVX3_DL)
261
336
  #else
262
337
  #define HWY_CHOOSE_AVX3_DL(FUNC_NAME) nullptr
338
+ #define HWY_VISIT_AVX3_DL(VISITOR)
263
339
  #endif
264
340
 
265
341
  #if HWY_TARGETS & HWY_AVX3_ZEN4
266
342
  #define HWY_CHOOSE_AVX3_ZEN4(FUNC_NAME) &N_AVX3_ZEN4::FUNC_NAME
343
+ #define HWY_VISIT_AVX3_ZEN4(VISITOR) VISITOR(HWY_AVX3_ZEN4, N_AVX3_ZEN4)
267
344
  #else
268
345
  #define HWY_CHOOSE_AVX3_ZEN4(FUNC_NAME) nullptr
346
+ #define HWY_VISIT_AVX3_ZEN4(VISITOR)
269
347
  #endif
270
348
 
271
349
  #if HWY_TARGETS & HWY_AVX3_SPR
272
350
  #define HWY_CHOOSE_AVX3_SPR(FUNC_NAME) &N_AVX3_SPR::FUNC_NAME
351
+ #define HWY_VISIT_AVX3_SPR(VISITOR) VISITOR(HWY_AVX3_SPR, N_AVX3_SPR)
273
352
  #else
274
353
  #define HWY_CHOOSE_AVX3_SPR(FUNC_NAME) nullptr
354
+ #define HWY_VISIT_AVX3_SPR(VISITOR)
355
+ #endif
356
+
357
+ #if HWY_TARGETS & HWY_AVX10_2
358
+ #define HWY_CHOOSE_AVX10_2(FUNC_NAME) &N_AVX10_2::FUNC_NAME
359
+ #define HWY_VISIT_AVX10_2(VISITOR) VISITOR(HWY_AVX10_2, N_AVX10_2)
360
+ #else
361
+ #define HWY_CHOOSE_AVX10_2(FUNC_NAME) nullptr
362
+ #define HWY_VISIT_AVX10_2(VISITOR)
275
363
  #endif
276
364
 
277
365
  // MSVC 2017 workaround: the non-type template parameter to ChooseAndCall
@@ -535,8 +623,24 @@ struct AddExport {
535
623
  (HWY_DISPATCH_TABLE(FUNC_NAME)[hwy::GetChosenTarget().GetIndex()])
536
624
 
537
625
  // Calls the function pointer for the chosen target.
626
+ #if HWY_COMPILER_GCC || HWY_COMPILER_CLANG
627
+
628
+ // On GCC or Clang, we call hwy::PreventElision(...) to work around a compiler
629
+ // crash where the LLVM inliner crashes due to inlining incompatible intrinsics.
630
+
631
+ #define HWY_DYNAMIC_DISPATCH(FUNC_NAME) \
632
+ __extension__({ \
633
+ auto HWY_CONCAT(hwy_tmp_, __LINE__) = *(HWY_DYNAMIC_POINTER(FUNC_NAME)); \
634
+ hwy::PreventElision(HWY_CONCAT(hwy_tmp_, __LINE__)); \
635
+ HWY_CONCAT(hwy_tmp_, __LINE__); \
636
+ })
637
+
638
+ #else // !(HWY_COMPILER_GCC || HWY_COMPILER_CLANG)
639
+
538
640
  #define HWY_DYNAMIC_DISPATCH(FUNC_NAME) (*(HWY_DYNAMIC_POINTER(FUNC_NAME)))
539
641
 
642
+ #endif // HWY_COMPILER_GCC || HWY_COMPILER_CLANG
643
+
540
644
  // Same as DISPATCH, but provide a different arg name to clarify usage.
541
645
  #define HWY_DYNAMIC_DISPATCH_T(TABLE_NAME) HWY_DYNAMIC_DISPATCH(TABLE_NAME)
542
646
  #define HWY_DYNAMIC_POINTER_T(TABLE_NAME) HWY_DYNAMIC_POINTER(TABLE_NAME)
@@ -578,9 +682,10 @@ struct AddExport {
578
682
  #include "hwy/ops/x86_128-inl.h"
579
683
  #elif HWY_TARGET == HWY_AVX2
580
684
  #include "hwy/ops/x86_256-inl.h"
581
- #elif HWY_TARGET == HWY_AVX3 || HWY_TARGET == HWY_AVX3_DL || \
582
- HWY_TARGET == HWY_AVX3_ZEN4 || HWY_TARGET == HWY_AVX3_SPR
583
- #include "hwy/ops/x86_512-inl.h"
685
+ #elif HWY_TARGET == HWY_AVX3 || HWY_TARGET == HWY_AVX3_DL || \
686
+ HWY_TARGET == HWY_AVX3_ZEN4 || HWY_TARGET == HWY_AVX3_SPR || \
687
+ HWY_TARGET == HWY_AVX10_2
688
+ #include "hwy/ops/x86_avx3-inl.h"
584
689
  #elif HWY_TARGET == HWY_Z14 || HWY_TARGET == HWY_Z15 || \
585
690
  (HWY_TARGET & HWY_ALL_PPC)
586
691
  #include "hwy/ops/ppc_vsx-inl.h"
@@ -594,6 +699,10 @@ struct AddExport {
594
699
  #include "hwy/ops/wasm_128-inl.h"
595
700
  #elif HWY_TARGET == HWY_RVV
596
701
  #include "hwy/ops/rvv-inl.h"
702
+ #elif HWY_TARGET == HWY_LSX
703
+ #include "hwy/ops/loongarch_lsx-inl.h"
704
+ #elif HWY_TARGET == HWY_LASX
705
+ #include "hwy/ops/loongarch_lasx-inl.h"
597
706
  #elif HWY_TARGET == HWY_EMU128
598
707
  #include "hwy/ops/emu128-inl.h"
599
708
  #elif HWY_TARGET == HWY_SCALAR
@@ -49,25 +49,7 @@
49
49
  #include <stdint.h>
50
50
 
51
51
  #include "hwy/highway_export.h"
52
- #include "hwy/timer.h"
53
-
54
- // Enables sanity checks that verify correct operation at the cost of
55
- // longer benchmark runs.
56
- #ifndef NANOBENCHMARK_ENABLE_CHECKS
57
- #define NANOBENCHMARK_ENABLE_CHECKS 0
58
- #endif
59
-
60
- #define NANOBENCHMARK_CHECK_ALWAYS(condition) \
61
- while (!(condition)) { \
62
- fprintf(stderr, "Nanobenchmark check failed at line %d\n", __LINE__); \
63
- abort(); \
64
- }
65
-
66
- #if NANOBENCHMARK_ENABLE_CHECKS
67
- #define NANOBENCHMARK_CHECK(condition) NANOBENCHMARK_CHECK_ALWAYS(condition)
68
- #else
69
- #define NANOBENCHMARK_CHECK(condition)
70
- #endif
52
+ #include "hwy/timer.h" // IWYU pragma: export
71
53
 
72
54
  namespace hwy {
73
55