annotate src/opus-1.3/celt/arm/celt_fft_ne10.c @ 168:ceec0dd9ec9c

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 07 Feb 2020 11:51:13 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /* Copyright (c) 2015 Xiph.Org Foundation
cannam@154 2 Written by Viswanath Puttagunta */
cannam@154 3 /**
cannam@154 4 @file celt_fft_ne10.c
cannam@154 5 @brief ARM Neon optimizations for fft using NE10 library
cannam@154 6 */
cannam@154 7
cannam@154 8 /*
cannam@154 9 Redistribution and use in source and binary forms, with or without
cannam@154 10 modification, are permitted provided that the following conditions
cannam@154 11 are met:
cannam@154 12
cannam@154 13 - Redistributions of source code must retain the above copyright
cannam@154 14 notice, this list of conditions and the following disclaimer.
cannam@154 15
cannam@154 16 - Redistributions in binary form must reproduce the above copyright
cannam@154 17 notice, this list of conditions and the following disclaimer in the
cannam@154 18 documentation and/or other materials provided with the distribution.
cannam@154 19
cannam@154 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@154 21 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@154 22 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@154 23 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
cannam@154 24 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@154 25 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@154 26 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@154 27 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@154 28 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@154 29 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@154 30 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@154 31 */
cannam@154 32
cannam@154 33 #ifndef SKIP_CONFIG_H
cannam@154 34 #ifdef HAVE_CONFIG_H
cannam@154 35 #include "config.h"
cannam@154 36 #endif
cannam@154 37 #endif
cannam@154 38
cannam@154 39 #include <NE10_dsp.h>
cannam@154 40 #include "os_support.h"
cannam@154 41 #include "kiss_fft.h"
cannam@154 42 #include "stack_alloc.h"
cannam@154 43
cannam@154 44 #if !defined(FIXED_POINT)
cannam@154 45 # define NE10_FFT_ALLOC_C2C_TYPE_NEON ne10_fft_alloc_c2c_float32_neon
cannam@154 46 # define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_float32_t
cannam@154 47 # define NE10_FFT_STATE_TYPE_T ne10_fft_state_float32_t
cannam@154 48 # define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_float32
cannam@154 49 # define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_float32_t
cannam@154 50 # define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_float32_neon
cannam@154 51 #else
cannam@154 52 # define NE10_FFT_ALLOC_C2C_TYPE_NEON(nfft) ne10_fft_alloc_c2c_int32_neon(nfft)
cannam@154 53 # define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_int32_t
cannam@154 54 # define NE10_FFT_STATE_TYPE_T ne10_fft_state_int32_t
cannam@154 55 # define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32
cannam@154 56 # define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32
cannam@154 57 # define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_int32_t
cannam@154 58 # define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_int32_neon
cannam@154 59 #endif
cannam@154 60
cannam@154 61 #if defined(CUSTOM_MODES)
cannam@154 62
cannam@154 63 /* nfft lengths in NE10 that support scaled fft */
cannam@154 64 # define NE10_FFTSCALED_SUPPORT_MAX 4
cannam@154 65 static const int ne10_fft_scaled_support[NE10_FFTSCALED_SUPPORT_MAX] = {
cannam@154 66 480, 240, 120, 60
cannam@154 67 };
cannam@154 68
cannam@154 69 int opus_fft_alloc_arm_neon(kiss_fft_state *st)
cannam@154 70 {
cannam@154 71 int i;
cannam@154 72 size_t memneeded = sizeof(struct arch_fft_state);
cannam@154 73
cannam@154 74 st->arch_fft = (arch_fft_state *)opus_alloc(memneeded);
cannam@154 75 if (!st->arch_fft)
cannam@154 76 return -1;
cannam@154 77
cannam@154 78 for (i = 0; i < NE10_FFTSCALED_SUPPORT_MAX; i++) {
cannam@154 79 if(st->nfft == ne10_fft_scaled_support[i])
cannam@154 80 break;
cannam@154 81 }
cannam@154 82 if (i == NE10_FFTSCALED_SUPPORT_MAX) {
cannam@154 83 /* This nfft length (scaled fft) is not supported in NE10 */
cannam@154 84 st->arch_fft->is_supported = 0;
cannam@154 85 st->arch_fft->priv = NULL;
cannam@154 86 }
cannam@154 87 else {
cannam@154 88 st->arch_fft->is_supported = 1;
cannam@154 89 st->arch_fft->priv = (void *)NE10_FFT_ALLOC_C2C_TYPE_NEON(st->nfft);
cannam@154 90 if (st->arch_fft->priv == NULL) {
cannam@154 91 return -1;
cannam@154 92 }
cannam@154 93 }
cannam@154 94 return 0;
cannam@154 95 }
cannam@154 96
cannam@154 97 void opus_fft_free_arm_neon(kiss_fft_state *st)
cannam@154 98 {
cannam@154 99 NE10_FFT_CFG_TYPE_T cfg;
cannam@154 100
cannam@154 101 if (!st->arch_fft)
cannam@154 102 return;
cannam@154 103
cannam@154 104 cfg = (NE10_FFT_CFG_TYPE_T)st->arch_fft->priv;
cannam@154 105 if (cfg)
cannam@154 106 NE10_FFT_DESTROY_C2C_TYPE(cfg);
cannam@154 107 opus_free(st->arch_fft);
cannam@154 108 }
cannam@154 109 #endif
cannam@154 110
cannam@154 111 void opus_fft_neon(const kiss_fft_state *st,
cannam@154 112 const kiss_fft_cpx *fin,
cannam@154 113 kiss_fft_cpx *fout)
cannam@154 114 {
cannam@154 115 NE10_FFT_STATE_TYPE_T state;
cannam@154 116 NE10_FFT_CFG_TYPE_T cfg = &state;
cannam@154 117 VARDECL(NE10_FFT_CPX_TYPE_T, buffer);
cannam@154 118 SAVE_STACK;
cannam@154 119 ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T);
cannam@154 120
cannam@154 121 if (!st->arch_fft->is_supported) {
cannam@154 122 /* This nfft length (scaled fft) not supported in NE10 */
cannam@154 123 opus_fft_c(st, fin, fout);
cannam@154 124 }
cannam@154 125 else {
cannam@154 126 memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T));
cannam@154 127 state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0];
cannam@154 128 #if !defined(FIXED_POINT)
cannam@154 129 state.is_forward_scaled = 1;
cannam@154 130
cannam@154 131 NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
cannam@154 132 (NE10_FFT_CPX_TYPE_T *)fin,
cannam@154 133 cfg, 0);
cannam@154 134 #else
cannam@154 135 NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
cannam@154 136 (NE10_FFT_CPX_TYPE_T *)fin,
cannam@154 137 cfg, 0, 1);
cannam@154 138 #endif
cannam@154 139 }
cannam@154 140 RESTORE_STACK;
cannam@154 141 }
cannam@154 142
cannam@154 143 void opus_ifft_neon(const kiss_fft_state *st,
cannam@154 144 const kiss_fft_cpx *fin,
cannam@154 145 kiss_fft_cpx *fout)
cannam@154 146 {
cannam@154 147 NE10_FFT_STATE_TYPE_T state;
cannam@154 148 NE10_FFT_CFG_TYPE_T cfg = &state;
cannam@154 149 VARDECL(NE10_FFT_CPX_TYPE_T, buffer);
cannam@154 150 SAVE_STACK;
cannam@154 151 ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T);
cannam@154 152
cannam@154 153 if (!st->arch_fft->is_supported) {
cannam@154 154 /* This nfft length (scaled fft) not supported in NE10 */
cannam@154 155 opus_ifft_c(st, fin, fout);
cannam@154 156 }
cannam@154 157 else {
cannam@154 158 memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T));
cannam@154 159 state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0];
cannam@154 160 #if !defined(FIXED_POINT)
cannam@154 161 state.is_backward_scaled = 0;
cannam@154 162
cannam@154 163 NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
cannam@154 164 (NE10_FFT_CPX_TYPE_T *)fin,
cannam@154 165 cfg, 1);
cannam@154 166 #else
cannam@154 167 NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
cannam@154 168 (NE10_FFT_CPX_TYPE_T *)fin,
cannam@154 169 cfg, 1, 0);
cannam@154 170 #endif
cannam@154 171 }
cannam@154 172 RESTORE_STACK;
cannam@154 173 }