summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Midgley <bmidgley@xmission.com>2008-01-27 03:35:53 +0000
committerBrad Midgley <bmidgley@xmission.com>2008-01-27 03:35:53 +0000
commitc2ce7c2d410cfb0e67c1635ebf60fc06ae864f33 (patch)
treea6286cdee4e75898fe84a4705906406a3908431e
parentc9b510105937825c04c729b4bb02b87596b795fb (diff)
get 32-bit products whenever we're sure the multiplicands are both 16 bits
-rw-r--r--sbc/sbc.c190
-rw-r--r--sbc/sbc_math.h2
2 files changed, 97 insertions, 95 deletions
diff --git a/sbc/sbc.c b/sbc/sbc.c
index cfcf6432..f83c3485 100644
--- a/sbc/sbc.c
+++ b/sbc/sbc.c
@@ -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); }