| // 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 |