diff options
author | Gregory Maxwell <greg@xiph.org> | 2012-11-27 21:51:20 +0400 |
---|---|---|
committer | Gregory Maxwell <greg@xiph.org> | 2012-11-29 23:46:35 +0400 |
commit | 1c879aa1d4768e9de6932920ff54d9bde00bd5eb (patch) | |
tree | 13ce5bcade1d09459c847e0c2ad724ed9177d487 | |
parent | 10360697d4cb876445661b471eef16470ed24d0f (diff) |
Guard _BitScanReverse on MSVC so that MSVC 6 doesn't break.
This also adds some extra casts to shut up compiler warnings
reported on MSVC 6 where there is implicit truncation for the
arguments of bitexact_cos().
Lacking access to CLZ/BSR will make the code a fair bit slower but
that is better than failing to compile.
-rw-r--r-- | celt/bands.c | 4 | ||||
-rw-r--r-- | celt/ecintrin.h | 2 | ||||
-rw-r--r-- | celt/entcode.c | 5 |
3 files changed, 8 insertions, 3 deletions
diff --git a/celt/bands.c b/celt/bands.c index f38b6626..3be543c3 100644 --- a/celt/bands.c +++ b/celt/bands.c @@ -905,8 +905,8 @@ static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, c fill &= ((1<<B)-1)<<B; delta = 16384; } else { - imid = bitexact_cos(itheta); - iside = bitexact_cos(16384-itheta); + imid = bitexact_cos((opus_int16)itheta); + iside = bitexact_cos((opus_int16)(16384-itheta)); /* This is the mid vs side allocation that minimizes squared error in that band. */ delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); diff --git a/celt/ecintrin.h b/celt/ecintrin.h index 3dffa5f9..be57dd40 100644 --- a/celt/ecintrin.h +++ b/celt/ecintrin.h @@ -48,7 +48,7 @@ /*Count leading zeros. This macro should only be used for implementing ec_ilog(), if it is defined. All other code should use EC_ILOG() instead.*/ -#if defined(_MSC_VER) +#if defined(_MSC_VER) && (_MSC_VER >= 1400) # include <intrin.h> /*In _DEBUG mode this is not an intrinsic by default.*/ # pragma intrinsic(_BitScanReverse) diff --git a/celt/entcode.c b/celt/entcode.c index 02ac690b..fa5d7c7c 100644 --- a/celt/entcode.c +++ b/celt/entcode.c @@ -33,6 +33,11 @@ #include "arch.h" #if !defined(EC_CLZ) +/*This is a fallback for systems where we don't know how to access + a BSR or CLZ instruction (see ecintrin.h). + If you are optimizing Opus on a new platform and it has a native CLZ or + BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be + an easy performance win.*/ int ec_ilog(opus_uint32 _v){ /*On a Pentium M, this branchless version tested as the fastest on 1,000,000,000 random 32-bit integers, edging out a similar version with |