blob: d1f0c3e202aa2419fde99042cbbb6adf5e285e4d [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 && arm64
// SVE broadcast tests, in the shape of the binary/unary drivers in
// binary_sve_arm64_test.go: broadcast each scalar drawn from the pool and
// check that every lane the hardware actually populated equals the scalar.
package simd_test
import (
"simd/archsimd"
"testing"
)
// testSVEBroadcast drives a scalable broadcast constructor. active is the
// runtime number of live lanes (from the vector's Len()).
func testSVEBroadcast[T number, V any](t *testing.T, pool []T, elemBytes, active int,
f func(T) V, store func(V, []T)) {
t.Helper()
count := sveMaxBytes / elemBytes // lanes in the fixed backing array
for _, x := range pool {
g := make([]T, count)
store(f(x), g)
w := make([]T, count)
for i := range w {
w[i] = x
}
if !checkSlicesLogInput(t, g[:active], w[:active], 0.0, func() {
t.Helper()
t.Logf("x=%v", x)
}) {
return
}
}
}
func TestBroadcastSVE(t *testing.T) {
if !archsimd.ARM64.SVE() {
t.Skip("no SVE")
}
testSVEBroadcast(t, int8s, 1, archsimd.Int8s{}.Len(), archsimd.BroadcastInt8s, archsimd.Int8s.Store)
testSVEBroadcast(t, int16s, 2, archsimd.Int16s{}.Len(), archsimd.BroadcastInt16s, archsimd.Int16s.Store)
testSVEBroadcast(t, int32s, 4, archsimd.Int32s{}.Len(), archsimd.BroadcastInt32s, archsimd.Int32s.Store)
testSVEBroadcast(t, int64s, 8, archsimd.Int64s{}.Len(), archsimd.BroadcastInt64s, archsimd.Int64s.Store)
testSVEBroadcast(t, uint8s, 1, archsimd.Uint8s{}.Len(), archsimd.BroadcastUint8s, archsimd.Uint8s.Store)
testSVEBroadcast(t, uint16s, 2, archsimd.Uint16s{}.Len(), archsimd.BroadcastUint16s, archsimd.Uint16s.Store)
testSVEBroadcast(t, uint32s, 4, archsimd.Uint32s{}.Len(), archsimd.BroadcastUint32s, archsimd.Uint32s.Store)
testSVEBroadcast(t, uint64s, 8, archsimd.Uint64s{}.Len(), archsimd.BroadcastUint64s, archsimd.Uint64s.Store)
testSVEBroadcast(t, float32s, 4, archsimd.Float32s{}.Len(), archsimd.BroadcastFloat32s, archsimd.Float32s.Store)
testSVEBroadcast(t, float64s, 8, archsimd.Float64s{}.Len(), archsimd.BroadcastFloat64s, archsimd.Float64s.Store)
}