Skip to content

Commit d165368

Browse files
committed
PanasonicV8Decompressor: use proper builtin for bitreverse (-31%)
``` Comparing /home/lebedevri/rawspeed/build-old/src/utilities/rsbench/rsbench to /home/lebedevri/rawspeed/build-new/src/utilities/rsbench/rsbench Benchmark Time CPU Time Old Time New CPU Old CPU New --------------------------------------------------------------------------------------------------------------------------------------------------------------- P1126458_mechanical.RW2/threads:1/process_time/real_time_pvalue 0.0000 0.0000 U Test, Repetitions: 99 vs 99 P1126458_mechanical.RW2/threads:1/process_time/real_time_mean -0.2704 -0.2703 208 152 208 152 P1126458_mechanical.RW2/threads:1/process_time/real_time_median -0.2710 -0.2711 208 151 208 151 P1126458_mechanical.RW2/threads:1/process_time/real_time_stddev +1.1693 +3.3262 0 0 0 0 P1126458_mechanical.RW2/threads:1/process_time/real_time_cv +1.9731 +4.9285 0 0 0 0 P1126458_mechanical.RW2/threads:32/process_time/real_time_pvalue 0.0000 0.0000 U Test, Repetitions: 99 vs 99 P1126458_mechanical.RW2/threads:32/process_time/real_time_mean -0.3076 -0.3077 112 78 224 155 P1126458_mechanical.RW2/threads:32/process_time/real_time_median -0.3076 -0.3077 112 78 224 155 P1126458_mechanical.RW2/threads:32/process_time/real_time_stddev -0.1431 -0.2072 0 0 0 0 P1126458_mechanical.RW2/threads:32/process_time/real_time_cv +0.2376 +0.1451 0 0 0 0 OVERALL_GEOMEAN -0.2892 -0.2892 0 0 0 0 ```
1 parent b587d8c commit d165368

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

src/librawspeed/adt/Bit.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,16 @@ constexpr typename std::make_signed_t<T>
134134
return static_cast<SignedT>(value << SpareSignBits) >> SpareSignBits;
135135
}
136136

137+
template <class T>
138+
requires std::same_as<T, uint8_t>
139+
T bitreverse(const T v) {
140+
#if __has_builtin(__builtin_bitreverse8)
141+
return __builtin_bitreverse8(v);
142+
#endif
143+
// Reverse the order of bits within each byte using a bit-twiddle trick.
144+
// Three operation bit reversal from:
145+
// https://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv
146+
return uint8_t((uint8_t(v) * 0x0202020202ULL & 0x010884422010ULL) % 1023);
147+
}
148+
137149
} // namespace rawspeed

src/librawspeed/decompressors/PanasonicV8Decompressor.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,8 @@ struct BitStreamerReversedSequentialReplenisher
8989
std::copy_n(currInput.begin(), BitStreamerTraits<Tag>::MaxProcessBytes,
9090
tmp.begin());
9191

92-
// Reverse the order of bits within each byte using a bit-twiddle trick.
93-
// Three operation bit reversal from:
94-
// https://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv
95-
for (std::byte& b : tmp) {
96-
b = std::byte{
97-
uint8_t((uint8_t(b) * 0x0202020202ULL & 0x010884422010ULL) % 1023)};
98-
}
92+
for (std::byte& b : tmp)
93+
b = std::byte{bitreverse(uint8_t(b))};
9994

10095
return tmpStorage;
10196
}

0 commit comments

Comments
 (0)