Skip to content

Commit 08bcc6e

Browse files
mskvortsovjmvalin
authored andcommitted
Optimizations for Xtensa LX7
Signed-off-by: Jean-Marc Valin <[email protected]>
1 parent a389035 commit 08bcc6e

File tree

4 files changed

+130
-0
lines changed

4 files changed

+130
-0
lines changed

silk/SigProc_FIX.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,10 @@ static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b)
635635
#include "mips/sigproc_fix_mipsr1.h"
636636
#endif
637637

638+
#ifdef OPUS_XTENSA_LX7
639+
#include "xtensa/SigProc_FIX_lx7.h"
640+
#endif
641+
638642

639643
#ifdef __cplusplus
640644
}

silk/macros.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,5 +147,9 @@ static OPUS_INLINE opus_int32 silk_CLZ32(opus_int32 in32)
147147
#include "arm/macros_arm64.h"
148148
#endif
149149

150+
#ifdef OPUS_XTENSA_LX7
151+
#include "xtensa/macros_lx7.h"
152+
#endif
153+
150154
#endif /* SILK_MACROS_H */
151155

silk/xtensa/SigProc_FIX_lx7.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/***********************************************************************
2+
Copyright (C) 2025 Xiph.Org Foundation and contributors.
3+
Redistribution and use in source and binary forms, with or without
4+
modification, are permitted provided that the following conditions
5+
are met:
6+
- Redistributions of source code must retain the above copyright notice,
7+
this list of conditions and the following disclaimer.
8+
- Redistributions in binary form must reproduce the above copyright
9+
notice, this list of conditions and the following disclaimer in the
10+
documentation and/or other materials provided with the distribution.
11+
- Neither the name of Internet Society, IETF or IETF Trust, nor the
12+
names of specific contributors, may be used to endorse or promote
13+
products derived from this software without specific prior written
14+
permission.
15+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25+
POSSIBILITY OF SUCH DAMAGE.
26+
***********************************************************************/
27+
28+
#ifndef SILK_SIGPROC_FIX_LX7_H
29+
#define SILK_SIGPROC_FIX_LX7_H
30+
31+
#undef silk_SAT16
32+
static inline short int silk_SAT16_lx7(opus_int32 a)
33+
{
34+
opus_int32 res;
35+
__asm__(
36+
"clamps %0, %1, 15\n\t"
37+
: "=r"(res)
38+
: "r"(a)
39+
);
40+
return res;
41+
}
42+
#define silk_SAT16(a) (silk_SAT16_lx7(a))
43+
44+
#endif

silk/xtensa/macros_lx7.h

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/***********************************************************************
2+
Copyright (C) 2025 Xiph.Org Foundation and contributors.
3+
Redistribution and use in source and binary forms, with or without
4+
modification, are permitted provided that the following conditions
5+
are met:
6+
- Redistributions of source code must retain the above copyright notice,
7+
this list of conditions and the following disclaimer.
8+
- Redistributions in binary form must reproduce the above copyright
9+
notice, this list of conditions and the following disclaimer in the
10+
documentation and/or other materials provided with the distribution.
11+
- Neither the name of Internet Society, IETF or IETF Trust, nor the
12+
names of specific contributors, may be used to endorse or promote
13+
products derived from this software without specific prior written
14+
permission.
15+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25+
POSSIBILITY OF SUCH DAMAGE.
26+
***********************************************************************/
27+
28+
#ifndef SILK_MACROS_LX7_H
29+
#define SILK_MACROS_LX7_H
30+
31+
/* This macro only avoids the undefined behaviour from a left shift of
32+
a negative value. It should only be used in macros that can't include
33+
SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */
34+
#define SAFE_SHL(a, b) ((opus_int32)((opus_uint32)(a) << (b)))
35+
36+
/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */
37+
#undef silk_SMULWB
38+
static OPUS_INLINE opus_int32 silk_SMULWB_lx7(opus_int32 a32, opus_int32 b32)
39+
{
40+
opus_int32 res;
41+
__asm__(
42+
"mulsh %0, %1, %2\n\t"
43+
: "=r"(res)
44+
: "r"(a32), "r"(SAFE_SHL(b32, 16))
45+
);
46+
return res;
47+
}
48+
#define silk_SMULWB(a32, b32) (silk_SMULWB_lx7(a32, b32))
49+
50+
/* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */
51+
#undef silk_SMLAWB
52+
#define silk_SMLAWB(a32, b32, c32) ((a32) + silk_SMULWB(b32, c32))
53+
54+
/* (a32 * (b32 >> 16)) >> 16 */
55+
#undef silk_SMULWT
56+
static OPUS_INLINE opus_int32 silk_SMULWT_lx7(opus_int32 a32, opus_int32 b32)
57+
{
58+
opus_int32 res;
59+
__asm__(
60+
"mulsh %0, %1, %2\n\t"
61+
: "=r"(res)
62+
: "r"(a32), "r"(SAFE_SHL(b32 >> 16, 16))
63+
);
64+
return res;
65+
}
66+
67+
/* a32 + (b32 * (c32 >> 16)) >> 16 */
68+
#undef silk_SMLAWT
69+
#define silk_SMLAWT(a32, b32, c32) ((a32) + silk_SMULWT_lx7(b32, c32))
70+
71+
#undef silk_CLZ32
72+
static OPUS_INLINE opus_int32 silk_CLZ32_lx7(opus_int32 in32)
73+
{
74+
return __builtin_clz(in32);
75+
}
76+
#define silk_CLZ32(in32) (silk_CLZ32_lx7(in32))
77+
78+
#endif

0 commit comments

Comments
 (0)