diff --git a/kernel/riscv64/gemv_n_vector.c b/kernel/riscv64/gemv_n_vector.c index 4e4f63493c..48eb4e2d68 100644 --- a/kernel/riscv64/gemv_n_vector.c +++ b/kernel/riscv64/gemv_n_vector.c @@ -26,230 +26,67 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ #include "common.h" + #if !defined(DOUBLE) -#define VSETVL(n) RISCV_RVV(vsetvl_e32m8)(n) -#define FLOAT_V_T vfloat32m8_t -#define VLEV_FLOAT RISCV_RVV(vle32_v_f32m8) -#define VLSEV_FLOAT RISCV_RVV(vlse32_v_f32m8) -#define VSEV_FLOAT RISCV_RVV(vse32_v_f32m8) -#define VSSEV_FLOAT RISCV_RVV(vsse32_v_f32m8) -#define VFMACCVF_FLOAT RISCV_RVV(vfmacc_vf_f32m8) -#define VFMUL_VF_FLOAT RISCV_RVV(vfmul_vf_f32m8) -#define VREINTERPRET_FLOAT RISCV_RVV(vreinterpret_v_i32m8_f32m8) -#define VFILL_INT RISCV_RVV(vmv_v_x_i32m8) +#define VSETVL(n) RISCV_RVV(vsetvl_e32m8)(n) +#define FLOAT_V_T vfloat32m8_t +#define VLEV_FLOAT RISCV_RVV(vle32_v_f32m8) +#define VLSEV_FLOAT RISCV_RVV(vlse32_v_f32m8) +#define VSEV_FLOAT RISCV_RVV(vse32_v_f32m8) +#define VSSEV_FLOAT RISCV_RVV(vsse32_v_f32m8) +#define VFMACCVF_FLOAT RISCV_RVV(vfmacc_vf_f32m8) #else -#define VSETVL(n) RISCV_RVV(vsetvl_e64m4)(n) -#define FLOAT_V_T vfloat64m4_t -#define VLEV_FLOAT RISCV_RVV(vle64_v_f64m4) -#define VLSEV_FLOAT RISCV_RVV(vlse64_v_f64m4) -#define VSEV_FLOAT RISCV_RVV(vse64_v_f64m4) -#define VSSEV_FLOAT RISCV_RVV(vsse64_v_f64m4) -#define VFMACCVF_FLOAT RISCV_RVV(vfmacc_vf_f64m4) -#define VFMUL_VF_FLOAT RISCV_RVV(vfmul_vf_f64m4) -#define VREINTERPRET_FLOAT RISCV_RVV(vreinterpret_v_i64m4_f64m4) -#define VFILL_INT RISCV_RVV(vmv_v_x_i64m4) +#define VSETVL(n) RISCV_RVV(vsetvl_e64m8)(n) +#define FLOAT_V_T vfloat64m8_t +#define VLEV_FLOAT RISCV_RVV(vle64_v_f64m8) +#define VLSEV_FLOAT RISCV_RVV(vlse64_v_f64m8) +#define VSEV_FLOAT RISCV_RVV(vse64_v_f64m8) +#define VSSEV_FLOAT RISCV_RVV(vsse64_v_f64m8) +#define VFMACCVF_FLOAT RISCV_RVV(vfmacc_vf_f64m8) #endif int CNAME(BLASLONG m, BLASLONG n, BLASLONG dummy1, FLOAT alpha, FLOAT *a, BLASLONG lda, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y, FLOAT *buffer) { - BLASLONG i = 0, j = 0, k = 0; - BLASLONG ix = 0, iy = 0; - - if(n < 0) return(0); - FLOAT *a_ptr = a; - FLOAT temp[4]; - FLOAT_V_T va0, va1, vy0, vy1,vy0_temp, vy1_temp ,va0_0 , va0_1 , va1_0 ,va1_1 ,va2_0 ,va2_1 ,va3_0 ,va3_1 ; - unsigned int gvl = 0; - if(inc_y == 1 && inc_x == 1){ - gvl = VSETVL(m); - if(gvl <= m/2){ - for(k=0,j=0; k 0; i -= vl) { + vl = VSETVL(i); + vy = VLEV_FLOAT(y_ptr, vl); + va = VLEV_FLOAT(a_ptr, vl); + vy = VFMACCVF_FLOAT(vy, temp, va, vl); + VSEV_FLOAT(y_ptr, vy, vl); + y_ptr += vl; + a_ptr += vl; } - VSEV_FLOAT(&y[j], vy0, gvl); - j += gvl; + x += inc_x; + a += lda; } - }else{ + } else { BLASLONG stride_y = inc_y * sizeof(FLOAT); - gvl = VSETVL(m); - if(gvl <= m/2){ - BLASLONG inc_yv = inc_y * gvl; - for(k=0,j=0; k 0; i -= vl) { + vl = VSETVL(i); + vy = VLSEV_FLOAT(y_ptr, stride_y, vl); + va = VLEV_FLOAT(a_ptr, vl); + vy = VFMACCVF_FLOAT(vy, temp, va, vl); + VSSEV_FLOAT(y_ptr, stride_y, vy, vl); + y_ptr += vl * inc_y; + a_ptr += vl; } - VSSEV_FLOAT(&y[j*inc_y], stride_y, vy0, gvl); - j += gvl; + x += inc_x; + a += lda; } } return(0);