When working on evaluating x264 performance, I notice the best LMUL for such case with -march=rv64gcv is LMUL = 2
LMUL = 1: x264_pixel_8x8: add a4,a1,a2 addi a6,a0,16 vsetivli zero,4,e8,mf4,ta,ma add a5,a4,a2 vle8.v v12,0(a6) vle8.v v2,0(a4) addi a6,a0,4 addi a4,a4,4 vle8.v v11,0(a6) vle8.v v9,0(a4) addi a6,a1,4 addi a4,a0,32 vle8.v v13,0(a0) vle8.v v1,0(a1) vle8.v v4,0(a6) vle8.v v8,0(a4) vle8.v v7,0(a5) vwsubu.vv v3,v13,v1 add a3,a5,a2 addi a6,a0,20 addi a4,a0,36 vle8.v v10,0(a6) vle8.v v6,0(a4) addi a5,a5,4 vle8.v v5,0(a5) vsetvli zero,zero,e16,mf2,ta,mu vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v1,v12,v2 vsetvli zero,zero,e16,mf2,ta,mu vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vmv1r.v v2,v1 vwadd.vv v1,v3,v2 vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v2,v11,v4 vsetvli zero,zero,e16,mf2,ta,mu vmslt.vi v0,v2,0 vneg.v v2,v2,v0.t vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v3,v10,v9 vsetvli zero,zero,e16,mf2,ta,mu vmv1r.v v4,v2 vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.vv v2,v4,v3 vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v3,v8,v7 vsetvli zero,zero,e16,mf2,ta,mu add a4,a3,a2 vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.wv v1,v1,v3 vsetvli zero,zero,e8,mf4,ta,ma add a5,a4,a2 vwsubu.vv v3,v6,v5 addi a6,a0,48 vsetvli zero,zero,e16,mf2,ta,mu vle8.v v16,0(a3) vle8.v v12,0(a4) addi a3,a3,4 addi a4,a4,4 vle8.v v17,0(a6) vle8.v v14,0(a3) vle8.v v10,0(a4) vle8.v v8,0(a5) add a6,a5,a2 addi a3,a0,64 addi a4,a0,80 addi a5,a5,4 vle8.v v13,0(a3) vle8.v v4,0(a5) vle8.v v9,0(a4) vle8.v v6,0(a6) vmslt.vi v0,v3,0 addi a7,a0,52 vneg.v v3,v3,v0.t vle8.v v15,0(a7) vwadd.wv v2,v2,v3 addi a3,a0,68 addi a4,a0,84 vle8.v v11,0(a3) vle8.v v5,0(a4) addi a5,a0,96 vle8.v v7,0(a5) vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v3,v17,v16 vsetvli zero,zero,e16,mf2,ta,mu vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.wv v1,v1,v3 vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v3,v15,v14 vsetvli zero,zero,e16,mf2,ta,mu vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.wv v2,v2,v3 vsetvli zero,zero,e8,mf4,ta,ma vwsubu.vv v3,v13,v12 vsetvli zero,zero,e16,mf2,ta,mu slli a4,a2,3 vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.wv v1,v1,v3 vsetvli zero,zero,e8,mf4,ta,ma sub a4,a4,a2 vwsubu.vv v3,v11,v10 vsetvli zero,zero,e16,mf2,ta,mu add a1,a1,a4 vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.wv v2,v2,v3 vsetvli zero,zero,e8,mf4,ta,ma lbu a7,0(a1) vwsubu.vv v3,v9,v8 lbu a5,112(a0) vsetvli zero,zero,e16,mf2,ta,mu subw a5,a5,a7 vmslt.vi v0,v3,0 lbu a3,113(a0) vneg.v v3,v3,v0.t lbu a4,1(a1) vwadd.wv v1,v1,v3 addi a6,a6,4 vsetvli zero,zero,e8,mf4,ta,ma subw a3,a3,a4 vwsubu.vv v3,v5,v4 addi a2,a0,100 vsetvli zero,zero,e16,mf2,ta,mu vle8.v v4,0(a6) sraiw a6,a5,31 vle8.v v5,0(a2) sraiw a7,a3,31 vmslt.vi v0,v3,0 xor a2,a5,a6 vneg.v v3,v3,v0.t vwadd.wv v2,v2,v3 vsetvli zero,zero,e8,mf4,ta,ma lbu a4,114(a0) vwsubu.vv v3,v7,v6 lbu t1,2(a1) vsetvli zero,zero,e16,mf2,ta,mu subw a2,a2,a6 xor a6,a3,a7 vmslt.vi v0,v3,0 subw a4,a4,t1 vneg.v v3,v3,v0.t lbu t1,3(a1) vwadd.wv v1,v1,v3 lbu a5,115(a0) subw a6,a6,a7 vsetvli zero,zero,e8,mf4,ta,ma li a7,0 vwsubu.vv v3,v5,v4 sraiw t3,a4,31 vsetvli zero,zero,e16,mf2,ta,mu subw a5,a5,t1 vmslt.vi v0,v3,0 vneg.v v3,v3,v0.t vwadd.wv v2,v2,v3 sraiw t1,a5,31 vsetvli zero,zero,e32,m1,ta,ma xor a4,a4,t3 vadd.vv v1,v1,v2 vmv.s.x v2,a7 vredsum.vs v1,v1,v2 vmv.x.s a7,v1 addw a2,a7,a2 subw a4,a4,t3 addw a6,a6,a2 xor a2,a5,t1 lbu a3,116(a0) lbu t4,4(a1) addw a4,a4,a6 subw a2,a2,t1 lbu a5,5(a1) subw a3,a3,t4 addw a2,a2,a4 lbu a4,117(a0) lbu t1,6(a1) sraiw a7,a3,31 subw a4,a4,a5 lbu a5,118(a0) sraiw a6,a4,31 subw a5,a5,t1 xor a3,a3,a7 lbu t1,7(a1) lbu a0,119(a0) sraiw a1,a5,31 subw a0,a0,t1 subw a3,a3,a7 xor a4,a4,a6 addw a3,a3,a2 subw a4,a4,a6 sraiw a2,a0,31 xor a5,a5,a1 addw a4,a4,a3 subw a5,a5,a1 xor a0,a0,a2 addw a5,a5,a4 subw a0,a0,a2 addw a0,a0,a5 ret LMUL = dynamic x264_pixel_8x8: add a7,a1,a2 vsetivli zero,8,e8,mf2,ta,ma add a6,a7,a2 vle8.v v1,0(a1) add a3,a6,a2 vle8.v v2,0(a7) add a4,a3,a2 vle8.v v13,0(a0) vle8.v v7,0(a4) vwsubu.vv v4,v13,v1 vle8.v v11,0(a6) vle8.v v9,0(a3) add a5,a4,a2 addi t1,a0,16 vle8.v v5,0(a5) vle8.v v3,0(t1) addi a7,a0,32 addi a6,a0,48 vle8.v v12,0(a7) vle8.v v10,0(a6) addi a3,a0,64 addi a4,a0,80 vle8.v v8,0(a3) vle8.v v6,0(a4) vsetvli zero,zero,e16,m1,ta,mu vmslt.vi v0,v4,0 vneg.v v4,v4,v0.t vsetvli zero,zero,e8,mf2,ta,ma vwsubu.vv v1,v3,v2 vsetvli zero,zero,e16,m1,ta,mu vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vwadd.vv v2,v4,v1 vsetvli zero,zero,e8,mf2,ta,ma vwsubu.vv v1,v12,v11 vsetvli zero,zero,e16,m1,ta,mu vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vwadd.wv v2,v2,v1 vsetvli zero,zero,e8,mf2,ta,ma vwsubu.vv v1,v10,v9 vsetvli zero,zero,e16,m1,ta,mu vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vwadd.wv v2,v2,v1 vsetvli zero,zero,e8,mf2,ta,ma vwsubu.vv v1,v8,v7 vsetvli zero,zero,e16,m1,ta,mu slli a4,a2,3 vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vwadd.wv v2,v2,v1 vsetvli zero,zero,e8,mf2,ta,ma sub a4,a4,a2 vwsubu.vv v1,v6,v5 vsetvli zero,zero,e16,m1,ta,mu addi a3,a0,96 vmslt.vi v0,v1,0 vle8.v v7,0(a3) vneg.v v1,v1,v0.t add a5,a5,a2 vwadd.wv v2,v2,v1 vle8.v v6,0(a5) addi a0,a0,112 add a1,a1,a4 vle8.v v5,0(a0) vle8.v v4,0(a1) vsetvli zero,zero,e8,mf2,ta,ma vwsubu.vv v1,v7,v6 vsetvli zero,zero,e16,m1,ta,mu vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vwadd.wv v2,v2,v1 vsetvli zero,zero,e32,m2,ta,ma li a5,0 vmv.s.x v1,a5 vredsum.vs v1,v2,v1 vmv.x.s a0,v1 vsetvli zero,zero,e8,mf2,ta,ma vwsubu.vv v1,v5,v4 vsetvli zero,zero,e16,m1,ta,mu vmslt.vi v0,v1,0 vneg.v v1,v1,v0.t vsetivli zero,1,e32,m1,ta,ma vmv.s.x v2,a5 vsetivli zero,8,e16,m1,ta,ma vwredsumu.vs v1,v1,v2 vsetivli zero,0,e32,m1,ta,ma vmv.x.s a5,v1 addw a0,a0,a5 ret I notice we have much better codegen and performance improvement gain with --param=riscv-autovec-lmul=dynamic which is able to pick the best LMUL (M2). Add test avoid future somebody potential destroy performance on X264. gcc/testsuite/ChangeLog: * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-7.c: New test. --- .../costmodel/riscv/rvv/dynamic-lmul2-7.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-7.c diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-7.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-7.c new file mode 100644 index 00000000000..87e963edc47 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-7.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize --param riscv-autovec-lmul=dynamic" } */ + +int +x264_pixel_8x8 (unsigned char *pix1, unsigned char *pix2, int i_stride_pix2) +{ + int i_sum = 0; + for (int y = 0; y < 8; y++) + { + i_sum += __builtin_abs (pix1[0] - pix2[0]); + i_sum += __builtin_abs (pix1[1] - pix2[1]); + i_sum += __builtin_abs (pix1[2] - pix2[2]); + i_sum += __builtin_abs (pix1[3] - pix2[3]); + i_sum += __builtin_abs (pix1[4] - pix2[4]); + i_sum += __builtin_abs (pix1[5] - pix2[5]); + i_sum += __builtin_abs (pix1[6] - pix2[6]); + i_sum += __builtin_abs (pix1[7] - pix2[7]); + pix1 += 16; + pix2 += i_stride_pix2; + } + return i_sum; +} + +/* { dg-final { scan-assembler {e32,m2} } } */ -- 2.36.3