@@ -24,6 +24,7 @@ namespace arrow::util::internal {
2424
2525using ::arrow::internal::DispatchLevel;
2626using ::arrow::internal::DynamicDispatch;
27+ using ::arrow::internal::DynamicDispatchTarget;
2728
2829/* ***********************
2930 * Decode dispatching *
@@ -32,28 +33,16 @@ using ::arrow::internal::DynamicDispatch;
3233template <int kNumStreams >
3334struct ByteStreamSplitDecodeDynamic {
3435 using FunctionType = decltype (&ByteStreamSplitDecodeScalar<kNumStreams >);
35- using Implementation = std::pair<DispatchLevel, FunctionType>;
3636
3737 constexpr static auto implementations () {
3838 return std::array{
39- Implementation{
40- DispatchLevel::NONE,
41- #if defined(ARROW_HAVE_NEON)
42- // We always expect Neon to be available on Arm64
43- &ByteStreamSplitDecodeSimd<xsimd::neon64, kNumStreams >,
44- #elif defined(ARROW_HAVE_SSE4_2)
45- // We always expect SSE4.2 to be available on x86_64
46- &ByteStreamSplitDecodeSimd<xsimd::sse4_2, kNumStreams >,
47- #else
48- &ByteStreamSplitDecodeScalar<kNumStreams >,
49- #endif
50- },
51- #if defined(ARROW_HAVE_RUNTIME_AVX2)
52- Implementation{
53- DispatchLevel::AVX2,
54- &ByteStreamSplitDecodeSimd<xsimd::avx2, kNumStreams >,
55- },
56- #endif
39+ ARROW_DISPATCH_TARGET_NONE (&ByteStreamSplitDecodeScalar<kNumStreams >) //
40+ ARROW_DISPATCH_TARGET_NEON (
41+ (&ByteStreamSplitDecodeSimd<xsimd::neon64, kNumStreams >)) //
42+ ARROW_DISPATCH_TARGET_SSE4_2 (
43+ (&ByteStreamSplitDecodeSimd<xsimd::sse4_2, kNumStreams >)) //
44+ ARROW_DISPATCH_TARGET_AVX2 (
45+ (&ByteStreamSplitDecodeSimd<xsimd::avx2, kNumStreams >)) //
5746 };
5847 }
5948};
@@ -62,7 +51,7 @@ template <int kNumStreams>
6251void ByteStreamSplitDecodeSimdDispatch (const uint8_t * data, int width, int64_t num_values,
6352 int64_t stride, uint8_t * out) {
6453 static const DynamicDispatch<ByteStreamSplitDecodeDynamic<kNumStreams >> dispatch;
65- return dispatch. func (data, width, num_values, stride, out);
54+ return dispatch (data, width, num_values, stride, out);
6655}
6756
6857template void ByteStreamSplitDecodeSimdDispatch<2 >(const uint8_t *, int , int64_t , int64_t ,
@@ -79,25 +68,15 @@ template void ByteStreamSplitDecodeSimdDispatch<8>(const uint8_t*, int, int64_t,
7968template <int kNumStreams >
8069struct ByteStreamSplitEncodeDynamic {
8170 using FunctionType = decltype (&ByteStreamSplitEncodeScalar<kNumStreams >);
82- using Implementation = std::pair<DispatchLevel, FunctionType>;
8371
8472 constexpr static auto implementations () {
8573 return std::array{
86- Implementation{
87- DispatchLevel::NONE,
88- #if defined(ARROW_HAVE_NEON)
89- // We always expect Neon to be available on Arm64
90- &ByteStreamSplitEncodeSimd<xsimd::neon64, kNumStreams >,
91- #elif defined(ARROW_HAVE_SSE4_2)
92- // We always expect SSE4.2 to be available on x86_64
93- &ByteStreamSplitEncodeSimd<xsimd::sse4_2, kNumStreams >,
94- #else
95- &ByteStreamSplitEncodeScalar<kNumStreams >,
96- #endif
97- },
98- #if defined(ARROW_HAVE_RUNTIME_AVX2)
99- Implementation{DispatchLevel::AVX2, &ByteStreamSplitEncodeAvx2<kNumStreams >},
100- #endif
74+ ARROW_DISPATCH_TARGET_NONE (&ByteStreamSplitEncodeScalar<kNumStreams >) //
75+ ARROW_DISPATCH_TARGET_NEON ( //
76+ (&ByteStreamSplitEncodeSimd<xsimd::neon64, kNumStreams >)) //
77+ ARROW_DISPATCH_TARGET_SSE4_2 ( //
78+ (&ByteStreamSplitEncodeSimd<xsimd::sse4_2, kNumStreams >)) //
79+ ARROW_DISPATCH_TARGET_AVX2 ((&ByteStreamSplitEncodeAvx2<kNumStreams >)) //
10180 };
10281 }
10382};
@@ -107,7 +86,7 @@ void ByteStreamSplitEncodeSimdDispatch(const uint8_t* raw_values, int width,
10786 const int64_t num_values,
10887 uint8_t * output_buffer_raw) {
10988 static const DynamicDispatch<ByteStreamSplitEncodeDynamic<kNumStreams >> dispatch;
110- return dispatch. func (raw_values, width, num_values, output_buffer_raw);
89+ return dispatch (raw_values, width, num_values, output_buffer_raw);
11190}
11291
11392template void ByteStreamSplitEncodeSimdDispatch<2 >(const uint8_t *, int , const int64_t ,
0 commit comments