diff options
author | Erik de Castro Lopo <erikd@mega-nerd.com> | 2016-01-04 10:30:54 +1100 |
---|---|---|
committer | Erik de Castro Lopo <erikd@mega-nerd.com> | 2016-01-04 10:31:35 +1100 |
commit | 6cc1cbad2c40a4406fd911445b86b3df2291dd79 (patch) | |
tree | 417785984cc58a98db9c79acff0e28284dfd25f2 /src/libFLAC/include/private | |
parent | 0a0e5363ad015e6d33cf6a9598a6b79686e1f663 (diff) | |
download | flac-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.h | 33 |
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 |