aboutsummaryrefslogtreecommitdiff
path: root/src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp')
-rw-r--r--src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp295
1 files changed, 155 insertions, 140 deletions
diff --git a/src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp b/src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp
index 14dd38bd25..dd33c785cf 100644
--- a/src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp
+++ b/src/core/NEON/kernels/arm_gemm/kernels/sve_native_fp16_mla_4VLx4/generic.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2019 Arm Limited.
+ * Copyright (c) 2018-2020 Arm Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -60,12 +60,23 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
break;
}
- for (int y=0; y<M; y+=4) {
+ int rows_to_compute;
+
+ for (int y=0; y<M; y+=rows_to_compute) {
const __fp16 * const a_ptr0_base = A + (y * lda);
const unsigned long ldab = lda * sizeof(__fp16);
__fp16 *c_ptr0 = C + (y * ldc);
+ rows_to_compute = M-y;
+ if (rows_to_compute > 4) {
+ if (rows_to_compute % 4) {
+ rows_to_compute = 4 - 1;
+ } else {
+ rows_to_compute = 4;
+ }
+ }
+
for (int x0=0; x0<N; x0+=(4 * get_vector_length<__fp16>())) {
const long width = std::min((unsigned long)N-x0, (4 * get_vector_length<__fp16>()));
long loops = loops_count;
@@ -78,7 +89,7 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
const unsigned long ldcb = ldc * sizeof(__fp16);
const __fp16 *biasptr = bias ? bias+x0 : nullbias;
- switch(M-y) {
+ switch(rows_to_compute) {
case 1:
__asm __volatile (
"whilelt p6.h, %[temp], %[leftovers]\n"
@@ -256,88 +267,87 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
- "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"cbz %[regs], 3f\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z19.h, z11.h, z0.h[0]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z16.h, z12.h, z0.h[1]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z17.h, z13.h, z0.h[1]\n"
- "ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z18.h, z14.h, z0.h[1]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[1]\n"
- "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z8.h, z0.h[2]\n"
- "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"fmla z17.h, z9.h, z0.h[2]\n"
- "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z18.h, z10.h, z0.h[2]\n"
- "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
+ "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z19.h, z11.h, z0.h[2]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z0.h[3]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z13.h, z0.h[3]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z14.h, z0.h[3]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[3]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z8.h, z0.h[4]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z17.h, z9.h, z0.h[4]\n"
+ "fmla z16.h, z8.h, z0.h[4]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
- "fmla z18.h, z10.h, z0.h[4]\n"
+ "fmla z17.h, z9.h, z0.h[4]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z19.h, z11.h, z0.h[4]\n"
+ "fmla z18.h, z10.h, z0.h[4]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "fmla z19.h, z11.h, z0.h[4]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z12.h, z0.h[5]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z13.h, z0.h[5]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z14.h, z0.h[5]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[5]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z8.h, z0.h[6]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z17.h, z9.h, z0.h[6]\n"
+ "fmla z16.h, z8.h, z0.h[6]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
- "fmla z18.h, z10.h, z0.h[6]\n"
+ "fmla z17.h, z9.h, z0.h[6]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z19.h, z11.h, z0.h[6]\n"
+ "fmla z18.h, z10.h, z0.h[6]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "fmla z19.h, z11.h, z0.h[6]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z12.h, z0.h[7]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z13.h, z0.h[7]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z14.h, z0.h[7]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[7]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z8.h, z4.h[0]\n"
- "ld1rqh z0.h, p6/z, [%[a_ptr0], #0x10]\n"
- "fmla z17.h, z9.h, z4.h[0]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z18.h, z10.h, z4.h[0]\n"
+ "fmla z16.h, z8.h, z4.h[0]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
- "fmla z19.h, z11.h, z4.h[0]\n"
+ "fmla z17.h, z9.h, z4.h[0]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "fmla z18.h, z10.h, z4.h[0]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
- "addvl %[a_ptr0], %[a_ptr0], #2\n"
- "fmla z16.h, z12.h, z4.h[1]\n"
+ "fmla z19.h, z11.h, z4.h[0]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
+ "fmla z16.h, z12.h, z4.h[1]\n"
+ "ld1rqh z0.h, p6/z, [%[a_ptr0], #0x10]\n"
"fmla z17.h, z13.h, z4.h[1]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z18.h, z14.h, z4.h[1]\n"
@@ -345,51 +355,52 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"fmla z19.h, z15.h, z4.h[1]\n"
"ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "addvl %[a_ptr0], %[a_ptr0], #2\n"
+ "fmla z16.h, z8.h, z4.h[2]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
+ "fmla z17.h, z9.h, z4.h[2]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z16.h, z8.h, z4.h[2]\n"
+ "fmla z18.h, z10.h, z4.h[2]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
- "fmla z17.h, z9.h, z4.h[2]\n"
+ "fmla z19.h, z11.h, z4.h[2]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z18.h, z10.h, z4.h[2]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
- "fmla z19.h, z11.h, z4.h[2]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z12.h, z4.h[3]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z17.h, z13.h, z4.h[3]\n"
+ "fmla z16.h, z12.h, z4.h[3]\n"
"ld1h z8.h, p0/z, [%[b_ptr0]]\n"
- "fmla z18.h, z14.h, z4.h[3]\n"
+ "fmla z17.h, z13.h, z4.h[3]\n"
"ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z19.h, z15.h, z4.h[3]\n"
+ "fmla z18.h, z14.h, z4.h[3]\n"
"ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "fmla z19.h, z15.h, z4.h[3]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z8.h, z4.h[4]\n"
- "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z9.h, z4.h[4]\n"
- "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z10.h, z4.h[4]\n"
- "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z11.h, z4.h[4]\n"
+ "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z12.h, z4.h[5]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z17.h, z13.h, z4.h[5]\n"
+ "fmla z16.h, z12.h, z4.h[5]\n"
"ld1h z8.h, p0/z, [%[b_ptr0]]\n"
- "fmla z18.h, z14.h, z4.h[5]\n"
+ "fmla z17.h, z13.h, z4.h[5]\n"
"ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z19.h, z15.h, z4.h[5]\n"
+ "fmla z18.h, z14.h, z4.h[5]\n"
"ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "fmla z19.h, z15.h, z4.h[5]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z8.h, z4.h[6]\n"
- "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z9.h, z4.h[6]\n"
- "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z10.h, z4.h[6]\n"
- "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z11.h, z4.h[6]\n"
+ "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z4.h[7]\n"
"fmla z17.h, z13.h, z4.h[7]\n"
@@ -474,66 +485,67 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"b 4f\n"
"3:\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z19.h, z11.h, z0.h[0]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z16.h, z12.h, z0.h[1]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z17.h, z13.h, z0.h[1]\n"
- "ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z18.h, z14.h, z0.h[1]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[1]\n"
- "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z8.h, z0.h[2]\n"
- "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"fmla z17.h, z9.h, z0.h[2]\n"
- "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z18.h, z10.h, z0.h[2]\n"
- "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
+ "ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z19.h, z11.h, z0.h[2]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z0.h[3]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z13.h, z0.h[3]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z14.h, z0.h[3]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[3]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z8.h, z0.h[4]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z17.h, z9.h, z0.h[4]\n"
+ "fmla z16.h, z8.h, z0.h[4]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
- "fmla z18.h, z10.h, z0.h[4]\n"
+ "fmla z17.h, z9.h, z0.h[4]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z19.h, z11.h, z0.h[4]\n"
+ "fmla z18.h, z10.h, z0.h[4]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "fmla z19.h, z11.h, z0.h[4]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z16.h, z12.h, z0.h[5]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z17.h, z13.h, z0.h[5]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z14.h, z0.h[5]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[5]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "fmla z16.h, z8.h, z0.h[6]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
- "fmla z17.h, z9.h, z0.h[6]\n"
+ "fmla z16.h, z8.h, z0.h[6]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
- "fmla z18.h, z10.h, z0.h[6]\n"
+ "fmla z17.h, z9.h, z0.h[6]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
- "fmla z19.h, z11.h, z0.h[6]\n"
+ "fmla z18.h, z10.h, z0.h[6]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "fmla z19.h, z11.h, z0.h[6]\n"
"ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
- "addvl %[a_ptr0], %[a_ptr0], #1\n"
"fmla z16.h, z12.h, z0.h[7]\n"
+ "addvl %[a_ptr0], %[a_ptr0], #1\n"
"fmla z17.h, z13.h, z0.h[7]\n"
"fmla z18.h, z14.h, z0.h[7]\n"
"fmla z19.h, z15.h, z0.h[7]\n"
@@ -888,21 +900,21 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"fmla z23.h, z15.h, z5.h[7]\n"
"b.ne 2b\n"
"1:\n"
- "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"cbz %[regs], 3f\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z20.h, z8.h, z1.h[0]\n"
- "ld1rqh z5.h, p7/z, [a_ptr1]\n"
+ "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z5.h, p7/z, [a_ptr1]\n"
"fmla z21.h, z9.h, z1.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z22.h, z10.h, z1.h[0]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z11.h, z0.h[0]\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z23.h, z11.h, z1.h[0]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z0.h[1]\n"
@@ -1201,19 +1213,19 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"b 4f\n"
"3:\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z20.h, z8.h, z1.h[0]\n"
- "ld1rqh z5.h, p6/z, [a_ptr1]\n"
+ "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z5.h, p6/z, [a_ptr1]\n"
"fmla z21.h, z9.h, z1.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z22.h, z10.h, z1.h[0]\n"
- "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z19.h, z11.h, z0.h[0]\n"
- "addvl %[a_ptr0], %[a_ptr0], #1\n"
+ "ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z23.h, z11.h, z1.h[0]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z0.h[1]\n"
@@ -1221,10 +1233,11 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"fmla z20.h, z12.h, z1.h[1]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"fmla z17.h, z13.h, z0.h[1]\n"
- "addvl a_ptr1, a_ptr1, #1\n"
+ "addvl %[a_ptr0], %[a_ptr0], #1\n"
"fmla z21.h, z13.h, z1.h[1]\n"
"ld1h z13.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z18.h, z14.h, z0.h[1]\n"
+ "addvl a_ptr1, a_ptr1, #1\n"
"fmla z22.h, z14.h, z1.h[1]\n"
"ld1h z14.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z19.h, z15.h, z0.h[1]\n"
@@ -1509,9 +1522,9 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"fmla z27.h, z11.h, z2.h[0]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z0.h[1]\n"
- "add a_ptr2, a_ptr2, #0x20\n"
- "fmla z20.h, z12.h, z1.h[1]\n"
"add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "fmla z20.h, z12.h, z1.h[1]\n"
+ "add a_ptr2, a_ptr2, #0x20\n"
"fmla z24.h, z12.h, z2.h[1]\n"
"ld1h z12.h, p0/z, [%[b_ptr0]]\n"
"fmla z17.h, z13.h, z0.h[1]\n"
@@ -1768,21 +1781,21 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"fmla z27.h, z15.h, z6.h[7]\n"
"b.ne 2b\n"
"1:\n"
- "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"cbz %[regs], 3f\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z20.h, z8.h, z1.h[0]\n"
- "ld1rqh z5.h, p7/z, [a_ptr1]\n"
+ "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
"fmla z24.h, z8.h, z2.h[0]\n"
- "ld1rqh z6.h, p7/z, [a_ptr2]\n"
+ "ld1rqh z5.h, p7/z, [a_ptr1]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z6.h, p7/z, [a_ptr2]\n"
"fmla z21.h, z9.h, z1.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z25.h, z9.h, z2.h[0]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z22.h, z10.h, z1.h[0]\n"
"fmla z26.h, z10.h, z2.h[0]\n"
"ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
@@ -2176,26 +2189,27 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"b 4f\n"
"3:\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z20.h, z8.h, z1.h[0]\n"
- "ld1rqh z5.h, p6/z, [a_ptr1]\n"
+ "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
"fmla z24.h, z8.h, z2.h[0]\n"
- "ld1rqh z6.h, p6/z, [a_ptr2]\n"
+ "ld1rqh z5.h, p6/z, [a_ptr1]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z6.h, p6/z, [a_ptr2]\n"
"fmla z21.h, z9.h, z1.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z25.h, z9.h, z2.h[0]\n"
- "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
- "addvl %[a_ptr0], %[a_ptr0], #1\n"
+ "ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z22.h, z10.h, z1.h[0]\n"
- "addvl a_ptr1, a_ptr1, #1\n"
+ "addvl %[a_ptr0], %[a_ptr0], #1\n"
"fmla z26.h, z10.h, z2.h[0]\n"
"ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z19.h, z11.h, z0.h[0]\n"
- "addvl a_ptr2, a_ptr2, #1\n"
+ "addvl a_ptr1, a_ptr1, #1\n"
"fmla z23.h, z11.h, z1.h[0]\n"
+ "addvl a_ptr2, a_ptr2, #1\n"
"fmla z27.h, z11.h, z2.h[0]\n"
"ld1h z11.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z16.h, z12.h, z0.h[1]\n"
@@ -2897,21 +2911,21 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"fmla z31.h, z15.h, z7.h[7]\n"
"b.ne 2b\n"
"1:\n"
- "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"cbz %[regs], 3f\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z20.h, z8.h, z1.h[0]\n"
- "ld1rqh z5.h, p7/z, [a_ptr1]\n"
+ "ld1rqh z4.h, p7/z, [%[a_ptr0]]\n"
"fmla z24.h, z8.h, z2.h[0]\n"
- "ld1rqh z6.h, p7/z, [a_ptr2]\n"
+ "ld1rqh z5.h, p7/z, [a_ptr1]\n"
"fmla z28.h, z8.h, z3.h[0]\n"
- "ld1rqh z7.h, p7/z, [a_ptr3]\n"
+ "ld1rqh z6.h, p7/z, [a_ptr2]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z7.h, p7/z, [a_ptr3]\n"
"fmla z21.h, z9.h, z1.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z25.h, z9.h, z2.h[0]\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z29.h, z9.h, z3.h[0]\n"
"ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
@@ -3400,30 +3414,31 @@ void sve_native_fp16_mla_4VLx4(const __fp16 *A, int lda, const __fp16 *B, int ld
"b 4f\n"
"3:\n"
"fmla z16.h, z8.h, z0.h[0]\n"
- "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
+ "ld1h z15.h, p3/z, [%[b_ptr0], #3, MUL VL]\n"
"fmla z20.h, z8.h, z1.h[0]\n"
- "ld1rqh z5.h, p6/z, [a_ptr1]\n"
+ "ld1rqh z4.h, p6/z, [%[a_ptr0]]\n"
"fmla z24.h, z8.h, z2.h[0]\n"
- "ld1rqh z6.h, p6/z, [a_ptr2]\n"
+ "ld1rqh z5.h, p6/z, [a_ptr1]\n"
"fmla z28.h, z8.h, z3.h[0]\n"
- "ld1rqh z7.h, p6/z, [a_ptr3]\n"
+ "ld1rqh z6.h, p6/z, [a_ptr2]\n"
"fmla z17.h, z9.h, z0.h[0]\n"
- "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
+ "ld1rqh z7.h, p6/z, [a_ptr3]\n"
"fmla z21.h, z9.h, z1.h[0]\n"
- "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
+ "add %[b_ptr0], %[b_ptr0], %[ldb]\n"
"fmla z25.h, z9.h, z2.h[0]\n"
- "addvl %[a_ptr0], %[a_ptr0], #1\n"
+ "ld1h z8.h, p0/z, [%[b_ptr0]]\n"
"fmla z29.h, z9.h, z3.h[0]\n"
"ld1h z9.h, p1/z, [%[b_ptr0], #1, MUL VL]\n"
"fmla z18.h, z10.h, z0.h[0]\n"
- "addvl a_ptr1, a_ptr1, #1\n"
+ "addvl %[a_ptr0], %[a_ptr0], #1\n"
"fmla z22.h, z10.h, z1.h[0]\n"
- "addvl a_ptr2, a_ptr2, #1\n"
+ "addvl a_ptr1, a_ptr1, #1\n"
"fmla z26.h, z10.h, z2.h[0]\n"
- "addvl a_ptr3, a_ptr3, #1\n"
+ "addvl a_ptr2, a_ptr2, #1\n"
"fmla z30.h, z10.h, z3.h[0]\n"
"ld1h z10.h, p2/z, [%[b_ptr0], #2, MUL VL]\n"
"fmla z19.h, z11.h, z0.h[0]\n"
+ "addvl a_ptr3, a_ptr3, #1\n"
"fmla z23.h, z11.h, z1.h[0]\n"
"fmla z27.h, z11.h, z2.h[0]\n"
"fmla z31.h, z11.h, z3.h[0]\n"