diff options
| author | Brad Midgley <bmidgley@xmission.com> | 2008-01-27 03:35:53 +0000 | 
|---|---|---|
| committer | Brad Midgley <bmidgley@xmission.com> | 2008-01-27 03:35:53 +0000 | 
| commit | c2ce7c2d410cfb0e67c1635ebf60fc06ae864f33 (patch) | |
| tree | a6286cdee4e75898fe84a4705906406a3908431e | |
| parent | c9b510105937825c04c729b4bb02b87596b795fb (diff) | |
get 32-bit products whenever we're sure the multiplicands are both 16 bits
| -rw-r--r-- | sbc/sbc.c | 190 | ||||
| -rw-r--r-- | sbc/sbc_math.h | 2 | 
2 files changed, 97 insertions, 95 deletions
| @@ -715,51 +715,51 @@ static inline void _sbc_analyze_four(const int16_t *in, int32_t *out)  	sbc_fixed_t t[8];  	sbc_extended_t s[5]; -	MUL(res, _sbc_proto_4[0], (in[8] - in[32])); /* Q18 */ -	MULA(res, _sbc_proto_4[1], (in[16] - in[24])); +	MUL32(res, _sbc_proto_4[0], (in[8] - in[32])); /* Q18 */ +	MULA32(res, _sbc_proto_4[1], (in[16] - in[24]));  	t[0] = SCALE4_STAGE1(res); /* Q8 */ -	MUL(res, _sbc_proto_4[2], in[1]); -	MULA(res, _sbc_proto_4[3], in[9]); -	MULA(res, _sbc_proto_4[4], in[17]); -	MULA(res, _sbc_proto_4[5], in[25]); -	MULA(res, _sbc_proto_4[6], in[33]); +	MUL32(res, _sbc_proto_4[2], in[1]); +	MULA32(res, _sbc_proto_4[3], in[9]); +	MULA32(res, _sbc_proto_4[4], in[17]); +	MULA32(res, _sbc_proto_4[5], in[25]); +	MULA32(res, _sbc_proto_4[6], in[33]);  	t[1] = SCALE4_STAGE1(res); -	MUL(res, _sbc_proto_4[7], in[2]); -	MULA(res, _sbc_proto_4[8], in[10]); -	MULA(res, _sbc_proto_4[9], in[18]); -	MULA(res, _sbc_proto_4[10], in[26]); -	MULA(res, _sbc_proto_4[11], in[34]); +	MUL32(res, _sbc_proto_4[7], in[2]); +	MULA32(res, _sbc_proto_4[8], in[10]); +	MULA32(res, _sbc_proto_4[9], in[18]); +	MULA32(res, _sbc_proto_4[10], in[26]); +	MULA32(res, _sbc_proto_4[11], in[34]);  	t[2] = SCALE4_STAGE1(res); -	MUL(res, _sbc_proto_4[12], in[3]); -	MULA(res, _sbc_proto_4[13], in[11]); -	MULA(res, _sbc_proto_4[14], in[19]); -	MULA(res, _sbc_proto_4[15], in[27]); -	MULA(res, _sbc_proto_4[16], in[35]); +	MUL32(res, _sbc_proto_4[12], in[3]); +	MULA32(res, _sbc_proto_4[13], in[11]); +	MULA32(res, _sbc_proto_4[14], in[19]); +	MULA32(res, _sbc_proto_4[15], in[27]); +	MULA32(res, _sbc_proto_4[16], in[35]);  	t[3] = SCALE4_STAGE1(res);  	MUL(res, _sbc_proto_4[17], in[4] + in[36]);  	MULA(res, _sbc_proto_4[18], in[12] + in[28]); -	MULA(res, _sbc_proto_4[19], in[20]); +	MULA32(res, _sbc_proto_4[19], in[20]);  	t[4] = SCALE4_STAGE1(res); -	MUL(res, _sbc_proto_4[16], in[5]); -	MULA(res, _sbc_proto_4[15], in[13]); -	MULA(res, _sbc_proto_4[14], in[21]); -	MULA(res, _sbc_proto_4[13], in[29]); -	MULA(res, _sbc_proto_4[12], in[37]); +	MUL32(res, _sbc_proto_4[16], in[5]); +	MULA32(res, _sbc_proto_4[15], in[13]); +	MULA32(res, _sbc_proto_4[14], in[21]); +	MULA32(res, _sbc_proto_4[13], in[29]); +	MULA32(res, _sbc_proto_4[12], in[37]);  	t[5] = SCALE4_STAGE1(res);  	/* don't compute t[6]... this term always multiplies  	 * with cos(pi/2) = 0 */ -	MUL(res, _sbc_proto_4[6], in[7]); -	MULA(res, _sbc_proto_4[5], in[15]); -	MULA(res, _sbc_proto_4[4], in[23]); -	MULA(res, _sbc_proto_4[3], in[31]); -	MULA(res, _sbc_proto_4[2], in[39]); +	MUL32(res, _sbc_proto_4[6], in[7]); +	MULA32(res, _sbc_proto_4[5], in[15]); +	MULA32(res, _sbc_proto_4[4], in[23]); +	MULA32(res, _sbc_proto_4[3], in[31]); +	MULA32(res, _sbc_proto_4[2], in[39]);  	t[7] = SCALE4_STAGE1(res);  	MUL(s[0], _anamatrix4[0], t[0] + t[4]); @@ -800,89 +800,89 @@ static inline void _sbc_analyze_eight(const int16_t *in, int32_t *out)  	sbc_fixed_t t[8];  	sbc_extended_t s[8]; -	MUL(res,  _sbc_proto_8[0], (in[16] - in[64])); /* Q18 = Q18 * Q0 */ -	MULA(res, _sbc_proto_8[1], (in[32] - in[48])); -	MULA(res, _sbc_proto_8[2], in[4]); -	MULA(res, _sbc_proto_8[3], in[20]); -	MULA(res, _sbc_proto_8[4], in[36]); -	MULA(res, _sbc_proto_8[5], in[52]); +	MUL32(res,  _sbc_proto_8[0], (in[16] - in[64])); /* Q18 = Q18 * Q0 */ +	MULA32(res, _sbc_proto_8[1], (in[32] - in[48])); +	MULA32(res, _sbc_proto_8[2], in[4]); +	MULA32(res, _sbc_proto_8[3], in[20]); +	MULA32(res, _sbc_proto_8[4], in[36]); +	MULA32(res, _sbc_proto_8[5], in[52]);  	t[0] = SCALE8_STAGE1(res); /* Q10 */ -	MUL(res,   _sbc_proto_8[6], in[2]); -	MULA(res,  _sbc_proto_8[7], in[18]); -	MULA(res,  _sbc_proto_8[8], in[34]); -	MULA(res,  _sbc_proto_8[9], in[50]); -	MULA(res, _sbc_proto_8[10], in[66]); +	MUL32(res,   _sbc_proto_8[6], in[2]); +	MULA32(res,  _sbc_proto_8[7], in[18]); +	MULA32(res,  _sbc_proto_8[8], in[34]); +	MULA32(res,  _sbc_proto_8[9], in[50]); +	MULA32(res, _sbc_proto_8[10], in[66]);  	t[1] = SCALE8_STAGE1(res); -	MUL(res,  _sbc_proto_8[11], in[1]); -	MULA(res, _sbc_proto_8[12], in[17]); -	MULA(res, _sbc_proto_8[13], in[33]); -	MULA(res, _sbc_proto_8[14], in[49]); -	MULA(res, _sbc_proto_8[15], in[65]); -	MULA(res, _sbc_proto_8[16], in[3]); -	MULA(res, _sbc_proto_8[17], in[19]); -	MULA(res, _sbc_proto_8[18], in[35]); -	MULA(res, _sbc_proto_8[19], in[51]); -	MULA(res, _sbc_proto_8[20], in[67]); +	MUL32(res,  _sbc_proto_8[11], in[1]); +	MULA32(res, _sbc_proto_8[12], in[17]); +	MULA32(res, _sbc_proto_8[13], in[33]); +	MULA32(res, _sbc_proto_8[14], in[49]); +	MULA32(res, _sbc_proto_8[15], in[65]); +	MULA32(res, _sbc_proto_8[16], in[3]); +	MULA32(res, _sbc_proto_8[17], in[19]); +	MULA32(res, _sbc_proto_8[18], in[35]); +	MULA32(res, _sbc_proto_8[19], in[51]); +	MULA32(res, _sbc_proto_8[20], in[67]);  	t[2] = SCALE8_STAGE1(res); -	MUL(res,   _sbc_proto_8[21], in[5]); -	MULA(res,  _sbc_proto_8[22], in[21]); -	MULA(res,  _sbc_proto_8[23], in[37]); -	MULA(res,  _sbc_proto_8[24], in[53]); -	MULA(res,  _sbc_proto_8[25], in[69]); -	MULA(res, -_sbc_proto_8[15], in[15]); -	MULA(res, -_sbc_proto_8[14], in[31]); -	MULA(res, -_sbc_proto_8[13], in[47]); -	MULA(res, -_sbc_proto_8[12], in[63]); -	MULA(res, -_sbc_proto_8[11], in[79]); +	MUL32(res,   _sbc_proto_8[21], in[5]); +	MULA32(res,  _sbc_proto_8[22], in[21]); +	MULA32(res,  _sbc_proto_8[23], in[37]); +	MULA32(res,  _sbc_proto_8[24], in[53]); +	MULA32(res,  _sbc_proto_8[25], in[69]); +	MULA32(res, -_sbc_proto_8[15], in[15]); +	MULA32(res, -_sbc_proto_8[14], in[31]); +	MULA32(res, -_sbc_proto_8[13], in[47]); +	MULA32(res, -_sbc_proto_8[12], in[63]); +	MULA32(res, -_sbc_proto_8[11], in[79]);  	t[3] = SCALE8_STAGE1(res); -	MUL(res,   _sbc_proto_8[26], in[6]); -	MULA(res,  _sbc_proto_8[27], in[22]); -	MULA(res,  _sbc_proto_8[28], in[38]); -	MULA(res,  _sbc_proto_8[29], in[54]); -	MULA(res,  _sbc_proto_8[30], in[70]); -	MULA(res, -_sbc_proto_8[10], in[14]); -	MULA(res,  -_sbc_proto_8[9], in[30]); -	MULA(res,  -_sbc_proto_8[8], in[46]); -	MULA(res,  -_sbc_proto_8[7], in[62]); -	MULA(res,  -_sbc_proto_8[6], in[78]); +	MUL32(res,   _sbc_proto_8[26], in[6]); +	MULA32(res,  _sbc_proto_8[27], in[22]); +	MULA32(res,  _sbc_proto_8[28], in[38]); +	MULA32(res,  _sbc_proto_8[29], in[54]); +	MULA32(res,  _sbc_proto_8[30], in[70]); +	MULA32(res, -_sbc_proto_8[10], in[14]); +	MULA32(res,  -_sbc_proto_8[9], in[30]); +	MULA32(res,  -_sbc_proto_8[8], in[46]); +	MULA32(res,  -_sbc_proto_8[7], in[62]); +	MULA32(res,  -_sbc_proto_8[6], in[78]);  	t[4] = SCALE8_STAGE1(res); -	MUL(res,   _sbc_proto_8[31], in[7]); -	MULA(res,  _sbc_proto_8[32], in[23]); -	MULA(res,  _sbc_proto_8[33], in[39]); -	MULA(res,  _sbc_proto_8[34], in[55]); -	MULA(res,  _sbc_proto_8[35], in[71]); -	MULA(res, -_sbc_proto_8[20], in[13]); -	MULA(res, -_sbc_proto_8[19], in[29]); -	MULA(res, -_sbc_proto_8[18], in[45]); -	MULA(res, -_sbc_proto_8[17], in[61]); -	MULA(res, -_sbc_proto_8[16], in[77]); +	MUL32(res,   _sbc_proto_8[31], in[7]); +	MULA32(res,  _sbc_proto_8[32], in[23]); +	MULA32(res,  _sbc_proto_8[33], in[39]); +	MULA32(res,  _sbc_proto_8[34], in[55]); +	MULA32(res,  _sbc_proto_8[35], in[71]); +	MULA32(res, -_sbc_proto_8[20], in[13]); +	MULA32(res, -_sbc_proto_8[19], in[29]); +	MULA32(res, -_sbc_proto_8[18], in[45]); +	MULA32(res, -_sbc_proto_8[17], in[61]); +	MULA32(res, -_sbc_proto_8[16], in[77]);  	t[5] = SCALE8_STAGE1(res);  	MUL(res,   _sbc_proto_8[36], in[8] + in[72]);  	MULA(res,  _sbc_proto_8[37], in[24] + in[56]); -	MULA(res,  _sbc_proto_8[38], in[40]); -	MULA(res, -_sbc_proto_8[39], in[12]); -	MULA(res,  -_sbc_proto_8[5], in[28]); -	MULA(res,  -_sbc_proto_8[4], in[44]); -	MULA(res,  -_sbc_proto_8[3], in[60]); -	MULA(res,  -_sbc_proto_8[2], in[76]); +	MULA32(res,  _sbc_proto_8[38], in[40]); +	MULA32(res, -_sbc_proto_8[39], in[12]); +	MULA32(res,  -_sbc_proto_8[5], in[28]); +	MULA32(res,  -_sbc_proto_8[4], in[44]); +	MULA32(res,  -_sbc_proto_8[3], in[60]); +	MULA32(res,  -_sbc_proto_8[2], in[76]);  	t[6] = SCALE8_STAGE1(res); -	MUL(res,   _sbc_proto_8[35], in[9]); -	MULA(res,  _sbc_proto_8[34], in[25]); -	MULA(res,  _sbc_proto_8[33], in[41]); -	MULA(res,  _sbc_proto_8[32], in[57]); -	MULA(res,  _sbc_proto_8[31], in[73]); -	MULA(res, -_sbc_proto_8[25], in[11]); -	MULA(res, -_sbc_proto_8[24], in[27]); -	MULA(res, -_sbc_proto_8[23], in[43]); -	MULA(res, -_sbc_proto_8[22], in[59]); -	MULA(res, -_sbc_proto_8[21], in[75]); +	MUL32(res,   _sbc_proto_8[35], in[9]); +	MULA32(res,  _sbc_proto_8[34], in[25]); +	MULA32(res,  _sbc_proto_8[33], in[41]); +	MULA32(res,  _sbc_proto_8[32], in[57]); +	MULA32(res,  _sbc_proto_8[31], in[73]); +	MULA32(res, -_sbc_proto_8[25], in[11]); +	MULA32(res, -_sbc_proto_8[24], in[27]); +	MULA32(res, -_sbc_proto_8[23], in[43]); +	MULA32(res, -_sbc_proto_8[22], in[59]); +	MULA32(res, -_sbc_proto_8[21], in[75]);  	t[7] = SCALE8_STAGE1(res);  	MUL(s[0], _anamatrix8[0], t[0]); /* = Q14 * Q10 */ diff --git a/sbc/sbc_math.h b/sbc/sbc_math.h index 5aeddac1..c8c72c75 100644 --- a/sbc/sbc_math.h +++ b/sbc/sbc_math.h @@ -64,6 +64,8 @@ typedef long long sbc_extended_t;  #define SBC_FIXED_0(val) { val = 0; }  #define ADD(dst, src)    { dst += src; }  #define SUB(dst, src)    { dst -= src; } +#define MUL32(dst, a, b)   { dst = (sbc_fixed_t) (a) * (b); } +#define MULA32(dst, a, b)  { dst += (sbc_fixed_t) (a) * (b); }  #define MUL(dst, a, b)   { dst = (sbc_extended_t) (a) * (b); }  #define MULA(dst, a, b)  { dst += (sbc_extended_t) (a) * (b); }  #define DIV2(dst, src)   { dst = ASR(src, 1); } | 
