Source file src/simd/internal/test_helpers/mask.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build goexperiment.simd
     6  
     7  package test_helpers
     8  
     9  import "testing"
    10  
    11  func TestMaskAllAny[E integer, V interface {
    12  	Len() int
    13  	Equal(V) M
    14  	NotEqual(V) M
    15  }, M interface {
    16  	All() bool
    17  	Any() bool
    18  	None() bool
    19  	TrailingZeros() int
    20  }](t *testing.T, load func([]E) V) {
    21  	t.Helper()
    22  	var zero V
    23  	lanes := zero.Len()
    24  	a := make([]E, lanes)
    25  	b := make([]E, lanes)
    26  	for i := range lanes {
    27  		a[i] = E(i % 2)
    28  		b[i] = E(i % 3)
    29  	}
    30  	b[1] = 0
    31  	va := load(a)
    32  	vb := load(b)
    33  	m := va.Equal(vb)
    34  	if m.All() {
    35  		t.Errorf("m.All(): want false, got true")
    36  	}
    37  	if !m.Any() {
    38  		t.Errorf("m.Any(): want true, got false")
    39  	}
    40  	if m.None() {
    41  		t.Errorf("m.None(): want false, got true")
    42  	}
    43  	mAllOnes := va.Equal(va)
    44  	if !mAllOnes.All() {
    45  		t.Errorf("mAllOnes.All(): want true, got false")
    46  	}
    47  	if !mAllOnes.Any() {
    48  		t.Errorf("mAllOnes.Any(): want true, got false")
    49  	}
    50  	if mAllOnes.None() {
    51  		t.Errorf("mAllOnes.None(): want false, got true")
    52  	}
    53  	if got := mAllOnes.TrailingZeros(); got != 0 {
    54  		t.Errorf("mAllOnes.TrailingZeros(): want 0, got %d", got)
    55  	}
    56  	mAllZeros := va.NotEqual(va)
    57  	if mAllZeros.All() {
    58  		t.Errorf("mAllZeros.All(): want false, got true")
    59  	}
    60  	if mAllZeros.Any() {
    61  		t.Errorf("mAllZeros.Any(): want false, got true")
    62  	}
    63  	if !mAllZeros.None() {
    64  		t.Errorf("mAllZeros.None(): want true, got false")
    65  	}
    66  	if got := mAllZeros.TrailingZeros(); got != lanes {
    67  		t.Errorf("mAllZeros.TrailingZeros(): want %d, got %d", lanes, got)
    68  	}
    69  	vz := load(make([]E, lanes))
    70  	for i := range lanes {
    71  		s1 := make([]E, lanes)
    72  		s1[i] = 1
    73  		m1 := load(s1).NotEqual(vz)
    74  		if m1.All() {
    75  			t.Errorf("single-1 lane %d All: want false, got true", i)
    76  		}
    77  		if !m1.Any() {
    78  			t.Errorf("single-1 lane %d Any: want true, got false", i)
    79  		}
    80  		if m1.None() {
    81  			t.Errorf("single-1 lane %d None: want false, got true", i)
    82  		}
    83  		if got := m1.TrailingZeros(); got != i {
    84  			t.Errorf("single-1 lane %d TrailingZeros: want %d, got %d", i, i, got)
    85  		}
    86  		s0 := make([]E, lanes)
    87  		for j := range lanes {
    88  			if j != i {
    89  				s0[j] = 1
    90  			}
    91  		}
    92  		m0 := load(s0).NotEqual(vz)
    93  		if m0.All() {
    94  			t.Errorf("single-0 lane %d All: want false, got true", i)
    95  		}
    96  		if !m0.Any() {
    97  			t.Errorf("single-0 lane %d Any: want true, got false", i)
    98  		}
    99  		if m0.None() {
   100  			t.Errorf("single-0 lane %d None: want false, got true", i)
   101  		}
   102  		wantTZ := 0
   103  		if i == 0 {
   104  			wantTZ = 1
   105  		}
   106  		if got := m0.TrailingZeros(); got != wantTZ {
   107  			t.Errorf("single-0 lane %d TrailingZeros: want %d, got %d", i, wantTZ, got)
   108  		}
   109  	}
   110  }
   111  

View as plain text