1*a58d3d2aSXin Li /*Copyright (c) 2013, Xiph.Org Foundation and contributors. 2*a58d3d2aSXin Li 3*a58d3d2aSXin Li All rights reserved. 4*a58d3d2aSXin Li 5*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without 6*a58d3d2aSXin Li modification, are permitted provided that the following conditions are met: 7*a58d3d2aSXin Li 8*a58d3d2aSXin Li * Redistributions of source code must retain the above copyright notice, 9*a58d3d2aSXin Li this list of conditions and the following disclaimer. 10*a58d3d2aSXin Li * Redistributions in binary form must reproduce the above copyright notice, 11*a58d3d2aSXin Li this list of conditions and the following disclaimer in the 12*a58d3d2aSXin Li documentation and/or other materials provided with the distribution. 13*a58d3d2aSXin Li 14*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 18*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.*/ 25*a58d3d2aSXin Li 26*a58d3d2aSXin Li #ifndef KISS_FFT_ARMv4_H 27*a58d3d2aSXin Li #define KISS_FFT_ARMv4_H 28*a58d3d2aSXin Li 29*a58d3d2aSXin Li #if !defined(KISS_FFT_GUTS_H) 30*a58d3d2aSXin Li #error "This file should only be included from _kiss_fft_guts.h" 31*a58d3d2aSXin Li #endif 32*a58d3d2aSXin Li 33*a58d3d2aSXin Li #ifdef FIXED_POINT 34*a58d3d2aSXin Li 35*a58d3d2aSXin Li #undef C_MUL 36*a58d3d2aSXin Li #define C_MUL(m,a,b) \ 37*a58d3d2aSXin Li do{ \ 38*a58d3d2aSXin Li int br__; \ 39*a58d3d2aSXin Li int bi__; \ 40*a58d3d2aSXin Li int tt__; \ 41*a58d3d2aSXin Li __asm__ __volatile__( \ 42*a58d3d2aSXin Li "#C_MUL\n\t" \ 43*a58d3d2aSXin Li "ldrsh %[br], [%[bp], #0]\n\t" \ 44*a58d3d2aSXin Li "ldm %[ap], {r0,r1}\n\t" \ 45*a58d3d2aSXin Li "ldrsh %[bi], [%[bp], #2]\n\t" \ 46*a58d3d2aSXin Li "smull %[tt], %[mi], r1, %[br]\n\t" \ 47*a58d3d2aSXin Li "smlal %[tt], %[mi], r0, %[bi]\n\t" \ 48*a58d3d2aSXin Li "rsb %[bi], %[bi], #0\n\t" \ 49*a58d3d2aSXin Li "smull %[br], %[mr], r0, %[br]\n\t" \ 50*a58d3d2aSXin Li "mov %[tt], %[tt], lsr #15\n\t" \ 51*a58d3d2aSXin Li "smlal %[br], %[mr], r1, %[bi]\n\t" \ 52*a58d3d2aSXin Li "orr %[mi], %[tt], %[mi], lsl #17\n\t" \ 53*a58d3d2aSXin Li "mov %[br], %[br], lsr #15\n\t" \ 54*a58d3d2aSXin Li "orr %[mr], %[br], %[mr], lsl #17\n\t" \ 55*a58d3d2aSXin Li : [mr]"=r"((m).r), [mi]"=r"((m).i), \ 56*a58d3d2aSXin Li [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ 57*a58d3d2aSXin Li : [ap]"r"(&(a)), [bp]"r"(&(b)) \ 58*a58d3d2aSXin Li : "r0", "r1" \ 59*a58d3d2aSXin Li ); \ 60*a58d3d2aSXin Li } \ 61*a58d3d2aSXin Li while(0) 62*a58d3d2aSXin Li 63*a58d3d2aSXin Li #undef C_MUL4 64*a58d3d2aSXin Li #define C_MUL4(m,a,b) \ 65*a58d3d2aSXin Li do{ \ 66*a58d3d2aSXin Li int br__; \ 67*a58d3d2aSXin Li int bi__; \ 68*a58d3d2aSXin Li int tt__; \ 69*a58d3d2aSXin Li __asm__ __volatile__( \ 70*a58d3d2aSXin Li "#C_MUL4\n\t" \ 71*a58d3d2aSXin Li "ldrsh %[br], [%[bp], #0]\n\t" \ 72*a58d3d2aSXin Li "ldm %[ap], {r0,r1}\n\t" \ 73*a58d3d2aSXin Li "ldrsh %[bi], [%[bp], #2]\n\t" \ 74*a58d3d2aSXin Li "smull %[tt], %[mi], r1, %[br]\n\t" \ 75*a58d3d2aSXin Li "smlal %[tt], %[mi], r0, %[bi]\n\t" \ 76*a58d3d2aSXin Li "rsb %[bi], %[bi], #0\n\t" \ 77*a58d3d2aSXin Li "smull %[br], %[mr], r0, %[br]\n\t" \ 78*a58d3d2aSXin Li "mov %[tt], %[tt], lsr #17\n\t" \ 79*a58d3d2aSXin Li "smlal %[br], %[mr], r1, %[bi]\n\t" \ 80*a58d3d2aSXin Li "orr %[mi], %[tt], %[mi], lsl #15\n\t" \ 81*a58d3d2aSXin Li "mov %[br], %[br], lsr #17\n\t" \ 82*a58d3d2aSXin Li "orr %[mr], %[br], %[mr], lsl #15\n\t" \ 83*a58d3d2aSXin Li : [mr]"=r"((m).r), [mi]"=r"((m).i), \ 84*a58d3d2aSXin Li [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ 85*a58d3d2aSXin Li : [ap]"r"(&(a)), [bp]"r"(&(b)) \ 86*a58d3d2aSXin Li : "r0", "r1" \ 87*a58d3d2aSXin Li ); \ 88*a58d3d2aSXin Li } \ 89*a58d3d2aSXin Li while(0) 90*a58d3d2aSXin Li 91*a58d3d2aSXin Li #undef C_MULC 92*a58d3d2aSXin Li #define C_MULC(m,a,b) \ 93*a58d3d2aSXin Li do{ \ 94*a58d3d2aSXin Li int br__; \ 95*a58d3d2aSXin Li int bi__; \ 96*a58d3d2aSXin Li int tt__; \ 97*a58d3d2aSXin Li __asm__ __volatile__( \ 98*a58d3d2aSXin Li "#C_MULC\n\t" \ 99*a58d3d2aSXin Li "ldrsh %[br], [%[bp], #0]\n\t" \ 100*a58d3d2aSXin Li "ldm %[ap], {r0,r1}\n\t" \ 101*a58d3d2aSXin Li "ldrsh %[bi], [%[bp], #2]\n\t" \ 102*a58d3d2aSXin Li "smull %[tt], %[mr], r0, %[br]\n\t" \ 103*a58d3d2aSXin Li "smlal %[tt], %[mr], r1, %[bi]\n\t" \ 104*a58d3d2aSXin Li "rsb %[bi], %[bi], #0\n\t" \ 105*a58d3d2aSXin Li "smull %[br], %[mi], r1, %[br]\n\t" \ 106*a58d3d2aSXin Li "mov %[tt], %[tt], lsr #15\n\t" \ 107*a58d3d2aSXin Li "smlal %[br], %[mi], r0, %[bi]\n\t" \ 108*a58d3d2aSXin Li "orr %[mr], %[tt], %[mr], lsl #17\n\t" \ 109*a58d3d2aSXin Li "mov %[br], %[br], lsr #15\n\t" \ 110*a58d3d2aSXin Li "orr %[mi], %[br], %[mi], lsl #17\n\t" \ 111*a58d3d2aSXin Li : [mr]"=r"((m).r), [mi]"=r"((m).i), \ 112*a58d3d2aSXin Li [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ 113*a58d3d2aSXin Li : [ap]"r"(&(a)), [bp]"r"(&(b)) \ 114*a58d3d2aSXin Li : "r0", "r1" \ 115*a58d3d2aSXin Li ); \ 116*a58d3d2aSXin Li } \ 117*a58d3d2aSXin Li while(0) 118*a58d3d2aSXin Li 119*a58d3d2aSXin Li #endif /* FIXED_POINT */ 120*a58d3d2aSXin Li 121*a58d3d2aSXin Li #endif /* KISS_FFT_ARMv4_H */ 122