re2 1.22.2 → 1.23.0

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 (495) hide show
  1. package/README.md +60 -4
  2. package/binding.gyp +5 -1
  3. package/lib/addon.cc +4 -0
  4. package/lib/new.cc +1 -246
  5. package/lib/pattern.cc +252 -0
  6. package/lib/pattern.h +10 -0
  7. package/lib/set.cc +777 -0
  8. package/lib/wrapped_re2_set.h +42 -0
  9. package/package.json +21 -9
  10. package/re2.d.ts +46 -9
  11. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
  12. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
  13. package/vendor/abseil-cpp/CMake/README.md +2 -2
  14. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  15. package/vendor/abseil-cpp/MODULE.bazel +6 -9
  16. package/vendor/abseil-cpp/README.md +6 -8
  17. package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
  18. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
  19. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
  20. package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
  21. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
  22. package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
  23. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
  24. package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
  25. package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
  26. package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
  27. package/vendor/abseil-cpp/absl/base/config.h +22 -129
  28. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
  29. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  30. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
  31. package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  32. package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  33. package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
  34. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  35. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
  36. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
  37. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
  38. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  39. package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
  40. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
  41. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
  42. package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
  44. package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
  45. package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
  46. package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
  48. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  49. package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
  50. package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
  51. package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
  52. package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
  53. package/vendor/abseil-cpp/absl/base/options.h +3 -80
  54. package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
  55. package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
  56. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  60. package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
  61. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  62. package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
  63. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
  64. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
  65. package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
  83. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
  87. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
  88. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
  89. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
  90. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
  91. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
  92. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
  93. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
  94. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
  95. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
  96. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  97. package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
  101. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
  102. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
  103. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
  104. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
  105. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
  106. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
  107. package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
  108. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
  109. package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
  110. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
  111. package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
  112. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
  113. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
  114. package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
  115. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
  116. package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
  117. package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
  118. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
  119. package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
  120. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
  121. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  122. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  123. package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  124. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
  125. package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
  126. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
  127. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
  128. package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  129. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  130. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  131. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  132. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  133. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
  134. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  135. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  136. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  137. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  138. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  139. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  140. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  141. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  142. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  143. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
  144. package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  145. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
  146. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  147. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
  148. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
  149. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  150. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  151. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
  152. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
  153. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  154. package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
  155. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  156. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
  157. package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
  158. package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  159. package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
  160. package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
  161. package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
  162. package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
  163. package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
  164. package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
  165. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
  166. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
  167. package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
  168. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
  169. package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
  170. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
  171. package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
  172. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
  173. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  174. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  175. package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
  176. package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
  177. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
  178. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
  179. package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
  180. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
  181. package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
  182. package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
  183. package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
  184. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
  185. package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
  186. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
  187. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
  188. package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
  189. package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
  190. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
  191. package/vendor/abseil-cpp/absl/log/check.h +2 -1
  192. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
  193. package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
  194. package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
  195. package/vendor/abseil-cpp/absl/log/globals.h +4 -5
  196. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
  197. package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  198. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
  199. package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
  200. package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  201. package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
  202. package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
  203. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  204. package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
  205. package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  206. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  207. package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
  208. package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
  209. package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
  210. package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
  211. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
  212. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  213. package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
  214. package/vendor/abseil-cpp/absl/log/log.h +48 -35
  215. package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
  216. package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
  217. package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
  218. package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
  219. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
  220. package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  221. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
  222. package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
  223. package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
  224. package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
  225. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  226. package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
  227. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
  228. package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
  229. package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
  230. package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
  231. package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
  232. package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
  233. package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
  234. package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
  235. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
  236. package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
  237. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
  238. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
  239. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
  240. package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
  241. package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  242. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
  243. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
  244. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  245. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
  246. package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
  247. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
  248. package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
  249. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  250. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
  251. package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
  252. package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  253. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
  254. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  255. package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
  256. package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
  257. package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
  258. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
  259. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  260. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
  261. package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
  262. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  263. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  264. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  265. package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
  266. package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
  267. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
  268. package/vendor/abseil-cpp/absl/random/random.h +88 -53
  269. package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  270. package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
  271. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  272. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  273. package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
  274. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
  275. package/vendor/abseil-cpp/absl/status/status.cc +4 -8
  276. package/vendor/abseil-cpp/absl/status/status.h +8 -8
  277. package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
  278. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
  279. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  280. package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
  281. package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
  282. package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
  283. package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
  284. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
  285. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
  286. package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
  287. package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
  288. package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
  289. package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
  290. package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
  291. package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
  292. package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
  293. package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
  294. package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
  295. package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  296. package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  297. package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
  298. package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
  299. package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
  300. package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
  301. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
  302. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
  303. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  304. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
  305. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
  306. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  307. package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  308. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
  309. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
  310. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
  311. package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
  312. package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
  313. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  314. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  315. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
  316. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  317. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
  318. package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  319. package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  320. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  321. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
  322. package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  323. package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  324. package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  325. package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
  326. package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
  327. package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
  328. package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
  329. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
  330. package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
  331. package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
  332. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
  333. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
  334. package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
  335. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
  336. package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
  337. package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
  338. package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
  339. package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
  340. package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
  341. package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
  342. package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
  343. package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
  344. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
  345. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
  346. package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
  347. package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
  348. package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
  349. package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
  350. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
  351. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
  352. package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  353. package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
  354. package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  355. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  356. package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  357. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  358. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
  359. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
  360. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  361. package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  362. package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  363. package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  364. package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
  365. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  366. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
  367. package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  368. package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
  369. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
  370. package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
  371. package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
  372. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
  373. package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
  374. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  375. package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
  376. package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
  377. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
  378. package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
  379. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
  380. package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
  381. package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
  382. package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
  383. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
  384. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  385. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  386. package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
  387. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
  388. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
  389. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
  390. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
  391. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  392. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
  393. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  394. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
  395. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
  396. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
  397. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
  398. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
  399. package/vendor/abseil-cpp/absl/time/time.h +24 -18
  400. package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
  401. package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
  402. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
  403. package/vendor/abseil-cpp/absl/types/any.h +9 -484
  404. package/vendor/abseil-cpp/absl/types/optional.h +7 -747
  405. package/vendor/abseil-cpp/absl/types/span.h +46 -19
  406. package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
  407. package/vendor/abseil-cpp/absl/types/variant.h +5 -784
  408. package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
  409. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
  410. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
  411. package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
  412. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
  413. package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
  414. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
  415. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
  416. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
  417. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
  418. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
  419. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  420. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
  421. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
  422. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
  423. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
  424. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
  425. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
  426. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
  427. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
  428. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
  429. package/vendor/re2/.bazelrc +4 -4
  430. package/vendor/re2/.bcr/metadata.template.json +16 -0
  431. package/vendor/re2/.bcr/presubmit.yml +57 -0
  432. package/vendor/re2/.bcr/source.template.json +5 -0
  433. package/vendor/re2/.github/bazel.sh +1 -7
  434. package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
  435. package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
  436. package/vendor/re2/.github/workflows/ci.yml +5 -6
  437. package/vendor/re2/.github/workflows/pages.yml +3 -3
  438. package/vendor/re2/.github/workflows/python.yml +29 -24
  439. package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
  440. package/vendor/re2/.github/workflows/release.yml +15 -4
  441. package/vendor/re2/BUILD.bazel +25 -0
  442. package/vendor/re2/CMakeLists.txt +100 -85
  443. package/vendor/re2/CONTRIBUTING.md +0 -1
  444. package/vendor/re2/MODULE.bazel +10 -10
  445. package/vendor/re2/Makefile +1 -1
  446. package/vendor/re2/README.md +259 -0
  447. package/vendor/re2/python/BUILD.bazel +8 -0
  448. package/vendor/re2/python/re2.py +1 -1
  449. package/vendor/re2/python/re2_test.py +6 -0
  450. package/vendor/re2/python/setup.py +3 -3
  451. package/vendor/re2/re2/bitmap256.cc +3 -4
  452. package/vendor/re2/re2/bitstate.cc +15 -10
  453. package/vendor/re2/re2/dfa.cc +1 -2
  454. package/vendor/re2/re2/parse.cc +3 -4
  455. package/vendor/re2/re2/prog.cc +1 -2
  456. package/vendor/re2/re2/prog.h +1 -0
  457. package/vendor/re2/re2/re2.cc +5 -0
  458. package/vendor/re2/re2/re2.h +9 -9
  459. package/vendor/re2/re2/set.cc +6 -0
  460. package/vendor/re2/re2/set.h +5 -0
  461. package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
  462. package/vendor/re2/re2/testing/re2_test.cc +8 -0
  463. package/vendor/re2/re2/testing/set_test.cc +5 -0
  464. package/vendor/re2/re2/walker-inl.h +1 -1
  465. package/vendor/abseil-cpp/WORKSPACE +0 -76
  466. package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
  467. package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
  468. package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  469. package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
  470. package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
  471. package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
  472. package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
  473. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
  474. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
  475. package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  476. package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
  477. package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
  478. package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
  479. package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
  480. package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
  481. package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  482. package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  483. package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  484. package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  485. package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
  486. package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
  487. package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
  488. package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
  489. package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
  490. package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
  491. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
  492. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
  493. package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
  494. package/vendor/re2/.github/workflows/pr.yml +0 -34
  495. package/vendor/re2/README +0 -47
