Index: celt/arm/fixed_armv5e.h |
diff --git a/celt/arm/fixed_armv5e.h b/celt/arm/fixed_armv5e.h |
index 1194a7d3ecb61ae9ac20ec530ec2e1eacc6a519a..36a6321101357e447d299d37d2a55d751c30d909 100644 |
--- a/celt/arm/fixed_armv5e.h |
+++ b/celt/arm/fixed_armv5e.h |
@@ -82,6 +82,23 @@ static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a, |
} |
#define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_armv5e(c, a, b)) |
+/** 16x32 multiply, followed by a 16-bit shift right and 32-bit add. |
+ Result fits in 32 bits. */ |
+#undef MAC16_32_Q16 |
+static OPUS_INLINE opus_val32 MAC16_32_Q16_armv5e(opus_val32 c, opus_val16 a, |
+ opus_val32 b) |
+{ |
+ int res; |
+ __asm__( |
+ "#MAC16_32_Q16\n\t" |
+ "smlawb %0, %1, %2, %3;\n" |
+ : "=r"(res) |
+ : "r"(b), "r"(a), "r"(c) |
+ ); |
+ return res; |
+} |
+#define MAC16_32_Q16(c, a, b) (MAC16_32_Q16_armv5e(c, a, b)) |
+ |
/** 16x16 multiply-add where the result fits in 32 bits */ |
#undef MAC16_16 |
static OPUS_INLINE opus_val32 MAC16_16_armv5e(opus_val32 c, opus_val16 a, |
@@ -113,4 +130,22 @@ static OPUS_INLINE opus_val32 MULT16_16_armv5e(opus_val16 a, opus_val16 b) |
} |
#define MULT16_16(a, b) (MULT16_16_armv5e(a, b)) |
+#ifdef OPUS_ARM_INLINE_MEDIA |
+ |
+#undef SIG2WORD16 |
+static OPUS_INLINE opus_val16 SIG2WORD16_armv6(opus_val32 x) |
+{ |
+ celt_sig res; |
+ __asm__( |
+ "#SIG2WORD16\n\t" |
+ "ssat %0, #16, %1, ASR #12\n\t" |
+ : "=r"(res) |
+ : "r"(x+2048) |
+ ); |
+ return EXTRACT16(res); |
+} |
+#define SIG2WORD16(x) (SIG2WORD16_armv6(x)) |
+ |
+#endif /* OPUS_ARM_INLINE_MEDIA */ |
+ |
#endif |