cannam@154: /* Copyright (c) 2010 Xiph.Org Foundation cannam@154: * Copyright (c) 2013 Parrot */ cannam@154: /* cannam@154: Redistribution and use in source and binary forms, with or without cannam@154: modification, are permitted provided that the following conditions cannam@154: are met: cannam@154: cannam@154: - Redistributions of source code must retain the above copyright cannam@154: notice, this list of conditions and the following disclaimer. cannam@154: cannam@154: - Redistributions in binary form must reproduce the above copyright cannam@154: notice, this list of conditions and the following disclaimer in the cannam@154: documentation and/or other materials provided with the distribution. cannam@154: cannam@154: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS cannam@154: ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT cannam@154: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR cannam@154: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER cannam@154: OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, cannam@154: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, cannam@154: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR cannam@154: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF cannam@154: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING cannam@154: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS cannam@154: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cannam@154: */ cannam@154: cannam@154: #if !defined(PITCH_ARM_H) cannam@154: # define PITCH_ARM_H cannam@154: cannam@154: # include "armcpu.h" cannam@154: cannam@154: # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) cannam@154: opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N); cannam@154: void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, cannam@154: const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); cannam@154: cannam@154: # if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) cannam@154: # define OVERRIDE_CELT_INNER_PROD (1) cannam@154: # define OVERRIDE_DUAL_INNER_PROD (1) cannam@154: # define celt_inner_prod(x, y, N, arch) ((void)(arch), PRESUME_NEON(celt_inner_prod)(x, y, N)) cannam@154: # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), PRESUME_NEON(dual_inner_prod)(x, y01, y02, N, xy1, xy2)) cannam@154: # endif cannam@154: # endif cannam@154: cannam@154: # if !defined(OVERRIDE_CELT_INNER_PROD) cannam@154: # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) cannam@154: extern opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N); cannam@154: # define OVERRIDE_CELT_INNER_PROD (1) cannam@154: # define celt_inner_prod(x, y, N, arch) ((*CELT_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y, N)) cannam@154: # elif defined(OPUS_ARM_PRESUME_NEON_INTR) cannam@154: # define OVERRIDE_CELT_INNER_PROD (1) cannam@154: # define celt_inner_prod(x, y, N, arch) ((void)(arch), celt_inner_prod_neon(x, y, N)) cannam@154: # endif cannam@154: # endif cannam@154: cannam@154: # if !defined(OVERRIDE_DUAL_INNER_PROD) cannam@154: # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) cannam@154: extern void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, cannam@154: const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); cannam@154: # define OVERRIDE_DUAL_INNER_PROD (1) cannam@154: # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((*DUAL_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y01, y02, N, xy1, xy2)) cannam@154: # elif defined(OPUS_ARM_PRESUME_NEON_INTR) cannam@154: # define OVERRIDE_DUAL_INNER_PROD (1) cannam@154: # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), dual_inner_prod_neon(x, y01, y02, N, xy1, xy2)) cannam@154: # endif cannam@154: # endif cannam@154: cannam@154: # if defined(FIXED_POINT) cannam@154: cannam@154: # if defined(OPUS_ARM_MAY_HAVE_NEON) cannam@154: opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y, cannam@154: opus_val32 *xcorr, int len, int max_pitch, int arch); cannam@154: # endif cannam@154: cannam@154: # if defined(OPUS_ARM_MAY_HAVE_MEDIA) cannam@154: # define celt_pitch_xcorr_media MAY_HAVE_EDSP(celt_pitch_xcorr) cannam@154: # endif cannam@154: cannam@154: # if defined(OPUS_ARM_MAY_HAVE_EDSP) cannam@154: opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y, cannam@154: opus_val32 *xcorr, int len, int max_pitch, int arch); cannam@154: # endif cannam@154: cannam@154: # if defined(OPUS_HAVE_RTCD) && \ cannam@154: ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \ cannam@154: (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \ cannam@154: (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) cannam@154: extern opus_val32 cannam@154: (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, cannam@154: const opus_val16 *, opus_val32 *, int, int, int); cannam@154: # define OVERRIDE_PITCH_XCORR (1) cannam@154: # define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ cannam@154: ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \ cannam@154: xcorr, len, max_pitch, arch)) cannam@154: cannam@154: # elif defined(OPUS_ARM_PRESUME_EDSP) || \ cannam@154: defined(OPUS_ARM_PRESUME_MEDIA) || \ cannam@154: defined(OPUS_ARM_PRESUME_NEON) cannam@154: # define OVERRIDE_PITCH_XCORR (1) cannam@154: # define celt_pitch_xcorr (PRESUME_NEON(celt_pitch_xcorr)) cannam@154: cannam@154: # endif cannam@154: cannam@154: # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) cannam@154: void xcorr_kernel_neon_fixed( cannam@154: const opus_val16 *x, cannam@154: const opus_val16 *y, cannam@154: opus_val32 sum[4], cannam@154: int len); cannam@154: # endif cannam@154: cannam@154: # if defined(OPUS_HAVE_RTCD) && \ cannam@154: (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) cannam@154: cannam@154: extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])( cannam@154: const opus_val16 *x, cannam@154: const opus_val16 *y, cannam@154: opus_val32 sum[4], cannam@154: int len); cannam@154: cannam@154: # define OVERRIDE_XCORR_KERNEL (1) cannam@154: # define xcorr_kernel(x, y, sum, len, arch) \ cannam@154: ((*XCORR_KERNEL_IMPL[(arch) & OPUS_ARCHMASK])(x, y, sum, len)) cannam@154: cannam@154: # elif defined(OPUS_ARM_PRESUME_NEON_INTR) cannam@154: # define OVERRIDE_XCORR_KERNEL (1) cannam@154: # define xcorr_kernel(x, y, sum, len, arch) \ cannam@154: ((void)arch, xcorr_kernel_neon_fixed(x, y, sum, len)) cannam@154: cannam@154: # endif cannam@154: cannam@154: #else /* Start !FIXED_POINT */ cannam@154: /* Float case */ cannam@154: #if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) cannam@154: void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, cannam@154: opus_val32 *xcorr, int len, int max_pitch, int arch); cannam@154: #endif cannam@154: cannam@154: # if defined(OPUS_HAVE_RTCD) && \ cannam@154: (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) cannam@154: extern void cannam@154: (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, cannam@154: const opus_val16 *, opus_val32 *, int, int, int); cannam@154: cannam@154: # define OVERRIDE_PITCH_XCORR (1) cannam@154: # define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ cannam@154: ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \ cannam@154: xcorr, len, max_pitch, arch)) cannam@154: cannam@154: # elif defined(OPUS_ARM_PRESUME_NEON_INTR) cannam@154: cannam@154: # define OVERRIDE_PITCH_XCORR (1) cannam@154: # define celt_pitch_xcorr celt_pitch_xcorr_float_neon cannam@154: cannam@154: # endif cannam@154: cannam@154: #endif /* end !FIXED_POINT */ cannam@154: cannam@154: #endif