/*
 * Copyright (c) 2023 Institue of Software Chinese Academy of Sciences (ISCAS).
 *
 * 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
 */

#include "config.h"
#include "libavutil/riscv/asm.S"

func ff_ac3_exponent_min_rvv, zve32x
        beqz     a1, 3f
1:
        vsetvli  t2, a2, e8, m8, ta, ma
        vle8.v   v8, (a0)
        addi     t0, a0, 256
        sub      a2, a2, t2
        mv       t1, a1
2:
        vle8.v   v16, (t0)
        addi     t1, t1, -1
        vminu.vv v8, v8, v16
        addi     t0, t0, 256
        bnez     t1, 2b

        vse8.v   v8, (a0)
        add      a0, a0, t2
        bnez     a2, 1b
3:
        ret
endfunc

func ff_float_to_fixed24_rvv, zve32f
        li            t1, 1 << 24
        fcvt.s.w      f0, t1
1:
        vsetvli       t0, a2, e32, m8, ta, ma
        sub           a2, a2, t0
        vle32.v       v0, (a1)
        vfmul.vf      v0, v0, f0
        vfcvt.x.f.v   v0, v0
        sh2add        a1, t0, a1
        vse32.v       v0, (a0)
        sh2add        a0, t0, a0
        bnez          a2, 1b

        ret
endfunc

#if __riscv_xlen >= 64
func ff_sum_square_butterfly_int32_rvv, zve64x
        vsetvli    t0, zero, e64, m8, ta, ma
        vmv.v.x    v0, zero
        vmv.v.x    v8, zero
1:
        vsetvli    t0, a3, e32, m2, tu, ma
        vle32.v    v16, (a1)
        sub        a3, a3, t0
        vle32.v    v20, (a2)
        sh2add     a1, t0, a1
        vadd.vv    v24, v16, v20
        sh2add     a2, t0, a2
        vsub.vv    v28, v16, v20
        vwmacc.vv  v0, v16, v16
        vwmacc.vv  v4, v20, v20
        vwmacc.vv  v8, v24, v24
        vwmacc.vv  v12, v28, v28
        bnez       a3, 1b

        vsetvli    t0, zero, e64, m4, ta, ma
        vmv.s.x    v16, zero
        vmv.s.x    v17, zero
        vredsum.vs v16, v0, v16
        vmv.s.x    v18, zero
        vredsum.vs v17, v4, v17
        vmv.s.x    v19, zero
        vredsum.vs v18, v8, v18
        vmv.x.s    t0, v16
        vredsum.vs v19, v12, v19
        vmv.x.s    t1, v17
        sd         t0,   (a0)
        vmv.x.s    t2, v18
        sd         t1,  8(a0)
        vmv.x.s    t3, v19
        sd         t2, 16(a0)
        sd         t3, 24(a0)
        ret
endfunc
#endif

func ff_sum_square_butterfly_float_rvv, zve32f
        vsetvli     t0, zero, e32, m8, ta, ma
        vmv.v.x     v0, zero
        vmv.v.x     v8, zero
1:
        vsetvli     t0, a3, e32, m4, tu, ma
        vle32.v     v16, (a1)
        sub         a3, a3, t0
        vle32.v     v20, (a2)
        sh2add      a1, t0, a1
        vfadd.vv    v24, v16, v20
        sh2add      a2, t0, a2
        vfsub.vv    v28, v16, v20
        vfmacc.vv   v0, v16, v16
        vfmacc.vv   v4, v20, v20
        vfmacc.vv   v8, v24, v24
        vfmacc.vv   v12, v28, v28
        bnez        a3, 1b

        vsetvli     t0, zero, e32, m4, ta, ma
        vmv.s.x     v16, zero
        vmv.s.x     v17, zero
        vfredsum.vs v16, v0, v16
        vmv.s.x     v18, zero
        vfredsum.vs v17, v4, v17
        vmv.s.x     v19, zero
        vfredsum.vs v18, v8, v18
        vfmv.f.s    ft0, v16
        vfredsum.vs v19, v12, v19
        vfmv.f.s    ft1, v17
        fsw         ft0,   (a0)
        vfmv.f.s    ft2, v18
        fsw         ft1,  4(a0)
        vfmv.f.s    ft3, v19
        fsw         ft2,  8(a0)
        fsw         ft3, 12(a0)
        ret
endfunc
