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_ARMv5E_H 27*a58d3d2aSXin Li #define KISS_FFT_ARMv5E_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 #if defined(__thumb__)||defined(__thumb2__) 36*a58d3d2aSXin Li #define LDRD_CONS "Q" 37*a58d3d2aSXin Li #else 38*a58d3d2aSXin Li #define LDRD_CONS "Uq" 39*a58d3d2aSXin Li #endif 40*a58d3d2aSXin Li 41*a58d3d2aSXin Li #undef C_MUL 42*a58d3d2aSXin Li #define C_MUL(m,a,b) \ 43*a58d3d2aSXin Li do{ \ 44*a58d3d2aSXin Li int mr1__; \ 45*a58d3d2aSXin Li int mr2__; \ 46*a58d3d2aSXin Li int mi__; \ 47*a58d3d2aSXin Li long long aval__; \ 48*a58d3d2aSXin Li int bval__; \ 49*a58d3d2aSXin Li __asm__( \ 50*a58d3d2aSXin Li "#C_MUL\n\t" \ 51*a58d3d2aSXin Li "ldrd %[aval], %H[aval], %[ap]\n\t" \ 52*a58d3d2aSXin Li "ldr %[bval], %[bp]\n\t" \ 53*a58d3d2aSXin Li "smulwb %[mi], %H[aval], %[bval]\n\t" \ 54*a58d3d2aSXin Li "smulwb %[mr1], %[aval], %[bval]\n\t" \ 55*a58d3d2aSXin Li "smulwt %[mr2], %H[aval], %[bval]\n\t" \ 56*a58d3d2aSXin Li "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ 57*a58d3d2aSXin Li : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ 58*a58d3d2aSXin Li [aval]"=&r"(aval__), [bval]"=r"(bval__) \ 59*a58d3d2aSXin Li : [ap]LDRD_CONS(a), [bp]"m"(b) \ 60*a58d3d2aSXin Li ); \ 61*a58d3d2aSXin Li (m).r = SHL32(SUB32(mr1__, mr2__), 1); \ 62*a58d3d2aSXin Li (m).i = SHL32(mi__, 1); \ 63*a58d3d2aSXin Li } \ 64*a58d3d2aSXin Li while(0) 65*a58d3d2aSXin Li 66*a58d3d2aSXin Li #undef C_MUL4 67*a58d3d2aSXin Li #define C_MUL4(m,a,b) \ 68*a58d3d2aSXin Li do{ \ 69*a58d3d2aSXin Li int mr1__; \ 70*a58d3d2aSXin Li int mr2__; \ 71*a58d3d2aSXin Li int mi__; \ 72*a58d3d2aSXin Li long long aval__; \ 73*a58d3d2aSXin Li int bval__; \ 74*a58d3d2aSXin Li __asm__( \ 75*a58d3d2aSXin Li "#C_MUL4\n\t" \ 76*a58d3d2aSXin Li "ldrd %[aval], %H[aval], %[ap]\n\t" \ 77*a58d3d2aSXin Li "ldr %[bval], %[bp]\n\t" \ 78*a58d3d2aSXin Li "smulwb %[mi], %H[aval], %[bval]\n\t" \ 79*a58d3d2aSXin Li "smulwb %[mr1], %[aval], %[bval]\n\t" \ 80*a58d3d2aSXin Li "smulwt %[mr2], %H[aval], %[bval]\n\t" \ 81*a58d3d2aSXin Li "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ 82*a58d3d2aSXin Li : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ 83*a58d3d2aSXin Li [aval]"=&r"(aval__), [bval]"=r"(bval__) \ 84*a58d3d2aSXin Li : [ap]LDRD_CONS(a), [bp]"m"(b) \ 85*a58d3d2aSXin Li ); \ 86*a58d3d2aSXin Li (m).r = SHR32(SUB32(mr1__, mr2__), 1); \ 87*a58d3d2aSXin Li (m).i = SHR32(mi__, 1); \ 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 mr__; \ 95*a58d3d2aSXin Li int mi1__; \ 96*a58d3d2aSXin Li int mi2__; \ 97*a58d3d2aSXin Li long long aval__; \ 98*a58d3d2aSXin Li int bval__; \ 99*a58d3d2aSXin Li __asm__( \ 100*a58d3d2aSXin Li "#C_MULC\n\t" \ 101*a58d3d2aSXin Li "ldrd %[aval], %H[aval], %[ap]\n\t" \ 102*a58d3d2aSXin Li "ldr %[bval], %[bp]\n\t" \ 103*a58d3d2aSXin Li "smulwb %[mr], %[aval], %[bval]\n\t" \ 104*a58d3d2aSXin Li "smulwb %[mi1], %H[aval], %[bval]\n\t" \ 105*a58d3d2aSXin Li "smulwt %[mi2], %[aval], %[bval]\n\t" \ 106*a58d3d2aSXin Li "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \ 107*a58d3d2aSXin Li : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \ 108*a58d3d2aSXin Li [aval]"=&r"(aval__), [bval]"=r"(bval__) \ 109*a58d3d2aSXin Li : [ap]LDRD_CONS(a), [bp]"m"(b) \ 110*a58d3d2aSXin Li ); \ 111*a58d3d2aSXin Li (m).r = SHL32(mr__, 1); \ 112*a58d3d2aSXin Li (m).i = SHL32(SUB32(mi1__, mi2__), 1); \ 113*a58d3d2aSXin Li } \ 114*a58d3d2aSXin Li while(0) 115*a58d3d2aSXin Li 116*a58d3d2aSXin Li #endif /* FIXED_POINT */ 117*a58d3d2aSXin Li 118*a58d3d2aSXin Li #endif /* KISS_FFT_GUTS_H */ 119