xref: /aosp_15_r20/external/speex/libspeexdsp/fixed_bfin.h (revision 28e138c64d234588b5cd2a8a403b584bd3036e4e)
1*28e138c6SAndroid Build Coastguard Worker /* Copyright (C) 2005 Analog Devices
2*28e138c6SAndroid Build Coastguard Worker    Author: Jean-Marc Valin */
3*28e138c6SAndroid Build Coastguard Worker /**
4*28e138c6SAndroid Build Coastguard Worker    @file fixed_bfin.h
5*28e138c6SAndroid Build Coastguard Worker    @brief Blackfin fixed-point operations
6*28e138c6SAndroid Build Coastguard Worker */
7*28e138c6SAndroid Build Coastguard Worker /*
8*28e138c6SAndroid Build Coastguard Worker    Redistribution and use in source and binary forms, with or without
9*28e138c6SAndroid Build Coastguard Worker    modification, are permitted provided that the following conditions
10*28e138c6SAndroid Build Coastguard Worker    are met:
11*28e138c6SAndroid Build Coastguard Worker 
12*28e138c6SAndroid Build Coastguard Worker    - Redistributions of source code must retain the above copyright
13*28e138c6SAndroid Build Coastguard Worker    notice, this list of conditions and the following disclaimer.
14*28e138c6SAndroid Build Coastguard Worker 
15*28e138c6SAndroid Build Coastguard Worker    - Redistributions in binary form must reproduce the above copyright
16*28e138c6SAndroid Build Coastguard Worker    notice, this list of conditions and the following disclaimer in the
17*28e138c6SAndroid Build Coastguard Worker    documentation and/or other materials provided with the distribution.
18*28e138c6SAndroid Build Coastguard Worker 
19*28e138c6SAndroid Build Coastguard Worker    - Neither the name of the Xiph.org Foundation nor the names of its
20*28e138c6SAndroid Build Coastguard Worker    contributors may be used to endorse or promote products derived from
21*28e138c6SAndroid Build Coastguard Worker    this software without specific prior written permission.
22*28e138c6SAndroid Build Coastguard Worker 
23*28e138c6SAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24*28e138c6SAndroid Build Coastguard Worker    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25*28e138c6SAndroid Build Coastguard Worker    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26*28e138c6SAndroid Build Coastguard Worker    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
27*28e138c6SAndroid Build Coastguard Worker    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28*28e138c6SAndroid Build Coastguard Worker    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29*28e138c6SAndroid Build Coastguard Worker    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30*28e138c6SAndroid Build Coastguard Worker    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31*28e138c6SAndroid Build Coastguard Worker    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32*28e138c6SAndroid Build Coastguard Worker    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*28e138c6SAndroid Build Coastguard Worker    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*28e138c6SAndroid Build Coastguard Worker */
35*28e138c6SAndroid Build Coastguard Worker 
36*28e138c6SAndroid Build Coastguard Worker #ifndef FIXED_BFIN_H
37*28e138c6SAndroid Build Coastguard Worker #define FIXED_BFIN_H
38*28e138c6SAndroid Build Coastguard Worker 
39*28e138c6SAndroid Build Coastguard Worker #include "bfin.h"
40*28e138c6SAndroid Build Coastguard Worker 
41*28e138c6SAndroid Build Coastguard Worker #undef PDIV32_16
PDIV32_16(spx_word32_t a,spx_word16_t b)42*28e138c6SAndroid Build Coastguard Worker static inline spx_word16_t PDIV32_16(spx_word32_t a, spx_word16_t b)
43*28e138c6SAndroid Build Coastguard Worker {
44*28e138c6SAndroid Build Coastguard Worker    spx_word32_t res, bb;
45*28e138c6SAndroid Build Coastguard Worker    bb = b;
46*28e138c6SAndroid Build Coastguard Worker    a += b>>1;
47*28e138c6SAndroid Build Coastguard Worker    __asm__  (
48*28e138c6SAndroid Build Coastguard Worker          "P0 = 15;\n\t"
49*28e138c6SAndroid Build Coastguard Worker          "R0 = %1;\n\t"
50*28e138c6SAndroid Build Coastguard Worker          "R1 = %2;\n\t"
51*28e138c6SAndroid Build Coastguard Worker          //"R0 = R0 + R1;\n\t"
52*28e138c6SAndroid Build Coastguard Worker          "R0 <<= 1;\n\t"
53*28e138c6SAndroid Build Coastguard Worker          "DIVS (R0, R1);\n\t"
54*28e138c6SAndroid Build Coastguard Worker          "LOOP divide%= LC0 = P0;\n\t"
55*28e138c6SAndroid Build Coastguard Worker          "LOOP_BEGIN divide%=;\n\t"
56*28e138c6SAndroid Build Coastguard Worker             "DIVQ (R0, R1);\n\t"
57*28e138c6SAndroid Build Coastguard Worker          "LOOP_END divide%=;\n\t"
58*28e138c6SAndroid Build Coastguard Worker          "R0 = R0.L;\n\t"
59*28e138c6SAndroid Build Coastguard Worker          "%0 = R0;\n\t"
60*28e138c6SAndroid Build Coastguard Worker    : "=m" (res)
61*28e138c6SAndroid Build Coastguard Worker    : "m" (a), "m" (bb)
62*28e138c6SAndroid Build Coastguard Worker    : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS);
63*28e138c6SAndroid Build Coastguard Worker    return res;
64*28e138c6SAndroid Build Coastguard Worker }
65*28e138c6SAndroid Build Coastguard Worker 
66*28e138c6SAndroid Build Coastguard Worker #undef DIV32_16
DIV32_16(spx_word32_t a,spx_word16_t b)67*28e138c6SAndroid Build Coastguard Worker static inline spx_word16_t DIV32_16(spx_word32_t a, spx_word16_t b)
68*28e138c6SAndroid Build Coastguard Worker {
69*28e138c6SAndroid Build Coastguard Worker    spx_word32_t res, bb;
70*28e138c6SAndroid Build Coastguard Worker    bb = b;
71*28e138c6SAndroid Build Coastguard Worker    /* Make the roundinf consistent with the C version
72*28e138c6SAndroid Build Coastguard Worker       (do we need to do that?)*/
73*28e138c6SAndroid Build Coastguard Worker    if (a<0)
74*28e138c6SAndroid Build Coastguard Worker       a += (b-1);
75*28e138c6SAndroid Build Coastguard Worker    __asm__  (
76*28e138c6SAndroid Build Coastguard Worker          "P0 = 15;\n\t"
77*28e138c6SAndroid Build Coastguard Worker          "R0 = %1;\n\t"
78*28e138c6SAndroid Build Coastguard Worker          "R1 = %2;\n\t"
79*28e138c6SAndroid Build Coastguard Worker          "R0 <<= 1;\n\t"
80*28e138c6SAndroid Build Coastguard Worker          "DIVS (R0, R1);\n\t"
81*28e138c6SAndroid Build Coastguard Worker          "LOOP divide%= LC0 = P0;\n\t"
82*28e138c6SAndroid Build Coastguard Worker          "LOOP_BEGIN divide%=;\n\t"
83*28e138c6SAndroid Build Coastguard Worker             "DIVQ (R0, R1);\n\t"
84*28e138c6SAndroid Build Coastguard Worker          "LOOP_END divide%=;\n\t"
85*28e138c6SAndroid Build Coastguard Worker          "R0 = R0.L;\n\t"
86*28e138c6SAndroid Build Coastguard Worker          "%0 = R0;\n\t"
87*28e138c6SAndroid Build Coastguard Worker    : "=m" (res)
88*28e138c6SAndroid Build Coastguard Worker    : "m" (a), "m" (bb)
89*28e138c6SAndroid Build Coastguard Worker    : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS);
90*28e138c6SAndroid Build Coastguard Worker    return res;
91*28e138c6SAndroid Build Coastguard Worker }
92*28e138c6SAndroid Build Coastguard Worker 
93*28e138c6SAndroid Build Coastguard Worker #undef MAX16
MAX16(spx_word16_t a,spx_word16_t b)94*28e138c6SAndroid Build Coastguard Worker static inline spx_word16_t MAX16(spx_word16_t a, spx_word16_t b)
95*28e138c6SAndroid Build Coastguard Worker {
96*28e138c6SAndroid Build Coastguard Worker    spx_word32_t res;
97*28e138c6SAndroid Build Coastguard Worker    __asm__  (
98*28e138c6SAndroid Build Coastguard Worker          "%1 = %1.L (X);\n\t"
99*28e138c6SAndroid Build Coastguard Worker          "%2 = %2.L (X);\n\t"
100*28e138c6SAndroid Build Coastguard Worker          "%0 = MAX(%1,%2);"
101*28e138c6SAndroid Build Coastguard Worker    : "=d" (res)
102*28e138c6SAndroid Build Coastguard Worker    : "%d" (a), "d" (b)
103*28e138c6SAndroid Build Coastguard Worker    : "ASTAT"
104*28e138c6SAndroid Build Coastguard Worker    );
105*28e138c6SAndroid Build Coastguard Worker    return res;
106*28e138c6SAndroid Build Coastguard Worker }
107*28e138c6SAndroid Build Coastguard Worker 
108*28e138c6SAndroid Build Coastguard Worker #undef MULT16_32_Q15
MULT16_32_Q15(spx_word16_t a,spx_word32_t b)109*28e138c6SAndroid Build Coastguard Worker static inline spx_word32_t MULT16_32_Q15(spx_word16_t a, spx_word32_t b)
110*28e138c6SAndroid Build Coastguard Worker {
111*28e138c6SAndroid Build Coastguard Worker    spx_word32_t res;
112*28e138c6SAndroid Build Coastguard Worker    __asm__
113*28e138c6SAndroid Build Coastguard Worker    (
114*28e138c6SAndroid Build Coastguard Worker          "A1 = %2.L*%1.L (M);\n\t"
115*28e138c6SAndroid Build Coastguard Worker          "A1 = A1 >>> 15;\n\t"
116*28e138c6SAndroid Build Coastguard Worker          "%0 = (A1 += %2.L*%1.H) ;\n\t"
117*28e138c6SAndroid Build Coastguard Worker    : "=&W" (res), "=&d" (b)
118*28e138c6SAndroid Build Coastguard Worker    : "d" (a), "1" (b)
119*28e138c6SAndroid Build Coastguard Worker    : "A1", "ASTAT"
120*28e138c6SAndroid Build Coastguard Worker    );
121*28e138c6SAndroid Build Coastguard Worker    return res;
122*28e138c6SAndroid Build Coastguard Worker }
123*28e138c6SAndroid Build Coastguard Worker 
124*28e138c6SAndroid Build Coastguard Worker #undef MAC16_32_Q15
MAC16_32_Q15(spx_word32_t c,spx_word16_t a,spx_word32_t b)125*28e138c6SAndroid Build Coastguard Worker static inline spx_word32_t MAC16_32_Q15(spx_word32_t c, spx_word16_t a, spx_word32_t b)
126*28e138c6SAndroid Build Coastguard Worker {
127*28e138c6SAndroid Build Coastguard Worker    spx_word32_t res;
128*28e138c6SAndroid Build Coastguard Worker    __asm__
129*28e138c6SAndroid Build Coastguard Worker          (
130*28e138c6SAndroid Build Coastguard Worker          "A1 = %2.L*%1.L (M);\n\t"
131*28e138c6SAndroid Build Coastguard Worker          "A1 = A1 >>> 15;\n\t"
132*28e138c6SAndroid Build Coastguard Worker          "%0 = (A1 += %2.L*%1.H);\n\t"
133*28e138c6SAndroid Build Coastguard Worker          "%0 = %0 + %4;\n\t"
134*28e138c6SAndroid Build Coastguard Worker    : "=&W" (res), "=&d" (b)
135*28e138c6SAndroid Build Coastguard Worker    : "d" (a), "1" (b), "d" (c)
136*28e138c6SAndroid Build Coastguard Worker    : "A1", "ASTAT"
137*28e138c6SAndroid Build Coastguard Worker          );
138*28e138c6SAndroid Build Coastguard Worker    return res;
139*28e138c6SAndroid Build Coastguard Worker }
140*28e138c6SAndroid Build Coastguard Worker 
141*28e138c6SAndroid Build Coastguard Worker #endif
142