@@ -99,19 +99,12 @@ V128 V128_PMul10(const V128 l, const V128 r);
99
99
  // Produces a XOR operation of |l| and |r|.
100
100
  V128 V128_Xor(const V128 l, const V128 r);
101
101
 
102
- // Produces an AND operation of |l| and |r|.
103
- V128 V128_And(const V128 l, const V128 r);
104
-
105
102
  // Sets the lower half of a 128 bit register to the given 64-bit value and
106
103
  // zeroes the upper half.
107
104
  // dst[63:0] := |r|
108
105
  // dst[127:64] := |0|
109
106
  V128 V128_From64WithZeroFill(const uint64_t r);
110
107
 
111
- // Shift |l| right by |imm| bytes while shifting in zeros.
112
- template <int imm>
113
- V128 V128_ShiftRight(const V128 l);
114
-
115
108
  // Extracts a 32-bit integer from |l|, selected with |imm|.
116
109
  template <int imm>
117
110
  int V128_Extract32(const V128 l);
@@ -170,17 +163,10 @@ inline V128 V128_PMul10(const V128 l, const V128 r) {
170
163
 
171
164
  inline V128 V128_Xor(const V128 l, const V128 r) { return _mm_xor_si128(l, r); }
172
165
 
173
- inline V128 V128_And(const V128 l, const V128 r) { return _mm_and_si128(l, r); }
174
-
175
166
  inline V128 V128_From64WithZeroFill(const uint64_t r) {
176
167
  return _mm_set_epi64x(static_cast<int64_t>(0), static_cast<int64_t>(r));
177
168
  }
178
169
 
179
- template <int imm>
180
- inline V128 V128_ShiftRight(const V128 l) {
181
- return _mm_srli_si128(l, imm);
182
- }
183
-
184
170
  template <int imm>
185
171
  inline int V128_Extract32(const V128 l) {
186
172
  return _mm_extract_epi32(l, imm);
@@ -261,20 +247,12 @@ inline V128 V128_PMul10(const V128 l, const V128 r) {
261
247
 
262
248
  inline V128 V128_Xor(const V128 l, const V128 r) { return veorq_u64(l, r); }
263
249
 
264
- inline V128 V128_And(const V128 l, const V128 r) { return vandq_u64(l, r); }
265
-
266
250
  inline V128 V128_From64WithZeroFill(const uint64_t r){
267
251
  constexpr uint64x2_t kZero = {0, 0};
268
252
  return vsetq_lane_u64(r, kZero, 0);
269
253
  }
270
254
 
271
255
 
272
- template <int imm>
273
- inline V128 V128_ShiftRight(const V128 l) {
274
- return vreinterpretq_u64_s8(
275
- vextq_s8(vreinterpretq_s8_u64(l), vdupq_n_s8(0), imm));
276
- }
277
-
278
256
  template <int imm>
279
257
  inline int V128_Extract32(const V128 l) {
280
258
  return vgetq_lane_s32(vreinterpretq_s32_u64(l), imm);
@@ -422,6 +422,11 @@ CrcMemcpy::ArchSpecificEngines CrcMemcpy::GetArchSpecificEngines() {
422
422
  };
423
423
  // INTEL_SANDYBRIDGE performs better with SSE than AVX.
424
424
  case CpuType::kIntelSandybridge:
425
+ // Use SIMD memcpy on ARM cores.
426
+ case CpuType::kArmNeoverseN1:
427
+ case CpuType::kArmNeoverseN2:
428
+ case CpuType::kArmNeoverseV1:
429
+ case CpuType::kArmNeoverseV2:
425
430
  return {
426
431
  /*.temporal=*/new AcceleratedCrcMemcpyEngine<3, 0>(),
427
432
  /*.non_temporal=*/new CrcNonTemporalMemcpyEngine(),
@@ -64,27 +64,27 @@ class CRC32AcceleratedX86ARMCombined : public CRC32 {
64
64
  constexpr size_t kSmallCutoff = 256;
65
65
  constexpr size_t kMediumCutoff = 2048;
66
66
 
67
- #define ABSL_INTERNAL_STEP1(crc) \
67
+ #define ABSL_INTERNAL_STEP1(crc, p) \
68
68
  do { \
69
69
  crc = CRC32_u8(static_cast<uint32_t>(crc), *p++); \
70
70
  } while (0)
71
- #define ABSL_INTERNAL_STEP2(crc) \
71
+ #define ABSL_INTERNAL_STEP2(crc, p) \
72
72
  do { \
73
73
  crc = \
74
74
  CRC32_u16(static_cast<uint32_t>(crc), absl::little_endian::Load16(p)); \
75
75
  p += 2; \
76
76
  } while (0)
77
- #define ABSL_INTERNAL_STEP4(crc) \
77
+ #define ABSL_INTERNAL_STEP4(crc, p) \
78
78
  do { \
79
79
  crc = \
80
80
  CRC32_u32(static_cast<uint32_t>(crc), absl::little_endian::Load32(p)); \
81
81
  p += 4; \
82
82
  } while (0)
83
- #define ABSL_INTERNAL_STEP8(crc, data) \
84
- do { \
85
- crc = CRC32_u64(static_cast<uint32_t>(crc), \
86
- absl::little_endian::Load64(data)); \
87
- data += 8; \
83
+ #define ABSL_INTERNAL_STEP8(crc, p) \
84
+ do { \
85
+ crc = \
86
+ CRC32_u64(static_cast<uint32_t>(crc), absl::little_endian::Load64(p)); \
87
+ p += 8; \
88
88
  } while (0)
89
89
  #define ABSL_INTERNAL_STEP8BY2(crc0, crc1, p0, p1) \
90
90
  do { \
@@ -100,47 +100,67 @@ constexpr size_t kMediumCutoff = 2048;
100
100
 
101
101
  namespace {
102
102
 
103
- uint32_t multiply(uint32_t a, uint32_t b) {
104
- V128 power = V128_From64WithZeroFill(a);
105
- V128 crc = V128_From64WithZeroFill(b);
106
- V128 res = V128_PMulLow(power, crc);
107
-
108
- // Combine crc values.
109
- //
110
- // Adding res to itself is equivalent to multiplying by 2,
111
- // or shifting left by 1. Addition is used as not all compilers
112
- // are able to generate optimal code without this hint.
113
- // https://godbolt.org/z/rr3fMnf39
114
- res = V128_Add64(res, res);
115
- return static_cast<uint32_t>(V128_Extract32<1>(res)) ^
116
- CRC32_u32(0, static_cast<uint32_t>(V128_Low64(res)));
103
+ // Does polynomial multiplication a * b * x^33 mod G.
104
+ //
105
+ // One of the multiplicands needs to have an extra factor of x^-33 to cancel out
106
+ // the extra factor of x^33. The extra factor of x^33 comes from:
107
+ //
108
+ // - x^1 from the carry-less multiplication, due to the
109
+ // "least-significant-bit-first" convention of CRC-32C.
110
+ //
111
+ // - x^32 from using CRC32_u64() to reduce the carry-less product to 32 bits.
112
+ //
113
+ // Both could be avoided, but at the cost of extra instructions. It's more
114
+ // efficient to just drop a factor of x^33 from one of the multiplicands.
115
+ uint32_t MultiplyWithExtraX33(uint32_t a, uint32_t b) {
116
+ V128 a_vec = V128_From64WithZeroFill(a);
117
+ V128 b_vec = V128_From64WithZeroFill(b);
118
+ V128 res = V128_PMulLow(a_vec, b_vec);
119
+
120
+ return CRC32_u64(0, static_cast<uint64_t>(V128_Low64(res)));
117
121
  }
118
122
 
119
- // Powers of crc32c polynomial, for faster ExtendByZeros.
120
- // Verified against folly:
121
- // folly/hash/detail/Crc32CombineDetail.cpp
123
+ // The number of low-order bits that ComputeZeroConstant() drops from the
124
+ // length, i.e. treats as zeroes
125
+ constexpr int kNumDroppedBits = 4;
126
+
127
+ // Precomputed constants for faster ExtendByZeroes(). This was generated by
128
+ // gen_crc32c_consts.py. The entry at index i is x^(2^(i + 3 + kNumDroppedBits)
129
+ // - 33) mod G. That is x^-33 times the polynomial by which the CRC value needs
130
+ // to be multiplied to extend it by 2^(i + 3 + kNumDroppedBits) zero bits, or
131
+ // equivalently 2^(i + kNumDroppedBits) zero bytes. The extra factor of x^-33
132
+ // cancels out the extra factor of x^33 that MultiplyWithExtraX33() introduces.
122
133
  constexpr uint32_t kCRC32CPowers[] = {
123
- 0x82f63b78, 0x6ea2d55c, 0x18b8ea18, 0x510ac59a, 0xb82be955, 0xb8fdb1e7,
124
- 0x88e56f72, 0x74c360a4, 0xe4172b16, 0x0d65762a, 0x35d73a62, 0x28461564,
125
- 0xbf455269, 0xe2ea32dc, 0xfe7740e6, 0xf946610b, 0x3c204f8f, 0x538586e3,
126
- 0x59726915, 0x734d5309, 0xbc1ac763, 0x7d0722cc, 0xd289cabe, 0xe94ca9bc,
127
- 0x05b74f3f, 0xa51e1f42, 0x40000000, 0x20000000, 0x08000000, 0x00800000,
128
- 0x00008000, 0x82f63b78, 0x6ea2d55c, 0x18b8ea18, 0x510ac59a, 0xb82be955,
129
- 0xb8fdb1e7, 0x88e56f72, 0x74c360a4, 0xe4172b16, 0x0d65762a, 0x35d73a62,
130
- 0x28461564, 0xbf455269, 0xe2ea32dc, 0xfe7740e6, 0xf946610b, 0x3c204f8f,
131
- 0x538586e3, 0x59726915, 0x734d5309, 0xbc1ac763, 0x7d0722cc, 0xd289cabe,
132
- 0xe94ca9bc, 0x05b74f3f, 0xa51e1f42, 0x40000000, 0x20000000, 0x08000000,
133
- 0x00800000, 0x00008000,
134
+ 0x493c7d27, 0xba4fc28e, 0x9e4addf8, 0x0d3b6092, 0xb9e02b86, 0xdd7e3b0c,
135
+ 0x170076fa, 0xa51b6135, 0x82f89c77, 0x54a86326, 0x1dc403cc, 0x5ae703ab,
136
+ 0xc5013a36, 0xac2ac6dd, 0x9b4615a9, 0x688d1c61, 0xf6af14e6, 0xb6ffe386,
137
+ 0xb717425b, 0x478b0d30, 0x54cc62e5, 0x7b2102ee, 0x8a99adef, 0xa7568c8f,
138
+ 0xd610d67e, 0x6b086b3f, 0xd94f3c0b, 0xbf818109, 0x780d5a4d, 0x05ec76f1,
139
+ 0x00000001, 0x493c7d27, 0xba4fc28e, 0x9e4addf8, 0x0d3b6092, 0xb9e02b86,
140
+ 0xdd7e3b0c, 0x170076fa, 0xa51b6135, 0x82f89c77, 0x54a86326, 0x1dc403cc,
141
+ 0x5ae703ab, 0xc5013a36, 0xac2ac6dd, 0x9b4615a9, 0x688d1c61, 0xf6af14e6,
142
+ 0xb6ffe386, 0xb717425b, 0x478b0d30, 0x54cc62e5, 0x7b2102ee, 0x8a99adef,
143
+ 0xa7568c8f, 0xd610d67e, 0x6b086b3f, 0xd94f3c0b, 0xbf818109, 0x780d5a4d,
134
144
  };
145
+ // There must be an entry for each non-dropped bit in the size_t length.
146
+ static_assert(std::size(kCRC32CPowers) >= sizeof(size_t) * 8 - kNumDroppedBits);
135
147
 
136
148
  } // namespace
137
149
 
138
- // Compute a magic constant, so that multiplying by it is the same as
139
- // extending crc by length zeros.
150
+ // Compute a magic constant, so that multiplying by it is the same as extending
151
+ // crc by length zeros. The lowest kNumDroppedBits of the length are ignored and
152
+ // treated as zeroes; the caller is assumed to handle any nonzero bits there.
153
+ #if defined(NDEBUG) && ABSL_HAVE_CPP_ATTRIBUTE(clang::no_sanitize)
154
+ // The array accesses in this are safe: `length >= size_t{1} <<
155
+ // kNumDroppedBits`, so `countr_zero(length >> kNumDroppedBits) < sizeof(size_t)
156
+ // * 8 - kNumDroppedBits`, and `length & (length - 1)` cannot introduce bits
157
+ // `>= sizeof(size_t) * 8 - kNumDroppedBits`. The compiler cannot prove this, so
158
+ // manually disable bounds checking.
159
+ [[clang::no_sanitize("array-bounds")]]
160
+ #endif
140
161
  uint32_t CRC32AcceleratedX86ARMCombined::ComputeZeroConstant(
141
162
  size_t length) const {
142
- // Lowest 2 bits are handled separately in ExtendByZeroes
143
- length >>= 2;
163
+ length >>= kNumDroppedBits;
144
164
 
145
165
  int index = absl::countr_zero(length);
146
166
  uint32_t prev = kCRC32CPowers[index];
@@ -149,7 +169,7 @@ uint32_t CRC32AcceleratedX86ARMCombined::ComputeZeroConstant(
149
169
  while (length) {
150
170
  // For each bit of length, extend by 2**n zeros.
151
171
  index = absl::countr_zero(length);
152
- prev = multiply(prev, kCRC32CPowers[index]);
172
+ prev = MultiplyWithExtraX33(prev, kCRC32CPowers[index]);
153
173
  length &= length - 1;
154
174
  }
155
175
  return prev;
@@ -159,22 +179,13 @@ void CRC32AcceleratedX86ARMCombined::ExtendByZeroes(uint32_t* crc,
159
179
  size_t length) const {
160
180
  uint32_t val = *crc;
161
181
  // Don't bother with multiplication for small length.
162
- switch (length & 3) {
163
- case 0:
164
- break;
165
- case 1:
166
- val = CRC32_u8(val, 0);
167
- break;
168
- case 2:
169
- val = CRC32_u16(val, 0);
170
- break;
171
- case 3:
172
- val = CRC32_u8(val, 0);
173
- val = CRC32_u16(val, 0);
174
- break;
175
- }
176
- if (length > 3) {
177
- val = multiply(val, ComputeZeroConstant(length));
182
+ if (length & 1) val = CRC32_u8(val, 0);
183
+ if (length & 2) val = CRC32_u16(val, 0);
184
+ if (length & 4) val = CRC32_u32(val, 0);
185
+ if (length & 8) val = CRC32_u64(val, 0);
186
+ static_assert(kNumDroppedBits == 4);
187
+ if (length >= size_t{1} << kNumDroppedBits) {
188
+ val = MultiplyWithExtraX33(val, ComputeZeroConstant(length));
178
189
  }
179
190
  *crc = val;
180
191
  }
@@ -221,7 +232,8 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreamsBase
221
232
  // We are applying it to CRC32C polynomial.
222
233
  ABSL_ATTRIBUTE_ALWAYS_INLINE void Process64BytesPclmul(
223
234
  const uint8_t* p, V128* partialCRC) const {
224
- V128 loopMultiplicands = V128_Load(reinterpret_cast<const V128*>(k1k2));
235
+ V128 loopMultiplicands =
236
+ V128_Load(reinterpret_cast<const V128*>(kFoldAcross512Bits));
225
237
 
226
238
  V128 partialCRC1 = partialCRC[0];
227
239
  V128 partialCRC2 = partialCRC[1];
@@ -265,53 +277,33 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreamsBase
265
277
 
266
278
  // Combine 4 vectors of partial crc into a single vector.
267
279
  V128 reductionMultiplicands =
268
- V128_Load(reinterpret_cast<const V128*>(k5k6));
280
+ V128_Load(reinterpret_cast<const V128*>(kFoldAcross256Bits));
269
281
 
270
282
  V128 low = V128_PMulLow(reductionMultiplicands, partialCRC1);
271
283
  V128 high = V128_PMulHi(reductionMultiplicands, partialCRC1);
272
284
 
273
285
  partialCRC1 = V128_Xor(low, high);
274
- partialCRC1 = V128_Xor(partialCRC1, partialCRC2);
286
+ partialCRC1 = V128_Xor(partialCRC1, partialCRC3);
275
287
 
276
- low = V128_PMulLow(reductionMultiplicands, partialCRC3);
277
- high = V128_PMulHi(reductionMultiplicands, partialCRC3);
288
+ low = V128_PMulLow(reductionMultiplicands, partialCRC2);
289
+ high = V128_PMulHi(reductionMultiplicands, partialCRC2);
278
290
 
279
- partialCRC3 = V128_Xor(low, high);
280
- partialCRC3 = V128_Xor(partialCRC3, partialCRC4);
291
+ partialCRC2 = V128_Xor(low, high);
292
+ partialCRC2 = V128_Xor(partialCRC2, partialCRC4);
281
293
 
282
- reductionMultiplicands = V128_Load(reinterpret_cast<const V128*>(k3k4));
294
+ reductionMultiplicands =
295
+ V128_Load(reinterpret_cast<const V128*>(kFoldAcross128Bits));
283
296
 
284
297
  low = V128_PMulLow(reductionMultiplicands, partialCRC1);
285
298
  high = V128_PMulHi(reductionMultiplicands, partialCRC1);
286
299
  V128 fullCRC = V128_Xor(low, high);
287
- fullCRC = V128_Xor(fullCRC, partialCRC3);
300
+ fullCRC = V128_Xor(fullCRC, partialCRC2);
288
301
 
289
302
  // Reduce fullCRC into scalar value.
290
- reductionMultiplicands = V128_Load(reinterpret_cast<const V128*>(k5k6));
291
-
292
- V128 mask = V128_Load(reinterpret_cast<const V128*>(kMask));
293
-
294
- V128 tmp = V128_PMul01(reductionMultiplicands, fullCRC);
295
- fullCRC = V128_ShiftRight<8>(fullCRC);
296
- fullCRC = V128_Xor(fullCRC, tmp);
297
-
298
- reductionMultiplicands = V128_Load(reinterpret_cast<const V128*>(k7k0));
299
-
300
- tmp = V128_ShiftRight<4>(fullCRC);
301
- fullCRC = V128_And(fullCRC, mask);
302
- fullCRC = V128_PMulLow(reductionMultiplicands, fullCRC);
303
- fullCRC = V128_Xor(tmp, fullCRC);
304
-
305
- reductionMultiplicands = V128_Load(reinterpret_cast<const V128*>(kPoly));
306
-
307
- tmp = V128_And(fullCRC, mask);
308
- tmp = V128_PMul01(reductionMultiplicands, tmp);
309
- tmp = V128_And(tmp, mask);
310
- tmp = V128_PMulLow(reductionMultiplicands, tmp);
311
-
312
- fullCRC = V128_Xor(tmp, fullCRC);
313
-
314
- return static_cast<uint64_t>(V128_Extract32<1>(fullCRC));
303
+ uint32_t crc = 0;
304
+ crc = CRC32_u64(crc, V128_Extract64<0>(fullCRC));
305
+ crc = CRC32_u64(crc, V128_Extract64<1>(fullCRC));
306
+ return crc;
315
307
  }
316
308
 
317
309
  // Update crc with 64 bytes of data from p.
@@ -325,15 +317,23 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreamsBase
325
317
  return crc;
326
318
  }
327
319
 
328
- // Generated by crc32c_x86_test --crc32c_generate_constants=true
329
- // and verified against constants in linux kernel for S390:
330
- // https://github.com/torvalds/linux/blob/master/arch/s390/crypto/crc32le-vx.S
331
- alignas(16) static constexpr uint64_t k1k2[2] = {0x0740eef02, 0x09e4addf8};
332
- alignas(16) static constexpr uint64_t k3k4[2] = {0x1384aa63a, 0x0ba4fc28e};
333
- alignas(16) static constexpr uint64_t k5k6[2] = {0x0f20c0dfe, 0x14cd00bd6};
334
- alignas(16) static constexpr uint64_t k7k0[2] = {0x0dd45aab8, 0x000000000};
335
- alignas(16) static constexpr uint64_t kPoly[2] = {0x105ec76f0, 0x0dea713f1};
336
- alignas(16) static constexpr uint32_t kMask[4] = {~0u, 0u, ~0u, 0u};
320
+ // Constants generated by './scripts/gen-crc-consts.py x86_pclmul
321
+ // crc32_lsb_0x82f63b78' from the Linux kernel.
322
+ alignas(16) static constexpr uint64_t kFoldAcross512Bits[2] = {
323
+ // (x^543 mod G) * x^32
324
+ 0x00000000740eef02,
325
+ // (x^479 mod G) * x^32
326
+ 0x000000009e4addf8};
327
+ alignas(16) static constexpr uint64_t kFoldAcross256Bits[2] = {
328
+ // (x^287 mod G) * x^32
329
+ 0x000000003da6d0cb,
330
+ // (x^223 mod G) * x^32
331
+ 0x00000000ba4fc28e};
332
+ alignas(16) static constexpr uint64_t kFoldAcross128Bits[2] = {
333
+ // (x^159 mod G) * x^32
334
+ 0x00000000f20c0dfe,
335
+ // (x^95 mod G) * x^32
336
+ 0x00000000493c7d27};
337
337
 
338
338
  // Medium runs of bytes are broken into groups of kGroupsSmall blocks of same
339
339
  // size. Each group is CRCed in parallel then combined at the end of the
@@ -345,30 +345,13 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreamsBase
345
345
  static constexpr size_t kMaxStreams = 3;
346
346
  };
347
347
 
348
- #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
349
- alignas(16) constexpr uint64_t
350
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::k1k2[2];
351
- alignas(16) constexpr uint64_t
352
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::k3k4[2];
353
- alignas(16) constexpr uint64_t
354
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::k5k6[2];
355
- alignas(16) constexpr uint64_t
356
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::k7k0[2];
357
- alignas(16) constexpr uint64_t
358
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::kPoly[2];
359
- alignas(16) constexpr uint32_t
360
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::kMask[4];
361
- constexpr size_t
362
- CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::kGroupsSmall;
363
- constexpr size_t CRC32AcceleratedX86ARMCombinedMultipleStreamsBase::kMaxStreams;
364
- #endif // ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
365
-
366
348
  template <size_t num_crc_streams, size_t num_pclmul_streams,
367
349
  CutoffStrategy strategy>
368
350
  class CRC32AcceleratedX86ARMCombinedMultipleStreams
369
351
  : public CRC32AcceleratedX86ARMCombinedMultipleStreamsBase {
370
352
  ABSL_ATTRIBUTE_HOT
371
- void Extend(uint32_t* crc, const void* bytes, size_t length) const override {
353
+ void Extend(uint32_t* crc, const void* bytes,
354
+ const size_t length) const override {
372
355
  static_assert(num_crc_streams >= 1 && num_crc_streams <= kMaxStreams,
373
356
  "Invalid number of crc streams");
374
357
  static_assert(num_pclmul_streams >= 0 && num_pclmul_streams <= kMaxStreams,
@@ -378,47 +361,15 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams
378
361
  uint32_t l = *crc;
379
362
  uint64_t l64;
380
363
 
381
- // We have dedicated instruction for 1,2,4 and 8 bytes.
382
- if (length & 8) {
383
- ABSL_INTERNAL_STEP8(l, p);
384
- length &= ~size_t{8};
385
- }
386
- if (length & 4) {
387
- ABSL_INTERNAL_STEP4(l);
388
- length &= ~size_t{4};
389
- }
390
- if (length & 2) {
391
- ABSL_INTERNAL_STEP2(l);
392
- length &= ~size_t{2};
393
- }
394
- if (length & 1) {
395
- ABSL_INTERNAL_STEP1(l);
396
- length &= ~size_t{1};
397
- }
398
- if (length == 0) {
399
- *crc = l;
400
- return;
401
- }
402
- // length is now multiple of 16.
403
-
404
364
  // For small blocks just run simple loop, because cost of combining multiple
405
365
  // streams is significant.
406
- if (strategy != CutoffStrategy::Unroll64CRC) {
407
- if (length < kSmallCutoff) {
408
- while (length >= 16) {
409
- ABSL_INTERNAL_STEP8(l, p);
410
- ABSL_INTERNAL_STEP8(l, p);
411
- length -= 16;
412
- }
413
- *crc = l;
414
- return;
415
- }
416
- }
417
-
418
- // For medium blocks we run 3 crc streams and combine them as described in
419
- // Intel paper above. Running 4th stream doesn't help, because crc
420
- // instruction has latency 3 and throughput 1.
421
- if (length < kMediumCutoff) {
366
+ if (strategy != CutoffStrategy::Unroll64CRC && (length < kSmallCutoff)) {
367
+ // fallthrough; Use the same strategy as we do for processing the
368
+ // remaining bytes after any other strategy.
369
+ } else if (length < kMediumCutoff) {
370
+ // For medium blocks we run 3 crc streams and combine them as described in
371
+ // Intel paper above. Running 4th stream doesn't help, because crc
372
+ // instruction has latency 3 and throughput 1.
422
373
  l64 = l;
423
374
  if (strategy == CutoffStrategy::Fold3) {
424
375
  uint64_t l641 = 0;
@@ -467,6 +418,7 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams
467
418
  p += 64;
468
419
  }
469
420
  }
421
+ l = static_cast<uint32_t>(l64);
470
422
  } else {
471
423
  // There is a lot of data, we can ignore combine costs and run all
472
424
  // requested streams (num_crc_streams + num_pclmul_streams),
@@ -478,7 +430,7 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams
478
430
  const uint8_t* x = RoundUp<8>(p);
479
431
  // Process bytes until p is 8-byte aligned, if that isn't past the end.
480
432
  while (p != x) {
481
- ABSL_INTERNAL_STEP1(l);
433
+ ABSL_INTERNAL_STEP1(l, p);
482
434
  }
483
435
 
484
436
  size_t bs = static_cast<size_t>(e - p) /
@@ -571,14 +523,15 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams
571
523
  }
572
524
 
573
525
  // Combine all streams into single result.
526
+ static_assert(64 % (1 << kNumDroppedBits) == 0);
574
527
  uint32_t magic = ComputeZeroConstant(bs * 64);
575
528
  l64 = l64_crc[0];
576
529
  for (size_t i = 1; i < num_crc_streams; i++) {
577
- l64 = multiply(static_cast<uint32_t>(l64), magic);
530
+ l64 = MultiplyWithExtraX33(static_cast<uint32_t>(l64), magic);
578
531
  l64 ^= l64_crc[i];
579
532
  }
580
533
  for (size_t i = 0; i < num_pclmul_streams; i++) {
581
- l64 = multiply(static_cast<uint32_t>(l64), magic);
534
+ l64 = MultiplyWithExtraX33(static_cast<uint32_t>(l64), magic);
582
535
  l64 ^= l64_pclmul[i];
583
536
  }
584
537
 
@@ -588,16 +541,27 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams
588
541
  } else {
589
542
  p = crc_streams[num_crc_streams - 1];
590
543
  }
544
+ l = static_cast<uint32_t>(l64);
591
545
  }
592
- l = static_cast<uint32_t>(l64);
593
546
 
547
+ uint64_t remaining_bytes = static_cast<uint64_t>(e - p);
548
+ // Process the remaining bytes.
594
549
  while ((e - p) >= 16) {
595
550
  ABSL_INTERNAL_STEP8(l, p);
596
551
  ABSL_INTERNAL_STEP8(l, p);
597
552
  }
598
- // Process the last few bytes
599
- while (p != e) {
600
- ABSL_INTERNAL_STEP1(l);
553
+
554
+ if (remaining_bytes & 8) {
555
+ ABSL_INTERNAL_STEP8(l, p);
556
+ }
557
+ if (remaining_bytes & 4) {
558
+ ABSL_INTERNAL_STEP4(l, p);
559
+ }
560
+ if (remaining_bytes & 2) {
561
+ ABSL_INTERNAL_STEP2(l, p);
562
+ }
563
+ if (remaining_bytes & 1) {
564
+ ABSL_INTERNAL_STEP1(l, p);
601
565
  }
602
566
 
603
567
  #undef ABSL_INTERNAL_STEP8BY3
@@ -622,6 +586,8 @@ CRCImpl* TryNewCRC32AcceleratedX86ARMCombined() {
622
586
  case CpuType::kAmdRome:
623
587
  case CpuType::kAmdNaples:
624
588
  case CpuType::kAmdMilan:
589
+ case CpuType::kAmdGenoa:
590
+ case CpuType::kAmdTurin:
625
591
  return new CRC32AcceleratedX86ARMCombinedMultipleStreams<
626
592
  3, 1, CutoffStrategy::Fold3>();
627
593
  // PCLMULQDQ is fast, use combined PCLMULQDQ + CRC implementation.
@@ -629,6 +595,10 @@ CRCImpl* TryNewCRC32AcceleratedX86ARMCombined() {
629
595
  case CpuType::kIntelSkylakeXeon:
630
596
  case CpuType::kIntelBroadwell:
631
597
  case CpuType::kIntelSkylake:
598
+ case CpuType::kIntelIcelake:
599
+ case CpuType::kIntelSapphirerapids:
600
+ case CpuType::kIntelEmeraldrapids:
601
+ case CpuType::kIntelGraniterapidsap:
632
602
  return new CRC32AcceleratedX86ARMCombinedMultipleStreams<
633
603
  3, 2, CutoffStrategy::Fold3>();
634
604
  // PCLMULQDQ is slow, don't use it.
@@ -640,6 +610,7 @@ CRCImpl* TryNewCRC32AcceleratedX86ARMCombined() {
640
610
  case CpuType::kArmNeoverseN1:
641
611
  case CpuType::kArmNeoverseN2:
642
612
  case CpuType::kArmNeoverseV1:
613
+ case CpuType::kArmNeoverseN3:
643
614
  return new CRC32AcceleratedX86ARMCombinedMultipleStreams<
644
615
  1, 1, CutoffStrategy::Unroll64CRC>();
645
616
  case CpuType::kAmpereSiryn:
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ #
3
+ # Copyright 2025 The Abseil Authors.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ """This script generates kCRC32CPowers[]."""
18
+
19
+
20
+ def poly_mul(a, b):
21
+ """Polynomial multiplication: a * b."""
22
+ product = 0
23
+ for i in range(b.bit_length()):
24
+ if (b & (1 << i)) != 0:
25
+ product ^= a << i
26
+ return product
27
+
28
+
29
+ def poly_div(a, b):
30
+ """Polynomial division: floor(a / b)."""
31
+ q = 0
32
+ while a.bit_length() >= b.bit_length():
33
+ q ^= 1 << (a.bit_length() - b.bit_length())
34
+ a ^= b << (a.bit_length() - b.bit_length())
35
+ return q
36
+
37
+
38
+ def poly_reduce(a, b):
39
+ """Polynomial reduction: a mod b."""
40
+ return a ^ poly_mul(poly_div(a, b), b)
41
+
42
+
43
+ def poly_exp(a, b, g):
44
+ """Polynomial exponentiation: a^b mod g."""
45
+ if b == 1:
46
+ return poly_reduce(a, g)
47
+ c = poly_exp(a, b // 2, g)
48
+ c = poly_mul(c, c)
49
+ if b % 2 != 0:
50
+ c = poly_mul(c, a)
51
+ return poly_reduce(c, g)
52
+
53
+
54
+ def bitreflect(a, num_bits):
55
+ """Reflects the bits of the given integer."""
56
+ if a.bit_length() > num_bits:
57
+ raise ValueError(f'Integer has more than {num_bits} bits')
58
+ return sum(((a >> i) & 1) << (num_bits - 1 - i) for i in range(num_bits))
59
+
60
+
61
+ G = 0x11EDC6F41 # The CRC-32C reducing polynomial, in the "natural" bit order
62
+ CRC_BITS = 32 # The degree of G, i.e. the 32 in "CRC-32C"
63
+ LSB_FIRST = True # CRC-32C is a least-significant-bit-first CRC
64
+ NUM_SIZE_BITS = 64 # The maximum number of bits in the length (size_t)
65
+ NUM_DROPPED_BITS = 4 # The number of bits dropped from the length
66
+ LOG2_BITS_PER_BYTE = 3 # log2 of the number of bits in a byte, i.e. log2(8)
67
+ X = 2 # The polynomial 'x', in the "natural" bit order
68
+
69
+
70
+ def print_crc32c_powers():
71
+ """Generates kCRC32CPowers[].
72
+
73
+ kCRC32CPowers[] is an array of length NUM_SIZE_BITS - NUM_DROPPED_BITS,
74
+ whose i'th entry is x^(2^(i + LOG2_BITS_PER_BYTE + NUM_DROPPED_BITS) -
75
+ CRC_BITS - 1) mod G. See kCRC32CPowers[] in the C++ source for more info.
76
+ """
77
+ for i in range(NUM_SIZE_BITS - NUM_DROPPED_BITS):
78
+ poly = poly_exp(
79
+ X,
80
+ 2 ** (i + LOG2_BITS_PER_BYTE + NUM_DROPPED_BITS)
81
+ - CRC_BITS
82
+ - (1 if LSB_FIRST else 0),
83
+ G,
84
+ )
85
+ poly = bitreflect(poly, CRC_BITS)
86
+ print(f'0x{poly:0{2*CRC_BITS//8}x}, ', end='')
87
+
88
+
89
+ if __name__ == '__main__':
90
+ print_crc32c_powers()
@@ -14,6 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
+ load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
18
+ load("@rules_cc//cc:cc_library.bzl", "cc_library")
19
+ load("@rules_cc//cc:cc_test.bzl", "cc_test")
17
20
  load(
18
21
  "//absl:copts/configure_copts.bzl",
19
22
  "ABSL_DEFAULT_COPTS",
@@ -55,6 +58,7 @@ cc_library(
55
58
  "//absl/base:config",
56
59
  "//absl/base:core_headers",
57
60
  "//absl/base:dynamic_annotations",
61
+ "//absl/base:malloc_internal",
58
62
  "//absl/base:raw_logging_internal",
59
63
  ],
60
64
  )
@@ -66,7 +70,9 @@ cc_test(
66
70
  linkopts = ABSL_DEFAULT_LINKOPTS,
67
71
  deps = [
68
72
  ":stacktrace",
73
+ "//absl/base:config",
69
74
  "//absl/base:core_headers",
75
+ "//absl/types:span",
70
76
  "@googletest//:gtest",
71
77
  "@googletest//:gtest_main",
72
78
  ],
@@ -202,6 +208,7 @@ cc_library(
202
208
  ],
203
209
  hdrs = [
204
210
  "internal/address_is_readable.h",
211
+ "internal/addresses.h",
205
212
  "internal/elf_mem_image.h",
206
213
  "internal/vdso_support.h",
207
214
  ],