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