1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org/* Copyright (C) 2004 Jean-Marc Valin */
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   @file fixed_arm4.h
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   @brief ARM4 fixed-point operations
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/*
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   Redistribution and use in source and binary forms, with or without
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   modification, are permitted provided that the following conditions
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   are met:
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   - Redistributions of source code must retain the above copyright
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   notice, this list of conditions and the following disclaimer.
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   - Redistributions in binary form must reproduce the above copyright
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   notice, this list of conditions and the following disclaimer in the
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   documentation and/or other materials provided with the distribution.
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   - Neither the name of the Xiph.org Foundation nor the names of its
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   contributors may be used to endorse or promote products derived from
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   this software without specific prior written permission.
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org*/
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#ifndef FIXED_ARM4_H
369d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#define FIXED_ARM4_H
37659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MULT16_32_Q14
39ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.orgstatic inline spx_word32_t MULT16_32_Q14(spx_word16_t x, spx_word32_t y) {
40304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  int res;
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int dummy;
42dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  asm (
43dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org        "smull  %0,%1,%2,%3 \n\t"
44b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        "mov %0, %0, lsr #14 \n\t"
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        "add %0, %0, %1, lsl #18 \n\t"
46bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com   : "=&r"(res), "=&r" (dummy)
47659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   : "r"(y),"r"((int)x));
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return(res);
4971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org}
5071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MULT16_32_Q15
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int res;
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int dummy;
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  asm (
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        "smull  %0,%1,%2,%3 \n\t"
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        "mov %0, %0, lsr #15 \n\t"
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        "add %0, %0, %1, lsl #17 \n\t"
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   : "=&r"(res), "=&r" (dummy)
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   : "r"(y),"r"((int)x));
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return(res);
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DIV32_16
6578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgstatic inline short DIV32_16(int a, int b)
6678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org{
67812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org   int res=0;
6878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org   int dead1, dead2, dead3, dead4, dead5;
69812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org   __asm__ __volatile__ (
70812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org         "\teor %5, %0, %1\n"
7178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tmovs %4, %0\n"
7278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\trsbmi %0, %0, #0 \n"
7378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tmovs %4, %1\n"
7478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\trsbmi %1, %1, #0 \n"
7578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tmov %4, #1\n"
7678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
7778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tsubs %3, %0, %1, asl #14 \n"
780b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org         "\tmovpl %0, %3 \n"
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #14 \n"
808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #13 \n"
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #13 \n"
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #12 \n"
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
874acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org         "\torrpl %2, %2, %4, asl #12 \n"
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com         "\tsubs %3, %0, %1, asl #11 \n"
909d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com         "\tmovpl %0, %3 \n"
919d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com         "\torrpl %2, %2, %4, asl #11 \n"
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org         "\tsubs %3, %0, %1, asl #10 \n"
949d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com         "\tmovpl %0, %3 \n"
959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com         "\torrpl %2, %2, %4, asl #10 \n"
960b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
970b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org         "\tsubs %3, %0, %1, asl #9 \n"
980b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org         "\tmovpl %0, %3 \n"
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #9 \n"
1005d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #8 \n"
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #8 \n"
10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #7 \n"
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #7 \n"
108f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #6 \n"
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #6 \n"
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #5 \n"
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #5 \n"
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #4 \n"
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tmovpl %0, %3 \n"
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\torrpl %2, %2, %4, asl #4 \n"
1200b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
12178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tsubs %3, %0, %1, asl #3 \n"
12278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tmovpl %0, %3 \n"
1230b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org         "\torrpl %2, %2, %4, asl #3 \n"
1240b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         "\tsubs %3, %0, %1, asl #2 \n"
126f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org         "\tmovpl %0, %3 \n"
127f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org         "\torrpl %2, %2, %4, asl #2 \n"
128f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
129f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org         "\tsubs %3, %0, %1, asl #1 \n"
1307be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org         "\tmovpl %0, %3 \n"
131b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org         "\torrpl %2, %2, %4, asl #1 \n"
132b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
133659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org         "\tsubs %3, %0, %1 \n"
13478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\tmovpl %0, %3 \n"
13578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org         "\torrpl %2, %2, %4 \n"
136659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
137659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org         "\tmovs %5, %5, lsr #31 \n"
138659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org         "\trsbne %2, %2, #0 \n"
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org   : "=r" (dead1), "=r" (dead2), "=r" (res),
140659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   "=r" (dead3), "=r" (dead4), "=r" (dead5)
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org   : "0" (a), "1" (b), "2" (res)
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org   : "cc"
1437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                        );
144659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   return res;
145659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org}
146659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
147659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
148659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#endif
149659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org