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