ref: f9b1b3fec85aab07db668b697fa700a94d7f75aa
parent: da752d1883c7b18a83e09c2e8e25a12e19138b68
author: Gregory Maxwell <[email protected]>
date: Fri Aug 12 09:08:38 EDT 2011
Shrink INV_TABLE to save a little memory.
--- a/libcelt/cwrs.c
+++ b/libcelt/cwrs.c
@@ -77,7 +77,7 @@
#define MASK32 (0xFFFFFFFF)
/*INV_TABLE[i] holds the multiplicative inverse of (2*i+1) mod 2**32.*/
-static const opus_uint32 INV_TABLE[64]={
+static const opus_uint32 INV_TABLE[53]={
0x00000001,0xAAAAAAAB,0xCCCCCCCD,0xB6DB6DB7,
0x38E38E39,0xBA2E8BA3,0xC4EC4EC5,0xEEEEEEEF,
0xF0F0F0F1,0x286BCA1B,0x3CF3CF3D,0xE9BD37A7,
@@ -91,17 +91,16 @@
0x781948B1,0x2B2E43DB,0xFCFCFCFD,0x6FD0EB67,
0xFA3F47E9,0xD2FD2FD3,0x3F4FD3F5,0xD4E25B9F,
0x5F02A3A1,0xBF5A814B,0x7C32B16D,0xD3431B57,
- 0xD8FD8FD9,0x8D28AC43,0xDA6C0965,0xDB195E8F,
- 0x0FDBC091,0x61F2A4BB,0xDCFDCFDD,0x46FDD947,
- 0x56BE69C9,0xEB2FDEB3,0x26E978D5,0xEFDFBF7F,
+ 0xD8FD8FD9,
};
/*Computes (_a*_b-_c)/(2*_d+1) when the quotient is known to be exact.
_a, _b, _c, and _d may be arbitrary so long as the arbitrary precision result
fits in 32 bits, but currently the table for multiplicative inverses is only
- valid for _d<64.*/
+ valid for _d<=52.*/
static inline opus_uint32 imusdiv32odd(opus_uint32 _a,opus_uint32 _b,
opus_uint32 _c,int _d){
+ celt_assert(_d<=52);
return (_a*_b-_c)*INV_TABLE[_d]&MASK32;
}
@@ -109,7 +108,7 @@
_d does not actually have to be even, but imusdiv32odd will be faster when
it's odd, so you should use that instead.
_a and _d are assumed to be small (e.g., _a*_d fits in 32 bits; currently the
- table for multiplicative inverses is only valid for _d<=127).
+ table for multiplicative inverses is only valid for _d<=54).
_b and _c may be arbitrary so long as the arbitrary precision reuslt fits in
32 bits.*/
static inline opus_uint32 imusdiv32even(opus_uint32 _a,opus_uint32 _b,
@@ -119,8 +118,8 @@
int shift;
int one;
celt_assert(_d>0);
+ celt_assert(_d<=54);
shift=EC_ILOG(_d^_d-1);
- celt_assert(_d<=127);
inv=INV_TABLE[_d-1>>shift];
shift--;
one=1<<shift;
@@ -344,7 +343,9 @@
_u[0]=0;
_u[1]=um2=1;
#ifndef SMALL_FOOTPRINT
- if(_n<=6 || _k>127)
+ /*_k>52 doesn't work in the false branch due to the limits of INV_TABLE,
+ but _k isn't tested here because k<=52 for n=7*/
+ if(_n<=6)
#endif
{
/*If _n==0, _u[0] should be 1 and the rest should be 0.*/