blob: 26f04663f95bd10fd35c4869622b9747b03ab960 [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
package test_helpers
import "testing"
func TestMaskAllAny[E integer, V interface {
Len() int
Equal(V) M
NotEqual(V) M
}, M interface {
All() bool
Any() bool
None() bool
TrailingZeros() int
}](t *testing.T, load func([]E) V) {
t.Helper()
var zero V
lanes := zero.Len()
a := make([]E, lanes)
b := make([]E, lanes)
for i := range lanes {
a[i] = E(i % 2)
b[i] = E(i % 3)
}
b[1] = 0
va := load(a)
vb := load(b)
m := va.Equal(vb)
if m.All() {
t.Errorf("m.All(): want false, got true")
}
if !m.Any() {
t.Errorf("m.Any(): want true, got false")
}
if m.None() {
t.Errorf("m.None(): want false, got true")
}
mAllOnes := va.Equal(va)
if !mAllOnes.All() {
t.Errorf("mAllOnes.All(): want true, got false")
}
if !mAllOnes.Any() {
t.Errorf("mAllOnes.Any(): want true, got false")
}
if mAllOnes.None() {
t.Errorf("mAllOnes.None(): want false, got true")
}
if got := mAllOnes.TrailingZeros(); got != 0 {
t.Errorf("mAllOnes.TrailingZeros(): want 0, got %d", got)
}
mAllZeros := va.NotEqual(va)
if mAllZeros.All() {
t.Errorf("mAllZeros.All(): want false, got true")
}
if mAllZeros.Any() {
t.Errorf("mAllZeros.Any(): want false, got true")
}
if !mAllZeros.None() {
t.Errorf("mAllZeros.None(): want true, got false")
}
if got := mAllZeros.TrailingZeros(); got != lanes {
t.Errorf("mAllZeros.TrailingZeros(): want %d, got %d", lanes, got)
}
vz := load(make([]E, lanes))
for i := range lanes {
s1 := make([]E, lanes)
s1[i] = 1
m1 := load(s1).NotEqual(vz)
if m1.All() {
t.Errorf("single-1 lane %d All: want false, got true", i)
}
if !m1.Any() {
t.Errorf("single-1 lane %d Any: want true, got false", i)
}
if m1.None() {
t.Errorf("single-1 lane %d None: want false, got true", i)
}
if got := m1.TrailingZeros(); got != i {
t.Errorf("single-1 lane %d TrailingZeros: want %d, got %d", i, i, got)
}
s0 := make([]E, lanes)
for j := range lanes {
if j != i {
s0[j] = 1
}
}
m0 := load(s0).NotEqual(vz)
if m0.All() {
t.Errorf("single-0 lane %d All: want false, got true", i)
}
if !m0.Any() {
t.Errorf("single-0 lane %d Any: want true, got false", i)
}
if m0.None() {
t.Errorf("single-0 lane %d None: want false, got true", i)
}
wantTZ := 0
if i == 0 {
wantTZ = 1
}
if got := m0.TrailingZeros(); got != wantTZ {
t.Errorf("single-0 lane %d TrailingZeros: want %d, got %d", i, wantTZ, got)
}
}
}