isa-l/erasure_code/riscv64/gf_vect_mul_rvv.S
lvshuo d414b2702a erasure_code: optimize RVV implementation
The ISA-L EC code has been written using RVV vector instructions and the minimum multiplication table,
resulting in a performance improvement of over 10 times compared to the existing implementation.

Signed-off-by: Shuo Lv <lv.shuo@sanechips.com.cn>
2025-07-11 15:55:57 +02:00

115 lines
3.4 KiB
ArmAsm

##################################################################
# Copyright (c) 2025 sanechips Technologies Co., Ltd.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * 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.
# * Neither the name of sanechips Corporation 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
# "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 COPYRIGHT
# OWNER OR CONTRIBUTORS 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.
########################################################################
#if HAVE_RVV
.text
.align 2
.global gf_vect_mul_rvv
.type gf_vect_mul_rvv, @function
/* Function arguments:
* a0: len - Length of vector in bytes.
* a1: gftbl - Pointer to 32-byte array of pre-calculated constants.
* a2: src - Pointer to source data array.
* a3: dest - Pointer to destination data array.
* Returns:
* a0: 0 for success, 1 for failure.
*/
/* Local variables */
#define x_pos t0
#define x_tmp t1
#define x_ptr t2
#define x_len a0
#define x_tbl a1
#define x_src a2
#define x_dest a3
/* Vector registers */
#define v_src v1
#define v_src_lo v2
#define v_src_hi v3
#define v_dest v4
#define v_tmp1_lo v5
#define v_tmp1_hi v6
#define v_gft1_lo v7
#define v_gft1_hi v8
gf_vect_mul_rvv:
/* Check if len is 32 bytes */
andi x_tmp, x_len, 0x1F
bnez x_tmp, .return_fail
vsetvli t6, x0, e8, m1
/* Load pre-calculated constants into v_gft1_lo and v_gft1_hi */
vle8.v v_gft1_lo, (x_tbl)
addi t3, x_tbl, 16
vle8.v v_gft1_hi, (t3)
/* Initialize position counter */
li x_pos, 0
.Llooprvv_vl:
/* Load source data into v_src */
add x_ptr,x_src,x_pos
vle8.v v_src, (x_ptr)
/* Split 4-bit lo and 4-bit hi */
vand.vi v_src_lo, v_src, 0x0F
vsrl.vi v_src_hi, v_src, 4
/* Table lookup (GF multiplication) */
vrgather.vv v_tmp1_lo, v_gft1_lo, v_src_lo
vrgather.vv v_tmp1_hi, v_gft1_hi, v_src_hi
/* XOR (GF addition) */
vxor.vv v_dest, v_tmp1_hi, v_tmp1_lo
/* Store result to destination */
vse8.v v_dest, (x_dest)
/* Increment position counter */
add x_pos, x_pos, t6
add x_dest, x_dest, t6
/* Check if we have processed all bytes */
blt x_pos, x_len, .Llooprvv_vl
.return_pass:
li a0, 0
ret
.return_fail:
li a0, 1
ret
#endif