// Copyright 2019 Google LLC
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.

#include <xnnpack/assembly.h>

# void xnn_f32_gemm${"inc" if INC else ""}_ukernel_1x8__aarch64_neonfma_cortex_a53(
#     size_t mr,                (x0) - unused.  mr = 1
#     size_t nc,                x1
#     size_t kc,                x2 / x0
#     const uint8_t*restrict a, x3
#     size_t a_stride,          (x4) - unused
#     const void*restrict w,    x5
#     uint8_t*restrict c,       x6
#     size_t cm_stride,         (x7) - unused
#     size_t cn_stride,         [sp] -> x14
$if INC:
  #     const float*restrict acc,  [sp + 8] -> x15
  #     const union xnn_f32_output_params params[restrict static 1])  [sp + 16] -> x8
$else:
  #     const union xnn_f32_output_params params[restrict static 1])  [sp + 8] -> x8

# d8-d15 need to be preserved if used.
# x19-30 need to be preserved if used.

# A pointer
# x3  a0

# C pointer
# x6  c0

# Clamp v4 v5

# A53 based on A57/A75 but with LD64

BEGIN_FUNCTION xnn_f32_gemm${"inc" if INC else ""}_ukernel_1x8__aarch64_neonfma_cortex_a53

        $if INC:
          # Load cn_stride, acc
          LDP x14, x15, [sp]
          # Load params pointer
          LDR x8, [sp, 16]
        $else:
          # Load cn_stride, params pointer
          LDP x14, x8, [sp]

        # Load clamping_params values
        LD2R {v4.4s, v5.4s}, [x8]
0:
        $if INC:
          # Load initial accumulators
          LDP q16, q17, [x15], 32
        $else:
          # Load initial bias from w into accumulators
          LDP q16, q17, [x5], 32

        MOVI v18.4s, 0  // second set of C for pipelining FMLA
        PRFM PLDL1KEEP, [x5]
        MOVI v19.4s, 0
        PRFM PLDL1KEEP, [x5, 64]
        PRFM PLDL1KEEP, [x5, 128]
        PRFM PLDL1KEEP, [x5, 192]

        # Is there at least 8 floats (32 bytes) for prologue + epilogue?
        SUBS x0, x2, 32  // k = kc - 32

        B.LO 3f

        # 16 prologue
        # Read first block of 1 A and B.
        LDP q20, q21, [x5], 32
        LDP q22, q23, [x5], 32
        LDP q24, q25, [x5], 32
        LDP q26, q27, [x5], 32
        LDR q0, [x3], 16

        # Is there at least 32.  yes do main loop
        SUBS x0, x0, 32
        B.LO 2f

        # Main loop - 8 floats of A (32 bytes)
1:
        # First block of 4.  FMA for first 4, loads for 2nd block of 4.
        FMLA v16.4s, v20.4s, v0.s[0]
        LDR q1, [x3], 16
        FMLA v17.4s, v21.4s, v0.s[0]
        LDR q20, [x5], 16
        FMLA v18.4s, v22.4s, v0.s[1]
        LDR q21, [x5], 16
        FMLA v19.4s, v23.4s, v0.s[1]
        LDR q22, [x5], 16
        FMLA v16.4s, v24.4s, v0.s[2]
        LDR q23, [x5], 16
        FMLA v17.4s, v25.4s, v0.s[2]
        LDR q24, [x5], 16
        FMLA v18.4s, v26.4s, v0.s[3]
        LDR q25, [x5], 16
        FMLA v19.4s, v27.4s, v0.s[3]
        LDR q26, [x5], 16
        LDR q27, [x5], 16

        # Second block of 4.  FMA for second 4, loads for 1st block of 4.
        FMLA v16.4s, v20.4s, v1.s[0]
        LDR q0, [x3], 16
        FMLA v17.4s, v21.4s, v1.s[0]
        LDR q20, [x5], 16
        FMLA v18.4s, v22.4s, v1.s[1]
        LDR q21, [x5], 16
        FMLA v19.4s, v23.4s, v1.s[1]
        LDR q22, [x5], 16
        FMLA v16.4s, v24.4s, v1.s[2]
        LDR q23, [x5], 16
        FMLA v17.4s, v25.4s, v1.s[2]
        LDR q24, [x5], 16
        FMLA v18.4s, v26.4s, v1.s[3]
        LDR q25, [x5], 16
        FMLA v19.4s, v27.4s, v1.s[3]
        LDR q26, [x5], 16
        SUBS x0, x0, 32
        LDR q27, [x5], 16
        B.HS 1b

