// 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. //specgen:category Comparison package spec import "math" func bool2mask[E MaskElt](b bool) E { if b { return ^E(0) } return 0 } // Equal returns a mask indicating which elements of x and y are equal. // //specgen:require zN=xN func Equal[E EltOrMask, W Width, zE MaskElt](x, y Vec[E, W]) (z Vec[zE, W]) { return map2[E, W, zE, W](x, y, func(x, y E) zE { return bool2mask[zE](x == y) }) } // NotEqual returns a mask indicating which elements of x and y are not equal. // //specgen:require zN=xN func NotEqual[E EltOrMask, W Width, zE MaskElt](x, y Vec[E, W]) (z Vec[zE, W]) { return map2[E, W, zE, W](x, y, func(x, y E) zE { return bool2mask[zE](x != y) }) } // Less returns a mask indicating which elements of x are less than y. // // z[i] = x[i] < y[i] // //specgen:require zN=xN func Less[E Elt, W Width, zE MaskElt](x, y Vec[E, W]) (z Vec[zE, W]) { return map2[E, W, zE, W](x, y, func(x, y E) zE { return bool2mask[zE](x < y) }) } // LessEqual returns a mask indicating which elements of x are less than or // equal to y. // // z[i] = x[i] <= y[i] // //specgen:require zN=xN func LessEqual[E Elt, W Width, zE MaskElt](x, y Vec[E, W]) (z Vec[zE, W]) { return map2[E, W, zE, W](x, y, func(x, y E) zE { return bool2mask[zE](x <= y) }) } // Greater returns a mask indicating which elements of x are greater than y. // // z[i] = x[i] > y[i] // //specgen:require zN=xN func Greater[E Elt, W Width, zE MaskElt](x, y Vec[E, W]) (z Vec[zE, W]) { return map2[E, W, zE, W](x, y, func(x, y E) zE { return bool2mask[zE](x > y) }) } // GreaterEqual returns a mask indicating which elements of x are greater than // or equal to y. // // z[i] = x[i] >= y[i] // //specgen:require zN=xN func GreaterEqual[E Elt, W Width, zE MaskElt](x, y Vec[E, W]) (z Vec[zE, W]) { return map2[E, W, zE, W](x, y, func(x, y E) zE { return bool2mask[zE](x >= y) }) } // ToMask returns a mask indicating which elements of x are non-zero. // // z[i] = x[i] != 0 // //specgen:require zN=xN func ToMask[E Elt, W Width, zE MaskElt](x Vec[E, W]) (z Vec[zE, W]) { return map1[E, W, zE, W](x, func(x E) zE { return bool2mask[zE](x != 0) }) } // IsNan returns a mask indicating which elements of x are NaN. // // z[i] = math.IsNaN(x[i]) // //specgen:require zN=xN func IsNaN[E Floats, W Width, zE MaskElt](x Vec[E, W]) (z Vec[zE, W]) { return map1[E, W, zE, W](x, func(x E) zE { return bool2mask[zE](math.IsNaN(float64(x))) }) }