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