summaryrefslogtreecommitdiff
path: root/celt/arm
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2013-05-22 23:05:07 +0200
committerTimothy B. Terriberry <tterribe@xiph.org>2013-05-22 15:33:22 -0700
commit70485d895487563b0558ff5c7e52fd2f3d4ee2ef (patch)
tree0f1fd33825f2a7cbf4a5c4a05099793a339007a7 /celt/arm
parent85ede2c6aa066da29fce5186394f46927358be3b (diff)
downloadopus-70485d895487563b0558ff5c7e52fd2f3d4ee2ef.tar.gz
Faster MULT32_32_Q31 for ARM.
Uses a C implementation with a 32*32 => 64 multiplication, which ARM has. Speeds up decoding of a 64 kbps test file by 0.5MHz on an ARM7TDMI and 1.0MHz on an ARM9TDMI. 0.2% speedup on a 96 kbps enc+dec test on a Cortex A8. Signed-off-by: Timothy B. Terriberry <tterribe@xiph.org>
Diffstat (limited to 'celt/arm')
-rw-r--r--celt/arm/fixed_armv4.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/celt/arm/fixed_armv4.h b/celt/arm/fixed_armv4.h
index 73e4f434..bcacc343 100644
--- a/celt/arm/fixed_armv4.h
+++ b/celt/arm/fixed_armv4.h
@@ -68,4 +68,9 @@ static inline opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b)
#undef MAC16_32_Q15
#define MAC16_32_Q15(c, a, b) ADD32(c, MULT16_32_Q15(a, b))
+
+/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */
+#undef MULT32_32_Q31
+#define MULT32_32_Q31(a,b) (opus_val32)((((opus_int64)(a)) * ((opus_int64)(b)))>>31)
+
#endif