blob: 4700db42dc695eead8004f8fa3584adc90308f92 [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build goexperiment.simd
#include "textflag.h"
// func sgemmKernelSVE(c, a, b *float32, k, bstride int64)
//
// The same instruction sequence in the sgemmSIMD
// innermost loop.
TEXT ·sgemmKernelSVE(SB), NOSPLIT, $0-40
MOVD cioff+0(FP), R0
MOVD ai+8(FP), R1
MOVD boff+16(FP), R2
MOVD k+24(FP), R3
MOVD vlx4+32(FP), R4
// Construct the all-true predicate
MOVD $8, R5
MOVD ZR, R6
PWHILELT R5, R6, P0.S
ZDUP $0, Z0.S // the C strip accumulator
loop:
FMOVS (R1), F1 // a[i][p]
ZDUP Z1.S[0], Z1.S
ZLDR (VL*0)(R2), Z2 // B[p][off:off+vl]
ZFMLA Z2.S, Z1.S, P0.M, Z0.S
ADD $4, R1
ADD R4, R2
SUBS $1, R3
BNE loop
ZSTR Z0, (VL*0)(R0)
RET