blob: b29e8fd2866f75e8ee68cad9c7f9f98eb762b750 [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.
//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)))
})
}