diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/arm/fixed_armv5e.h')
-rw-r--r-- | lib/rbcodec/codecs/libopus/celt/arm/fixed_armv5e.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/arm/fixed_armv5e.h b/lib/rbcodec/codecs/libopus/celt/arm/fixed_armv5e.h index 1194a7d3ec..36a6321101 100644 --- a/lib/rbcodec/codecs/libopus/celt/arm/fixed_armv5e.h +++ b/lib/rbcodec/codecs/libopus/celt/arm/fixed_armv5e.h | |||
@@ -82,6 +82,23 @@ static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a, | |||
82 | } | 82 | } |
83 | #define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_armv5e(c, a, b)) | 83 | #define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_armv5e(c, a, b)) |
84 | 84 | ||
85 | /** 16x32 multiply, followed by a 16-bit shift right and 32-bit add. | ||
86 | Result fits in 32 bits. */ | ||
87 | #undef MAC16_32_Q16 | ||
88 | static OPUS_INLINE opus_val32 MAC16_32_Q16_armv5e(opus_val32 c, opus_val16 a, | ||
89 | opus_val32 b) | ||
90 | { | ||
91 | int res; | ||
92 | __asm__( | ||
93 | "#MAC16_32_Q16\n\t" | ||
94 | "smlawb %0, %1, %2, %3;\n" | ||
95 | : "=r"(res) | ||
96 | : "r"(b), "r"(a), "r"(c) | ||
97 | ); | ||
98 | return res; | ||
99 | } | ||
100 | #define MAC16_32_Q16(c, a, b) (MAC16_32_Q16_armv5e(c, a, b)) | ||
101 | |||
85 | /** 16x16 multiply-add where the result fits in 32 bits */ | 102 | /** 16x16 multiply-add where the result fits in 32 bits */ |
86 | #undef MAC16_16 | 103 | #undef MAC16_16 |
87 | static OPUS_INLINE opus_val32 MAC16_16_armv5e(opus_val32 c, opus_val16 a, | 104 | 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) | |||
113 | } | 130 | } |
114 | #define MULT16_16(a, b) (MULT16_16_armv5e(a, b)) | 131 | #define MULT16_16(a, b) (MULT16_16_armv5e(a, b)) |
115 | 132 | ||
133 | #ifdef OPUS_ARM_INLINE_MEDIA | ||
134 | |||
135 | #undef SIG2WORD16 | ||
136 | static OPUS_INLINE opus_val16 SIG2WORD16_armv6(opus_val32 x) | ||
137 | { | ||
138 | celt_sig res; | ||
139 | __asm__( | ||
140 | "#SIG2WORD16\n\t" | ||
141 | "ssat %0, #16, %1, ASR #12\n\t" | ||
142 | : "=r"(res) | ||
143 | : "r"(x+2048) | ||
144 | ); | ||
145 | return EXTRACT16(res); | ||
146 | } | ||
147 | #define SIG2WORD16(x) (SIG2WORD16_armv6(x)) | ||
148 | |||
149 | #endif /* OPUS_ARM_INLINE_MEDIA */ | ||
150 | |||
116 | #endif | 151 | #endif |