/*
 * Copyright (c) 2012
 *      MIPS Technologies, Inc., California.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * Author:  Nedeljko Babic (nbabic@mips.com)
 *
 * LSP routines for ACELP-based codecs optimized for MIPS
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * Reference: libavcodec/lsp.c
 */
#ifndef AVCODEC_MIPS_LSP_MIPS_H
#define AVCODEC_MIPS_LSP_MIPS_H

#if HAVE_MIPSFPU && HAVE_INLINE_ASM
#include "libavutil/mips/asmdefs.h"

static av_always_inline void ff_lsp2polyf_mips(const double *lsp, double *f, int lp_half_order)
{
    int i, j = 0;
    double * p_fi = f;
    double * p_f = 0;

    f[0] = 1.0;
    f[1] = -2 * lsp[0];
    lsp -= 2;

    for(i=2; i<=lp_half_order; i++)
    {
        double tmp, f_j_2, f_j_1, f_j;
        double val = lsp[2*i];

        __asm__ volatile(
            "move   %[p_f],     %[p_fi]                         \n\t"
            "add.d  %[val],     %[val],     %[val]              \n\t"
            PTR_ADDIU "%[p_fi], 8                               \n\t"
            "ldc1   %[f_j_1],   0(%[p_f])                       \n\t"
            "ldc1   %[f_j],     8(%[p_f])                       \n\t"
            "neg.d  %[val],     %[val]                          \n\t"
            "add.d  %[tmp],     %[f_j_1],   %[f_j_1]            \n\t"
            "madd.d %[tmp],     %[tmp],     %[f_j], %[val]      \n\t"
            "addiu  %[j],       %[i], -2                        \n\t"
            "ldc1   %[f_j_2],   -8(%[p_f])                      \n\t"
            "sdc1   %[tmp],     16(%[p_f])                      \n\t"
            "beqz   %[j],       ff_lsp2polyf_lp_j_end%=         \n\t"
            "ff_lsp2polyf_lp_j%=:                               \n\t"
            "add.d  %[tmp],     %[f_j],     %[f_j_2]            \n\t"
            "madd.d %[tmp],     %[tmp],     %[f_j_1], %[val]    \n\t"
            "mov.d  %[f_j],     %[f_j_1]                        \n\t"
            "addiu  %[j],       -1                              \n\t"
            "mov.d  %[f_j_1],   %[f_j_2]                        \n\t"
            "ldc1   %[f_j_2],   -16(%[p_f])                     \n\t"
            "sdc1   %[tmp],     8(%[p_f])                       \n\t"
            PTR_ADDIU "%[p_f], -8                              \n\t"
            "bgtz   %[j],       ff_lsp2polyf_lp_j%=             \n\t"
            "ff_lsp2polyf_lp_j_end%=:                           \n\t"

            : [f_j_2]"=&f"(f_j_2), [f_j_1]"=&f"(f_j_1), [val]"+f"(val),
              [tmp]"=&f"(tmp), [f_j]"=&f"(f_j), [p_f]"+r"(p_f),
              [j]"+r"(j), [p_fi]"+r"(p_fi)
            : [i]"r"(i)
            : "memory"
        );
        f[1] += val;
    }
}
#define ff_lsp2polyf ff_lsp2polyf_mips
#endif /* HAVE_MIPSFPU && HAVE_INLINE_ASM */
#endif /* AVCODEC_MIPS_LSP_MIPS_H */
