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