Skip to content

Commit 88feeaf

Browse files
authored
Merge pull request #861 from LebedevRI/panasonic-v8-perf
PanasonicV8Decompressor: maor faster (-33%)
2 parents b587d8c + d48e614 commit 88feeaf

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed

src/librawspeed/adt/Bit.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
#include "adt/Casts.h"
2525
#include "adt/Invariant.h"
2626
#include <algorithm>
27+
#include <array>
2728
#include <bit>
2829
#include <climits>
2930
#include <concepts>
3031
#include <cstdint>
32+
#include <cstring>
3133
#include <type_traits>
3234

3335
namespace rawspeed {
@@ -134,4 +136,40 @@ constexpr typename std::make_signed_t<T>
134136
return static_cast<SignedT>(value << SpareSignBits) >> SpareSignBits;
135137
}
136138

139+
template <class T>
140+
requires std::same_as<T, uint8_t>
141+
T bitreverse(const T v) {
142+
#if __has_builtin(__builtin_bitreverse8)
143+
return __builtin_bitreverse8(v);
144+
#endif
145+
// Reverse the order of bits within each byte using a bit-twiddle trick.
146+
// Three operation bit reversal from:
147+
// https://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv
148+
return uint8_t((uint8_t(v) * 0x0202020202ULL & 0x010884422010ULL) % 1023);
149+
}
150+
151+
#if __has_builtin(__builtin_bitreverse32)
152+
template <class T>
153+
requires std::same_as<T, uint32_t>
154+
T bitreverse(const T v) {
155+
return __builtin_bitreverse32(v);
156+
}
157+
#endif
158+
159+
template <class T>
160+
requires std::same_as<T, uint8_t>
161+
std::array<T, 4> bitreverse_each(std::array<T, 4> x) {
162+
#if !__has_builtin(__builtin_bitreverse32)
163+
for (T& e : x)
164+
e = bitreverse(e);
165+
#else
166+
uint32_t tmp;
167+
std::memcpy(&tmp, x.data(), sizeof(uint32_t));
168+
tmp = bitreverse(tmp);
169+
tmp = __builtin_bswap32(tmp);
170+
std::memcpy(x.data(), &tmp, sizeof(uint32_t));
171+
#endif
172+
return x;
173+
}
174+
137175
} // namespace rawspeed

src/librawspeed/decompressors/PanasonicV8Decompressor.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,12 @@ 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+
std::array<uint8_t, 4> ints;
93+
for (int i = 0; i != 4; ++i)
94+
ints[i] = uint8_t(tmp(i));
95+
ints = bitreverse_each(ints);
96+
for (int i = 0; i != 4; ++i)
97+
tmp(i) = std::byte{ints[i]};
9998

10099
return tmpStorage;
101100
}

0 commit comments

Comments
 (0)