summaryrefslogtreecommitdiff
path: root/src/libFLAC/include/private
diff options
context:
space:
mode:
authorErik de Castro Lopo <erikd@mega-nerd.com>2016-01-04 10:30:54 +1100
committerErik de Castro Lopo <erikd@mega-nerd.com>2016-01-04 10:31:35 +1100
commit6cc1cbad2c40a4406fd911445b86b3df2291dd79 (patch)
tree417785984cc58a98db9c79acff0e28284dfd25f2 /src/libFLAC/include/private
parent0a0e5363ad015e6d33cf6a9598a6b79686e1f663 (diff)
downloadflac-6cc1cbad2c40a4406fd911445b86b3df2291dd79.tar.gz
libFLAC: Support 64bit brword/bwword
This patch allows FLAC__BYTES_PER_WORD to be set to 8, but is disabled by default. Patch-from: lvqcl <lvqcl.mail@gmail.com>
Diffstat (limited to 'src/libFLAC/include/private')
-rw-r--r--src/libFLAC/include/private/bitmath.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/libFLAC/include/private/bitmath.h b/src/libFLAC/include/private/bitmath.h
index 220b8dcc..bdd154a9 100644
--- a/src/libFLAC/include/private/bitmath.h
+++ b/src/libFLAC/include/private/bitmath.h
@@ -91,7 +91,31 @@ static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v)
#endif
}
-/* This one works with input 0 */
+/* Used when 64-bit bsr/clz is unavailable; can use 32-bit bsr/clz when possible */
+static inline unsigned int FLAC__clz_soft_uint64(FLAC__uint64 word)
+{
+ return (FLAC__uint32)(word>>32) ? FLAC__clz_uint32((FLAC__uint32)(word>>32)) :
+ FLAC__clz_uint32((FLAC__uint32)word) + 32;
+}
+
+static inline unsigned int FLAC__clz_uint64(FLAC__uint64 v)
+{
+ /* Never used with input 0 */
+ FLAC__ASSERT(v > 0);
+#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+ return __builtin_clzll(v);
+#elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64))
+ {
+ unsigned long idx;
+ _BitScanReverse64(&idx, v);
+ return idx ^ 63U;
+ }
+#else
+ return FLAC__clz_soft_uint64(v);
+#endif
+}
+
+/* These two functions work with input 0 */
static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v)
{
if (!v)
@@ -99,6 +123,13 @@ static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v)
return FLAC__clz_uint32(v);
}
+static inline unsigned int FLAC__clz2_uint64(FLAC__uint64 v)
+{
+ if (!v)
+ return 64;
+ return FLAC__clz_uint64(v);
+}
+
/* An example of what FLAC__bitmath_ilog2() computes:
*
* ilog2( 0) = assertion failure