2:
        # Epilogue

        # First block of 4.  FMA for first 4, loads for 2nd block of 4.
        FMLA v16.4s, v20.4s, v0.s[0]
        LDR q1, [x3], 16
        FMLA v17.4s, v21.4s, v0.s[0]
        LDR q20, [x5], 16
        FMLA v18.4s, v22.4s, v0.s[1]
        LDR q21, [x5], 16
        FMLA v19.4s, v23.4s, v0.s[1]
        LDR q22, [x5], 16
        FMLA v16.4s, v24.4s, v0.s[2]
        LDR q23, [x5], 16
        FMLA v17.4s, v25.4s, v0.s[2]
        LDR q24, [x5], 16
        FMLA v18.4s, v26.4s, v0.s[3]
        LDR q25, [x5], 16
        FMLA v19.4s, v27.4s, v0.s[3]
        LDR q26, [x5], 16

        # Second block of 4.  no loads
        FMLA v16.4s, v20.4s, v1.s[0]
        LDR q27, [x5], 16
        FMLA v17.4s, v21.4s, v1.s[0]
        FMLA v18.4s, v22.4s, v1.s[1]
        FMLA v19.4s, v23.4s, v1.s[1]
        FMLA v16.4s, v24.4s, v1.s[2]
        FMLA v17.4s, v25.4s, v1.s[2]
        FMLA v18.4s, v26.4s, v1.s[3]
        FMLA v19.4s, v27.4s, v1.s[3]

3:
        # Is there a remainder?- 4 floats of A (16 bytes)
        TBNZ x0, 4, 5f
        # Is there a remainder?- 2 floats of A (8 bytes)
        TBNZ x0, 3, 6f
        # Is there a remainder?- 1 floats of A (4 bytes)
        TBNZ x0, 2, 8f

4:
        FADD v16.4s, v16.4s, v18.4s
        FADD v17.4s, v17.4s, v19.4s

        # Clamp
        FMIN v16.4s, v16.4s, v4.4s
        SUBS x1, x1, 8
        FMIN v17.4s, v17.4s, v4.4s
        FMAX v16.4s, v16.4s, v5.4s
        FMAX v17.4s, v17.4s, v5.4s

        # Store full 1 x 8
        B.LO 9f

        ST1 {v16.16b, v17.16b}, [x6], x14
        SUB  x3,  x3, x2 // a0 -= kc

        B.HI 0b

        RET

5:
        # Remainder- 4 floats of A (16 bytes)
        LDR q20, [x5], 16
        LDR q21, [x5], 16
        LDR q0, [x3], 16
        FMLA v16.4s, v20.4s, v0.s[0]
        FMLA v17.4s, v21.4s, v0.s[0]
        LDR q22, [x5], 16
        LDR q23, [x5], 16
        LDR q24, [x5], 16
        LDR q25, [x5], 16
        LDR q26, [x5], 16
        LDR q27, [x5], 16
        FMLA v18.4s, v22.4s, v0.s[1]
        FMLA v19.4s, v23.4s, v0.s[1]
        FMLA v16.4s, v24.4s, v0.s[2]
        FMLA v17.4s, v25.4s, v0.s[2]
        FMLA v18.4s, v26.4s, v0.s[3]
        FMLA v19.4s, v27.4s, v0.s[3]

        TBZ x0, 3, 7f
6:
        # Remainder- 2 floats of A (8 bytes)
        LDR q20, [x5], 16
        LDR q21, [x5], 16
        LDR d0, [x3], 8
        FMLA v16.4s, v20.4s, v0.s[0]
        FMLA v17.4s, v21.4s, v0.s[0]
        LDR q22, [x5], 16
        LDR q23, [x5], 16
        FMLA v18.4s, v22.4s, v0.s[1]
        FMLA v19.4s, v23.4s, v0.s[1]
7:
        TBZ x0, 2, 4b
8:
        # Remainder- 1 float of A (4 bytes)
        LDR q20, [x5], 16
        LDR q21, [x5], 16
        LDR s0, [x3], 4
        FMLA v16.4s, v20.4s, v0.s[0]
        FMLA v17.4s, v21.4s, v0.s[0]
        B 4b

        # Store odd channels
9:
        TBZ x1, 2, 10f
        STR q16, [x6], 16
        MOV v16.16b, v17.16b

10:
        TBZ x1, 1, 11f
        STR d16, [x6], 8
        DUP d16, v16.d[1]

11:
        TBZ x1, 0, 12f
        STR s16, [x6]
12:
        RET

END_FUNCTION xnn_f32_gemm${"inc" if INC else ""}_ukernel_1x8__aarch64_neonfma_cortex_a53

#ifdef __ELF__
.section ".note.GNU-stack","",%progbits
#endif
